С выходом новых версий типовых конфигураций (ERP 2.5.22, КА 2.5.22 и др.), требующих использования платформы 8.3.27 и режима совместимости "Не использовать", многие разработчики столкнулись с серьезной проблемой. При попытке доработать динамический список в расширении — будь то заимствованная форма или новая — список доступных полей в конструкторе оказывается пустым, а существующие пути к данным в элементах формы очищаются. Рассмотрим причины этого поведения и способы борьбы с ним.
Проанализируем ситуацию: проблема не связана с ошибками в коде или некорректными действиями разработчика. Это официально признанный баг платформы 1С:Предприятие 8.3.27 (проявляется в релизах 1559, 1644 и др.). Суть ошибки заключается в том, что при указании Основной таблицы в динамическом списке расширения конфигуратор перестает видеть поля запроса. Механизм сопоставления метаданных между расширением и основной конфигурацией в этих релизах работает некорректно, что приводит к "очистке" визуального редактора.
Важно понимать, что в режиме "Предприятие" такой список может продолжать работать, если вы не сохраняли форму с "битыми" путями. Но как только вы открываете форму в конфигураторе и пытаетесь внести изменения, 1С не находит соответствия полей и удаляет привязки ПутьКДанным у элементов формы.
Наиболее правильный и стабильный способ решить проблему — обновить платформу до релиза, в котором эта ошибка исправлена. Рассмотрим хронологию исправлений:
После обновления платформы метаданные в расширении должны синхронизироваться. В некоторых случаях может потребоваться перевыбрать Основную таблицу в свойствах динамического списка, чтобы конфигуратор "перечитал" состав полей.
Если обновление платформы по каким-то причинам невозможно в данный момент, разберем способ обхода через программную доработку. Суть метода заключается в том, чтобы не настраивать список в конфигураторе, а изменять его текст и добавлять колонки в коде модуля формы.
Рассмотрим пример, как добавить новое поле в список программно в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Модифицируем текст запроса динамического списка
ТекстЗапроса = Список.ТекстЗапроса;
// Добавляем выборку нужного реквизита из основной таблицы
// Используем СтрЗаменить для вставки поля после ключевого слова ВЫБРАТЬ
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ Док.НовыйРеквизит КАК НовыйРеквизит,");
Список.ТекстЗапроса = ТекстЗапроса;
// Программное создание элемента формы для отображения данных
НоваяКолонка = Элементы.Добавить("СписокНовыйРеквизит", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Список.НовыйРеквизит";
НоваяКолонка.Заголовок = "Дополнительный реквизит";
КонецПроцедуры
Важный нюанс: программное изменение должно происходить после того, как отработают типовые механизмы модификации запроса. В современных конфигурациях 1С (ERP/КА) динамические списки часто перестраиваются в общем модуле ОбщегоНазначенияБПКлиентСервер или специализированных модулях списков. Проверьте, не затирает ли ваш код стандартная логика системы.
Посмотрим на альтернативный "костыль", который помогал некоторым разработчикам на проблемных релизах платформы. Выяснилось, что если заимствовать в расширение все реквизиты объекта (включая все табличные части и стандартные реквизиты), механизм сопоставления полей динамического списка начинает работать стабильнее.
ЗаказНаПроизводство2_2), который является основной таблицей списка.Внимание: этот метод сильно "раздувает" расширение и может привести к конфликтам при обновлении основной конфигурации, поэтому используйте его только как крайнюю меру.
Проанализируем ситуацию с настройками самого реквизита Список. В некоторых случаях при заимствовании формы платформа самопроизвольно меняет настройки динамического считывания данных.
Попробуйте выполнить следующие действия:
Работа без режима совместимости на платформе 8.3.27 требует от разработчика повышенного внимания к типам данных. Проверьте, не изменились ли типы реквизитов в новой версии ERP на ОпределяемыеТипы. Если в запросе списка используется поле с неопределенным типом, который не был заимствован в расширение, платформа может "выкинуть" это поле из списка доступных.
Подведем итог: если вы столкнулись с пустыми полями в динамическом списке на 8.3.27 — это не ваша ошибка, а особенность платформы. Наилучшим выходом будет переход на релиз 8.3.27.1859. Если же вы ограничены в правах на обновление инфраструктуры, используйте программное создание колонок через Элементы.Добавить(), что гарантирует наличие данных в режиме "Предприятие" в обход визуальных багов конфигуратора.