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