Конвертация данных 1С: КД 2 и КД 3, какую версию выбрать

Дата: 02.10.2026 22:11:30
Конвертация данных
Обмен данными
EnterpriseData
БСП
Расширение конфигурации
Программирование 1С
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

Конвертация данных 1С (КД) — отдельная конфигурация фирмы «1С» для разработки правил обмена между базами 1С:Предприятия с разными конфигурациями. Сама она данные не переносит: правила исполняет обработка обмена или модуль менеджера обмена в рабочей базе. Ниже — различия КД 2 и КД 3, жизненный цикл правил, код обработчиков, отладка и ошибки.

Обзор способов обмена — в статье про обмен данными, настройка синхронизации для пользователя — в отдельной статье. Имена типовых процедур сверены с КА 2.5.20 на БСП 3.1.10.

Когда разработчику нужна КД

  • Нетиповая база. Самописная конфигурация не знает EnterpriseData, связать ее с типовой проще правилами КД 2.
  • Перенос из старой программы (УТ 10.3, БП 2.0, УПП, 7.7), если готового переноса от 1С нет или он не подходит.
  • Доработка типового обмена. БП 3.0, УТ 11, КА 2, ERP 2 и УНФ обмениваются через EnterpriseData; свои реквизиты и фильтры добавляют по технологии КД 3.
  • Сопровождение. После обновления любой стороны правила сверяют, иначе обмен падает или теряет данные.

Если вторая сторона — не 1С, КД не нужна, нужен API 1С.

Конвертация данных 1С: чем КД 2 отличается от КД 3

У конфигурации две версии, и это разные инструменты. КД 2 (редакция 2.1) сопоставляет метаданные двух конкретных конфигураций. КД 3 (редакции 3.0 и 3.1) сопоставляет одну конфигурацию с форматом EnterpriseData — XDTO-пакетом, который понимают обе стороны (основы — в статье про XDTO).

КД 2КД 3
Что сопоставляетсяИсточник и приемникСвоя конфигурация и EnterpriseData
РезультатXML-файл правилТекст общего модуля — менеджера обмена
Кто исполняетУниверсальный обмен данными или синхронизация БСППодсистема «Обмен данными» БСП
ОбработчикиТекст в правилах, выполняется через Выполнить()Процедуры общего модуля
НаправлениеОдин файл — одно направлениеОтправка и получение в одном модуле
После обновленияСверять правила со структурой обеих базТиповой модуль обновляет 1С, свои правки — в расширении

Как выбрать. Обе программы — свежие типовые с EnterpriseData: КД 3. Каждая база отвечает за свою половину обмена, обновление одной стороны не ломает другую. Для точечной правки типового обмена сама КД 3 часто не нужна — код пишут сразу в расширении; КД 3 нужна, когда менеджер обмена пишут с нуля для своей конфигурации на БСП. Хотя бы одна база старая или самописная — КД 2: она свяжет что угодно, но каждое обновление любой стороны означает сверку правил, то есть постоянные расходы. А если типовая синхронизация переносит все нужное, КД не нужна вовсе.

Жизненный цикл правил: от КД до рабочей базы

КД 2

  1. Выгрузить структуру метаданных обеих конфигураций обработкой MD83Exp.epf из комплекта КД 2 (для 8.2 — MD82Exp.epf, для 7.7 — MD77.ert).
  2. Загрузить структуры в КД и описать правила: ПКО (конвертации объектов), ПКС (свойств), ПКЗ (значений перечислений) и ПВД (выгрузки данных — что и с каким отбором выгружать); написать обработчики.
  3. Сохранить правила в XML-файл.
  4. Выгрузить данные в источнике обработкой «Универсальный обмен данными в формате XML» (V8Exchan83.epf) и загрузить файл в приемнике. Правила пишутся в начало файла обмена, отдельный файл приемнику не нужен.
  5. После обновления любой базы — обновить ее структуру в КД, исправить и перевыгрузить правила.

В БСП правила КД 2 работают и внутри синхронизации: так в КА 2.5 устроены обмены с ЗУП 2.5 и Документооборотом 2.0 (макеты ПравилаОбмена и ПравилаРегистрации у планов обмена). Регистр ПравилаДляОбменаДанными хранит источник правил — макет или файл, поэтому доработанные правила загружают без снятия с поддержки.

КД 3

  1. Загрузить в КД 3 структуру своей конфигурации и описание формата EnterpriseData нужной версии.
  2. Описать ПОД (правила обработки данных), ПКО, ПКС и ПКПД для предопределенных значений — отдельно для отправки и получения, только свою половину обмена.
  3. Сформировать модуль менеджера обмена и поместить его в общий модуль.
  4. Привязать модуль к версиям формата: Настройки.ВерсииФорматаОбмена в ПриПолученииНастроек модуля менеджера плана обмена. В КА 2.5 все восемь версий, от 1.7 до 1.17, обслуживает МенеджерОбменаЧерезУниверсальныйФормат.
  5. В типовой конфигурации модуль перезаписывается обновлением, поэтому свои правки держат в расширении.

