Enterprise Data (КД3) на костылях расширений: Большая шпаргалка по выживанию в модуле обмена

08.05.26

Интеграция - Перенос данных 1C

Забудьте про визуальные конвертации — переходим на темную сторону кода. Большая шпаргалка по низкоуровневой доработке Enterprise Data в расширениях: от перехвата ПОД/ПКО и хирургии XDTO до многоэтажной маршрутизации (1 XML = 3 документа 1С), синхронизации статусов и хаков с ДополнительнымиСвойствами. Без воды, только боевой код и паттерны, спасающие рассудок при интеграциях.

Enterprise Data на костылях расширений: Большая шпаргалка по выживанию в модуле менеджера обмена

Привет, коллега. Если ты открыл эту статью, значит, в твой проект пришла беда, или, как это называют в сметах, «интеграция по Enterprise Data». Если раньше ты спокойно рисовал правила конвертации в удобной древовидной форме КД 2.0, попивая кофе, то теперь перед тобой монструозный модуль МенеджерОбменаЧерезУниверсальныйФормат, зубодробительный XDTO и требование «не менять типовой конфигурации, делать в расширении».

Добро пожаловать в адский уют низкоуровневого программирования обмена данными.

Я провел сотни часов, дебажая этот модуль, матерясь на пустые значения в XDTO и пытаясь понять, почему документ, который должен был создаться, мистически исчез. На основе реального боевого кода интеграции транспортной подсистемы (УАТ) с ERP я написал эту огромную шпаргалку. Здесь нет воды, только хардкор, паттерны и обходные пути.

Забудь всё, что ты знал про визуальные редакторы. Мы будем писать код.

 

ГЛАВА 1. Анатомия вмешательства: Как влезть в типовой обмен и не убить конфигурацию

Первое правило клуба обмена: не трогай типовой код модуля менеджера. Ни единого символа. Вся наша магия строится на расширениях. У нас есть три заклинания для перехвата управления:

 

1.1 &После — Тихий сосед

Мы добавляем свой код после того, как отработает типовая процедура. Идеально для добавления новых правил обработки (ПОД) или конвертации (ПКО).

&После("ЗаполнитьПравилаОбработкиДанных")
Процедура ЧИС_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных)
    // Типовой код уже сформировал свои правила, мы просто докидываем свои
    ДобавитьПОД_Справочник_ЧИС_ВидыТранспортнойРаботы_Получение(ПравилаОбработкиДанных);
КонецПроцедуры

Риск: Минимальный. При обновлении конфигурации типовая процедура может измениться, но твой код просто добавится после неё.

 

1.2 &ИзменениеИКонтроль — Узурпатор

Мы полностью заменяем типовую процедуру своей. При этом платформа будет ругаться предупреждениями при обновлении конфигурации, если типовой код изменился. Это знак тебе: «Эй, проверь, не сломал ли обновление твою логику!».

&ИзменениеИКонтроль("ДобавитьПОД_Документ_ПередачаМатериаловВПроизводство_Отправка")
Процедура ЧИС_ДобавитьПОД_Документ_ПередачаМатериаловВПроизводство_Отправка(ПравилаОбработкиДанных)
   // Типовой код НЕ ВЫПОЛНИТСЯ. Мы пишем с нуля или копируем типовое и дописываем.
   ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
   // ...
   #Вставка
   ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ПередачаМатериаловВПроизв_Отправка");
   #КонецВставки
КонецПроцедуры

Риск: Высокий. Если 1С добавит новую галочку в типовую процедуру, твой код её потеряет, пока ты не синхронизируешь изменения, будь внимателен при вставке кода, анализатор очень ревностно проверяет строчки, нельзя отклоняться даже от пробелов, сразу прилетит эрор. 

Данное поведение было до 8.3.18

1.3 &Вместо — Хирург

Мы врезаемся в типовую процедуру. Можем выполнить код до, после или вместо типового, используя ПродолжитьВызов(). Редко используется для правил, чаще для обработчиков, но знать стоит.

 

ГЛАВА 2. Два столпа обмена: ПОД и ПКО

Вся твоя работа сведется к манипулированию двумя структурами: Правилами Обработки Данных (ПОД) и Правилами Конвертации Объектов (ПКО). Запомни разницу навсегда, иначе сойдешь с ума.

 

2.1 ПОД (Правила обработки данных) — ЭТО ЧТО мы грузим и КОГДА

ПОД отвечает за выборку объектов из базы при отправке и за включение/выключение ПКО при получении.

