Как реализовать отбор в отчете на базе Построителя отчета в обычных формах

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

При разработке отчетов в конфигурациях на обычных формах (например, УПП 1.3, КА 1.1 или УТ 10.3) разработчики часто сталкиваются с необходимостью создать удобный интерфейс для фильтрации данных. Использование объекта ПостроительОтчета значительно упрощает эту задачу, так как он берет на себя генерацию текста запроса с учетом условий. Однако связь между элементами управления на форме и внутренними настройками построителя не всегда очевидна. В этой статье мы подробно разберем, как правильно организовать отбор по номенклатуре или контрагентам, чтобы пользователь мог выбирать значения в списке, в группе и использовать другие виды сравнения.

Способ 1: Использование табличного поля (наиболее простой и универсальный)

Если нам нужно предоставить пользователю полный контроль над всеми возможными отборами, предусмотренными в запросе, самым эффективным решением будет использование табличного поля непосредственно на форме отчета. Проанализируем, как это реализовать по шагам.

Во-первых, в реквизитах обработки или отчета должен быть создан реквизит с типом ПостроительОтчета. Назовем его, к примеру, ПостроительОтчета.

Во-вторых, на форму необходимо добавить элемент управления типа Табличное поле. В свойстве "Данные" этого поля следует указать путь: ПостроительОтчета.Отбор. Система 1С автоматически определит колонки (Использование, Имя, Вид сравнения, Значение) и обеспечит корректную работу типов данных.

Разберем программную часть инициализации такого отбора. Рассмотрим пример кода, который необходимо выполнить перед тем, как пользователь увидит форму:


// Устанавливаем текст запроса для построителя
ПостроительОтчета.Текст = 
"ВЫБРАТЬ
|   Продажи.Номенклатура КАК Номенклатура,
|   Продажи.Контрагент КАК Контрагент,
|   Продажи.КоличествоОборот КАК Количество
|ИЗ
|   РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК Продажи";

// Заполняем настройки построителя на основании текста запроса
ПостроительОтчета.ЗаполнитьНастройки();

// Теперь в коллекции ПостроительОтчета.Отбор появились поля Номенклатура и Контрагент

Важный момент: если мы хотим, чтобы в списке отборов сразу присутствовали нужные поля, даже если пользователь еще не добавил их вручную, мы можем включить их программно:


ЭлементОтбора = ПостроительОтчета.Отбор.Номенклатура;
ЭлементОтбора.Использование = Истина;

Способ 2: Организация быстрых отборов (отдельные поля на форме)

Иногда интерфейс требует вынести конкретные поля (например, "Контрагент") отдельно от общей таблицы настроек, чтобы пользователю было удобнее. Рассмотрим ситуацию, когда на форме есть ПолеВвода для значения и отдельное поле для выбора вида сравнения (равно, в группе, в списке и т.д.).

Выясним, как связать эти поля с построителем. В типовых конфигурациях 1С (УПП, КА) для этого используется специальный механизм в модуле УправлениеОтчетами. Проанализируем вызов процедуры связи в обработчике ПриОткрытии формы:


Процедура ПриОткрытии()
    // Связываем поля формы с отбором построителя
    // Предположим, на форме есть элементы: ПолеОтбораКонтрагент и ПолеВидаСравненияКонтрагент
    УправлениеОтчетами.УстановитьСвязьПолейБыстрогоОтбораНаФорме(
        ПостроительОтчета.Отбор.Контрагент, 
        ЭлементыФормы.ПолеОтбораКонтрагент, 
        ЭлементыФормы.ПолеВидаСравненияКонтрагент
    );
КонецПроцедуры

Процедура УстановитьСвязьПолейБыстрогоОтбораНаФорме выполняет "магию" синхронизации: когда пользователь меняет значение в поле на форме, оно автоматически записывается в ПостроительОтчета.Отбор.Контрагент.Значение. Аналогично происходит и с видом сравнения. Это позволяет реализовать выбор "В иерархии" или "В списке", о котором спрашивал автор темы.

Если вы создаете отчет "с нуля" и не хотите использовать типовые модули, вам придется вручную обрабатывать событие ПриИзменении для элементов формы:


Процедура ПолеОтбораКонтрагентПриИзменении(Элемент)
    ПостроительОтчета.Отбор.Контрагент.Значение = Элемент.Значение;
    ПостроительОтчета.Отбор.Контрагент.Использование = ЗначениеЗаполнено(Элемент.Значение);
КонецПроцедуры

Процедура ПолеВидаСравненияКонтрагентПриИзменении(Элемент)
    ПостроительОтчета.Отбор.Контрагент.ВидСравнения = Элемент.Значение;
КонецПроцедуры

Способ 3: Настройка видов сравнения для иерархии и списков

Разберем подробнее, как обеспечить возможность выбора "в группе" или "в списке". Это критически важно для работы со справочником "Номенклатура", который обычно имеет сложную иерархию.

Для того чтобы ПостроительОтчета корректно обработал иерархическое условие, необходимо установить правильный ВидСравнения. Рассмотрим основные варианты:

Посмотрим на пример кода, который программно устанавливает отбор по списку номенклатуры:


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

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

Особенности работы с ПостроителемОтчета

Важно помнить несколько технических нюансов, которые помогут избежать ошибок при разработке:

  1. Метод ЗаполнитьНастройки(): Вызывайте этот метод каждый раз после изменения текста запроса в ПостроительОтчета.Текст. Без этого коллекция Отбор не будет соответствовать полям запроса.
  2. Фигурные скобки в запросе: Для того чтобы построитель мог управлять отборами, поля в запросе должны быть доступны для расширения. В тексте запроса для ПостроительОтчета часто используются фигурные скобки {}, обозначающие секции, которыми может управлять построитель (ГДЕ, УПОРЯДОЧИТЬ ПО и т.д.). Хотя построитель умеет анализировать и обычные запросы, использование секций {ГДЕ ...} дает больше гибкости.
  3. Представления полей: Если вы хотите, чтобы в таблице отбора пользователь видел понятное название (например, "Товар" вместо "Номенклатура"), используйте свойство Представление:
    ПостроительОтчета.Отбор.Номенклатура.Представление = "Выберите товар";
  4. Типы значений: При использовании быстрых отборов на форме следите, чтобы тип ПоляВвода совпадал с типом данных в отборе. Если выбран вид сравнения "В списке", тип значения поля ввода должен программно меняться на СписокЗначений. Стандартное табличное поле (Способ 1) делает это автоматически.

Проанализировав все способы, можно сделать вывод: для сложных отчетов с множеством условий лучше всего использовать стандартное табличное поле, связанное с ПостроительОтчета.Отбор. Если же требуется лаконичный интерфейс с парой полей, стоит воспользоваться механизмом связи через УправлениеОтчетами или прописать синхронизацию значений вручную.

← На главную