Обе версии КД 1С распространяет через портал обновлений, нужна подписка ИТС.

Обработчики КД 2: пример кода

Обработчик КД 2 — фрагмент кода в поле события правила. Обработка выполняет его через Выполнить() внутри своей процедуры. Рассчитывайте только на переменные события (для ПКО «Перед выгрузкой» — Источник, Приемник, Отказ, ИмяПКО, РежимЗаписи и еще десяток) и общую структуру Параметры: в режиме отладки другие не видны. Имена объектов условные.

// Фрагменты для полей событий в правилах КД 2. Это не процедуры:
// обработка выполняет текст через Выполнить(), рассчитывайте только
// на переменные события и структуру Параметры. Имена объектов условные.

// ===== ПВД «Реализации», событие «Перед выгрузкой» (база-источник) =====
// Объект — документ из выборки, ИмяПКО — правило, по которому он уйдет.
Если Не Объект.Проведен И Не Параметры.ВыгружатьНепроведенные Тогда
	Отказ = Истина;
ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийРеализации.Услуги Тогда
	// В приемнике услуги — отдельный документ: выгружаем по другому ПКО.
	ИмяПКО = "РеализацияУслуг";
ИначеЕсли Объект.Товары.Количество() = 0 Тогда
	Отказ = Истина;
КонецЕсли;

// ===== ПКО «РеализацияТоваров», событие «Перед выгрузкой» =====
// Источник — документ или ссылка на него, если он выгружается из другого объекта.
// Отказ здесь отрезал бы и такие ссылки, поэтому фильтры живут в ПВД.
Если Источник.Проведен Тогда
	РежимЗаписи = "Проведение"; // приемник проведет документ при загрузке
Иначе
	РежимЗаписи = "Запись";
КонецЕсли;

// ===== ПКС «Комментарий» (источник не задан), событие «Перед выгрузкой» =====
// Присвоенное Значение уходит в приемник, реквизит источника не читается.
Значение = СтрШаблон("Из учетной базы: %1 от %2",
	Источник.Номер, Формат(Источник.Дата, "ДЛФ=D"));

// ===== ПКО «Контрагенты», событие «После загрузки» (база-приемник) =====
// Объект еще не записан; ОбъектНайден = Истина, если элемент уже был в базе.
// Новых контрагентов складываем в группу «Из обмена», найденные не трогаем.
Если Не Параметры.Свойство("ГруппаИзОбмена") Тогда
	// Кэш на весь сеанс загрузки: группу ищем один раз, а не для каждого элемента.
	Группа = Справочники.Контрагенты.НайтиПоНаименованию("Из обмена", Истина);
	Параметры.Вставить("ГруппаИзОбмена",
		?(ЗначениеЗаполнено(Группа) И Группа.ЭтоГруппа, Группа, Неопределено));
КонецЕсли;
Если Не ОбъектНайден И Не Объект.ЭтоГруппа
	И Параметры.ГруппаИзОбмена <> Неопределено Тогда
	Объект.Родитель = Параметры.ГруппаИзОбмена;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.НаименованиеПолное) Тогда
	Объект.НаименованиеПолное = Объект.Наименование;
КонецЕсли;

Разбор ключевых строк

  • Отказ = Истина в ПВД снимает с выгрузки сам документ. То же в ПКО отрезает объект и там, где он выгружается ссылкой из другого объекта, — реквизит в приемнике окажется пустым.
  • ИмяПКО = "РеализацияУслуг" — ПВД выбирает правило конвертации для конкретного объекта.
  • РежимЗаписи = "Проведение" уходит в файл атрибутом объекта, и приемник проводит документ при загрузке.
  • Если в ПКС «Перед выгрузкой» присвоено Значение, реквизит источника не читается.
  • Параметр ВыгружатьНепроведенные объявляйте в правилах с типом Булево: без типа он придет как Неопределено, и Не упадет с ошибкой преобразования.
  • В «После загрузки» ОбъектМодифицирован уже равен Истина — объект запишется; Отказ = Истина отменяет запись.

Запуск правил КД 2 из кода

Для выгрузки по расписанию обработку создают на сервере и заполняют ее реквизиты, как это делает форма (имена сверены с обработкой из КА 2.5).

// Общий модуль ОбменПравиламиКД2 (флажок «Сервер»): обмен по правилам КД 2
// без формы, например из регламентного задания. Пути к файлам — на сервере 1С.
// Обработка «Универсальный обмен данными в формате XML» входит в КА 2.5;
// в базе без нее используйте внешнюю V8Exchan83.epf из комплекта КД 2.

Процедура ВыгрузитьПоПравиламКД2(ИмяФайлаПравил, ИмяФайлаОбмена, НачалоПериода, КонецПериода) Экспорт

	Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
	Обработка.РежимОбмена = "Выгрузка";
	Обработка.ИмяФайлаПравилОбмена = ИмяФайлаПравил;
	Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
	Обработка.ДатаНачала = НачалоПериода;
	Обработка.ДатаОкончания = КонецПериода;
	Обработка.ИмяФайлаПротоколаОбмена = ИмяФайлаОбмена + ".log";
	Обработка.ЭтоИнтерактивныйРежим = Ложь;

	// Правила читаем заранее: таблицу параметров заполняет именно чтение правил.
	Обработка.ЗагрузитьПравилаОбмена();
	Если Обработка.ФлагОшибки Тогда
		ВызватьИсключение СтрШаблон("Не удалось прочитать правила обмена %1", ИмяФайлаПравил);
	КонецЕсли;
	// Строка в таблице есть, только если параметр в правилах устанавливается в диалоге.
	Обработка.УстановитьЗначениеПараметраВТаблице("ВыгружатьНепроведенные", Ложь);

	// Ошибки обработчиков методы не выбрасывают, а пишут в протокол.
	Обработка.ВыполнитьВыгрузку();
	Если Обработка.ФлагОшибки Тогда
		ВызватьИсключение СтрШаблон("Выгрузка завершилась с ошибками, протокол: %1",
			Обработка.ИмяФайлаПротоколаОбмена);
	КонецЕсли;

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

Процедура ЗагрузитьПоПравиламКД2(ИмяФайлаОбмена) Экспорт

	// Файл правил не нужен: КД 2 записывает правила в начало файла обмена.
	// Объект обработки — новый на каждую операцию: после загрузки он без
	// повторного чтения правил выгружать откажется.
	Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
	Обработка.РежимОбмена = "Загрузка";
	Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
	Обработка.ИмяФайлаПротоколаОбмена = ИмяФайлаОбмена + ".import.log";
	Обработка.ЭтоИнтерактивныйРежим = Ложь;
	Обработка.ИспользоватьТранзакции = Истина;

	Обработка.ВыполнитьЗагрузку();
	Если Обработка.ФлагОшибки Тогда
		ВызватьИсключение СтрШаблон("Загрузка завершилась с ошибками, протокол: %1",
			Обработка.ИмяФайлаПротоколаОбмена);
	КонецЕсли;

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

КД 3: доработка типового обмена в расширении

Типовой модуль менеджера обмена не правят: обновление перезапишет правку. Общий модуль заимствуют в расширение (в КА 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 ссылаются на объект, которого нет в конфигурации, — почти всегда после обновления. Обновите структуру в КД и перевыгрузите правила.
  • «Не найдено соответствие для значения Источника». В источнике появилось значение перечисления, которого нет в ПКЗ.
  • «Ошибка в обработчике события ПередВыгрузкойОбъекта» (для ПКС — «… ПередВыгрузкой (свойства)»). Исключение в коде обработчика КД 2; правило и объект — в протоколе обмена. В КД 3 то же выглядит как «Ошибка выполнения обработчика.» с полями «Событие», «Обработчик», «Объект».
  • Пустые ссылки в приемнике. Фильтр поставили в ПКО «Перед выгрузкой» вместо ПВД.
  • Обработчик из расширения молчит. Имя записали в правило, но не перехватили ВыполнитьПроцедуруМодуляМенеджера.
  • Пропали строки табличной части. КД 3 заменяет табличные части из правил целиком, строки, добавленные в приемнике вручную, исчезают.
  • Расширение не применяется после обновления. Модуль менеджера перегенерировали, перехваченную процедуру переименовали.

Частые вопросы

Работает ли конвертация данных в 1С 8.3 со старыми базами?

Да. В комплекте КД 2.1 есть обработки обмена и выгрузки структуры для 8.3, 8.2 и 7.7, так что данные переносят из любой конфигурации 1С 8 и даже из 7.7.

Можно ли доработать типовой обмен без снятия с поддержки?

Для EnterpriseData — да, расширением, как в примерах выше. Правила КД 2 в синхронизации БСП загружают из файла: источник правил хранится в регистре ПравилаДляОбменаДанными.

Чем ПОД в КД 2 отличается от ПОД в КД 3?

В КД 2 ПОД — правила очистки данных (удаление объектов в приемнике), в КД 3 — правила обработки данных: какие объекты и по каким ПКО обрабатывать. По смыслу им ближе ПВД из КД 2.

Какие книги по конвертации данных 1С читать?

Смотрите на год издания: материал по редакции 2 к КД 3 почти не применим. Надежнее документация на ИТС и справка конфигурации. Для КД 3 лучший учебник — типовой модуль менеджера обмена: в КА 2.5 в нем больше 500 правил конвертации объектов.

Когда проще заказать

Если в команде никто не работал с КД или обмен ломается после каждого обновления, дешевле отдать задачу программисту, который делает это регулярно. Опишите базы и что должно передаваться и разместите задачу бесплатно — оценка бесплатная, ответ в течение рабочего дня. Все направления работ — на странице услуг.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.