Почему отбор регистра сведений в табличном поле срабатывает только после обновления?

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

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

Проанализируем причины такого поведения платформы 1С:Предприятие и разберем по шагам, как правильно настроить отбор и гарантировать актуальность отображаемых данных.

Причины некорректного поведения

Выясним причину, почему метод Установить() у отбора не приводит к мгновенному заполнению таблицы на форме. Здесь играют роль два ключевых фактора:

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

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

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

Посмотрим на пример кода, который необходимо вызывать в обработчиках событий формы ПриОткрытии и ПослеЗаписи:


Процедура ОбновитьДанныеРегистра()
    Если ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

    // Устанавливаем значение отбора по текущему объекту
    ЭлементыФормы.ТФ.Значение.Отбор.Заявитель.Установить(Ссылка);
    
    // Принудительно считываем записи из информационной базы
    ЭлементыФормы.ТФ.Значение.Прочитать();
КонецПроцедуры

Вызов метода Прочитать() заставляет платформу обратиться к базе данных с учетом установленных условий отбора и немедленно отрисовать полученные строки в табличном поле формы без необходимости нажимать кнопку командной панели.

Способ 2. Настройка отбора при использовании динамического списка

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

Разберем универсальную процедуру для установки фильтра в объектах типа список:


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

Корректная обработка новых объектов в интерфейсе

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

  1. В обработчике ПриОткрытии проверяем условие Если ЭтоНовый() Тогда.
  2. Если объект новый, делаем табличное поле регистра недоступным для редактирования через ЭлементыФормы.ТФ.Доступность = Ложь или размещаем на форме поясняющую надпись о том, что данные регистра доступны только после первой записи объекта.
  3. В обработчике события ПослеЗаписи восстанавливаем доступность элемента управления и вызываем процедуру инициализации отбора и чтения данных по сформированной ссылке: ОбновитьДанныеРегистра().

Такой подход исключает ошибки при попытке записи данных с пустой ссылкой и гарантирует корректное отображение записей сразу после записи элемента справочника или документа.

← На главную