Волшебное улучшение обменов по правилам через COM-соединение

13.08.13

Интеграция - Обмен между базами 1C

В типовых конфигурациях есть замечательный механизм обмена по правилам через COM-соединение. Объекты по одному передаются из базы-источника в базу-приемник, подключенную через COM. В результате не требуется промежуточный файл обмена, иногда большой и процесс обмена более контролируемый. Тем не менее, типовой механизм можно улучшить и добиться, чтобы, как только объект передавался в базу-получатель, сразу же бы удалялась и регистрация изменений для базы-получателя. Несколько строк кода приносят волшебный эффект!

Назначение улучшения

Улучшение позволяет принести много положительных эффектов в обмены через COM:

  1. Основная цель. Если выгрузка(загрузка) завершается с ошибкой, то уже переданные объекты не будут передаваться повторно. Особенно это хорошо в случаях, когда обмены не проходили длительное время и накопился большой объем изменений. Большие обмены длятся долго и могут вылететь, их приходится назначать сначала.
  2. Борьба с коллизиями. Если даже выгрузка происходит успешно, но не происходит загрузки, нет подтверждения о том, что объект получен, соответственно, он будет передаваться еще раз. Это может привести к коллизиям, т.к. за время между обменами объект могли изменить. Мы можем удалить регистрацию изменений и не дожидаясь подтверждения в виде загрузки из базы-получателя, ведь и так понятно, что объект туда ушел.
  3. Страх отложенных движений. Когда документ передается повторно, он распроводится. Это пугает пользователей, они видят, что документ был сперва проведен, потом распроводится. Особенно это страшно в случае больших обменов, когда могут распроводиться большие массивы документов. По этой схеме документ передается только один раз.

 

Реализация

Сначала я беспокоился, что обмен по COM-соединению реализован через выгрузку во временный файл обмена. Но, к счастью, передача идет по одному объекту.

Изменения нужно вносить в обработку ОбменДаннымиXML: в процедуру ВыполнитьВыгрузкуИзмененныхДанныхДляУзлаОбмена в цикл по перебору изменений. Добавляемый код выделен комментариями:

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

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

 

Важно! Изменения нужно добавить в код обработок обеих базах. Почему? Обычно обмен двухсторонний.

Обмен происходит в процедуре ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиЧерезComСоединение.

Сначала происходит загрузка из базы-приемника, при этом вызывается экземпляр обработки обмена из базы-приемника  ОбработкаОбменаПриемника.ВыполнитьВыгрузку. Поэтому важно, чтобы в базе-приемнике обработка тоже была пропатчена аналогичным образом.

Затем идет выгрузка из базы-отправителя, используется уже обработка из базы-отправителя ВыполнитьВыгрузку.     

 

Проверка

В журнале регистрации базы-получателя видим, что пришел документ РОТ 3006:

 

В мониторе обмена в базе-отправителе видим, что объект зарегистрирован:

Теперь выполним код по удалению, посмотрим монитор обмена, однако вместо ожидаемого удаления документа РОТ из зарегистрированных изменений увидим ошибку:

Дело в том, что в настройке обмена указан размер транзакции – 200 объектов:

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

Еще одно свидетельство, до обмена количество зарегистрированных изменений было большим:

После обмена добавились только свежие изменения (в тестовой базе активно работают пользователи):

Заключение

Эта статья замечательно показывает, как минимальное, точечное вмешательство, может привести к потрясающему эффекту. Как тут не вспомнить анекдот про сантехника, который приходит, тыкает пальцем и берет за это 1000 рублей, объясняя – сам тык стоит 1 рубль, но время, в течении которого я изучал этот тык стоит 999 рублей.

 

Сначала я обсуждал эту проблему на Инфостарте в контексте:

1С:Предприятие 8.1 (8.1.15.14)
"Управление торговлей", редакция 10.3 (10.3.7.9)
В УТ настроен обмен с Розницей по правилам обмена через COM-соединение.
Хочу, чтобы при выгрузке из УТ в Розницу (из базы-отправителя в базу-получатель), когда документ передан в базу-получатель и зарегистрирован в отложенных движениях, чтобы он удалялся из плана-обмена базы-отправителя (УТ).
Т.к. иногда выгрузка не доходит до конца, или же не получает подтверждения, чтобы данные повторно не гонялись
.

 

К сожалению, никто мне там не подсказал этого замечательного решения, пришлось до всего додумываться самому.

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

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

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

45650 36520 руб.

04.08.2015    159689    363    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134940    723    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

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

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

34650 27720 руб.

15.04.2019    68420    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

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

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

43450 34760 руб.

03.12.2020    34169    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

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

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

28000 25200 руб.

23.07.2020    46301    196    64    

158

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

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

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

50722 45650 руб.

31.10.2014    231412    124    327    

296

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    9208    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

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

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

28000 25200 руб.

15.12.2021    20252    132    38    