Сценарий 1: Добавить выгрузку нового документа Ты просто добавляешь ПОД, указываешь метаданные и какие ПКО в нем используются.

Процедура ДобавитьПОД_Документ_ЗаказНаВнутреннееПотребление_Отправка(ПравилаОбработкиДанных)
   ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
   ПравилоОбработки.Имя = "Документ_ЗаказНаВнутреннееПотребление_Отправка";
   ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.ЗаказНаВнутреннееПотребление;
   ПравилоОбработки.ОчисткаДанных = Ложь;
   ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЗаказНаВнутреннееПотребление_Отправка"); 
КонецПроцедуры

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

Процедура ПОД_Документ_ЗаказНаВнутреннееПотребление_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
     // Если документ не проведен - отключаем все ПКО для него. Он просто не попадет в файл выгрузки!
     ИспользованиеПКО.Документ_ЗаказНаВнутреннееПотребление_Отправка = ДанныеИБ.Проведен;
КонецПроцедуры

 

2.2 ПКО (Правила конвертации объектов) — ЭТО КАК мы преобразуем данные ПКО мапит поля источника на поля приемника. 

Процедура ДобавитьПКО_Документ_ЗаказНаПроизводство2_2_Получение(ПравилаКонвертации)
   ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
   ПравилоКонвертации.ИмяПКО = "Документ_ЗаказНаПроизводство2_2_Получение";
   ПравилоКонвертации.ОбъектДанных = Метаданные.Документы.ЗаказНаПроизводство2_2;
   ПравилоКонвертации.ОбъектФормата = "Документ.уатРемонтныйЛист"; // Входящий XML-объект
   СвойстваШапки = ПравилоКонвертации.Свойства;
   ДобавитьПКС(СвойстваШапки, "Организация", "Организация", , "Справочник_Организации_Получение", "http://v8.1c.ru/edi/...");
КонецПроцедуры

Если ты не добавишь ДобавитьПКС для какого-то поля, оно просто не заполнится, даже если в XML оно есть. Платформа не угадывает.

 

ГЛАВА 3. Маршрутизация: Как один документ превратить в три разных

Это самая частая боль. В периферийной базе (например, УАТ) есть один документ уатРемонтыйЛист. А в центральной базе (ERP) он должен распасться на:

  1. ЗаказНаПроизводство (если ремонт своей бригадой)
  2. ЗаказПереработчику (если отдаем на сторону запчасти)
  3. ЗаказНаРемонт (если отдаем машину целиком в сервис)

 

Шаг 1. В ПОД добавляем ВСЕ возможные ПКО-назначения:

ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЗаказПереработчику_Получение");
ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЗаказНаПроизводство2_2_Получение");
ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЗаказНаРемонт_Получение");

 

Шаг 2. В обработчике ПОД  ПриОбработке рубим лишние ПКО: По умолчанию все ПКО отключены. Мы читаем входящие данные XDTO и включаем только нужное.

Процедура ПОД_Документ_уатРемонтныйЛист_Получение_ПриОбработке(ДанныеXDTO, ИспользованиеПКО, КомпонентыОбмена)
    // Сначала отключаем вообще всё!
    УстановитьИспользованиеПКО(ИспользованиеПКО, Ложь);
    // Читаем признак из входящего XML
    Если ДанныеXDTO.СпособРемонта.Значение = "РемЗона" Тогда
         ИспользованиеПКО.Документ_ЗаказНаПроизводство2_2_Получение = Истина;
    ИначеЕсли ДанныеXDTO.СпособРемонта.Значение = "РемонтЗапчастей" Тогда
         ИспользованиеПКО.Документ_ЗаказПереработчику_Получение = Истина;
    ИначеЕсли ДанныеXDTO.СпособРемонта.Значение = "Автосервис" Тогда
         ИспользованиеПКО.Документ_ЗаказНаРемонт_Получение = Истина;
    КонецЕсли;
КонецПроцедуры

Итог: Платформа создаст ровно тот документ, который нужен, используя один и тот же входящий пакет XML.

 

ГЛАВА 4. События ПКО: Кровеносная система обмена

ПКО — это не просто маппинг. Это программа, исполняемая событиями. Зная их порядок и фишки, ты спасешь себе сотни часов отладки.

 

4.1. ПриКонвертацииДанныхXDTO (Получение) — Хирургия входящих данных

Срабатывает до того, как данные лягут в объект. Здесь ПолученныеДанные — это еще не объект ИБ, это структура или объект XDTO, который можно калечить.

