Как программно добавить строку отбора в табличное поле построителя отчетов в 1С?

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

При разработке обработок и отчетов на обычных формах часто возникает задача программно заполнить параметры или отборы, которые отображаются в табличном поле. Распространенная ошибка начинающих разработчиков — попытка работать с визуальным элементом управления (ЭлементыФормы.ТабличноеПоле) напрямую через методы интерфейса, такие как ДобавитьСтроку(). Разберем, как правильно управлять отборами через объектную модель платформы 1С.

Принцип разделения данных и отображения

В платформе 1С табличное поле на форме является лишь визуальным представлением данных. Если табличное поле связано с отбором построителя (тип Отбор у объекта ПостроительОтчета или ПостроительЗапроса), все манипуляции необходимо производить с самим объектом данных, а не с элементом формы.

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

Как программно добавить условие в отбор построителя

Рассмотрим работу с коллекцией Отбор. Для добавления нового условия используется метод Добавить(), который возвращает объект ЭлементОтбора. После добавления необходимо настроить ключевые свойства элемента:

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

Посмотрим на базовый пример добавления отбора по полю договора:


// Добавляем новое поле в отбор построителя
ЭлементОтбора = ПостроительОтбораДоговоров.Отбор.Добавить("Договор");

// Настраиваем параметры созданного элемента
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение      = ВыбранныйДоговор;
ЭлементОтбора.Использование = Истина;

Безопасная установка отбора с проверкой существования

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

  1. Выполняем поиск нужного поля в коллекции с помощью метода Найти().
  2. Если метод возвращает Неопределено, добавляем новое поле через метод Добавить().
  3. Заполняем свойства ВидСравнения, Значение и Использование для полученного элемента.

Разберем пример реализации безопасного добавления:


// 1. Ищем, было ли поле добавлено ранее
ЭлементОтбора = ПостроительОтбораДоговоров.Отбор.Найти("Договор");

// 2. Если элемента нет в коллекции — добавляем его
Если ЭлементОтбора = Неопределено Тогда
    ЭлементОтбора = ПостроительОтбораДоговоров.Отбор.Добавить("Договор");
КонецЕсли;

// 3. Устанавливаем параметры фильтра
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение      = ВыбранныйДоговор;
ЭлементОтбора.Использование = Истина;

Также у объекта ЭлементОтбора существует метод Установить(), позволяющий задать основные параметры одной строкой:

ЭлементОтбора.Установить(ВыбранныйДоговор, ВидСравнения.Равно, Истина);

Возможные ошибки и нюансы работы

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

  1. Ошибка «Недопустимое значение параметра»: возникает, если имя поля, переданное в метод Добавить(), отсутствует в составе доступных полей построителя. Поле должно быть либо описано в тексте запроса построителя (в секции {ГДЕ ...}), либо сформировано автоматически при вызове метода ЗаполнитьНастройки().
  2. Интервальные виды сравнения: если используется сравнение вида ВидСравнения.ИнтервалВключаяГраницы, вместо свойства Значение необходимо заполнять свойства ЗначениеС и ЗначениеПо.
  3. Прямой доступ по имени: если поле уже гарантированно инициализировано в построителе, к нему можно обратиться по имени через квадратные скобки: ПостроительОтбораДоговоров.Отбор["Договор"].Значение = ВыбранныйДоговор;.
← На главную