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