Вход | Регистрация
 

Обход неявных блокировок

Обход неявных блокировок
Я
   Ginger_616
 
04.02.20 - 14:06
Добрый день!
Суть задачи в том что в процедуре "ПриЗаписи" документа "ЗаказКлиента" если по определенным условиям Отказ становится равен Истина - делать запись об этом в определенный регистр сведений (режим записи - независимый).
Так как "ПриЗаписи" работает в "неявной транзации", запись которую я формирую программно в регистр сведений откатывается.
Вопрос: Каким образом можно решить такую ситуацию?
 
 
   Ginger_616
 
1 - 04.02.20 - 14:06
тему что-то криво написал, сори.
   vi0
 
2 - 04.02.20 - 14:12
а что за задача прикладная? зачемп писать в регистр?
   Ginger_616
 
3 - 04.02.20 - 14:19
В регистр необходимо фиксировать данные о том, что заказ не смог "влезть" в доставку.
Условно в день мы можем принять 1 тонну, принято 990 кг, поступил заказ на 200 кг, отвезти мы его уже не можем так как превышается лимит.
Пользователю выводится сообщение с ошибкой, заказ не проводится.  
Информацию необходимо зафиксировать для того чтобы в дальнейшем отобразить ее в отчетах.
   polosov
 
4 - 04.02.20 - 14:32
Делай проверку и запись в ОбработкаПроверкиЗаполнения
   eTmy
 
5 - 04.02.20 - 14:37
(4) могут быть уже не актуальные данные
   Вуглускр1991
 
6 - 04.02.20 - 14:57
Переназначить кнопки запись и проведение. Сделать транзакцию явной. После чего в ветке с отменой транзакции начать новую с записью в этот регистр.
Потом, надо будет создать регистр в который писать отказы в записи в тот регистр
Потом, надо будет создать регистр в который писать отказы в записи в тот регистр
Потом, надо будет создать регистр в который писать отказы в записи в тот регистр
Потом, надо будет создать регистр в который писать отказы в записи в тот регистр
...
   vi0
 
7 - 04.02.20 - 15:02
если эта работа исключительно в форме документа то можно сделать проверку ПередЗаписью формы
там транзакция еще не началась
   Ginger_616
 
8 - 04.02.20 - 15:27
(7) Все получилось после того как перенес свои проверки в модуль форму в процедуру передЗаписьюНаСервере. Спасибо! Буду тестировать!
Всем большое спасибо за помощь.
   H A D G E H O G s
 
9 - 04.02.20 - 15:36
(0)
Пиши в ФоновомЗадании
   Ginger_616
 
10 - 05.02.20 - 09:58
Уважаемые, в итоге сегодня я продолжил работу над задачей и понял что перенесение данного кода в модуль формы мне не подходит, т.к. необходимо чтобы механизм отрабатывал не только когда зашли в заказ и провели, а также когда он проводится из формы списка, любого рабочего места и т.д.
Взгрустнул. (9) В фоновом задании я не могу фиксировать момент, когда у нас заказ не влез в доставку.
   toypaul
 
11 - 05.02.20 - 10:12
   toypaul
 
12 - 05.02.20 - 10:13
правда обработка проверки может сработать не только при попытке записи
   artik2
 
13 - 05.02.20 - 10:45
не пробовал, но возможно прокатит передать запись в регистр веб-сервису, опубликованного к этой же базе.
   1Садовник
 
14 - 05.02.20 - 11:20
(10) //В фоновом задании я не могу фиксировать момент, когда у нас заказ не влез в доставку.
Почему? В "ПриЗаписи" ставишь условие ограничения, если оно срабатывает: Отказ = Истина и запускаешь фоновое задание на запись в РС с нужными параметрами. При откате транзакции, фоновое отработает.

(11) Следует учитывать, что обработчик ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта, в частности, он не вызывается в случаях если запись были инициирована программно. - https://its.1c.ru/db/v8std#content:463:hdoc
   Cyberhawk
 
15 - 05.02.20 - 11:25
(3) "Пользователю выводится сообщение с ошибкой, заказ не проводится" // Вот в форме ПередЗаписьюНаСервере и делай
   vi0
 
16 - 05.02.20 - 13:59
(14) только нужно дождаться успешного завершения фонового, чтобы убедиться что там все случилось как надо
   vi0
 
17 - 05.02.20 - 14:05
Хотя ФЗ попахивает костылём
   vi0
 
18 - 05.02.20 - 14:08
(3) "Пользователю выводится сообщение с ошибкой, заказ не проводится. Информацию необходимо зафиксировать для того чтобы в дальнейшем отобразить ее в отчетах."
А дальше что пользователь делает с заказом?
   vi0
 
19 - 05.02.20 - 14:08
(3) Типовая конфигурация? Какая? Какая версия?
   Cyberhawk
 
