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

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

С выходом новых версий типовых конфигураций (ERP 2.5.22, КА 2.5.22 и др.), требующих использования платформы 8.3.27 и режима совместимости "Не использовать", многие разработчики столкнулись с серьезной проблемой. При попытке доработать динамический список в расширении — будь то заимствованная форма или новая — список доступных полей в конструкторе оказывается пустым, а существующие пути к данным в элементах формы очищаются. Рассмотрим причины этого поведения и способы борьбы с ним.

Выясняем причину: ошибка платформы №60023674

Проанализируем ситуацию: проблема не связана с ошибками в коде или некорректными действиями разработчика. Это официально признанный баг платформы 1С:Предприятие 8.3.27 (проявляется в релизах 1559, 1644 и др.). Суть ошибки заключается в том, что при указании Основной таблицы в динамическом списке расширения конфигуратор перестает видеть поля запроса. Механизм сопоставления метаданных между расширением и основной конфигурацией в этих релизах работает некорректно, что приводит к "очистке" визуального редактора.

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

Решение №1: Обновление платформы (Рекомендуемое)

Наиболее правильный и стабильный способ решить проблему — обновить платформу до релиза, в котором эта ошибка исправлена. Рассмотрим хронологию исправлений:

  1. Первые исправления появились в версии 8.3.27.1786.
  2. Для стабильной работы и корректного взаимодействия со всеми механизмами ERP рекомендуется использовать версию 8.3.27.1859 и выше.
  3. Также исправление вошло в ветку 8.5 (начиная с 8.5.1.931).

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

Решение №2: Программная модификация динамического списка

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

Рассмотрим пример, как добавить новое поле в список программно в процедуре ПриСозданииНаСервере:


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

Важный нюанс: программное изменение должно происходить после того, как отработают типовые механизмы модификации запроса. В современных конфигурациях 1С (ERP/КА) динамические списки часто перестраиваются в общем модуле ОбщегоНазначенияБПКлиентСервер или специализированных модулях списков. Проверьте, не затирает ли ваш код стандартная логика системы.

Решение №3: Тотальный захват реквизитов (Metadata Workaround)

Посмотрим на альтернативный "костыль", который помогал некоторым разработчикам на проблемных релизах платформы. Выяснилось, что если заимствовать в расширение все реквизиты объекта (включая все табличные части и стандартные реквизиты), механизм сопоставления полей динамического списка начинает работать стабильнее.

  1. Перейдите в основную конфигурацию.
  2. Найдите объект (например, документ ЗаказНаПроизводство2_2), который является основной таблицей списка.
  3. Добавьте в расширение абсолютно все его реквизиты.
  4. После этого проверьте конструктор динамического списка — поля должны появиться в списке доступных.

Внимание: этот метод сильно "раздувает" расширение и может привести к конфликтам при обновлении основной конфигурации, поэтому используйте его только как крайнюю меру.

Решение №4: Настройка свойств "Основная таблица"

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

Попробуйте выполнить следующие действия:

  1. Откройте свойства динамического списка в расширении.
  2. Временно очистите свойство Основная таблица. Посмотрите, появились ли поля из произвольного запроса.
  3. Если поля появились, попробуйте снова указать основную таблицу, но проверьте флаг Динамическое считывание данных. Значения должны строго соответствовать настройкам в основной конфигурации.
  4. Убедитесь, что включен флаг Автозаполнение доступных полей.

Рекомендации по работе в режиме "Не использовать"

Работа без режима совместимости на платформе 8.3.27 требует от разработчика повышенного внимания к типам данных. Проверьте, не изменились ли типы реквизитов в новой версии ERP на ОпределяемыеТипы. Если в запросе списка используется поле с неопределенным типом, который не был заимствован в расширение, платформа может "выкинуть" это поле из списка доступных.

Подведем итог: если вы столкнулись с пустыми полями в динамическом списке на 8.3.27 — это не ваша ошибка, а особенность платформы. Наилучшим выходом будет переход на релиз 8.3.27.1859. Если же вы ограничены в правах на обновление инфраструктуры, используйте программное создание колонок через Элементы.Добавить(), что гарантирует наличие данных в режиме "Предприятие" в обход визуальных багов конфигуратора.

← На главную