Профессия — 1С

Рукопашный бой Карташ

Категории

Отбор в таблице значений

рубрики: Фишки | Дата: 30 Июль, 2017
Скачать обработку с примерами из статьи: professia1c_TableValueFilter.epf
Платформа: 8.3; Тип формы: управляемая.

Достаточно часто при работе с таблицами значений требуется выбрать строки по какому-либо условию. Когда условием отбора является равенство — тут нет никакой проблемы — достаточно воспользоваться методом НайтиСтроки() как это описано в статье про основные приемы работы с таблицами значений. Но когда нам нужно использовать более сложные условия отбора (В, В ИЕРАРХИИ и т.д.), то приходится прибегать к нестандартным способам. В этой статье рассмотрим два таких способа.




Для демонстрации создадим обработку с двумя таблицами значений: ИсходнаяТаблица и Результат.

И заполним исходную таблицу следующим образом:

Наименование Количество
Ручка 15
Лампа 2
Карандаш 10
Дырокол 5

Допустим мы хотим оставить только строки с наименованиями «Ручка» и «Карандаш»

Отбор с использованием запроса

Идея заключается в следующем — загружаем таблицу значений во временную таблицу запроса. И теперь мы можем установить любой отбор, доступный в языке запросов 1С. Выполняем запрос, и при помощи метода Выгрузить() получаем результирующую таблицу:




&НаКлиенте
Процедура ОтборЗапросом(Команда)
	ОтборЗапросомНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтборЗапросомНаСервере()

	ТаблицаТовары = РеквизитФормыВЗначение("ИсходнаяТаблица");

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ИсходнаяТаблица.Наименование,
	|	ИсходнаяТаблица.Количество
	|ПОМЕСТИТЬ ВТ_ИсходнаяТаблица
	|ИЗ
	|	&ИсходнаяТаблица КАК ИсходнаяТаблица
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_ИсходнаяТаблица.Наименование,
	|	ВТ_ИсходнаяТаблица.Количество
	|ИЗ
	|	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
	|ГДЕ
	|	ВТ_ИсходнаяТаблица.Наименование В(&СписокНаименований)";

	СписокНаименований = Новый Массив;
	СписокНаименований.Добавить("Ручка");
	СписокНаименований.Добавить("Карандаш");

	Запрос.УстановитьПараметр("ИсходнаяТаблица", ТаблицаТовары);
	Запрос.УстановитьПараметр("СписокНаименований", СписокНаименований);

	ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

	ЗначениеВРеквизитФормы(ТаблицаРезультат, "Результат");

КонецПроцедуры




Отбор с использованием построителя отчетов

Такого же результата можно достичь и с использованием построителя запросов. В этом случае создаем объект ПостроительЗапроса, указываем в качестве источника данных нашу таблицу значений, устанавливаем отбор для построителя, и выгружаем результат выполнения в новую таблицу значений:




&НаКлиенте
Процедура ОтборПостроителем(Команда)
	ОтборПостроителемНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтборПостроителемНаСервере()

	ТаблицаТовары = РеквизитФормыВЗначение("ИсходнаяТаблица");

	СписокНаименований = Новый СписокЗначений;
	СписокНаименований.Добавить("Ручка");
	СписокНаименований.Добавить("Карандаш");

	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаТовары);

	Отбор = Построитель.Отбор;
	ОтборНаименование = Отбор.Добавить("Наименование");

	ОтборНаименование.ВидСравнения	= ВидСравнения.ВСписке;
	ОтборНаименование.Использование	= Истина;
	ОтборНаименование.Значение		= СписокНаименований;

	Построитель.Выполнить();
	ТаблицаРезультат = 	Построитель.Результат.Выгрузить();

	ЗначениеВРеквизитФормы(ТаблицаРезультат, "Результат");

КонецПроцедуры

Конечно в реальной ситуации список для отбора будет формироваться немного иначе. Никто не станет в коде прописывать конкретные наименования. Но так как целью было показать сам принцип установки отборов для таблицы значений, и чтобы не привязывать демонстрационную обработку (ссылка на нее в шапке статьи) к конкретной конфигурации — было сделано такое упрощение. Стоит также заметить, что данные методы могут применяться не только для таблиц значений. В частности и для табличных частей в толстом клиенте.

2 комментария на «“Отбор в таблице значений”»

  1. Карпов Дмитрий:

    Ранее не работал с построителем, спасибо за материал.

    • Owner:

      Спасибо за отзыв! Честно говоря сам способ с построителем недавно только узнал. До этого всегда через временную таблицу делал.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С