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

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

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

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