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