Почему не отображается добавленное поле в динамическом списке 1С и как это исправить

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

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда после изменения текста произвольного запроса в динамическом списке и добавления новой колонки на форму, эта колонка упорно отказывается выводиться в режиме Предприятие. Рассмотрим подробнее, почему это происходит, проанализируем возможные причины и разберем по шагам эффективные способы решения этой задачи на примере конфигурации Управление торговлей 11.

Первичная диагностика: настройки формы и кэш

Прежде чем приступать к глубокому анализу кода и запросов, разберем базовые моменты, которые могут блокировать отображение данных. Выясним причину, проверив настройки элемента формы. Иногда полезно использовать инструменты, обеспечивающие открытие доступа к скрытым реквизитам форм документов и справочников, чтобы исключить фактор видимости на уровне атрибутов. Одной из самых частых ошибок является отсутствие флага использования реквизита.

  1. Проверим свойство Использовать всегда. В конфигураторе откроем свойства реквизита динамического списка. Убедимся, что для нового поля (например, КонтрагентИНН) установлена галочка Использовать всегда. Это гарантирует, что платформа включит поле в выборку, даже если оно явно не размещено в видимой области таблицы.
  2. Проанализируем состав форм. В типовых конфигурациях, таких как УТ 11 или ERP, для одного справочника может существовать несколько форм списка (форма списка, форма выбора, форма списка для определенных условий). Убедимся, что мы редактируем именно ту форму, которую открываем в интерфейсе.
  3. Выполним сброс пользовательских настроек. В режиме Предприятие перейдем в меню Еще — Установить стандартные настройки. Иногда гибкая настройка списка по щучьему веленью через штатные механизмы способна решить проблему отображения, но часто платформа запоминает старую структуру колонок в настройках пользователя, и новые поля просто скрыты по умолчанию.

Программный анализ текста запроса

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Точка останова здесь позволит увидеть итоговый текст запроса
    ТекстЗапроса = Список.ТекстЗапроса;
    // Проверяем наличие поля КонтрагентИНН в строке ТекстЗапроса
КонецПроцедуры

Важно понимать, что текст запроса может подменяться программно в общих модулях. Если в ПриСозданииНаСервере ваше поле на месте, а в ПриОткрытии оно исчезает — ищем вызовы процедур из разряда ОбщегоНазначенияУТ.ПостроитьЗапросПоМетаданным или аналогичных механизмов динамического построения запросов.

Проблема обращения «через точку» и функциональные опции

Рассмотрим специфику архитектуры 1С:ERP и УТ 11. Часто программисты добавляют поля, обращаясь к реквизитам ссылочных полей напрямую в запросе, например: СправочникСоглашенияСКлиентами.Контрагент.ИНН. Если вам требуются сложные вычисляемые данные или дополнительные параметризуемые поля в динамических списках (например, остатки и цены), такой простой подход редко работает корректно.

В современных конфигурациях 1С активно используются Функциональные опции. Если в системе отключена опция, отвечающая за использование контрагентов (или включена опция «Партнеры без контрагентов»), платформа может на лету модифицировать запрос динамического списка, вырезая из него «неиспользуемые» с точки зрения логики системы поля. При этом обращение через точку (неявное соединение) страдает в первую очередь.

Решение проблемы через явное левое соединение (LEFT JOIN)

Как показывает практика, наиболее надежным способом заставить платформу выводить данные является замена неявного обращения на явное соединение таблиц в конструкторе запроса динамического списка. Рассмотрим подробнее структуру такого запроса:


ВЫБРАТЬ
    СправочникСоглашенияСКлиентами.Ссылка КАК Ссылка,
    СправочникСоглашенияСКлиентами.Номер КАК Номер,
    СправочникСоглашенияСКлиентами.Контрагент КАК Контрагент,
    ТаблицаКонтрагенты.ИНН КАК КонтрагентИНН
ИЗ
    Справочник.СоглашенияСКлиентами КАК СправочникСоглашенияСКлиентами
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК ТаблицаКонтрагенты
        ПО СправочникСоглашенияСКлиентами.Контрагент = ТаблицаКонтрагенты.Ссылка
ГДЕ
    НЕ СправочникСоглашенияСКлиентами.Типовое

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

Оптимизация производительности и проблема «Вывести список»

После реализации решения через ЛЕВОЕ СОЕДИНЕНИЕ мы можем столкнуться с другой проблемой: зависание системы при попытке выполнить команду Вывести список (экспорт в текстовый документ или Excel). Выясним причину этого поведения.

Динамический список работает порционно, подгружая по 20-45 записей для отображения на экране. Команда же Вывести список инициирует выполнение запроса ко всем записям таблицы. Если в справочнике десятки тысяч контрагентов и соглашений, а поле связи не проиндексировано, СУБД может выбрать неоптимальный план выполнения.

Для оптимизации работы таких списков рекомендуем соблюдать следующие правила:

  1. Индексация: Проверьте, что реквизит Контрагент в справочнике СоглашенияСКлиентами имеет свойство Индексировать. Это критически важно для скорости выполнения соединений.
  2. Ограничение выборки: Старайтесь не выводить в динамический список поля неограниченной длины или очень тяжелые вычисляемые конструкции, если в этом нет прямой необходимости.
  3. Использование расширений: В современных версиях 1С предпочтительнее модифицировать запрос динамического списка через Расширения. Это позволяет сохранить поддержку типовой конфигурации и избежать конфликтов при обновлении.

Таким образом, мы проанализировали путь от простой настройки интерфейса до глубокой модификации SQL-запроса. Использование явных соединений вместо обращений через точку в динамических списках является лучшей практикой (best practice) при разработке на управляемых формах, так как это обеспечивает более стабильное поведение системы вне зависимости от настроек функциональных опций.

← На главную