Тестовая площадка: Управление торговлей, редакция 11 (11.4.3.126), версия платформы 8.3.11
Обмен через универсальный формат широко используется в типовых конфигурациях. Для ознакомления есть хорошая статья //infostart.ru/public/695523/, также множество различных курсов, в которых разложены основные моменты по работе с правилами конвертации, синхронизации объектов метаданных.
Основной принцип создания "нестандартных" правил обмена заключается в доработке модуля "МенеджерОбменаЧерезУниверсальныйФормат" (в различных конфигурациях название может немного отличаться). Но что делать, если в компании участвуют несколько баз данных — стандартных, самописных (неважно), между которыми идет активный обмен данными EnterpriseData — и на каждый узел обмена могут действовать свои специфические правила?
В данном случае удобно использовать механизм расширений конфигурации — и если требуется организовать специфичные правила обмена, тогда в конфигурации создается отдельное расширение о обмену.
Рассмотрим пример передачи данных из базы УТ 11.3 в идентичную по структуре базу данных "Дочерняя УТ 11.3".
Постановка задачи: в основной базе данных производятся продажи товаров специфическому контрагенту, который является "дочерней фирмой" по отношению к основной. Необходимо реализовать "одностороннее" правило обмена "Реализации товаров и услуг -> Поступления товаров и услуг" по контрагенту с фиксированным ИНН.
Сокращения:
ЦБ — база-источник УТ 11.3, из которой идет выгрузка документов "Реализации товаров и услуг"
УТ — база приемник, в которой при обмене создаются "Поступления товаров"
ED — универсальный обмен (EnterpriseData)
В базе ЦБ создаются и проводятся "Реализации товаров" — и после проведения регистрируются в обмене ED, далее происходит обмен (через фоновое задание, либо вручную через каталог обмена). В при этом документ "Реализация товаров" должен "превратиться" в "Поступление товаров и услуг", а контрагент и организация "поменяться местами".
Как настраивать синхронизацию данных по плану обмена описано не будет — для этого существует множество различных статей. Переходим непосредственно к созданию правил обмена.
Предположим, что у нас настроен обмен, при котором главный узел организации-источника имеет код "ЦБ", а узел приемника код "УТ".
База-источник:
База-приемник:
Для начала создадим расширение конфигурации: назовем его, для примера "РасширениеОбмен" — и добавим модули, которые нам нужны для решения задачи.
1.Установка активного узла обмена в параметре сеанса. К сожалению, в процессе обмена не всегда можно получить активный узел, для которого происходит обмен. В процессе самого обмена данными структура данных "КомпонентыОбмена", содержащая все настройки обмена ED (в том числе ссылку на узел обмена) доступна не в каждой процедуре при обмене данными: например, при непосредственном заполнении перечня правил обмена "МенеджерОбменаЧерезУниверсальныйФормат.ЗаполнитьПравилаОбработкиДанных" этой переменной в параметрах нет.
На этапе инициализации обмена данными установим код узла обмена в параметры сеанса:
&Перед("ИнициализироватьТаблицыПравилОбмена")
Процедура РасшОбмен_ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена) Экспорт
Если КомпонентыОбмена.УзелКорреспондента <> Неопределено Тогда
Буф = Новый Структура(ПараметрыСеанса.БуферОбмена);
Буф.Вставить("КомпонентыОбмена_УзелКорреспондента_Код", КомпонентыОбмена.УзелКорреспондента.Код);
ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(Буф);
КонецЕсли;
КонецПроцедуры
2. Регистрация объектов. Также необходимо выделить перечень объектов, необходимых для регистрации в нужном нам узле универсального обмена. Это можно сделать, отредактировав правила регистрации объектов с использованием конфигурации "Конвертер 2.1", но в случае с расширением достаточно переопределить работу функции, разбирающей правила регистрации. В задании для нашего узла обмена нам нужны совсем "немногие" ссылки на объекты, остальное необходимо "отсечь".
Регистрироваться будет документ "Реализации товаров и услуг" и некоторые входящие в него ссылки: организация, контрагент, валюта, склад.
Код изменения правил регистрации объектов
Также создана простая дополнительная процедура, которая "собирает" все подчиненные ссылки объекта в массив
Процедура сбора подчиненных ссылок объекта
3. Создание правил отправки данных. Все правила конвертации/отправки/получения данных находятся в модуле "МенеджерОбменаЧерезУниверсальныйФормат". Данный модуль содержит множество стандартных правил обмена — необходимо добавить к ним несколько "своих" правил конвертации. Новых правил можно выделить 3:
- Реализация товаров, услуг -> Поступление товаров,услуг
- Организации -> Контрагенты
- Контрагенты -> Организации
Для создания правил можно использовать конфигурацию "Конвертер 3.0", но в целом можно просто использовать функции из типового модуля МенеджерОбменаЧерезУниверсальныйФормат как шаблоны методом "копи-пасты".
В результате получилась область с набором процедур следующего вида:
«Но что делать, если в компании участвуют несколько баз данных — стандартных, самописных (неважно), между которыми идет активный обмен данными EnterpriseData — и на каждый узел обмена могут действовать свои специфические правила?»
Обычно в таких случаях модуль обмена помещаем в модуль внешней обработки,
и при настройке обмена указываем путь к ней. Разве так не проще?
Изначально так и делалось, только с отладкой «замучался» — пока не знаю способа отладки внешней обработки в режиме «Подключить». Принцип одинаковый, но имхо через расширение в разы удобнее делать, если совместимость конфы позволяет 🙂
Я тоже с этим столкнулась. Не понимаю, почему в узел нельзя добавить какой нибудь реквизит, чтобы обозначить по какой конвертации он работает — 2й или 3ей?
План обмена полный может быть один (регистрируются все). А узлы по одному переводить правильнее (разные релизы периферийных баз могут же быть).
(2) В этой статье указана ссылка на статью, где описано как отлаживать внешние обработки с правилами. 😉
(1) мне на партнерском портале отвечали что в новых версия так уже не прокатит — типа юзайте расширения 🙂
спасибо за идею, как раз нужно почти тоже самое. но гонять каждый раз ссылочные данные документов (номенклатуру, контрагенты и т.д.) избыточно.
Подскажите пожалуйста, в
в месте:
Показать
в чем смысл этой строки?
(7) Цель — собрать все ссылки внутри номенклатуры, чтобы в приемнике не было «сюрпризов» вида «<Объект не найден…>» внутри карточки товара и всех объектов по цепочке. Возможно там ошибка в коде «ТекСтрока.Номенклатура.Родитель», а надо просто «ТекСтрока.Номенклатура», спасибо что заметили 😉 надо в рабочем проекте проверить…
да, я про «родителя» и написал ))
Кстати, вопрос с самого начала, у меня:
КомпонентыОбмена.УзелКорреспондента.Код равен «90af25b2-c4cc-4890-a62a-418ec3a70977», и до буквенного префикса (в отладчике смотрю) — даже не знаю как к нему подобраться.
(10) Обычно все безвыходные ситуации в новых «конфах» на 8.3.10 и выше решаю расширениями: можно и процедуры переопределить и нужные реквизиты на форму выложить…
да обойти понятно как — по наименованию тому же — суть не в этом — поменялась там логика немного — ымей ввиду )