90
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 417 13.08.13 09:48 Сейчас в теме
Разумно. У нас дабы не менять конфу удаление регистрации сделано в правилах обмена в обработчике "После выгрузки в файл". Если б дали конфу менять, то сделал бы скорее всего так же.
2. fixin 4252 13.08.13 11:16 Сейчас в теме
(1) возможно, но сложно. Так проще. главное, что я к этому долго шел и не получалось все никак.
3. dmpas 417 13.08.13 11:32 Сейчас в теме
(2) Да, проще, я не спорю :)
4. fixin 4252 13.08.13 11:59 Сейчас в теме
(3) видишь ли, я мечтал об этом год. А оказалось, что все так просто. Теперь если слетает обмен, то ничего страшного, то что уже прошло, повторно не пойдет....
5. Kamikadze 46 15.08.13 10:50 Сейчас в теме
У себя пошел подобным путем, но есть одно НО - ошибки при обменах трудно ловить, так как в режиме сервера сообщения не выводяться. Сейчас думаю над сообщениями об ошибках и впринципе - все будет работать как часики.
6. fixin 4252 15.08.13 10:59 Сейчас в теме
(5) журнал регистрации на что? ;-)
или регистр сведений.
24. anchovy 24 28.03.14 14:16 Сейчас в теме
Позволю себе немного критики.
Это только половина решения, т.к. подобное вмешательство отрезает часть логики типового обмена, отвечающую за проверку результата выгрузки. На что и указал в (5)Kamikadze. Про то, что нужно это как-то компенсировать, в статье ничего нет.
Если бы это было представлено как финальное сообщение в обсуждении тут http://forum.infostart.ru/forum42/topic58449/ , то было бы понятно. Но на статью это явно не тянет - не хватает завершенности.
25. fixin 4252 28.03.14 14:47 Сейчас в теме
(24) не понял вашего замечания. О каком отрезании логики идет речь?
Если объект передался по правилам, его можно исключть из регистрации в планах обмена. Не вижу тут проблем, может укажете?
26. insurgut 207 29.03.14 11:06 Сейчас в теме
(25) ну да, если запись регистра подчиненная регистратору передана - можно снимать с регистрации, ну если потом произойдет ошибка при передаче самого регистратора - ничего страшного :)
27. fixin 4252 29.03.14 15:52 Сейчас в теме
(26) Вы великий теоретик, да.
А ничего, что:
1. При обмене УТ-Розница движения не передаются, документы просто перепроводятся.
2. Если передастся только регистратор, со следующей порцией передаются и движения по регистрам.

Я тащемто практик.
28. insurgut 207 30.03.14 13:33 Сейчас в теме
(27) Я как раз таки больше практик, чем теоретик. :) А примем тут УТ-Розница? Решение же вы предлагаете универсальное, т.е. какие правила используются - не имеет значение. Будь они типовыми, или написанными самостоятельно.
Не спорю, что решение ваше имеет право на жизнь, просто с определенными условиями и ограничениями.
29. fixin 4252 30.03.14 17:21 Сейчас в теме
(28) мне кажется, что человек способный понять и внедрить это решение, по умолчанию обладает достаточной квалификацией, чтобы понять, применимо это решение или нет.
Все же это методика не для чайников 1С. ;-)
30. insurgut 207 31.03.14 09:39 Сейчас в теме
(29) тут с вами соглашусь полностью :)
31. anchovy 24 01.04.14 17:09 Сейчас в теме
(25) Я же вроде указал, что отрезается алгоритм проверки результата выгрузки. Запись со ссылкой на выгруженный объект удаляется из таблицы регистрации изменений сразу после выгрузки. Т.е. на стороне выгрузки не получаем сообщение об успешности загрузки и лишаемся возможности что-либо предпринять.
Соответственно это не волшебство улучшения типового механизма, а хак, да еще и с побочными явлениями. О чем и нужно предупреждать в статье. Речь только об этом.
32. sorb 04.10.14 21:44 Сейчас в теме
(31) anchovy, Хоть давно был последний пост, но... в случае БСП все алгоритмы после загрузки отрабатываются сразу после загрузки самого объекта, поэтому ничего не теряется. В случае до БСП действительно удаление нужно делать немного позже, чем предложено у fixin. Но это никоим образом не умаляет ценность статьи автора - лично я кучу времени сэкономил, так как очень долго не доходили руки выполнить анализ механизма.
7. Kamikadze 46 15.08.13 11:26 Сейчас в теме
Журнал регистрации 1С меня не устраивает по быстродействию.
8. fixin 4252 15.08.13 11:46 Сейчас в теме
(7) пиши в свой лог в файл. или в регистр сведений.
9. sorb 04.09.13 12:21 Сейчас в теме
О-О-О! Долго руки не доходили разобраться, а тут такой подарок, спасибо! Для обменов на базе БСП это тоже действительно?
10. sorb 04.09.13 12:48 Сейчас в теме
Посмотрел, для БСП можно аналогично поправить обработку КонвертацияОбъектовИнформационныхБаз, процедура ВыполнитьВыгрузкуЗарегистрированныхДанных. Ищем текст:

УзелДляОбменаОбъект = УзелДляОбмена.ПолучитьОбъект();

