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