При активной разработке в расширениях конфигурации разработчики периодически сталкиваются с ситуацией, когда динамический список с произвольным запросом перестает отображать свои поля в дереве реквизитов формы в Конфигураторе. Пиктограмма разворачивания узла («плюсик») либо отсутствует вовсе, либо при раскрытии список дочерних колонок оказывается абсолютно пустым. Из-за этого невозможно перетащить поля в элементы формы визуальным способом.
В этой статье мы подробно проанализируем причины такого поведения платформы, рассмотрим зарегистрированную ошибку 1С и изучим надежные обходные пути (workarounds), позволяющие продолжить разработку даже без немедленного обновления платформы.
Разберем природу этого дефекта. Проблема была официально зарегистрирована фирмой «1С» под номером 60027315. Ее корень заключается в сбое механизма внутреннего кэширования метаданных Конфигуратора при работе с расширениями.
Выделим ключевые особенности проявления ошибки:
Данная ошибка затронула сборки линеек 8.3.27 (в частности, 8.3.27.1859) и предварительные версии 8.5. Ошибка полностью исправлена начиная с версии платформы 8.3.27.1936. Если у вас есть возможность обновить платформу, установка релиза 8.3.27.1936 или выше устраняет проблему сразу.
Если обновление платформы не помогло или вы работаете на других версиях, выясним другие типичные факторы, из-за которых парсер Конфигуратора не может отобразить поля списка в расширении:
Рассмотрим по шагам все способы решения задачи, если обновление платформы в текущий момент невозможно.
Наиболее надежный и универсальный метод обойти любые визуальные сбои Конфигуратора — отказаться от интерактивной настройки динамического списка и перенести инициализацию полей в программный код модуля формы. Создадим элементы управления и настроим их связь с данными в событии ПриСозданииНаСервере.
Посмотрим на пример реализации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Переопределяем текст запроса динамического списка
Список.ТекстЗапроса =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Контрагент КАК Контрагент,
| Док.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.ЗаказКлиента КАК Док";
// Программно добавляем колонку в таблицу формы
ТаблицаСписка = Элементы.Список;
ИмяЭлемента = "СписокКонтрагент";
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
НовоеПоле = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаСписка);
НовоеПоле.Вид = ВидПоляФормы.ПолеНадписи;
НовоеПоле.ПутьКДанным = "Список.Контрагент";
НовоеПоле.Заголовок = "Клиент";
КонецЕсли;
КонецПроцедуры
В этом случае платформа на стороне сервера свяжет ПутьКДанным с реальным полем выборки, и таблица корректно отобразит данные пользователю в режиме «1С:Предприятие».
Если динамический список уже содержит базовый запрос, а в расширении требуется лишь добавить дополнительные колонки или условия, правильнее использовать объект СхемаЗапроса. Это исключает ручные ошибки синтаксиса и позволяет платформе корректно перестроить метаданные динамического списка.
Проанализируем следующий пример:
&НаСервере
Процедура МодифицироватьЗапросСписка()
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);
// Получаем первый оператор выборки пакета
ОператорВыборки = Схема.ПакетЗапросов[0].Операторы[0];
// Добавляем новое поле в список выборки
ОператорВыборки.ВыбираемыеПоля.Добавить("Источник.Комментарий", "Комментарий");
// Возвращаем модифицированный текст обратно в динамический список
Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
КонецПроцедуры
Использование объекта СхемаЗапроса гарантирует чистоту синтаксиса результирующего текста запроса и стабильную работу механизма расширений.
Разберем обязательное правило разработки расширений: если в произвольном запросе динамического списка фигурируют объекты основной конфигурации, проверьте контекст расширения.
ВЫБРАТЬ, ГДЕ и ПО, также заимствованы в расширение, включая их типы данных.После добавления недостающих реквизитов закройте и повторно откройте форму в Конфигураторе — во многих случаях дерево реквизитов списка пересчитывается и становится доступным.
Когда речь идет о добавлении новой функциональности в отчеты или обработки, часто выручает промежуточная разработка во внешнем файле:
.epf или .erf).Если сбой дерева реквизитов произошел сразу после смены версии платформы, обязательно очистите пользовательские каталоги кэша. Платформа 1С сохраняет промежуточные бинарные описания структур форм, которые при несовпадении версий мешают перестроению дерева реквизитов.
Для очистки кэша выполните следующие действия:
1cv8.exe.%LOCALAPPDATA%\1C\1cv8
%APPDATA%\1C\1cv8Таким образом, для устранения дефекта рекомендуется в первую очередь выполнить обновление платформы до актуального релиза (не ниже 8.3.27.1936). Если обновление отложено, используйте программное добавление полей через метод коллекции Элементы.Добавить() с назначением свойства ПутьКДанным.