Почему не отображаются поля динамического списка на форме расширения и как это исправить?

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

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

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

Причина проблемы: зарегистрированная ошибка платформы 60027315

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

Выделим ключевые особенности проявления ошибки:

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

Данная ошибка затронула сборки линеек 8.3.27 (в частности, 8.3.27.1859) и предварительные версии 8.5. Ошибка полностью исправлена начиная с версии платформы 8.3.27.1936. Если у вас есть возможность обновить платформу, установка релиза 8.3.27.1936 или выше устраняет проблему сразу.

Дополнительные причины исчезновения полей динамического списка

Если обновление платформы не помогло или вы работаете на других версиях, выясним другие типичные факторы, из-за которых парсер Конфигуратора не может отобразить поля списка в расширении:

  1. Неполное заимствование объектов: если в произвольном запросе динамического списка используются таблицы, реквизиты или поля составного типа, которые не добавлены в расширение из основной конфигурации, среда разработки не может разрешить типизацию полей и оставляет дерево реквизита пустым.
  2. Сложные вложенные подзапросы: синтаксический анализатор расширений часто дает сбой при валидации запросов с глубокой вложенностью, сложными соединениями или обращением к временным таблицам внутри динамического списка.
  3. Повреждение локального кэша разработки: при частом переключении между версиями платформ файлы кэша конфигуратора блокируют обновление структуры формы.

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

Способ 1. Программное формирование запроса и элементов формы

Наиболее надежный и универсальный метод обойти любые визуальные сбои Конфигуратора — отказаться от интерактивной настройки динамического списка и перенести инициализацию полей в программный код модуля формы. Создадим элементы управления и настроим их связь с данными в событии ПриСозданииНаСервере.

Посмотрим на пример реализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Переопределяем текст запроса динамического списка
    Список.ТекстЗапроса = 
        "ВЫБРАТЬ
        |	Док.Ссылка КАК Ссылка,
        |	Док.Номер КАК Номер,
        |	Док.Дата КАК Дата,
        |	Док.Контрагент КАК Контрагент,
        |	Док.СуммаДокумента КАК СуммаДокумента
        |ИЗ
        |	Документ.ЗаказКлиента КАК Док";
    
    // Программно добавляем колонку в таблицу формы
    ТаблицаСписка = Элементы.Список;
    
    ИмяЭлемента = "СписокКонтрагент";
    Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        НовоеПоле = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаСписка);
        НовоеПоле.Вид = ВидПоляФормы.ПолеНадписи;
        НовоеПоле.ПутьКДанным = "Список.Контрагент";
        НовоеПоле.Заголовок = "Клиент";
    КонецЕсли;

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

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

Способ 2. Модификация текста через объект СхемаЗапроса

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

Проанализируем следующий пример:


&НаСервере
Процедура МодифицироватьЗапросСписка()
    
    Схема = Новый СхемаЗапроса;
    Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);
    
    // Получаем первый оператор выборки пакета
    ОператорВыборки = Схема.ПакетЗапросов[0].Операторы[0];
    
    // Добавляем новое поле в список выборки
    ОператорВыборки.ВыбираемыеПоля.Добавить("Источник.Комментарий", "Комментарий");
    
    // Возвращаем модифицированный текст обратно в динамический список
    Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
    
КонецПроцедуры

Использование объекта СхемаЗапроса гарантирует чистоту синтаксиса результирующего текста запроса и стабильную работу механизма расширений.

Способ 3. Контроль заимствования всех метаданных запроса

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

  1. Откройте дерево метаданных расширения.
  2. Убедитесь, что все таблицы (справочники, документы, регистры), к которым обращается запрос динамического списка, добавлены в расширение.
  3. Убедитесь, что реквизиты, участвующие в секциях ВЫБРАТЬ, ГДЕ и ПО, также заимствованы в расширение, включая их типы данных.

После добавления недостающих реквизитов закройте и повторно откройте форму в Конфигураторе — во многих случаях дерево реквизитов списка пересчитывается и становится доступным.

Способ 4. Временная разработка через внешний файл

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

  1. Выгрузите разрабатываемую обработку или отчет как внешний файл (.epf или .erf).
  2. Откройте этот файл в Конфигураторе отдельно от расширения. В изолированной обработке динамический список разворачивает состав полей без системных ограничений расширений.
  3. Разместите необходимые колонки на форме визуально, настройте их свойства и привязки.
  4. Скопируйте готовую форму обратно в состав метаданных вашего расширения.

Способ 5. Очистка локального кэша Конфигуратора

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

Для очистки кэша выполните следующие действия:

  1. Полностью закройте все запущенные процессы 1cv8.exe.
  2. Перейдите в системные каталоги операционной системы:
    %LOCALAPPDATA%\1C\1cv8
    %APPDATA%\1C\1cv8
  3. Удалите папки со случайными буквенно-цифровыми идентификаторами (GUID-именами).
  4. Запустите Конфигуратор и проверьте состав полей динамического списка повторно.

Таким образом, для устранения дефекта рекомендуется в первую очередь выполнить обновление платформы до актуального релиза (не ниже 8.3.27.1936). Если обновление отложено, используйте программное добавление полей через метод коллекции Элементы.Добавить() с назначением свойства ПутьКДанным.

← На главную