Зачем нужен:

  • Установить реквизиты, которых нет в XML (дефолты).
  • Заполнить перечисления.
  • Сгенерировать табличные части на лету.

Пример из жизни: В XML нет Хозяйственной операции, но в ERP без нее документ не проведется. Ставим дефолт:

Процедура ПКО_Документ_ЗаказПереработчику_Получение_ПриКонвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
    ПолученныеДанные.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ПроизводствоУПереработчика2_5");
КонецПроцедуры

Продвинутая техника: Формируем ТЧ из входящего массива Часто в XML приходит плоская таблица, а в 1С надо разнести её по разным табличным частям, добавив дефолтные колонки.

// Собираем правила, какие поля брать из XDTO
ПравилаЗаполнения = Новый Соответствие;
ПравилаЗаполнения.Вставить("Номенклатура", "Номенклатура");
ПравилаЗаполнения.Вставить("Количество", "Количество");
МассивСтрок = Новый Массив;
Для Каждого Строка Из ДанныеXDTO.Материалы Цикл
    СтруктураДанныхСтроки = ДанныеКоллекцииВВидеСтруктуры(Строка, ПравилаЗаполнения);
    // Добавляем то, чего в XML нет!
    СтруктураДанныхСтроки.Вставить("СтатьяРасходов", СтатьяКалькуляцииПоИдентификатору("СырьеИОсновныеМатериалы"));
    МассивСтрок.Добавить(СтруктураДанныхСтроки);
КонецЦикла;
// Кладем в багажник, чтобы забрать в ПередЗаписью
ПолученныеДанные.ДополнительныеСвойства.Вставить("ОбеспечениеМатериаламиИРаботами", МассивСтрок);

ПолученныеДанные.ДополнительныеСвойства. Это твой единственный способ передать данные между событиями ПКО. Записал здесь — достанешь в ПередЗаписьюПолученныхДанных

4.2. ПриОтправкеДанных(Отправка) — Контроль выгрузки

Срабатывает при формировании XML. Здесь ДанныеИБ — это объект 1С, а ДанныеXDTO — это формируемый пакет.

Зачем нужен:

  • Вставить кастомные теги в XML.
  • Выгрузить статус вместо всего документа (для синхронизации состояний).

Пример: Выгрузка флага статуса Нам не нужно выгружать весь документ ПринятиеКУчетуОС, нужно только сказать периферийной базе, что он проведен.

Процедура ПКО_Документ_ПринятиеКУчетуОС2_4_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
   // Просто дописываем кастомный тег в XML
   ДанныеXDTO.Вставить("ИзменитьСтатус", Истина);
КонецПроцедуры

 

4.3. ПослеЗагрузкиВсехДанных  / Отложенная обработка — Постфактум

Самый мощный и опасный обработчик. Вызывается после того, как все объекты пакета уже загружены и записаны.

Зачем нужен:

  • Создать связанные объекты, которых не было в XML.
  • Провести документ, если он завис от ссылок на другие объекты, которые только что создались.
  • Сгенерировать задачи пользователям.

Пример из кода: После загрузки документа ввода в эксплуатацию создаем бизнес-процесс Задание, чтобы пользователи не забыли заполнить реквизиты:

Процедура ОтложеннаяОбработка_уатВводВЭксплуатациюТСиОборудования(Объект, КомпонентыОбмена)
   СоздатьЗадание(Объект, КомпонентыОбмена);
КонецПроцедуры
Процедура СоздатьЗадание(Объект, КомпонентыОбмена)
   // Проверяем, нет ли уже задания
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Задание.Ссылка ИЗ БизнесПроцесс.Задание КАК Задание ГДЕ Задание.Предмет = &Предмет";
   Запрос.УстановитьПараметр("Предмет", Объект.Ссылка);  
   Если НЕ Запрос.Выполнить().Пустой() Тогда Возврат; КонецЕсли;
   Задание = БизнесПроцессы.Задание.СоздатьБизнесПроцесс();
   Задание.Наименование = "Необходимо заполнить " + Строка(Объект.Ссылка);
   Задание.Предмет = Объект.Ссылка;
   Задание.Записать();
   Задание.Старт();
КонецПроцедуры

 

ГЛАВА 5. Черная магия XDTO: Как читать то, чего не понимаешь

Иногда формат Enterprise Data меняется, и ты получаешь структуру, которая ни в какое ПКС не помещается. Или тебе нужно прочитать составной тип данных.

 