дальше идет обход выборки:
Пока ВыборкаИзменений.Следующий() Цикл

Идем в конец цикла, видим условие:
Если ЭтоОбменЧерезВнешнееСоединение Тогда

внутрь добавляем:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена, Данные);
11. fixin 4252 04.09.13 13:13 Сейчас в теме
(10) Интересно, Селезневские примут этот мой патч к сведению, или и дальше будут мучать пользователей COM-обменов?
12. sorb 04.09.13 16:14 Сейчас в теме
(11) думаю они на своем Такси вряд ли до этого доберутся :)
13. fixin 4252 04.09.13 16:57 Сейчас в теме
(12) жаль, что 1С не такая дружелюбная контора как хотелось бы. ;-)
Я считаю это упущенными возможностями конторы к развитию.
Если она общается только по закрытым каналам.
20. insurgut 207 10.02.14 12:00 Сейчас в теме
(11) какой патч? Если обмен двусторонний он будет являться успешным при одновременной выгрузке/загрузке. Идеология отличная, и ничего тут собственно менять не требуется. Для того, что вы реализовали есть типовое решение в комментарии выше.
21. fixin 4252 10.02.14 12:46 Сейчас в теме
(20) вы таки не поняли сути. вам - на перечитку.
22. Bajo 80 13.02.14 10:54 Сейчас в теме
(21) а где можно скачать обработку?
23. fixin 4252 13.02.14 13:52 Сейчас в теме
(22) какую обработку? это вмешательство в код, а не обработка.
14. asved.ru 36 24.09.13 05:49 Сейчас в теме
Поправочка: закрываем мы не промежуточную транзакцию, а всю имеющуюся. Вложенные транзакции 1С не поддерживаются.
15. DimkoZah 4 07.10.13 21:47 Сейчас в теме
А по-моему поддерживаются... Натыкался на вложенность транзакций в РТ 1.0 при очередном обновлении платформы - документ ОРП создавался заполнялся и записывался а транзакция не закрыта даже после ЗафиксироватьТранзакцию(). Приходилось дополнительно проверять открыта транзакция или нет.
16. i.kovtun 180 08.10.13 14:58 Сейчас в теме
(15)DimkoZah,
Предприятие 8 не поддерживает вложенные транзакции. Все "вложенные транзакции" сливаются в одну. Но это не значит, что транзакция завершится после первого вызова ЗафиксироватьТранзакцию() или ОтменитьТранзакцию().
Если количество вызовов метода НачатьТранзакцию() превышает количество вызовов методов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(), то система выполнит неявный вызов метода ОтменитьТранзакцию() в следующих случаях:

● при окончании выполнения встроенного языка (обработчик события, внешнее соединение, automation-сервер);

● при передаче управления с сервера на клиента.


1С:Предприятие 8.2. Документация/Глава 9. Работа с данными/9.2. Механизм транзакций/9.2.1. Использование явного вызова транзакций; 9.2.2. Вложенный вызов транзакций
DimkoZah; +1 Ответить
17. DimkoZah 4 09.10.13 01:45 Сейчас в теме
(16) i.kovtun, Благодарю! Вот только у меня есть вопрос: Почему возникла такая ситуация, что при закрытии смены документ Отчет о розничных продажах НЕ СОХРАНЯЛСЯ в базе из-за незакрытой транзакции (отловил в журнале)? Конфигурация при этом не изменялась, не обновлялась. Точно не помню сохранялся ли первый документ... Конфигурация дорабатывалась под множество фискальников.
18. i.kovtun 180 09.10.13 11:21 Сейчас в теме
(17) DimkoZah,
Трудно сказать. Чтобы разобраться нужно, во-первых, воспроизвести повторяемый кейс, проверить наличие исключений (в том числе завернутых в попытку), возможно придется продебажить. Ну и всегда остается очень маленькая вероятность ошибки в платформе.
19. insurgut 207 10.02.14 11:57 Сейчас в теме
Проще было сделать 2 односторонних обмена - результат тот же, доработок - никаких.
33. LsrGroup 16.10.14 12:00 Сейчас в теме
Такой подход можно применять, но только есть одно большое НО, которое надо всегда помнить.

Напомню, как работает ВыбратьИзменения: в процессе выборки изменений в записи регистрации изменений проставляется номер сообщения обмена данными, "фиксируя" старт обмена. Если после этого данные были изменены, то в номер сообщения проставляется Null.
И если мы удаляем регистрацию по номеру сообщения - то удаляются только данные по тем объектам, которые были выгружены И НЕ ИЗМЕНЕНЫ за время выгрузки! Если удаляем просто по ссылке - то есть вероятность очистить регистрацию по измененным объектам в течении обмена, и соответственно, не выгрузить часть изменений.
Это нужно хорошо помнить, так как вероятность ошибки увеличивается при большом кол-ве изменений во время обмена и больших пакетах выгрузки.
Aquari; eeeio; WellMaster; Irwin; vlad.frost; agarych; tormozit; Mick2iS; +8 Ответить
Оставьте свое сообщение