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