5.1. Чтение составных ссылок

В Enterprise Data ссылка на объект передается как структура с полями ТипЗначения, Значение и т.д. Как понять, что прилетело?

ТипДокументаРеализации = Неопределено;
Если ДанныеXDTO.Свойство("Контрагент")
И ТипЗнч(ДанныеXDTO.Контрагент) = Тип("Структура")
И ДанныеXDTO.Контрагент.Свойство("ТипЗначения", ТипДокументаРеализации) Тогда
    ИмяПКО = "";
    Если ТипДокументаРеализации = "Контрагент" Тогда
         ИмяПКО = "Справочник_Контрагенты_Получение";
    КонецЕсли;
    Если НЕ ИмяПКО = "" Тогда
         // Формируем инструкцию для платформы, какой ПКО использовать для поиска ссылки
         Инструкция = Новый Структура("Значение, ИмяПКО", ДанныеXDTO.Контрагент, ИмяПКО);
         ПолученныеДанные.ДополнительныеСвойства.Вставить("Контрагент", Инструкция);
    КонецЕсли;
КонецЕсли;

 

5.2. Поиск ссылки по UID в базе

В отложенных обработчиках тебе часто нужно найти объект, который только что загрузился, по его уникальному идентификатору из XML.

Функция НайтиТСПоИдентификатору(Идентификатор)
   ТС = Неопределено;
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   | ПубличныеИдентификаторыСинхронизируемыхОбъектов.Ссылка КАК Ссылка
   |ИЗ
   | РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПубличныеИдентификаторыСинхронизируемыхОбъектов
   |ГДЕ
   | ПубличныеИдентификаторыСинхронизируемыхОбъектов.Идентификатор = &Идентификатор";
   Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
   РезультатЗапроса = Запрос.Выполнить();
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ТипЗнч(ВыборкаДетальныеЗаписи.Ссылка) = Тип("СправочникСсылка.ОбъектыЭксплуатации") Тогда
            ТС = ВыборкаДетальныеЗаписи.Ссылка;
       КонецЕсли;
   КонецЦикла;
   Возврат ТС;
КонецФункции

Секрет: При обмене через Enterprise Data ссылки регистрируются в РС ПубличныеИдентификаторыСинхронизируемыхОбъектов. Ищи там, если не можешь найти объект обычным путем.

 

ГЛАВА 6. Синхронизация статусов без дублей документов

Это отдельный вид боли. В периферийной базе (УАТ) есть документ уатВводВЭксплуатацию. В центральной (ERP) в ответ на это должны быть созданы документы ПринятиеКУчетуОС и ПараметрыНачисленияТранспортногоНалога.

А когда в ERP эти документы проводят, нужно передать статус обратно в УАТ, чтобы там закрыли документ-источник. Как сделать это так, чтобы не выгружать весь ПринятиеКУчетуОС целиком (ведь УАТ его не поймет)?

Паттерн "Пустой ПКО для статуса"

  1. Создаем ПКО, который выгружает только ключевые свойства (Организация, Номер, Дата) и кастомный флаг ИзменитьСтатус.
Процедура ДобавитьПКО_Документ_ПринятиеКУчетуОС2_4_Отправка(ПравилаКонвертации)
   // ...
   ДобавитьПКС(СвойстваДокумента, , "ИзменитьСтатус",1, , ПространствоИмен);
КонецПроцедуры
Процедура ПКО_Документ_ПринятиеКУчетуОС2_4_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, ...)
   ДанныеXDTO.Вставить("ИзменитьСтатус", Истина);
КонецПроцедуры
  1. На стороне получения вешаем ПКО на документ уатВводВЭксплутацию, и в обработчике ПриКонвертацииДанныхXDTO просто меняем статус, если видим флаг.
Если ДанныеXDTO.Свойство("ИзменитьСтатус") И ДанныеXDTO.ИзменитьСтатус Тогда
     // Логика изменения статуса у полученного документа
КонецЕсли;

Таким образом, ты шлешь минимальный трафик, только сигнальные флаги, не засоряя базу-приемник лишними данными.

 

ГЛАВА 7. Кастомные объекты формата

А что, если твоего объекта вообще нет в Enterprise Data? Например, справочник ЧИС_НомрмативыОбслуживанияТС. Его нет в формате, но мы обязаны его передать.

Мы можем использовать любой подходящий объект формата (например, Справочник.ЛюбойСправочник) или создать свой ПКО, который будет упаковывать данные в кастомный XML-тег.

