Как реализовать загрузку реквизитов, добавленных через расширение, с помощью EnterpriseData?

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

При разработке расширений для типовых конфигураций 1С (таких как Бухгалтерия предприятия 3.0, ERP или Управление торговлей) мы часто сталкиваемся с необходимостью добавить новые реквизиты в существующие справочники или документы. Однако стандартный механизм обмена EnterpriseData (универсальный формат обмена) «из коробки» не видит эти поля. Рассмотрим подробнее, почему это происходит и как правильно настроить систему, чтобы данные успешно передавались и загружались.

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

Механизм EnterpriseData базируется на технологии XDTO (XML Data Transfer Objects). Каждый объект в XML-файле должен соответствовать строго определенной схеме (пакету XDTO). Когда вы добавляете реквизит в расширение, он появляется в базе данных, но не добавляется автоматически в описание формата EnterpriseData. Система сериализации при чтении XML-файла просто «не узнает» ваше новое поле и игнорирует его, так как оно отсутствует в метаданных соответствующей версии формата (например, 1.20).

Проанализируем ситуацию: для решения задачи недостаточно просто добавить поле в объект 1С. Нам необходимо выполнить два ключевых этапа:

  1. Расширить схему XDTO, чтобы система понимала новое поле в структуре XML.
  2. Программно описать передачу данных из XML в объект 1С при загрузке (и наоборот при выгрузке).

Шаг 1. Создание и настройка расширения пакета XDTO

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

  1. Создадим в нашем расширении новый Пакет XDTO.
  2. Важнейший момент: в поле Пространство имен (Namespace) мы должны указать именно ту ссылку, которая используется в целевой версии формата. Например, для версии 1.20 это будет http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.20.
  3. Найдем в списке типов пакета нужный нам объект, например, Справочник.Номенклатура. Нам нужно добавить в него свойство, соответствующее нашему новому реквизиту.
  4. Добавляем свойство (например, MYID). Установим для него тип string (из стандартного пространства имен http://www.w3.org/2001/XMLSchema).
  5. Обратите внимание на настройки границ: параметр Минимальное количество (Lower bound) обязательно установим в значение 0. Это позволит системе корректно обрабатывать файлы, в которых этого реквизита может не быть (например, если данные приходят из систем, которые еще не знают о вашем расширении).

Выясним причину, по которой регистр важен: XML крайне чувствителен к написанию тегов. Если в пакете свойство называется MYID, то и в файле оно должно быть строго в таком регистре. Использование myid приведет к тому, что значение будет проигнорировано.

Шаг 2. Программная обработка данных в менеджере обмена

После того как схема XDTO расширена, система начнет «видеть» поле в XML, но она всё еще не знает, что с ним делать. Теперь нам нужно вмешаться в процесс обработки данных. В конфигурациях на базе БСП (Библиотека стандартных подсистем) логика обмена сосредоточена в общем модуле МенеджерОбменаЧерезУниверсальныйФормат (или аналогичных модулях в зависимости от версии).

Рассмотрим, как реализовать загрузку данных с помощью обработчика в расширении. Нам потребуется создать перехватчик для метода ППО_ПриЧтенииДанныхXDTO. Посмотрим на пример кода:


&После("ППО_ПриЧтенииДанныхXDTO")
Процедура Расш1_ППО_ПриЧтенииДанныхXDTO(ДанныеXDTO, ДанныеОбъекта, КомпонентОбмена)
    
    // Проверяем тип объекта, который загружается
    Если ДанныеXDTO.Тип().Имя = "Справочник.Номенклатура" Тогда
        
        // Проверяем наличие нашего свойства в XML-данных
        Если ДанныеXDTO.Свойства().Свойство("MYID") Тогда
            // Записываем значение в структуру ДанныеОбъекта
            // Эти данные позже будут автоматически перенесены в реквизит объекта
            ДанныеОбъекта.Вставить("MYID", ДанныеXDTO.MYID);
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Аналогично, если нам нужно выгружать данные из 1С во внешнюю систему, мы должны использовать обработчик ППО_ПриОтправкеДанныхXDTO. Проанализируем пример выгрузки:


&После("ППО_ПриОтправкеДанныхXDTO")
Процедура Расш1_ППО_ПриОтправкеДанныхXDTO(ДанныеИБ, ДанныеXDTO, КомпонентОбмена)
    
    Если ДанныеXDTO.Тип().Имя = "Справочник.Номенклатура" Тогда
        
        // Получаем значение из реквизита объекта в базе 1С
        Если ДанныеИБ.Свойство("MYID") Тогда
            ДанныеXDTO.Вставить("MYID", ДанныеИБ.MYID);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Важные технические нюансы и советы

При работе с расширениями EnterpriseData следует помнить о нескольких критических моментах:

Альтернативный вариант: Дополнительные реквизиты (БСП)

Если вам нужно добавить реквизит «быстро» и без программирования XDTO, можно рассмотреть использование стандартного механизма Дополнительных реквизитов и сведений (БСП). EnterpriseData умеет передавать их автоматически.

Рассмотрим подробнее этот вариант:

В XML-файле EnterpriseData существует специальный узел ДополнительныеРеквизиты. Если вы добавите реквизит через пользовательский интерфейс 1С, он попадет в этот блок в виде коллекции «Ключ-Значение». Плюс этого метода в том, что не нужно снимать конфигурацию с поддержки или писать код в расширении. Минус — структура XML становится сложнее для парсинга внешней системой (не на базе 1С), так как значение лежит не в корне объекта, а внутри коллекции.

Выясним, какой путь лучше: для глубокой интеграции с внешними системами и сторонним ПО правильнее использовать метод с XDTO-пакетами, так как это создает чистую и понятную структуру XML. Для внутренних обменов между базами 1С часто достаточно дополнительных реквизитов.

Таким образом, мы разобрали основной механизм работы с расширениями в контексте EnterpriseData. Понимая принципы работы XDTO и зная точки входа в модулях обмена (ППО_ПриЧтенииДанныхXDTO), вы сможете передавать любые данные, не нарушая целостность основной конфигурации.

← На главную