20 - 05.02.20 - 14:13
(16) Технически это нереализуемо без внешнего контура контроля
   vi0
 
21 - 05.02.20 - 14:15
(20) почему не реализуемо?
   Cyberhawk
 
22 - 05.02.20 - 14:19
(21) Потому что ФЗ - увы - ненадежный механизм
   Tonik992
 
23 - 05.02.20 - 14:45
Писать в файлик или во внешний сервис.
   vi0
 
24 - 05.02.20 - 14:52
(22) в чем конкретно заключается ненадежность? Или ты ответишь как в ветке про инвестиции "может случиться что угодно"?
   fisher
 
25 - 05.02.20 - 14:52
В транзакции невозможно писать в базу данных факт отмены транзакции.
Вариантов только два: либо писать не в транзакции, либо не в базу данных. Во всяком случае не в базу данных 1С.
Из нативного - проще всего представляется писать в ЖР, а в регистр сведений перебрасывать по регламенту.
   vi0
 
26 - 05.02.20 - 14:53
Я спрашиваю про надёжность получения факта успешного завершения фз
   vi0
 
27 - 05.02.20 - 14:55
Мне кажется решение нужно искать в технологии работы с документами, а не в технических хитростях
   fisher
 
28 - 05.02.20 - 15:01
(27) Вопросы логирования - это как раз вопросы "технических хитростей", а не технологии работы с документами.
   vi0
 
29 - 05.02.20 - 15:04
(28) ты чему это?
   vi0
 
30 - 05.02.20 - 15:09
Под технологией я подразумеваю например подсистему формирования отгрузок в ут11 или в ерп. Где не нужно искать способ обойти транзакцию итп
 
 Рекламное место пустует
   fisher
 
31 - 05.02.20 - 15:24
(30) Простая задача. Мы хотим логировать события в том числе откатываемых транзакций. Абсолютно рядовое желание. Анализировать статистику ошибок, да мало ли что еще. Причем здесь вообще "технология работы с документами"? Это вообще не только документов касается. Из коробки для этих целей ЖР предназначен. Желание писать это в регистр сведений - это уже больше к задаче агрегации логов относится, чтобы выполнять необходимые анализы быстро и безболезненно. В мире "взрослого" программирования для этих целей выполняется локальное логирование в текстовые файлы, а сверху агрегаторы логов собирают уже по ним нужные данные в более удобные виды для дальнейшей обработки.
   Фауст
 
32 - 05.02.20 - 15:24
(3) Не нужно устанавливать Отказ = Истина.
Делай свои проверки в процедуре модуля объекта ПередЗаписью()
Если проверка не пройдена то: 
1) РежимЗаписи = РежимЗаписиДокумента.Запись;
2) Записываешь инфу в твой регистр сведений
3) Выводишь сообщение пользователю
   vi0
 
33 - 05.02.20 - 15:30
(31) ты упрощаешь и не берешь во внимание весь процесс, а именно то, что поступивший заказ не был обработан
   vi0
 
34 - 05.02.20 - 15:31
(33) + и вопрос там не про транзакции а про заказы и отгрузки
   ProxyInspector
 
35 - 05.02.20 - 16:14
ПередЗаписью() запиши в регистр сведений информацию об ошибке
После проведения удали эти записи, если все прошло нормально
   Cyberhawk
 
36 - 05.02.20 - 16:28
(24) Отмена программно - без гарантии. Выполнение - тоже.
   Cyberhawk
 
37 - 05.02.20 - 16:29
+(36) Выполнение = статус имеет выполнено, а по факту - код даже не выполнялся.
Поэтому нужен внешний контроль там, где нужна гарантия.
   vi0
 
38 - 05.02.20 - 16:52
(37) по какому факту? ты о чем? хотя можешь не отвечать, точнее отвечать не нужно.
   fisher
 
39 - 05.02.20 - 17:30
(33) Возможно я не до конца понял изначальную задачу ТС и обобщил не в ту степь. Если у него в статусы заказов упирается и причины отказа, тогда это тупо реквизитами заказа можно завести и в ПередЗаписью все просчитывать.
   Вуглускр1991
 
40 - 05.02.20 - 20:31
(39) Конфликт блокировок перед записью не просчитаешь.
   Сияющий в темноте
 
41 - 06.02.20 - 01:28
а когда мы программно записываем,может оказаться,что у нас одна большая транзакция на все документы и тут отказ,и опа-и как будто и не начинали писать в базу.
   fisher
 
42 - 06.02.20 - 10:10
(40) Так я тоже сначала повелся на то, что ТС нужна статистика отказов. А на самом деле он бизнес-процесс пытается выстроить. Читай (3)
   Вуглускр1991
 
43 - 06.02.20 - 10:32
(42) Ты прав, ПередЗаписью.


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