Почему не выводятся добавленные колонки в динамическом списке справочника «Партнеры» и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Разработчики, работающие с современными конфигурациями на ERP-платформе 1С (такими как «Управление торговлей 11», «Комплексная автоматизация 2» или «ERP Управление предприятием»), часто сталкиваются с крайне непонятной на первый взгляд проблемой. Сценарий стандартный: в конфигураторе открывается форма списка или выбора справочника Партнеры, в текст запроса динамического списка добавляется новый нужный реквизит, поле переносится на форму, настраивается видимость. Однако при запуске системы в режиме «1С:Предприятие» новая колонка на форме просто отсутствует. Более того, её нет даже в настройках изменения формы у пользователя.

В этой статье мы подробно разберем, почему типовой механизм конфигураций «затирает» изменения разработчика, сделанные в конфигураторе, проанализируем внутреннее устройство динамических списков ERP-систем и рассмотрим практические варианты решения проблемы для разных сценариев.

Почему конфигуратор «бессилен» перед программным кодом?

Для оптимизации производительности и обеспечения гибкости интерфейса разработчики фирмы «1С» применили в современных конфигурациях механизм динамического формирования текстов запросов для ключевых справочников (в первую очередь для справочников Партнеры и Номенклатура).

Когда пользователь открывает форму списка партнеров, платформа выполняет код инициализации формы. На сервере вызываются процедуры специализированных общих модулей (например, ПартнерыИКонтрагенты.ПартнерыФормаВыбораСпискаПриСозданииНаСервере). В процессе работы этот код полностью переопределяет свойство динамического списка Список.ТекстЗапроса, замещая созданный вами в конфигураторе запрос своим собственным шаблоном, сгенерированным «на лету» из программного кода общего модуля.

В результате любые ручные изменения структуры запроса внутри самой формы (в конфигураторе) бесследно исчезают в режиме предприятия, так как объект динамического списка инициализируется заново программным путем.

Прежде чем приступать к доработке кода, давайте исключим стандартные интерфейсные и платформенные причины. Для этого выполним стандартный чек-лист:

  1. Свойство «Использовать всегда»: Убедимся, что у добавленного поля на форме в конфигураторе установлено свойство Использовать всегда (флажок должен быть включен).
  2. Очистка кэша базы данных: Иногда платформа кэширует старое описание метаданных формы. Очистим локальный кэш пользователя или перезапустим базу под другим именем.
  3. Сброс настроек формы: В режиме «1С:Предприятие» зайдем в меню Еще — Изменить форму, затем выберем Все действия — Установить стандартные настройки. Это сбросит сохраненные пользовательские настройки отображения колонок.
  4. Проверка прав доступа (ролей): Проверим, что у текущего пользователя и его ролей есть права на чтение добавленного реквизита. Если прав нет, платформа автоматически скроет колонку.
  5. Влияние функциональных опций: Проверим, не привязан ли добавляемый реквизит к какой-либо функциональной опции, которая в данный момент выключена в программе.

Если все стандартные шаги выполнены, но колонка так и не появилась, значит, мы имеем дело именно с программным переопределением запроса. Рассмотрим подробные сценарии решения этой задачи.

Сценарий А: Вывод ИНН, КПП или других реквизитов контрагента

Это самый частый юзкейс. Разработчики хотят видеть ИНН компании прямо в списке партнеров. Но данные ИНН хранятся в связанном справочнике Контрагенты, а не в самом справочнике Партнеры.

Проанализируем логику работы типовой системы. В общем модуле при формировании запроса рассчитывается специальный внутренний флаг ЗапросСИнформациейПоКонтрагенту. Система анализирует настройки программы и состояние данных:

Для решения этой проблемы у нас есть два пути:

Путь 1. Без изменения кода (наведение порядка в данных). Проанализируем базу данных на предмет дублей связей партнеров и контрагентов. Если устранить ситуации, когда к одному партнеру привязано несколько контрагентов (например, объединить ошибочные элементы), и отключить независимое ведение в настройках, система автоматически переведет флаг в значение Истина, и колонка ИНН вернется на форму.

Путь 2. Программное вмешательство. Если бизнес-логика требует вывода ИНН несмотря ни на что, мы можем принудительно переопределить поведение системы. Для этого создадим расширение конфигурации и переопределим процедуру инициализации формы в общем модуле, установив флаг отображения контрагентов в значение Истина. Стоит учитывать, что при этом строки партнеров, имеющих несколько контрагентов, начнут дублироваться в списке.

