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

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

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

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

Анализ причин: платформенные ошибки и кэш метаданных

Выясним причину, почему редактор формы не видит реквизиты собственного объекта расширения:

  1. Ошибки релизов платформы. Проблема характерна для ряда сборок платформы (в частности, ранних релизов ветки 8.3.27), где механизм расширений некорректно передает состав метаданных собственных объектов в контекст управляемой формы. В таких сборках дерево реквизита Объект формы попросту не заполняется дочерними элементами.
  2. Свойства и режим совместимости расширения. Добавление собственных объектов метаданных, создающих таблицы в базе данных, требует, чтобы свойство расширения Назначение имело значение Адаптация или Дополнение. При назначении Исправление менять структуру данных нельзя. Кроме того, режим совместимости расширения должен строго соответствовать режиму совместимости основной конфигурации.
  3. Непримененная реструктуризация и кэш Конфигуратора. Если форма создается до того, как изменения структуры метаданных были зафиксированы в базе данных, Конфигуратор может оперировать старым описанием типа, где реквизиты еще отсутствуют.

Решение 1: Обновление платформы 1С:Предприятие

Рассмотрим основной способ решения, если проблема вызвана платформенным багом. Начиная с релиза 8.3.27.1935, ошибка отображения реквизитов объектов расширения в управляемых формах была исправлена. Если вы работаете на платформе ветки 8.3.27 более ранней сборки, рекомендуется выполнить обновление технологической платформы до актуального стабильного релиза.

Решение 2: Проверка назначения, сброс кэша и пересоздание формы

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

  1. Откроем свойства расширения и убедимся, что свойство Назначение установлено в Дополнение или Адаптация.
  2. Проверим, что Режим совместимости расширения полностью совпадает с режимом совместимости основной конфигурации.
  3. Сохраним изменения и применим конфигурацию к базе данных клавишей F7 (или запустим отладку). Структура таблиц должна фактически создаться в СУБД.
  4. Закроем Конфигуратор и очистим локальный кэш разработки (запустив 1С с параметром /ClearCache).
  5. Откроем Конфигуратор, удалим проблемную форму узла плана обмена и создадим ее заново через стандартный конструктор. При генерации на уже обновленной структуре метаданных платформа корректно выстроит дерево реквизитов.

Решение 3: Программный обход через реквизиты формы

Если обновление платформы в текущий момент невозможно, а привязка через Объект.ИмяРеквизита не работает даже в рантайме, применим проверенный обходной путь с независимыми реквизитами формы. Рассмотрим подробнее, как это реализовать.

Вместо использования реквизитов объекта напрямую создадим на форме узла отдельные реквизиты (в корне дерева реквизитов формы), например, ДатаНачалаВыгрузки. Свяжем элементы управления на форме с этими реквизитами, а синхронизацию данных с реальным узлом реализуем в коде формы.

Посмотрим на пример серверных процедур в модуле формы узла:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Считываем значения из реального объекта в реквизиты формы
    ТекущийУзел = РеквизитФормыВЗначение("Объект");
    ЭтаФорма.ДатаНачалаВыгрузки = ТекущийУзел.ДатаНачалаВыгрузкиДокументов;
    
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Заполняем реквизиты объекта значениями из реквизитов формы перед фиксацией
    ТекущийОбъект.ДатаНачалаВыгрузкиДокументов = ЭтаФорма.ДатаНачалаВыгрузки;
    
КонецПроцедуры

С помощью функций РеквизитФормыВЗначение и передачи контекста в параметр ТекущийОбъект мы полностью обходим некорректную работу визуального дизайнера формы с метаданными расширения.

Альтернативные архитектурные решения

Проанализируем другие подходы, если вы проектируете интеграцию через расширение:

  1. Хранение настроек узлов в регистре сведений. Создадим в расширении непериодический независимый регистр сведений, где ведущим измерением будет выступать ссылка на узел ПланОбменаСсылка.<ИмяПланаОбмена>, а ресурсами — все необходимые параметры выгрузки. Это избавляет от необходимости часто менять структуру самого плана обмена.
  2. Заимствование типового плана обмена. Если в конфигурации уже есть типовой план обмена, часто надежнее заимствовать его в расширение и добавить требуемые реквизиты, так как механизмы расширения базовых объектов работают стабильнее, чем полностью новые объекты.

Важное ограничение: помните, что собственный план обмена, добавленный в расширении, принципиально не поддерживает функционал распределенных информационных баз (РИБ) и предназначен только для универсального обмена данными, веб-сервисов или прямых интеграций.

← На главную