При разработке функционала интеграции нередко возникает задача добавить собственный план обмена через расширение конфигурации. Однако разработчики сталкиваются с неприятным поведением: план обмена создан, реквизиты и табличные части добавлены, но при попытке сконструировать форму узла основной реквизит Объект оказывается пустым. В дереве реквизитов формы отсутствуют добавленные поля, а при попытке программно связать элемент формы через свойство ПутьКДанным платформа выдает ошибку о том, что реквизит не найден.
Проанализируем причины такого поведения платформы 1С:Предприятие 8.3 и разберем способы решения и обхода этой проблемы.
Выясним причину, почему редактор формы не видит реквизиты собственного объекта расширения:
Объект формы попросту не заполняется дочерними элементами.Рассмотрим основной способ решения, если проблема вызвана платформенным багом. Начиная с релиза 8.3.27.1935, ошибка отображения реквизитов объектов расширения в управляемых формах была исправлена. Если вы работаете на платформе ветки 8.3.27 более ранней сборки, рекомендуется выполнить обновление технологической платформы до актуального стабильного релиза.
Разберем по шагам последовательность действий, которая помогает устранить коллизии кэша метаданных в среде разработки:
/ClearCache).Если обновление платформы в текущий момент невозможно, а привязка через Объект.ИмяРеквизита не работает даже в рантайме, применим проверенный обходной путь с независимыми реквизитами формы. Рассмотрим подробнее, как это реализовать.
Вместо использования реквизитов объекта напрямую создадим на форме узла отдельные реквизиты (в корне дерева реквизитов формы), например, ДатаНачалаВыгрузки. Свяжем элементы управления на форме с этими реквизитами, а синхронизацию данных с реальным узлом реализуем в коде формы.
Посмотрим на пример серверных процедур в модуле формы узла:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Считываем значения из реального объекта в реквизиты формы
ТекущийУзел = РеквизитФормыВЗначение("Объект");
ЭтаФорма.ДатаНачалаВыгрузки = ТекущийУзел.ДатаНачалаВыгрузкиДокументов;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Заполняем реквизиты объекта значениями из реквизитов формы перед фиксацией
ТекущийОбъект.ДатаНачалаВыгрузкиДокументов = ЭтаФорма.ДатаНачалаВыгрузки;
КонецПроцедуры
С помощью функций РеквизитФормыВЗначение и передачи контекста в параметр ТекущийОбъект мы полностью обходим некорректную работу визуального дизайнера формы с метаданными расширения.
Проанализируем другие подходы, если вы проектируете интеграцию через расширение:
ПланОбменаСсылка.<ИмяПланаОбмена>, а ресурсами — все необходимые параметры выгрузки. Это избавляет от необходимости часто менять структуру самого плана обмена.Важное ограничение: помните, что собственный план обмена, добавленный в расширении, принципиально не поддерживает функционал распределенных информационных баз (РИБ) и предназначен только для универсального обмена данными, веб-сервисов или прямых интеграций.