Сценарий Б: Вывод собственных (новых) реквизитов справочника «Партнеры»

Рассмотрим ситуацию, когда мы добавили в справочник Партнеры новый реквизит (например, КаналСбыта) и хотим вывести его в динамический список.

Для решения этой задачи нам потребуется использовать механизм расширений и переопределить функцию, которая возвращает базовый текст запроса для списка партнеров. Разберем этот процесс по шагам.

Шаг 1. Создадим новое расширение конфигурации и добавим в него общий модуль ПартнерыИКонтрагенты.

Шаг 2. Найдем в модуле функцию ТекстЗапросаДинамическогоСпискаПартнеры(ПараметрыЗапроса). Эта функция отвечает за формирование строки SQL-подобного запроса.

Шаг 3. В расширении применим к этой функции аннотацию &Вместо для изменения возвращаемого текста запроса. Напишем код модификации строки:


&Вместо("ТекстЗапросаДинамическогоСпискаПартнеры")
Функция Расш_ТекстЗапросаДинамическогоСпискаПартнеры(ПараметрыЗапроса)
    
    // Получаем оригинальный текст запроса, сформированный системой
    ТекстЗапроса = ПродолжитьВызов(ПараметрыЗапроса);
    
    // Добавляем выборку нашего реквизита "КаналСбыта" в текст запроса.
    // Для этого заменим стандартный фрагмент текста запроса на наш вариант с новым полем.
    ТекстЗапроса = СтрЗаменить(
        ТекстЗапроса, 
        "СправочникПартнеры.Ссылка КАК Ссылка,", 
        "СправочникПартнеры.Ссылка КАК Ссылка, СправочникПартнеры.КаналСбыта КАК КаналСбыта,"
    );
    
    Возврат ТекстЗапроса;
    
КонецФункции

Шаг 4. Чтобы по нашему новому полю корректно работали отборы, поиск и группировки, нам также может потребоваться доработать процедуру установки отборов. Найдем в этом же модуле процедуру УстановитьОтборыДинамическийСписокПартнеры и добавим обработку нашего реквизита аналогичным образом через расширение.

Сценарий В: Альтернативный бескодовый путь (Рекомендуемый)

Если перед вами стоит задача вывести дополнительное поле, но вы хотите избежать программирования, создания расширений и возможных сложностей при последующих обновлениях конфигурации 1С, настоятельно рекомендуется воспользоваться типовым механизмом дополнительных реквизитов.

Рассмотрим, как настроить отображение поля без написания кода:

  1. Перейдем в раздел НСИ и администрирование, далее откроем пункт Общие настройки и развернем группу Дополнительные реквизиты и сведения. Убедимся, что флажок использования доп. реквизитов активен.
  2. Перейдем по ссылке Дополнительные реквизиты, найдем в списке справочник Партнеры и добавим новый дополнительный реквизит (например, создадим реквизит «Важность партнера»). Заполним для него возможные значения.
  3. Запустим программу в пользовательском режиме и откроем список партнеров.
  4. Нажмем кнопку Еще в правом верхнем углу формы списка и выберем пункт Изменить форму.
  5. В дереве элементов формы найдем объект Список, раскроем его структуру, выделим элемент Ссылка и нажмем сверху кнопку Добавить поля.
  6. В открывшемся списке доступных полей найдем наш созданный дополнительный реквизит (он будет отображаться в списке доступных полей под своим именем), отметим его флажком и нажмем ОК.
  7. Переместим появившееся поле в нужное место на форме с помощью стрелок «Вверх» и «Вниз» и нажмите кнопку Применить.

Преимущество данного метода заключается в том, что платформа 1С на уровне ядра автоматически интегрирует дополнительные реквизиты в динамические списки. Запрос динамического списка модифицируется самой платформой без участия кода общих модулей, что гарантирует стабильную работу поля при любых обновлениях конфигурации и исключает ошибки со стороны разработчика.

Мы подробно разобрали причины, по которым стандартное добавление колонок через конфигуратор может не работать в динамических списках ERP-систем, и изучили три эффективных способа решения этой проблемы. Выбор конкретного пути зависит от архитектурных требований вашего проекта и необходимости сохранения типовой поддержки конфигурации.

← На главную