рубрики: Фишки | Дата: 30 июля, 2017
Скачать обработку с примерами из статьи: professia1c_TableValueFilter.epf
Платформа: 8.3; Тип формы: управляемая.
Достаточно часто при работе с таблицами значений требуется выбрать строки по какому-либо условию. Когда условием отбора является равенство — тут нет никакой проблемы — достаточно воспользоваться методом НайтиСтроки() как это описано в статье про основные приемы работы с таблицами значений. Но когда нам нужно использовать более сложные условия отбора (В, В ИЕРАРХИИ и т.д.), то приходится прибегать к нестандартным способам. В этой статье рассмотрим два таких способа.
Для демонстрации создадим обработку с двумя таблицами значений: ИсходнаяТаблица и Результат.
И заполним исходную таблицу следующим образом:
Наименование | Количество |
---|---|
Ручка | 15 |
Лампа | 2 |
Карандаш | 10 |
Дырокол | 5 |
Допустим мы хотим оставить только строки с наименованиями «Ручка» и «Карандаш»
Идея заключается в следующем — загружаем таблицу значений во временную таблицу запроса. И теперь мы можем установить любой отбор, доступный в языке запросов 1С. Выполняем запрос, и при помощи метода Выгрузить() получаем результирующую таблицу:
&НаКлиенте
Процедура ОтборЗапросом(Команда)
ОтборЗапросомНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОтборЗапросомНаСервере()
ТаблицаТовары = РеквизитФормыВЗначение("ИсходнаяТаблица");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсходнаяТаблица.Наименование,
| ИсходнаяТаблица.Количество
|ПОМЕСТИТЬ ВТ_ИсходнаяТаблица
|ИЗ
| &ИсходнаяТаблица КАК ИсходнаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ИсходнаяТаблица.Наименование,
| ВТ_ИсходнаяТаблица.Количество
|ИЗ
| ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
|ГДЕ
| ВТ_ИсходнаяТаблица.Наименование В(&СписокНаименований)";
СписокНаименований = Новый Массив;
СписокНаименований.Добавить("Ручка");
СписокНаименований.Добавить("Карандаш");
Запрос.УстановитьПараметр("ИсходнаяТаблица", ТаблицаТовары);
Запрос.УстановитьПараметр("СписокНаименований", СписокНаименований);
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(ТаблицаРезультат, "Результат");
КонецПроцедуры
Такого же результата можно достичь и с использованием построителя запросов. В этом случае создаем объект ПостроительЗапроса, указываем в качестве источника данных нашу таблицу значений, устанавливаем отбор для построителя, и выгружаем результат выполнения в новую таблицу значений:
&НаКлиенте
Процедура ОтборПостроителем(Команда)
ОтборПостроителемНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОтборПостроителемНаСервере()
ТаблицаТовары = РеквизитФормыВЗначение("ИсходнаяТаблица");
СписокНаименований = Новый СписокЗначений;
СписокНаименований.Добавить("Ручка");
СписокНаименований.Добавить("Карандаш");
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаТовары);
Отбор = Построитель.Отбор;
ОтборНаименование = Отбор.Добавить("Наименование");
ОтборНаименование.ВидСравнения = ВидСравнения.ВСписке;
ОтборНаименование.Использование = Истина;
ОтборНаименование.Значение = СписокНаименований;
Построитель.Выполнить();
ТаблицаРезультат = Построитель.Результат.Выгрузить();
ЗначениеВРеквизитФормы(ТаблицаРезультат, "Результат");
КонецПроцедуры
Конечно в реальной ситуации список для отбора будет формироваться немного иначе. Никто не станет в коде прописывать конкретные наименования. Но так как целью было показать сам принцип установки отборов для таблицы значений, и чтобы не привязывать демонстрационную обработку (ссылка на нее в шапке статьи) к конкретной конфигурации — было сделано такое упрощение. Стоит также заметить, что данные методы могут применяться не только для таблиц значений. В частности и для табличных частей в толстом клиенте.
Ранее не работал с построителем, спасибо за материал.
Спасибо за отзыв! Честно говоря сам способ с построителем недавно только узнал. До этого всегда через временную таблицу делал.