Конвертация данных 1С (КД) — отдельная конфигурация фирмы «1С» для разработки правил обмена между базами 1С:Предприятия с разными конфигурациями. Сама она данные не переносит: правила исполняет обработка обмена или модуль менеджера обмена в рабочей базе. Ниже — различия КД 2 и КД 3, жизненный цикл правил, код обработчиков, отладка и ошибки.
Обзор способов обмена — в статье про обмен данными, настройка синхронизации для пользователя — в отдельной статье. Имена типовых процедур сверены с КА 2.5.20 на БСП 3.1.10.
Если вторая сторона — не 1С, КД не нужна, нужен API 1С.
У конфигурации две версии, и это разные инструменты. КД 2 (редакция 2.1) сопоставляет метаданные двух конкретных конфигураций. КД 3 (редакции 3.0 и 3.1) сопоставляет одну конфигурацию с форматом EnterpriseData — XDTO-пакетом, который понимают обе стороны (основы — в статье про XDTO).
| КД 2 | КД 3 | |
|---|---|---|
| Что сопоставляется | Источник и приемник | Своя конфигурация и EnterpriseData |
| Результат | XML-файл правил | Текст общего модуля — менеджера обмена |
| Кто исполняет | Универсальный обмен данными или синхронизация БСП | Подсистема «Обмен данными» БСП |
| Обработчики | Текст в правилах, выполняется через Выполнить() | Процедуры общего модуля |
| Направление | Один файл — одно направление | Отправка и получение в одном модуле |
| После обновления | Сверять правила со структурой обеих баз | Типовой модуль обновляет 1С, свои правки — в расширении |
Как выбрать. Обе программы — свежие типовые с EnterpriseData: КД 3. Каждая база отвечает за свою половину обмена, обновление одной стороны не ломает другую. Для точечной правки типового обмена сама КД 3 часто не нужна — код пишут сразу в расширении; КД 3 нужна, когда менеджер обмена пишут с нуля для своей конфигурации на БСП. Хотя бы одна база старая или самописная — КД 2: она свяжет что угодно, но каждое обновление любой стороны означает сверку правил, то есть постоянные расходы. А если типовая синхронизация переносит все нужное, КД не нужна вовсе.
В БСП правила КД 2 работают и внутри синхронизации: так в КА 2.5 устроены обмены с ЗУП 2.5 и Документооборотом 2.0 (макеты ПравилаОбмена и ПравилаРегистрации у планов обмена). Регистр ПравилаДляОбменаДанными хранит источник правил — макет или файл, поэтому доработанные правила загружают без снятия с поддержки.
Обе версии КД 1С распространяет через портал обновлений, нужна подписка ИТС.
Обработчик КД 2 — фрагмент кода в поле события правила. Обработка выполняет его через Выполнить() внутри своей процедуры. Рассчитывайте только на переменные события (для ПКО «Перед выгрузкой» — Источник, Приемник, Отказ, ИмяПКО, РежимЗаписи и еще десяток) и общую структуру Параметры: в режиме отладки другие не видны. Имена объектов условные.
// Фрагменты для полей событий в правилах КД 2. Это не процедуры:
// обработка выполняет текст через Выполнить(), рассчитывайте только
// на переменные события и структуру Параметры. Имена объектов условные.
// ===== ПВД «Реализации», событие «Перед выгрузкой» (база-источник) =====
// Объект — документ из выборки, ИмяПКО — правило, по которому он уйдет.
Если Не Объект.Проведен И Не Параметры.ВыгружатьНепроведенные Тогда
Отказ = Истина;
ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийРеализации.Услуги Тогда
// В приемнике услуги — отдельный документ: выгружаем по другому ПКО.
ИмяПКО = "РеализацияУслуг";
ИначеЕсли Объект.Товары.Количество() = 0 Тогда
Отказ = Истина;
КонецЕсли;
// ===== ПКО «РеализацияТоваров», событие «Перед выгрузкой» =====
// Источник — документ или ссылка на него, если он выгружается из другого объекта.
// Отказ здесь отрезал бы и такие ссылки, поэтому фильтры живут в ПВД.
Если Источник.Проведен Тогда
РежимЗаписи = "Проведение"; // приемник проведет документ при загрузке
Иначе
РежимЗаписи = "Запись";
КонецЕсли;
// ===== ПКС «Комментарий» (источник не задан), событие «Перед выгрузкой» =====
// Присвоенное Значение уходит в приемник, реквизит источника не читается.
Значение = СтрШаблон("Из учетной базы: %1 от %2",
Источник.Номер, Формат(Источник.Дата, "ДЛФ=D"));
// ===== ПКО «Контрагенты», событие «После загрузки» (база-приемник) =====
// Объект еще не записан; ОбъектНайден = Истина, если элемент уже был в базе.
// Новых контрагентов складываем в группу «Из обмена», найденные не трогаем.
Если Не Параметры.Свойство("ГруппаИзОбмена") Тогда
// Кэш на весь сеанс загрузки: группу ищем один раз, а не для каждого элемента.
Группа = Справочники.Контрагенты.НайтиПоНаименованию("Из обмена", Истина);
Параметры.Вставить("ГруппаИзОбмена",
?(ЗначениеЗаполнено(Группа) И Группа.ЭтоГруппа, Группа, Неопределено));
КонецЕсли;
Если Не ОбъектНайден И Не Объект.ЭтоГруппа
И Параметры.ГруппаИзОбмена <> Неопределено Тогда
Объект.Родитель = Параметры.ГруппаИзОбмена;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.НаименованиеПолное) Тогда
Объект.НаименованиеПолное = Объект.Наименование;
КонецЕсли;
Отказ = Истина в ПВД снимает с выгрузки сам документ. То же в ПКО отрезает объект и там, где он выгружается ссылкой из другого объекта, — реквизит в приемнике окажется пустым.ИмяПКО = "РеализацияУслуг" — ПВД выбирает правило конвертации для конкретного объекта.РежимЗаписи = "Проведение" уходит в файл атрибутом объекта, и приемник проводит документ при загрузке.Значение, реквизит источника не читается.ВыгружатьНепроведенные объявляйте в правилах с типом Булево: без типа он придет как Неопределено, и Не упадет с ошибкой преобразования.ОбъектМодифицирован уже равен Истина — объект запишется; Отказ = Истина отменяет запись.Для выгрузки по расписанию обработку создают на сервере и заполняют ее реквизиты, как это делает форма (имена сверены с обработкой из КА 2.5).
// Общий модуль ОбменПравиламиКД2 (флажок «Сервер»): обмен по правилам КД 2
// без формы, например из регламентного задания. Пути к файлам — на сервере 1С.
// Обработка «Универсальный обмен данными в формате XML» входит в КА 2.5;
// в базе без нее используйте внешнюю V8Exchan83.epf из комплекта КД 2.
Процедура ВыгрузитьПоПравиламКД2(ИмяФайлаПравил, ИмяФайлаОбмена, НачалоПериода, КонецПериода) Экспорт
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = ИмяФайлаПравил;
Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
Обработка.ДатаНачала = НачалоПериода;
Обработка.ДатаОкончания = КонецПериода;
Обработка.ИмяФайлаПротоколаОбмена = ИмяФайлаОбмена + ".log";
Обработка.ЭтоИнтерактивныйРежим = Ложь;
// Правила читаем заранее: таблицу параметров заполняет именно чтение правил.
Обработка.ЗагрузитьПравилаОбмена();
Если Обработка.ФлагОшибки Тогда
ВызватьИсключение СтрШаблон("Не удалось прочитать правила обмена %1", ИмяФайлаПравил);
КонецЕсли;
// Строка в таблице есть, только если параметр в правилах устанавливается в диалоге.
Обработка.УстановитьЗначениеПараметраВТаблице("ВыгружатьНепроведенные", Ложь);
// Ошибки обработчиков методы не выбрасывают, а пишут в протокол.
Обработка.ВыполнитьВыгрузку();
Если Обработка.ФлагОшибки Тогда
ВызватьИсключение СтрШаблон("Выгрузка завершилась с ошибками, протокол: %1",
Обработка.ИмяФайлаПротоколаОбмена);
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьПоПравиламКД2(ИмяФайлаОбмена) Экспорт
// Файл правил не нужен: КД 2 записывает правила в начало файла обмена.
// Объект обработки — новый на каждую операцию: после загрузки он без
// повторного чтения правил выгружать откажется.
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Загрузка";
Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
Обработка.ИмяФайлаПротоколаОбмена = ИмяФайлаОбмена + ".import.log";
Обработка.ЭтоИнтерактивныйРежим = Ложь;
Обработка.ИспользоватьТранзакции = Истина;
Обработка.ВыполнитьЗагрузку();
Если Обработка.ФлагОшибки Тогда
ВызватьИсключение СтрШаблон("Загрузка завершилась с ошибками, протокол: %1",
Обработка.ИмяФайлаПротоколаОбмена);
КонецЕсли;
КонецПроцедуры
Типовой модуль менеджера обмена не правят: обновление перезапишет правку. Общий модуль заимствуют в расширение (в КА 2.5 — МенеджерОбменаЧерезУниверсальныйФормат) и перехватывают нужные процедуры, в том числе неэкспортные. Сигнатуры обработчиков — в комментарии листинга ниже. Фильтр отправки: номенклатуру с признаком из расширения в бухгалтерию не отправляем.
// Расширение с префиксом Расш1_, заимствован общий модуль
// МенеджерОбменаЧерезУниверсальныйФормат (имена сверены с КА 2.5.20, БСП 3.1.10).
// Сигнатуры обработчиков в этом модуле:
// ПОД ПриОбработке, отправка: (ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
// ПОД ПриОбработке, получение: (ДанныеXDTO, ИспользованиеПКО, КомпонентыОбмена)
// ПКО ПриОтправкеДанных: (ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
// ПКО ПриКонвертацииДанныхXDTO: (ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
// ПКО ПередЗаписьюПолученныхДанных:
// (ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
// В справочник Номенклатура расширение добавляет реквизит
// Расш1_НеВыгружатьВБухгалтерию (Булево).
&После("ПОД_Справочник_Номенклатура_Отправка_ПриОбработке")
Процедура Расш1_ПОД_Справочник_Номенклатура_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
// Типовой код уже выбрал ПКО: для группы или для элемента.
Если ДанныеИБ.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
// Ключ проверяем: в новом релизе ПКО могут переименовать.
Если ИспользованиеПКО.Свойство("Справочник_Номенклатура_Отправка")
И ДанныеИБ.Расш1_НеВыгружатьВБухгалтерию Тогда
ИспользованиеПКО.Справочник_Номенклатура_Отправка = Ложь;
КонецЕсли;
КонецПроцедуры
Получение: обмен не должен затирать полное наименование и описание, которые правят в этой базе.
// Тот же модуль расширения: получение номенклатуры.
&После("ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных")
Процедура Расш1_ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
// ДанныеИБ = Неопределено — элемента в базе нет, создается новый.
// ПолученныеДанные = Неопределено — загрузку уже отменил типовой код.
Если ДанныеИБ = Неопределено Или ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// После обработчика БСП скопирует в ДанныеИБ все свойства из ПКС.
// Чтобы правка, сделанная в этой базе, уцелела, кладем ее в ПолученныеДанные.
Если ЗначениеЗаполнено(ДанныеИБ.НаименованиеПолное) Тогда
ПолученныеДанные.НаименованиеПолное = ДанныеИБ.НаименованиеПолное;
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеИБ.Описание) Тогда
ПолученныеДанные.Описание = ДанныеИБ.Описание;
КонецЕсли;
КонецПроцедуры
Правило без типового обработчика — перехватывать нечего, назначаем свой.
// Тот же модуль расширения. У ПКО «Справочник_ЦеновыеГруппы» в типовом
// менеджере обработчиков нет, перехватывать нечего: назначаем свой.
&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура Расш1_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации)
Если НаправлениеОбмена <> "Получение" Тогда
Возврат;
КонецЕсли;
Правило = ПравилаКонвертации.Найти("Справочник_ЦеновыеГруппы", "ИмяПКО");
Если Правило = Неопределено Тогда
Возврат; // правило переименовали в новом релизе — доработку пора проверить
КонецЕсли;
Если ЗначениеЗаполнено(Правило.ПередЗаписьюПолученныхДанных) Тогда
// Появился типовой обработчик: его перехватывают через &После, а не заменяют.
ЗаписьЖурналаРегистрации("Расш1.ОбменДанными", УровеньЖурналаРегистрации.Предупреждение, , ,
"У ПКО Справочник_ЦеновыеГруппы появился типовой обработчик, доработка не подключена");
Возврат;
КонецЕсли;
Правило.ПередЗаписьюПолученныхДанных = "Расш1_ЦеновыеГруппы_ПередЗаписьюПолученныхДанных";
КонецПроцедуры
&Перед("ВыполнитьПроцедуруМодуляМенеджера")
Процедура Расш1_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры)
// Типовой диспетчер вызывает обработчики через Если...ИначеЕсли без ветки
// Иначе: имя из расширения он молча пропустит, поэтому вызываем сами.
Если ИмяПроцедуры = "Расш1_ЦеновыеГруппы_ПередЗаписьюПолученныхДанных" Тогда
Расш1_ЦеновыеГруппы_ПередЗаписьюПолученныхДанных(Параметры.ПолученныеДанные,
Параметры.ДанныеИБ, Параметры.КонвертацияСвойств, Параметры.КомпонентыОбмена);
КонецЕсли;
КонецПроцедуры
Процедура Расш1_ЦеновыеГруппы_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
// Ценовые группы ведутся в этой базе: новых из обмена не создаем,
// у найденных оставляем свое наименование.
Если ДанныеИБ = Неопределено Тогда
ПолученныеДанные = Неопределено;
Иначе
ПолученныеДанные.Наименование = ДанныеИБ.Наименование;
КонецЕсли;
КонецПроцедуры
ИспользованиеПКО — структура «имя ПКО → Булево»; Ложь — объект по этому правилу не уйдет. Фильтр действует во всех обменах через EnterpriseData этой базы; если корреспондентов несколько, проверяйте КомпонентыОбмена.УзелКорреспондента.ПолученныеДанные, — так написаны и типовые обработчики с пометкой «не перезаполнять».ПолученныеДанные = Неопределено для ненайденного объекта — он не создается; так же типовой код поступает с банками без кода. Ссылки на него в загружаемой номенклатуре останутся пустыми.ВыполнитьПроцедуруМодуляМенеджера не знает имен из расширения и пропускает их молча (ветки Иначе в нем нет), поэтому нужен перехват &Перед; ПродолжитьВызов не требуется.ЗаполнитьПравилаКонвертацииОбъектов, поэтому имя, записанное в &После, подхватится.КД 2. Отладчик в текст правил не заходит. В обработке «Универсальный обмен данными в формате XML» включите «Режим отладки обработчиков выгрузки» (или загрузки) и откройте «Настройка отладки выгрузки...». Помощник в четыре шага: выбрать режим отладки алгоритмов (например, «Вызывать алгоритмы как процедуры»), сформировать модуль отладки, вставить его в новую внешнюю обработку и указать путь к ней на сервере. Дальше — обычные точки останова. Каждый обработчик становится процедурой с параметрами события: обращение к переменной вне этого списка и переменных модуля отладки не скомпилируется.
КД 3. Обработчики — процедуры модуля или расширения, точки останова ставятся прямо в них. Синхронизация БСП идет фоновым заданием — включите автоподключение предмета «Фоновое задание» (см. статью об отладке). Правила на паре объектов удобно проверять обработкой «Выгрузка загрузка EnterpriseData» на копии базы.
Внешний модуль отладки свежая БСП не подключает: в КА 2.5 и эта обработка с путем к внешнему менеджеру, и синхронизация по правилам КД 2 с отладкой обработчиков отвечают «Внешняя обработка отладки, загружаемая из файла на диске, не поддерживается.» Такие правила КД 2 отлаживайте отдельной обработкой универсального обмена.
Да. В комплекте КД 2.1 есть обработки обмена и выгрузки структуры для 8.3, 8.2 и 7.7, так что данные переносят из любой конфигурации 1С 8 и даже из 7.7.
Для EnterpriseData — да, расширением, как в примерах выше. Правила КД 2 в синхронизации БСП загружают из файла: источник правил хранится в регистре ПравилаДляОбменаДанными.
В КД 2 ПОД — правила очистки данных (удаление объектов в приемнике), в КД 3 — правила обработки данных: какие объекты и по каким ПКО обрабатывать. По смыслу им ближе ПВД из КД 2.
Смотрите на год издания: материал по редакции 2 к КД 3 почти не применим. Надежнее документация на ИТС и справка конфигурации. Для КД 3 лучший учебник — типовой модуль менеджера обмена: в КА 2.5 в нем больше 500 правил конвертации объектов.
Если в команде никто не работал с КД или обмен ломается после каждого обновления, дешевле отдать задачу программисту, который делает это регулярно. Опишите базы и что должно передаваться и разместите задачу бесплатно — оценка бесплатная, ответ в течение рабочего дня. Все направления работ — на странице услуг.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.