В коде это выглядит так:

Процедура ДобавитьПКО_РСЗапись_ЧИС_НормативыОбслуживанияТС_Отправка(ПравилаКонвертации)
    // ...
    ПравилоКонвертации.ОбъектФормата = "Справочник.ЧИС_НормативыОбслуживанияТС";
    // ...
    ДобавитьПКС(СвойстваШапки, "", "СписокЗапчастей", 1,, "http://v8.1c.ru/edi/...");
КонецПроцедуры

А в обработчике ПриОтправкеДанных мы вручную формируем структуру, превращая регистр сведений в подобие справочника с нужными тегами, а в ПриКонвертацииДавнныхXDTO на приемнике — разбираем эту структуру и пишем в регистр сведений.

 

ГЛАВА 8. Удаление объектов из правил (Горячий хирургический нож)

Иногда типовой обмен тащит то, что нам не нужно. Например, справочник Подразделения. Он грузится криво, или мы хотим обрабатывать его своим алгоритмом.

Мы не можем удалить типовое ПОД из расширения, но мы можем вырезать его на лету!

&После("ЗаполнитьПравилаОбработкиДанных")
Процедура ЧИС_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных)
    // ...
    Для каждого ПравилоПОД из ПравилаОбработкиДанных Цикл
        Если ПравилоПОД.Имя = "Справочник_Подразделения_Отправка" Тогда
             ПравилаОбработкиДанных.Удалить(ПравилоПОД); // Прощай, подразделения!
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Осторожно: Удалять элементы коллекции в цикле Для Каждого небезопасно (может быть смещение индексов). Надежнее собирать массив на удаление и удалять во втором цикле. Но для расширений обменов этот хак часто используют.

 

ГЛАВА 9. Генерация объектов на лету

Обмен — это не просто перенос данных. Это обеспечение целостности. Если пришел ремонтный лист, а в базе нет нужной спецификации или контактного лица, обмен упадет. Что делать? Создавать объекты на лету прямо в обработчиках ПКО!

Пример: Создание Контактного Лица В XML пришел реквизит Ответственный, но в базе нет такого контактного лица у контрагента. Мы создаем его.

УИДКонтактногоЛица = Новый УникальныйИдентификатор(ДанныеXDTO.Ответственный.Ссылка.Значение);
СсылкаКЛ = Справочники.КонтактныеЛицаПартнеров.ПолучитьСсылку(УИДКонтактногоЛица);
Если ОбщегоНазначения.СсылкаСуществует(СсылкаКЛ) Тогда
    ПолученныеДанные.КонтактноеЛицо = СсылкаКЛ;
Иначе
    КЛОбъект = Справочники.КонтактныеЛицаПартнеров.СоздатьЭлемент();
    КЛОбъект.Наименование = ДанныеXDTO.Ответственный.Наименование;
    КЛОбъект.УстановитьСсылкуНового(СсылкаКЛ);
    КЛОбъект.Владелец = ДанныеИБ.Партнер; // Заполняем владельца по контрагенту
    КЛОбъект.ОбменДанными.Загрузка = Истина; // Обязательно!
    КЛОбъект.Записать();
    ПолученныеДанные.КонтактноеЛицо = КЛОбъект.Ссылка;
КонецЕсли;

Секрет: Используй УстановитьСсылкуНового(). Это гарантирует, что при повторной загрузке этого пакета объект не задвоится, а платформа найдет его по GUID.

 

ГЛАВА 10. Тонкости отправки: Внедрение в типовые документы

Частая задача: в типовой документ (например, РеализацияУслугПрочихАктивов) нужно добавить выгрузку кастомного реквизита расширения.

Мы используем &ИзменениеИКонтроль для процедуры добавления ПОД, добавляем свое ПКО в список используемых, а в обработчике ПриОбработке включаем его:

Процедура ЧИС_ПОД_Документ_РеализацияУслугПрочихАктивов_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
   // ...
   ИзменитьСтатус = ПроверитьПроведениеСписанияИРеализации(ДанныеИБ);
   ИспользованиеПКО.Документ_РеализацияУслугПрочихАктивов_Статус_Отправка = ИзменитьСтатус;
КонецПроцедуры

А в ПКО Документ_РеализацияУслугПрочихАктивов_Статус_Отправка в ПриОтправкеДанных мы допишем нужные теги в формируемый XDTO.

 

ЭПИЛОГ: Правила выживания

  1. Отладчик — твой лучший друг. Встань точкой останова на ЧИС_ВыполнитьПроцедуруМодуляМенеджера и следи, как летят данные. Без отладчика написать обмен невозможно.
  2. ДополнительныеСвойства — твой багажник. Не пытайся всё сделать в одном событии. Собирай данные в структуру, клади в ДополнительныеСвойства, доставай в ПередЗаписью.
  3. УстановитьИспользованиеПКО(Ложь) — твой рубильник. Сначала отключай всё, потом включай точечно. Так ты избежишь создания фантомных документов.
  4. ОбменДанными.Загрузка = Истина. Если создаешь объекты на лету в обработчиках, всегда ставь этот флаг, иначе 1С нарисует тебе кучу лишних проведений и движений.
  5. UID — царь обмена. Если объекты не находятся, 99% проблема в том, что платформа не может сопоставить GUID из XML с объектом в базе. Используй ПубличныеИдендификаторыСинхронизиуемыхОбъектов.

Обмен данными через Enterprise Data на уровне кода — это как игра на пианино в слепую. Но если ты понимаешь архитектуру (ПОД -> ПКО -> События -> XDTO), ты начинаешь слышать музыку. Удачи в бою, разработчик. Да пребудет с тобой стабильный обмен без ошибок идентификации!

Вступайте в нашу телеграмм-группу Инфостарт

Enterprise Data КД 3.0 обмен данными расширения 1С МенеджерОбменаЧерезУниверсальныйФормат ПКО ПОД XDTO программирование правил доработка обмена ПриКонвертацииДанныхXDTO ДополнительныеСвойства интеграция 1С Универсальный формат маршрутизация данных конвертация данных синхронизация статусов каскадное создание документов обработчики ПКО правила конвертации

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

58000 руб.

04.08.2015    188835    455    306    

456

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    188962    363    291    

421

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    161577    975    321    

484

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    84830    228    179    

162

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    34669    258    64    

195

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

05.10.2022    13750    16    8    

17

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Перенос данных из БП 2 в БП 3 готовые правила конвертации данных (КД 2), сэкономьте свое время! | Выполнить переход с БП 2 на БП 3 в ситуациях, когда простым обновлением перейти не получается | Переносится вся справочная информация, документы за выбранный период, а также начальные остатки на выбранную дату (то есть можно еще и свертку базы сделать при переносе) | Есть фильтр по организациям при выгрузке данных | Перенос можно проверить перед покупкой прямо на вашем сервере! Обращайтесь за проверкой!

50600 руб.

21.05.2019    58688    81    133    

73

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

27572 руб.

18.02.2016    204497    675    543    

563
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DmitryKSL 169 08.05.26 09:10 Сейчас в теме
Забудьте про визуальные конвертации — переходим на темную сторону кода

Всегда так и делал, даже не помню как КД3 выглядит. Помню меня на курсы записали по КД3, сам Дмитрий Гончаров вел, так он сказал - на практике большинство чисто в модуле сидят, конфу КД вообще не открывают.
sogesti; A7758735; kwazi; war41k; +4 Ответить
2. amiralnar 9 08.05.26 09:24 Сейчас в теме
Пожалуйста, не публикуйте генеративные статьи!
Каждый из нас сегодня может сгенерировать такую статью в чате с нейросетью.
Это обесценивает площадку и сообщество.
Sejix; rulan87; tsmult; nixel; akocur; Global__IT; gmw; qwinter; Somebody1; Трактор; +10 4 Ответить
3. war41k 751 08.05.26 09:28 Сейчас в теме
(2) Статья написана на реальном примере расширения, информация развивает сообщество, ИИ это инструмент, пользоваться им или нет дело каждого
Прикрепленные файлы:
KirillZ44; aximo; sapervodichka; +3 3 Ответить
4. DmitryKSL 169 08.05.26 09:30 Сейчас в теме
Кстати, многие не знают про "AdditionalInfo", в статье тоже не увидел. Можете перекинуть что угодно простых типов без блекджека... Смотришь чужой обмен, кто во что горазд. Одни в комментарий пихают, другие дополнительные сведения.
Вот простой пример.
База источник
&После("ПКО_Документ_ОтчетКомитенту_Отправка_ПриОтправкеДанных")
Процедура ОбменБП_ПКО_Документ_ОтчетКомитенту_Отправка_ПриОтправкеДанн­ых(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
	
	ДанныеXDTO.Вставить("AdditionalInfo", Новый Структура("СуммаНДСВознаграждения", ДанныеИБ.СуммаНДСВознаграждения));
	
КонецПроцедуры


База приемник
Процедура ДополнительныеСвойстваИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные)

	Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
		Для каждого Элемент Из ДанныеXDTO.AdditionalInfo Цикл
			ПолученныеДанные.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);
		КонецЦикла;
	КонецЕсли;		

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

