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

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