Механизмы проведения документов при обмене по универсальному формату

04.03.20

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

Как проводятся документы при обмене по универсальному формату. Пример доработки типовых правил обмена с переносом состояния документа: проведен/не поведен/пометка удаления.

Не нашел нигде описание процесса получения и проведения документов при обмене по универсальному формату. Ответ пришлось искать в недрах БСП (версии 3.0.3.164).

 

Логику поведения обмена документами можно понять из функции общего модуля ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ.

Логика получения документа из файла обмена:

1. Получаются данные из файла обмена и находится соответствующий им объект в базе.

ПолученнныеДанные — объект сформированный из полученных из xml файла обмена данных. Ссылку не содержит.

ДанныеИБ — объект информационной базы, соответсвующий (согласно правилам идентификации) объекту из файла. Если объекта в базе нет, то Неопределено.

2. Вызвается процедура из правил конвертации ПередЗаписьюПолученныхДанных, в которой с этими объектами можно произвести нужные манипуляции (но не все будет действовать). Или можно совсем отказаться от дальнейшей работы БСП, прописав свою логику и установив ПолученнныеДанные=Неопределено и ДанныеИБ=Неопределено.

3. Из ПолученнныеДанные и ДанныеИБ определяется объект ДанныеДляЗаписиВИБ с которым и происходит дальнейшая работа. Если ДанныеИБ существует, происходит заполнение его свойств из ПолученнныеДанные (ЗаполнитьДанныеИБПоПолученнымДанным), но при этом не переносится ПометкаУдаления и признак Проведено. По сути Проведено будет действовать только для новых документов. Для уже существующих будет использоваться их признак Проведено.

 
 Часть кода БСП: определение итогового объекта для проведения

4. ПометкаУдаления сбрасывается.

 
 Часть кода БСП: Сброс пометки удаления

5. Анализируется признак ДанныеДляЗаписиВИБ.Проведен. Если документ проведен, то проведение в ИБ отменяется и документ добавляется в таблицу для отложенного проведения  КомпонентыОбмена.ДокументыДляОтложенногоПроведения. Если документ не проведен, то просто отменяется проведение. Кстати в дальнейшем, из таблицы строку документа можно удалить и проведение не произойдет.

 
 Часть кода БСП: проведение или отмена проведения документа при загрузке документа

 

В формате EnterpriseData для документов нет признаков ПометкаУдаления и Проведен.

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

 

Реализация практической задачи

 

Встала задача. Организовать перенос из БП в УТ типового документа, которым они обмениваются в другом направлении. В БП документ реализован в расширении, в УТ это типовой документ. Необходимо синхронизировать состояние документа: проведен, не проведен, установлена пометка удаления.

Базы с поддержки не снимаем, используем расширения. Дорабатываем типовые правила обмена.

 

Решение:

 

1. Загружаем правила конвертации из баз БП и УТ. Тот еще квест. Подсказки можно найти в статье //infostart.ru/public/695523/. У меня так и не получилось, что бы в результате загрузки получились идентичные модули менеджера обмена. Но для доработки правила обмена одного документа это не критично.

2. Пишем правила отправки и получения документов в одной и другой конвертации. Не тема этой статьи, но в моем случае ничего сложного. Похоже на КД2, только нужно помнить, что табличные части нужно обрабатывать специальным образом.

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

 
 Правила нужно реализовывать сразу в двух базах

3. Реализуем перенос состояния документа при отправке через AdditionalInfo (событие при отправке данных)

 
 Код процедуры события при отправке данных

4. Реализуем логику приема со статусом в другой конвертации

4.1. Сначала в событии  ПриКонвертацииДанныхXDTO получаем состояние документа из AdditionalInfo и заполняем им ПолученныеДанные

 
 Код процедуры события ПриКонвертацииДанныхXDTO

4.2. В событии  ПередЗаписьюПолученныхДанных выставляем правильные флаги у правильных объектов, что бы алгоритмы БСП сделали синхронизацию состояния проведения объектов, а не взяли состояние текущего объекта.

Для этого нужно всего лишь статус  ДанныеИБ.Проведен (если ДанныеИБ нашлись) заполнить из  ПолученныеДанные.Проведен. Далее все произойдет корректно, документ из ИБ заполнистя данными из файла обмена, отменится его проведение и он будет добавлен в  ДокументыДляОтложенногоПроведения если это необходимо.

Пометку удаления необходимо обрабатывать отдельно и отменять дальнейшее действие правила, потому что далее в БСП она игнорируется.

Можно также здесь отменить загрузку непроведенного документа, отсутствующего в базе приемнике (в тексте не реализовано).

 
 Код процедуры события ПередЗаписьюПолученныхДанных

5. Добавляем правила в расширения.

Из КД3 выгружаем модуль менеджера обмена для конвертации. Сравниваем его в с текущим модулем менеджера обмена (Файл — Сравнить файлы). Отличия реализуем через расширение (одних методов После вполне достаточно). Повторяем для другой конвертации.

6. Добавляем к Плану обмена обеих конфигураци СинхронизацияДанныхЧерезУниверсальныйФормат реквизит типа булево, включающий нашу функциональность (РасшБП_ВключитьНашОбмен). Выносим его на форму узла.

 
 Код процедуры расширения, добавляющий реквизит на форму узла. Модуль формы узла

7. Реализуем регистрацию объекта на узлах плана обмена.

В моем случае в БП (источнике) документ был добавлен в расширение, а в УТ (получателе) уже был в конфигурации, но нужно было отменять отправку, если мы его получили.

 

Состав Плана обмена СинхронизацияДанныхЧерезУниверсальныйФормат можно дополнить через расширение (снимаем авторегистрацию).

