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

32 Comments

  1. baton_pk

    Разумно. У нас дабы не менять конфу удаление регистрации сделано в правилах обмена в обработчике «После выгрузки в файл». Если б дали конфу менять, то сделал бы скорее всего так же.

    Reply
  2. fixin

    (1) возможно, но сложно. Так проще. главное, что я к этому долго шел и не получалось все никак.

    Reply
  3. baton_pk

    (2) Да, проще, я не спорю 🙂

    Reply
  4. fixin

    (3) видишь ли, я мечтал об этом год. А оказалось, что все так просто. Теперь если слетает обмен, то ничего страшного, то что уже прошло, повторно не пойдет….

    Reply
  5. Kamikadze

    У себя пошел подобным путем, но есть одно НО — ошибки при обменах трудно ловить, так как в режиме сервера сообщения не выводяться. Сейчас думаю над сообщениями об ошибках и впринципе — все будет работать как часики.

    Reply
  6. fixin

    (5) журнал регистрации на что? 😉

    или регистр сведений.

    Reply
  7. Kamikadze

    Журнал регистрации 1С меня не устраивает по быстродействию.

    Reply
  8. fixin

    (7) пиши в свой лог в файл. или в регистр сведений.

    Reply
  9. sorb

    О-О-О! Долго руки не доходили разобраться, а тут такой подарок, спасибо! Для обменов на базе БСП это тоже действительно?

    Reply
  10. sorb

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

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

    дальше идет обход выборки:

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

    Идем в конец цикла, видим условие:

    Если ЭтоОбменЧерезВнешнееСоединение Тогда

    внутрь добавляем:

    ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена, Данные);

    Reply
  11. fixin

    (10) Интересно, Селезневские примут этот мой патч к сведению, или и дальше будут мучать пользователей COM-обменов?

    Reply
  12. sorb

    (11) думаю они на своем Такси вряд ли до этого доберутся 🙂

    Reply
  13. fixin

    (12) жаль, что 1С не такая дружелюбная контора как хотелось бы. 😉

    Я считаю это упущенными возможностями конторы к развитию.

    Если она общается только по закрытым каналам.

    Reply
  14. asved.ru

    Поправочка: закрываем мы не промежуточную транзакцию, а всю имеющуюся. Вложенные транзакции 1С не поддерживаются.

    Reply
  15. DimkoZah

    А по-моему поддерживаются… Натыкался на вложенность транзакций в РТ 1.0 при очередном обновлении платформы — документ ОРП создавался заполнялся и записывался а транзакция не закрыта даже после ЗафиксироватьТранзакцию(). Приходилось дополнительно проверять открыта транзакция или нет.

    Reply
  16. i.kovtun

    (15)DimkoZah,

    Предприятие 8 не поддерживает вложенные транзакции. Все «вложенные транзакции» сливаются в одну. Но это не значит, что транзакция завершится после первого вызова ЗафиксироватьТранзакцию() или ОтменитьТранзакцию().

    Если количество вызовов метода НачатьТранзакцию() превышает количество вызовов методов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(), то система выполнит неявный вызов метода ОтменитьТранзакцию() в следующих случаях:

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

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

    1С:Предприятие 8.2. Документация/Глава 9. Работа с данными/9.2. Механизм транзакций/9.2.1. Использование явного вызова транзакций; 9.2.2. Вложенный вызов транзакций

    Reply
  17. DimkoZah

    (16) i.kovtun, Благодарю! Вот только у меня есть вопрос: Почему возникла такая ситуация, что при закрытии смены документ Отчет о розничных продажах НЕ СОХРАНЯЛСЯ в базе из-за незакрытой транзакции (отловил в журнале)? Конфигурация при этом не изменялась, не обновлялась. Точно не помню сохранялся ли первый документ… Конфигурация дорабатывалась под множество фискальников.

    Reply
  18. i.kovtun

    (17) DimkoZah,

    Трудно сказать. Чтобы разобраться нужно, во-первых, воспроизвести повторяемый кейс, проверить наличие исключений (в том числе завернутых в попытку), возможно придется продебажить. Ну и всегда остается очень маленькая вероятность ошибки в платформе.

    Reply
  19. insurgut

    Проще было сделать 2 односторонних обмена — результат тот же, доработок — никаких.

    Reply
  20. insurgut

    (11) какой патч? Если обмен двусторонний он будет являться успешным при одновременной выгрузке/загрузке. Идеология отличная, и ничего тут собственно менять не требуется. Для того, что вы реализовали есть типовое решение в комментарии выше.

    Reply
  21. Bajo

    (21) а где можно скачать обработку?

    Reply
  22. fixin

    (22) какую обработку? это вмешательство в код, а не обработка.

    Reply
  23. anchovy

    Позволю себе немного критики.

    Это только половина решения, т.к. подобное вмешательство отрезает часть логики типового обмена, отвечающую за проверку результата выгрузки. На что и указал в (5)Kamikadze. Про то, что нужно это как-то компенсировать, в статье ничего нет.

    Если бы это было представлено как финальное сообщение в обсуждении тут http://forum.infostart.ru/forum42/topic58449/ , то было бы понятно. Но на статью это явно не тянет — не хватает завершенности.

    Reply
  24. fixin

    (24) не понял вашего замечания. О каком отрезании логики идет речь?

    Если объект передался по правилам, его можно исключть из регистрации в планах обмена. Не вижу тут проблем, может укажете?

    Reply
  25. insurgut

    (25) ну да, если запись регистра подчиненная регистратору передана — можно снимать с регистрации, ну если потом произойдет ошибка при передаче самого регистратора — ничего страшного 🙂

    Reply
  26. fixin

    (26) Вы великий теоретик, да.

    А ничего, что:

    1. При обмене УТ-Розница движения не передаются, документы просто перепроводятся.

    2. Если передастся только регистратор, со следующей порцией передаются и движения по регистрам.

    Я тащемто практик.

    Reply
  27. insurgut

    (27) Я как раз таки больше практик, чем теоретик. 🙂 А примем тут УТ-Розница? Решение же вы предлагаете универсальное, т.е. какие правила используются — не имеет значение. Будь они типовыми, или написанными самостоятельно.

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

    Reply
  28. fixin

    (28) мне кажется, что человек способный понять и внедрить это решение, по умолчанию обладает достаточной квалификацией, чтобы понять, применимо это решение или нет.

    Все же это методика не для чайников 1С. 😉

    Reply
  29. insurgut

    (29) тут с вами соглашусь полностью 🙂

    Reply
  30. anchovy

    (25) Я же вроде указал, что отрезается алгоритм проверки результата выгрузки. Запись со ссылкой на выгруженный объект удаляется из таблицы регистрации изменений сразу после выгрузки. Т.е. на стороне выгрузки не получаем сообщение об успешности загрузки и лишаемся возможности что-либо предпринять.

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

    Reply
  31. sorb

    (31) anchovy, Хоть давно был последний пост, но… в случае БСП все алгоритмы после загрузки отрабатываются сразу после загрузки самого объекта, поэтому ничего не теряется. В случае до БСП действительно удаление нужно делать немного позже, чем предложено у fixin. Но это никоим образом не умаляет ценность статьи автора — лично я кучу времени сэкономил, так как очень долго не доходили руки выполнить анализ механизма.

    Reply
  32. LsrGroup

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

    Напомню, как работает ВыбратьИзменения: в процессе выборки изменений в записи регистрации изменений проставляется номер сообщения обмена данными, «фиксируя» старт обмена. Если после этого данные были изменены, то в номер сообщения проставляется Null.

    И если мы удаляем регистрацию по номеру сообщения — то удаляются только данные по тем объектам, которые были выгружены И НЕ ИЗМЕНЕНЫ за время выгрузки! Если удаляем просто по ссылке — то есть вероятность очистить регистрацию по измененным объектам в течении обмена, и соответственно, не выгрузить часть изменений.

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *