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