При разработке расширений для типовых конфигураций 1С (таких как Бухгалтерия предприятия 3.0, ERP или Управление торговлей) мы часто сталкиваемся с необходимостью добавить новые реквизиты в существующие справочники или документы. Однако стандартный механизм обмена EnterpriseData (универсальный формат обмена) «из коробки» не видит эти поля. Рассмотрим подробнее, почему это происходит и как правильно настроить систему, чтобы данные успешно передавались и загружались.
Механизм EnterpriseData базируется на технологии XDTO (XML Data Transfer Objects). Каждый объект в XML-файле должен соответствовать строго определенной схеме (пакету XDTO). Когда вы добавляете реквизит в расширение, он появляется в базе данных, но не добавляется автоматически в описание формата EnterpriseData. Система сериализации при чтении XML-файла просто «не узнает» ваше новое поле и игнорирует его, так как оно отсутствует в метаданных соответствующей версии формата (например, 1.20).
Проанализируем ситуацию: для решения задачи недостаточно просто добавить поле в объект 1С. Нам необходимо выполнить два ключевых этапа:
XDTO, чтобы система понимала новое поле в структуре XML.Первым делом нам нужно внести изменения в пакет XDTO. Разберем по шагам, как это сделать в расширении:
Пространство имен (Namespace) мы должны указать именно ту ссылку, которая используется в целевой версии формата. Например, для версии 1.20 это будет http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.20.Справочник.Номенклатура. Нам нужно добавить в него свойство, соответствующее нашему новому реквизиту.MYID). Установим для него тип string (из стандартного пространства имен http://www.w3.org/2001/XMLSchema).Минимальное количество (Lower bound) обязательно установим в значение 0. Это позволит системе корректно обрабатывать файлы, в которых этого реквизита может не быть (например, если данные приходят из систем, которые еще не знают о вашем расширении).Выясним причину, по которой регистр важен: XML крайне чувствителен к написанию тегов. Если в пакете свойство называется MYID, то и в файле оно должно быть строго в таком регистре. Использование myid приведет к тому, что значение будет проигнорировано.
После того как схема 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 жестко привязано к конкретной версии формата (например, 1.20). Если вы обновите конфигурацию и она перейдет на использование формата 1.21, вам придется создать аналогичное расширение и для новой версии пакета XDTO.XDTO и обеспечивать сопоставление UUID объектов. Для простых типов (строка, число, дата) вышеописанного метода достаточно.Безопасный режим, так как работа с некоторыми методами XDTO и общими модулями обмена может требовать полных прав доступа к ресурсам платформы.XDTO-пакетов появилась в платформе начиная с версии 8.3.14. Если вы используете более старую версию, рекомендуется ее обновить во избежание непредсказуемых ошибок при слиянии схем.Если вам нужно добавить реквизит «быстро» и без программирования XDTO, можно рассмотреть использование стандартного механизма Дополнительных реквизитов и сведений (БСП). EnterpriseData умеет передавать их автоматически.
Рассмотрим подробнее этот вариант:
В XML-файле EnterpriseData существует специальный узел ДополнительныеРеквизиты. Если вы добавите реквизит через пользовательский интерфейс 1С, он попадет в этот блок в виде коллекции «Ключ-Значение». Плюс этого метода в том, что не нужно снимать конфигурацию с поддержки или писать код в расширении. Минус — структура XML становится сложнее для парсинга внешней системой (не на базе 1С), так как значение лежит не в корне объекта, а внутри коллекции.
Выясним, какой путь лучше: для глубокой интеграции с внешними системами и сторонним ПО правильнее использовать метод с XDTO-пакетами, так как это создает чистую и понятную структуру XML. Для внутренних обменов между базами 1С часто достаточно дополнительных реквизитов.
Таким образом, мы разобрали основной механизм работы с расширениями в контексте EnterpriseData. Понимая принципы работы XDTO и зная точки входа в модулях обмена (ППО_ПриЧтенииДанныхXDTO), вы сможете передавать любые данные, не нарушая целостность основной конфигурации.