|
Как узнать, произошёл ли отказ от записи элемента справочника? | ☑ | ||
---|---|---|---|---|
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
|
перед записью запоминаешь поле "Ссылка.Версия" после записи сравниваешь, если значение изменилось - запись прошла успешно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |