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