Как реализовать отбор номенклатуры при заполнении табличной части обработки на обычных формах?

Программист 1С v8.3 (Обычные формы)
← На главную

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

Способ 1. Использование Построителя запроса (ПостроительЗапроса)

Проанализируем самый профессиональный и гибкий подход для обычных форм — использование объекта ПостроительЗапроса. Этот объект специально создан для того, чтобы автоматически трансформировать текст запроса в зависимости от настроек, которые установил пользователь. Главное преимущество здесь в том, что нам не нужно вручную «клеить» строки текста запроса.

Разберем по шагам, как это работает:

  1. Подготовка запроса. В тексте запроса мы используем специальные фигурные скобки {}. Все, что находится внутри них, ПостроительЗапроса будет обрабатывать динамически.
  2. Настройка отбора. После инициализации текста, в объекте автоматически заполняется коллекция Отбор.
  3. Выполнение. Построитель сам добавит секцию ГДЕ в итоговый SQL-запрос.

Посмотрим на пример кода:


// Инициализируем построитель
Построитель = Новый ПостроительЗапроса;
Построитель.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Номенклатура,
    |	Номенклатура.Код
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |{ГДЕ
    |	Номенклатура.Ссылка.* КАК Номенклатура}";

// Выводим настройки отбора на форму
// Для этого на форме должно быть табличное поле с данными "Построитель.Отбор"
Построитель.ЗаполнитьНастройки();

// Выполняем запрос с учетом пользовательских фильтров
Построитель.Выполнить();
РезультатТаблица = Построитель.Результат.Выгрузить();

Важный момент: конструкция Номенклатура.Ссылка.* позволяет пользователю выбирать любые доступные виды сравнения (в иерархии, в списке и т.д.).

Способ 2. Связывание элементов формы с параметрами отбора

Рассмотрим ситуацию, когда нам не нужно выводить целое дерево отборов, а достаточно дать пользователю пару полей на форме (например, «Вид сравнения» и «Значение»). Мы можем напрямую привязать элементы формы к свойствам отбора табличной части или объекта построителя.

Как отмечается в обсуждении, мы можем указать в свойствах Данные для полей ввода пути к объекту отбора:

Проанализируем программный способ управления таким отбором при изменении значения на форме:


Процедура НоменклатураПриИзменении(Элемент)
    Если ЗначениеЗаполнено(Элемент.Значение) Тогда
        // Включаем отбор, если значение выбрано
        ТЗ.Отбор.Номенклатура.Использование = Истина;
        ТЗ.Отбор.Номенклатура.ВидСравнения = ВидСравнения.Равно;
        ТЗ.Отбор.Номенклатура.Значение = Элемент.Значение;
    Иначе
        // Выключаем отбор, если поле очищено
        ТЗ.Отбор.Номенклатура.Использование = Ложь;
    КонецЕсли;
КонецПроцедуры

Способ 3. Ограничение видов сравнения

Выясним причину, по которой иногда в списке видов сравнения появляется слишком много лишних пунктов (например, «Больше», «Меньше» для справочников). Чтобы сделать интерфейс удобнее, мы можем программно ограничить доступные варианты. Это решается через свойство ДоступныеВидыСравнения.

Пример настройки конкретного поля отбора:


ЭлементОтбора = Построитель.Отбор.Номенклатура;
СписокВидов = Новый СписокЗначений;
СписокВидов.Добавить(ВидСравнения.Равно);
СписокВидов.Добавить(ВидСравнения.ВИерархии);
СписокВидов.Добавить(ВидСравнения.ВСписке);

ЭлементОтбора.ДоступныеВидыСравнения = СписокВидов;

Работа с временными таблицами и Менеджером временных таблиц

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

Рассмотрим последовательность действий:

  1. Создаем МенеджерВременныхТаблиц.
  2. Выполняем первый запрос, который подготавливает данные и помещает их во временную таблицу (ВТ).
  3. Передаем этот менеджер в ПостроительЗапроса.
  4. В тексте построителя обращаемся к этой ВТ и накладываем на неё {ГДЕ ...}.

Это позволит объединить мощь пакетных запросов и гибкость пользовательских настроек.

Резюме

Для реализации качественного отбора в обычных формах 1С 8.3:

Таким образом, мы получаем функционал, максимально приближенный к стандартным отчетам, сохраняя при этом контроль над логикой заполнения табличной части обработки.

← На главную