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

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

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

Анализ проблемы: визуальное редактирование против программного кода

Когда мы работаем с основной конфигурацией, добавление поля в произвольный запрос динамического списка обычно проходит гладко. Однако в расширениях вступает в силу механизм объединения (мерджа) метаданных. Главная причина, по которой ваши изменения в визуальном редакторе расширения игнорируются, заключается в том, что в типовых решениях (таких как УТ 11, ERP 2.5, БП 3.0) текст запроса динамического списка часто переопределяется программно в момент создания формы. Даже если вы используете добавление реквизитов и элементов формы без кодирования, программный код конфигурации может иметь приоритет.

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

Шаг 1. Проверка программного переопределения запроса

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

  1. Добавим в расширение процедуру ПриСозданииНаСервере формы списка.
  2. Установим аннотацию &После.
  3. Вставим точку останова в конце этой процедуры.
  4. В режиме отладки вычислим выражение Список.ТекстЗапроса.

Для более детального исследования свойств объектов «на лету» можно также использовать редактор форм в режиме предприятия. Если в полученном тексте запроса отсутствует ваше добавленное поле, значит, базовая конфигурация перезаписала текст запроса. Выясним причину «вылета» при скроллинге: это происходит из-за того, что структура колонок формы перестает соответствовать структуре полей в ТекстЗапроса, либо возникают конфликты в КомпоновщикНастроек.

Шаг 2. Программное внедрение поля в текст запроса

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

Предположим, нам нужно добавить поле МоеДополнительноеПоле из справочника Номенклатура. Рассмотрим пример кода в модуле формы расширения:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий текст запроса, который уже мог быть изменен основной базой
    ТекстЗапроса = Список.ТекстЗапроса;
    
    // Проверяем, нет ли уже нашего поля (на всякий случай)
    Если Найти(ТекстЗапроса, "Номенклатура.МоеДополнительноеПоле") = 0 Тогда
        
        // Внедряем поле в секцию SELECT. 
        // ВАЖНО: используйте СтрЗаменить аккуратно, привязываясь к уникальным участкам запроса.
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Номенклатура.Ссылка,", "Номенклатура.Ссылка, Номенклатура.МоеДополнительноеПоле КАК МоеПолеРасширения,");
        
        // Возвращаем модифицированный текст обратно в список
        Список.ТекстЗапроса = ТекстЗапроса;
        
    КонецЕсли;

КонецПроцедуры

Проанализируем этот подход: мы используем СтрЗаменить, чтобы вклиниться в список выбираемых полей. Крайне важно убедиться, что псевдоним поля (МоеПолеРасширения) совпадает с именем элемента формы, который вы создали визуально.

Шаг 3. Настройка свойств динамического списка

Иногда программной правки текста недостаточно. Посмотрим на свойства самого объекта Список в расширении. Проверьте следующие моменты:

Шаг 4. Устранение ошибок при пролистывании (скроллинге)

Если при добавлении поля программно форма начала «вылетать» с ошибкой динамического списка при скроллинге, это явный признак нарушения структуры КомпоновщикНастроек. Рассмотрим подробнее, как этого избежать. Подобные проблемы часто возникают при попытке реализовать сложный функционал, например, флажок в динамическом списке или специализированное отображение картинок в списке счетов.

Когда вы меняете ТекстЗапроса, компоновщик настроек может хранить старые кэшированные данные о доступных полях. Чтобы синхронизировать состояние, после изменения текста запроса иногда требуется принудительно обновить настройки или проверить, не обращаются ли пользовательские настройки (отборы, группировки) к несуществующим полям.

Посмотрим на пример безопасного добавления колонки на форму, если вы решили делать это полностью программно (без визуального добавления в расширение):


// Программное добавление элемента формы
НовыйЭлемент = Элементы.Добавить("МоеПолеРасширения", Тип("ПолеФормы"), Элементы.Список);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Список.МоеПолеРасширения";
НовыйЭлемент.Заголовок = "Доп. Инфо";

Почему визуальный способ часто подводит?

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

Итоговые рекомендации

Разобравшись в проблеме, мы можем составить четкий алгоритм действий для программиста:

  1. Не полагайтесь на визуальный редактор динамического списка в расширении, если работаете с типовой конфигурацией.
  2. Используйте отладчик, чтобы увидеть реальное содержимое Список.ТекстЗапроса в самом конце процедуры ПриСозданииНаСервере.
  3. Модифицируйте текст запроса программно, используя СтрЗаменить или построитель запроса.
  4. Всегда проверяйте наличие Функциональных опций. Если ваше поле в основной базе привязано к опции, которая выключена, оно не отобразится, даже если вы добавите его в запрос.
  5. Если поле добавлено в запрос, но его нет в «Изменить форму», проверьте свойство ПользовательскаяВидимость и права доступа (Роли) в расширении.

Таким образом, совместная работа с расширением требует понимания жизненного цикла формы. Программная модификация запроса через &После — наиболее надежный и профессиональный способ вывода дополнительных данных в списки типовых решений.

← На главную