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

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

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

Выясним причину зацикливания событий ПриПолученииДанных и ПриВыводеСтроки

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

Проанализируем механику возникновения бесконечного цикла:

  1. Табличное поле запрашивает у платформы порцию данных для отображения на экране.
  2. Платформа вызывает процедуру-обработчик ПриПолученииДанных.
  3. Если внутри этой процедуры выполняется изменение свойства Отбор табличного поля (например, сменяется вид сравнения или значение фильтра), платформа воспринимает это как изменение условий выборки.
  4. Сброс кэша данных принудительно инициирует повторный запрос к источнику данных.
  5. Повторный запрос данных снова провоцирует вызов ПриПолученииДанных, создавая зацикливание с частотой в доли секунды.

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

Почему ДанныеСтроки принимает значение НЕОПРЕДЕЛЕНО и как с этим работать

Параметр ДанныеСтроки в событии ПриВыводеСтроки может принимать значение Неопределено в следующих случаях:

  1. Отрисовка пустых строк сетки таблицы (когда количество физических записей в списке меньше высоты табличного поля на форме).
  2. Вывод группировочных строк при отображении иерархии.
  3. Момент перерисовывания и сброса фильтра списка.

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


Процедура ТаблицаПодчиненногоСправочникаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    Если ДанныеСтроки = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Логика визуального оформления строки
    
КонецПроцедуры

Правильная организация дополнительного отбора по шагам

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

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

Посмотрим на пример правильной установки отбора в процедуре ПриОткрытии или специальной сервисной процедуре формы:


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

КонецПроцедуры

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

← На главную