Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как узнать, произошёл ли отказ от записи элемента справочника?

Как узнать, произошёл ли отказ от записи элемента справочника?
Я
   leklerk
 
15.04.21 - 18:56
Добрый день! Подскажите пожалуйста по такому вопросу. Допустим, записывается элемент справочника (необязательно из формы). Как узнать, записался ли он успешно или произошёл отказ от записи? В каком событии? Если проверять в конце обработчика ПриЗаписи модуля объекта или в подписке на это событие, то ведь всегда могут дописать код после моего кода и отказ может произойти там.
   H A D G E H O G s
 
1 - 15.04.21 - 19:06
(0) Подписки на события отрабатывают по их порядку в дереве метаданных (актуально на 8.3.10). Добавить свою подписку с префиксом яяя и в ней проверять, ну или добавить код проверки в начале работы системы, примерно такого вида

Функция ОбработчикРазмещенПослеСтандартного() Экспорт
    ИмяСтандартногоОбработчика="УстановитьПрефиксИнформационнойБазы";
    ИндексСтандартногоОбработчика=0;
    ИмяДополнительногоОбработчика="АСФПриУстановкеНовогоНомера";
    ИндексДополнительногоОбработчика=0;
    Счетчик=0;
    Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
        Если Лев(Подписка.Имя,СтрДлина(ИмяСтандартногоОбработчика))=ИмяСтандартногоОбработчика Тогда
            ИндексСтандартногоОбработчика=Счетчик;
        КонецЕсли;
        Если Подписка.Имя=ИмяДополнительногоОбработчика Тогда
            ИндексДополнительногоОбработчика=Счетчик;
        КонецЕсли;
        Счетчик=Счетчик+1;
    КонецЦикла;
    
    Возврат ИндексДополнительногоОбработчика>ИндексСтандартногоОбработчика;
КонецФункции

    ОбработчикРазмещенПослеСтандартного=АСФПрефиксыДокументовПовтИсп.ОбработчикРазмещенПослеСтандартного();
    Если ОбработчикРазмещенПослеСтандартного=Ложь Тогда
        Сообщить("Подсистема префиксации АСФ отключена, так как обработчик префиксации ""АСФПриУстановкеНовогоНомера"" размещен выше стандартного в дереве метаданных");
        Возврат;
    КонецЕсли;
   Dmitrii
 
2 - 15.04.21 - 19:16
(1) И ка это будет работать, например, с расширениями.
В расширениях можно (с какой-то там версии платформы) клепать свои подписки.
Расширений может быть несколько с одинаковым назначением (адаптация/исправление/дополнение).
В расширении может быть не прост добавлена новая подписка, но и просто расширена процедура-обработчик подписки.
   Dmitrii
 
3 - 15.04.21 - 19:18
(0) Опиши полностью свою задачу.
Зачем тебе знать произошел ли отказ?
Запись происходит в транзакции. Если произошел отказ (на любом этапе), то транзакция откатывается полностью. Даже если ты пытаешься что-то записывать или модифицировать другие объекты, их запись не произойдёт.
   leklerk
 
4 - 15.04.21 - 19:20
(1) H A D G E H O G, но ведь в той же подписке тоже могут дописать код после моей проверки, и отказ может произойти там! То есть я в своём коде проверил - отказа нет, а в последующем коде он взял да и произошёл.
   Dmitrii
 
5 - 15.04.21 - 19:21
+ к (3) уточню. Зачем тебе знать произошел ли отказ именно ДО завершения записи?
   Dmitrii
 
6 - 15.04.21 - 19:22
(4) >> я в своём коде проверил - отказа нет, а в последующем коде он взял да и произошёл.

И что такого? Что у тебя за код, если это так критично для тебя?
   H A D G E H O G s
 
7 - 15.04.21 - 19:23
(2) С расширениями не пробовал.
   H A D G E H O G s
 
8 - 15.04.21 - 19:24
(4) Это будут уже проблемы тех, кто дописал после твоего кода.
   Dmitrii
 
9 - 15.04.21 - 19:26
(7) Я к тому, что код в идеале должен быть таким, чтобы его логика не зависела от других алгоритмов, выполняемых в контексте обработки объекта. Последовательность иногда может быть критичной, но надо любыми способами избегать этого.
   leklerk
 