Подписки на события изменять в расширении нельзя, но для одного документа можно просто  дополнить процедуры ПередЗаписью и ПередУдалением, разместив там вызов процедуры из событий подписок СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияДокумента и СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияУдаления.

 

С этими процедурами будут отрабатывать правила регистрации, если их отредактировать.

 

И далее можно:

а) Изменить правила регистрации, указав зависимость регистрации документа от установки этого реквизита РасшБП_ВключитьНашОбмен (их можно загрузить из файла в пользовательском режиме), но потом возможно нужно будет обновлять правила регистрации при их обновлении в типовой, что может быть не удобно.

б) Либо программно убрирать лишние узлы в событии документа ПередЗаписью (так сказать, правила регистрации программно)

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

Если используется документ из типовой и он содержит подписки, необходимо использовать ПриЗаписи (вместо ПередЗаписью) для аналогичной функции, т.к. подписки отрабатывают после всех расширений (в моем случае это БП, код не привожу, он аналогичен).

 

Готово. Типовая может обновляться, правила типовой могут обновляться, переделка нашего правила при этом не потребуется.

 

Выводы:

 

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

2. Документы попадают в эту таблицу по признаку Проведен:

для нового документа — используется признак из обмена (ПолученныеДанные.Провден)

для существующего документа — используется признак из ИБ (ДанныеИБ.Проведен)

ДанныеИБ.Проведен не замещается из ПолученныеДанные.

3. Если нужно изменить это поведение, в событии ПередЗаписьюПолученныхДанных можно для ДанныеИБ.Проведен установить нужный признак. Или вообще реализовать свою логику  и отказаться от дальнейшего выполнения правила.

КД3 EnterpriseData УниверсальныйФорматОбмена

См. также

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141463    798    297    

419

SALE! 10%

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

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

55778 50200 руб.

04.08.2015    166425    332    277    

373

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.234.x) и БП 3.0 (3.0.161.x). Правила подходят для версии ПРОФ и КОРП.

35000 31500 руб.

15.12.2021    23985    169    51    

127

SALE! 10%

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

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.19.x).

35000 31500 руб.

23.07.2020    51180    228    69    

185

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    36568    94    66    

89

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 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" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171154    303    257    

378

SALE! 15%

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

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

15300 13005 руб.

18.02.2016    186854    589    509    

526

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    80632    312    250    

264
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VKuser296681124 07.03.20 19:27 Сейчас в теме
Спасибо за информацию! Многое прояснил для себя еще раз))
2. triviumfan 97 10.03.20 15:55 Сейчас в теме
Тяжело читать. Что за шрифт у вас? Меня одного он напрягает? Глаза в кучу...
Liberation Serif? Што за...
3. partizand 137 11.03.20 19:36 Сейчас в теме
Шрифты не выбирал и не настраивал. Какие были.
4. MaxS 2944 15.03.20 13:56 Сейчас в теме
Полезная статья. )
Для информации.
Где-то читал, что обмен в формате ED подразумевает обмен документами, участвующими в учете и по умолчанию считается, что раз он попал в обмен, то он проведён.
Если после обмена документ пометили на удаление и потом окончательно удалили, то из этой базы отправляется команда удаления этого объекта, в другой базе документ распроводится и помечается на удаление. Так работает типовой механизм.

Опасность обмена непроведенными документами в том, что они могут быть недозаполненными, поэтому могут не пройти проверку и обмен остановится, если в настройках не указано пропускать объект при ошибках выгрузки. Это в КД2 можно что угодно передавать, тем самым распространять бардак по другим базам. )
Т.е. нужно это знать перед тем, как дорабатывать обмен реквизитами "проведен", "не проведен" и т.п.
5. partizand 137 16.03.20 20:37 Сейчас в теме
(4)
О, точно! Не подумал об обязательных полях. Спасибо за замечание.
Задача была не в том, что бы передать непроведенный документ, а передать изменения. И распровести документ, если он был распроведен в источнике.
По сути это корявая реализация строка ТЧ -> Документ. При удалении строки ТЧ нужно удалить документ. А синхронизация состояния - постановка задачи от заказчика. Хотя тут мне нужно было обязательные незаполненные поля обговаривать.
К тому же так и не понял, получается распровели документ в исходной базе, но не удалили, конечная об этом не узнает. По мне, странное поведение.
6. resonance 82 21.04.20 17:33 Сейчас в теме
Очень полезная статья, спасибо.
7. volokitinac 06.11.21 20:26 Сейчас в теме
для включения объекта которого нет в правилах для плана обмена можно написав процедуру для элемента плана обмена


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

КонецПроцедуры
Показать
8. user1318024 19.09.24 01:12 Сейчас в теме
Благодарю, полезная статья!
Получилось реализовать передачу состояний документов. Создал новое расширение, добавил в общий модуль МенеджерОбменаЧерезУниверсальныйФормат13 код.

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

&После("ЗагрузитьДополнительныеРеквизиты")
Процедура раС_ЗагрузитьДополнительныеРеквизиты(ПолученныеДанные, ДанныеXDTO, КомпонентыОбмена, ЕстьТЧДопРеквизиты)
	Если ДанныеXDTO.Свойство("AdditionalInfo") Тогда
		ПолученныеДанные.ДополнительныеСвойства.Вставить("Проведен", ДанныеXDTO.AdditionalInfo.Проведен);
		ПолученныеДанные.ДополнительныеСвойства.Вставить("ПометкаУдаления", ДанныеXDTO.AdditionalInfo.ПометкаУдаления);
	КонецЕсли;
КонецПроцедуры

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