&После("ПКО_Документ_ОтчетКомитентуОПродажах_Получение_ПриКонвертац­ииДанныхXDTO")
Процедура ОбменУТ_ПКО_Документ_ОтчетКомитентуОПродажах_Получение_ПриКо­нвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
	
	ДополнительныеСвойстваИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные);
	
КонецПроцедуры

&Перед("ПКО_Документ_ОтчетКомитентуОПродажах_Получение_ПередЗаписью­ПолученныхДанных")
Процедура ОбменУТ_ПКО_Документ_ОтчетКомитентуОПродажах_Получение_Перед­ЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
			
	Если ПолученныеДанные.ДополнительныеСвойства.Свойство("СуммаНДСВознаграждения") тогда
		НДСВознагражденияУТ = ПолученныеДанные.ДополнительныеСвойства.СуммаНДСВознаграждения;
	КонецЕсли; 

КонецПроцедуры
Показать
rulan87; tsmult; aleksey2; rfcor; comptr; sqr4; sapervodichka; mistervoron; PaStrel; Teplotrassamen; Spurk; xnd; Stepashkin; kwazi; rozer; smit1c; war41k; +17 Ответить
21. war41k 751 11.05.26 12:14 Сейчас в теме
В комментарии (4) пример передачи произвольных данных
5. xnd 101 08.05.26 09:51 Сейчас в теме
анализатор очень ревностно проверяет строчки, нельзя отклоняться даже от пробелов, сразу прилетит эрор.

Практика и ИТС с вами несогласны:
https://its.1c.ru/db/v8322doc#bookmark:dev:TI000002149
Во время проверки применимости игнорируются пробелы и символы табуляции в начале и конце каждой строки метода, а также пустые строки (или строки, состоящие только из символов пробел и табуляция) в теле метода.
triviumfan; +1 Ответить
6. war41k 751 08.05.26 10:06 Сейчас в теме
(5) ● Для методов расширения с аннотацией &ИзменениеИКонтроль выполняется проверка соответствия текста расширяемого метода в конфигурации и в расширении. Данная проверка не является блокирующей для расширения. В случае непрохождения данной проверки, расширения применится, но метод с ошибкой применимости не будет расширен.

Состав выполняемых проверок в обоих случаях может отличаться в разных версиях платформы «1С:Предприятие». выполняется проверка соответствия текста если в коде будет добавлена новая строка или сдвинут код это уже не соответствие текста метода https://its.1c.ru/db/v8322doc#bookmark:dev:TI00000151 будет ошибка Расширение1: Обычная: Ошибка применения модуля "Расширение1 ОбщийМодуль.ОбщийМодуль1.Модуль". Текст модуля для метода "ВозведениеВСтепень" изменился
10. xnd 101 08.05.26 11:48 Сейчас в теме
(6) смотрю статью и не вижу там фрагмента "если в коде будет добавлена новая строка или сдвинут код это уже не соответствие текста метода"