10 - 15.04.21 - 19:27
(3) Данные в базе 1С связаны с внешней базой MS SQL. При изменении элементов справочников нужно, чтобы эти изменения отражались во внешней базе. Сейчас я это делаю в обработчике ПередЗаписью модуля объекта, т.к. надо знать и текущее значение реквизитов и предыдущее. Но допустим перед записью я изменил во внешней базе, а позже произошёл отказ, и, получается, надо возвращать изменения. Или перед записью не изменять сразу во внешней базе, а писать в регистр, который потом отсылает изменения во внешнюю базу регл. заданием. В любом случае надо знать, не произошёл ли позже отказ.
   leklerk
 
11 - 15.04.21 - 19:28
(5) Мне нужно знать, произошёл ли отказ, как раз ПОСЛЕ завершения записи, а не до.
   H A D G E H O G s
 
12 - 15.04.21 - 19:30
(9) Ну нет такого. Я крайне сомневаюсь, что автор сможет реализовать запуск фонового задания, в который он передаст ВерсиюДанных и через ВК будет ждать внесения этой версии в БД и в случае неуспеха по таймауту будет принимать решение о неудаче.
   leklerk
 
13 - 15.04.21 - 19:31
(6) "Что у тебя за код, если это так критично для тебя?" Код просто отсылает изменения во внешнюю базу.
"И что такого?" Просто, если я отослал изменения во внешнюю базу, а потом произошёл отказ, получается, что никаких изменений и нет, т.е. нужно откатывать.
   Dmitrii
 
14 - 15.04.21 - 19:35
(10) (11) Я понял тебя.
Регистр не нужен. Для этого в 1С есть планы обмена.
Единственный вопрос - насколько тебя устроит тот факт, что изменения во внешней базе будут отображаться не мгновенно.
   RomanYS
 
15 - 15.04.21 - 19:37
(13) подключение к внешней базе время записи та себе идея. Фиксируй в РС или плане обмена, потом отсылай
   Dmitrii
 
16 - 15.04.21 - 19:39
(15) +1. Кстати да. Подключение и отправка данных во внешний источник в транзакции записи - не самое лучшее решение. С неясными последствиями в случае сбоя или отказа со стороны этого внешнего объекта или транспорта.
   leklerk
 
17 - 15.04.21 - 19:45
(14) (15) (16) Да, мне уже говорили про планы обмена. Но ведь там отсылаются изменения из одной базы 1С в другую по правила обмена (реквизитам объектов базы-источника соответствуют реквизиты объектов базы-приёмника). А тут я должен выполнить хранимую процедуру MS SQL, которая внесёт изменения во внешнюю базу. Применима ли здесь схема с планами обмена?
   RomanYS
 
18 - 15.04.21 - 19:47
(17) План обмена это просто регистрация факта изменения. С транспортом планы никак не связаны
   acanta
 
19 - 15.04.21 - 19:52
Что мешает прямым запросом обращаться к плану обмена?
   leklerk
 
20 - 15.04.21 - 19:52
(18) Ок, спасибо, тогда попробую.
   leklerk
 
21 - 15.04.21 - 19:54
(19) Ещё не пробовал вариант с планами обмена. Есть опыт только простых обменов, поэтому плохо знаком с этой темой, надо поизучать)
   leklerk
 
22 - 15.04.21 - 19:57
(12) H A D G E H O G, а что такое ВК в твоём посте - не ВКонтакте же? :)
   ДедМорроз
 
23 - 15.04.21 - 22:52
Если мы в транзакции хотим что-то сделать после того,как она завершилась,то можно взять любой объект,который изменяется и получить его версию до и после изменения.
Эти параметры передать в фоновое задание,которое стартует и читает наш объект,пока наша транзакция не закончилась,прочитать из фонового не получится,а когда получится,то транзакция гарантированно завершена,а по версии можно сказать подтверждена или отменена.
   vde69
 
24 - 15.04.21 - 22:54
перед записью запоминаешь поле "Ссылка.Версия" после записи сравниваешь, если значение изменилось - запись прошла успешно


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.