зато вижу "Во время проверки применимости игнорируются пробелы и символы табуляции в начале и конце каждой строки метода, а также пустые строки (или строки, состоящие только из символов пробел и табуляция) в теле метода."
12. war41k 751 08.05.26 12:00 Сейчас в теме
Сами то пробовали &ИзменениеИКонтроль любая добавленная строка #Вставка #Удаление должны идти ровно под операторами тогда контроль проходит без проблем, эта проверка и сделана для исключения рассинхронизации модулей при обновлении конфигурации любой пробел в запросе уже не соответствие тело метода конфигурации и расширения? Если &Вместо, &После, и &Перед не вызывает ошибки так они не изменяют тело метода то ИзменениеИКонтроль очень ревностно проверяет синтаксический анализатор. Процедуры и Функции должны копироваться один в один из конфигурации, любое сдвижение изначально кода это уже рассинхронизация, весь геморрой ИзменениеИКонтроль именно в правильном копирование тело метода
Прикрепленные файлы:
13. xnd 101 08.05.26 12:27 Сейчас в теме
(12) Да и поэтому удивился что не сталкивался с таким поведением. Возможно что вы столкнулись с таким на платформе до 8.3.18 в которой это поведение было изменено
Прикрепленные файлы:
14. xnd 101 08.05.26 12:33 Сейчас в теме
(9)(12) Вот пример на 8.3.27.2074
Добавил в метод кучу лишних пустых строк ( включая пробелы) и никакого конфликта, но как только там появляется не пустая строка - получили закономерный конфликт
Прикрепленные файлы:
akocur; gmw; war41k; +3 Ответить
15. war41k 751 08.05.26 12:40 Сейчас в теме
(14) Значит таки поправили, проверил эрор не ловится, но не у всех последние платформы это тоже нужно учитывать
16. war41k 751 08.05.26 12:43 Сейчас в теме
(14) Поправил статью спасибо
23. fatman78 21 12.05.26 11:37 Сейчас в теме
(14) На самом деле это уже давно не проблема, если использовать kdiff3. Мы в расширениях, там где нельзя или не рационально использовать директиву "После", часто используем перехват с директивой "ИзменениеИКонтроль" для оптимальности выполнения кода и одновременного контроля появления изменений в логике работы кода от вендора. На своих проектах давно используем kdiff3 при обновлении на новый релиз поставщика, он отлично справляется с трехсторонним сравнением в автоматическом режиме в т.ч. и в запросах. Практически все конфликты трехстороннего объединения разрешаются kdiff в автоматическом режиме, крайне редко требуется ручное вмешательство в результат объединения модулей. Отлично справляется даже в тех случаях, когда разработчики вендора вдруг решили отформатировать блок текста всей перехваченной процедуры или функции.

Позволяет экономить до 90% времени при обновлениях. Нужно всего лишь придерживаться нескольких простых правил при доработке запросов. Есть у kdiff всего одна проблема при работе, иногда зависает при открытии окна результатов трехстороннего сравнения, но и ее для себя удалось решить.
9. ixijixi 2153 08.05.26 10:35 Сейчас в теме
(5) Но на практике на новых пробелах прилетает "эрор"
11. xnd 101 08.05.26 11:53 Сейчас в теме
(9) такое было до версии 8.3.18
При использовании в расширениях конфигурации аннотации ИзменениеИКонтроль, проверка применимости учитывала изменения, в которых добавлялись или удалялись пустые строки и строки, состоящие только из символов пробелов и табуляций.


Источник: https://dl04.1c.ru/content/Platform/8_5_4_1306/1cv8upd_8_5_4_1306.htm#cfd09ff9-5899-11ea-8371-0050569f678a
akocur; ixijixi; +2 Ответить
17. ixijixi 2153 08.05.26 12:44 Сейчас в теме
(11) Проверил, да, реально исправили проверку лишних пробелов. Спасибо, а то старался лишний раз не трогать эту аннотацию)
7. EvgeniyOlxovskiy 111 08.05.26 10:21 Сейчас в теме
А почему не стали использовать 1С:Конвертация данных 3?
8. war41k 751 08.05.26 10:28 Сейчас в теме
(7) После много летнего использования КД2 так и не зашел интерфейс КД3, командой разработки пилился модуль в расширении, быстрее было по коду разобраться как ЭТО работает, сроки "ещё вчера" давят на нервную систему :)
Shatilovako; EvgeniyOlxovskiy; +2 Ответить
18. Somebody1 68 08.05.26 15:20 Сейчас в теме
Открыл с интересом, а тут... нейрофарш, который невозможно читать :-(
rulan87; nixel; gmw; reg0303; +4 Ответить
19. war41k 751 08.05.26 20:57 Сейчас в теме
(18) котлеты со вкусом нейрофарша жарятся на медленном огне довольно вкусно, нужно только попробовать
user2099168; +1 Ответить
20. triviumfan 101 11.05.26 11:51 Сейчас в теме
Странно, что ни слова про доработку xdto пакета, который очень специфически расширяется.
Да и как передаешь произольный тег, если его нет в xdto и валидация не будет пройдена?!
22. fatman78 21 12.05.26 11:14 Сейчас в теме
(20) Согласен, хотел написать автору статьи про это, но вы меня опередили. Ссылка на документацию Расширение формата обмена EnterpriseData
24. war41k 751 12.05.26 12:16 Сейчас в теме
(22) Спасибо за дополнительную информацию
25. triviumfan 101 12.05.26 15:26 Сейчас в теме
(22) А ещё если делать как описано на ИТС, то конфа КД3 не поймёт и не подтянет новые поля или не свяжет с форматом. Ненавижу КД3 :-)
Для отправки сообщения требуется регистрация/авторизация