|
Запись в базу при отмене транзакции | ☑ | ||
---|---|---|---|---|
0
bUbA
03.07.23
✎
10:30
|
Добрый день!
Создал подписку на событие для справочников, процедура перед записью. Эта подписка проверяет корректность записываемых в справочник данных, и если обнаружена ошибка, то Отказ устанавливается в значение Истина и данные об ошибке должны писаться в регистр сведений. Но т.к. перед записью начинается транзакция, то при Отказ = Истина эта транзакция отменяется, объект не записывается, но и запись в регистр сведений тоже не делается. Попробовал через фоновые задания записывать в РС (ФоновыеЗадания.Выполнить), но запись также не происходит. Подскажите, пожалуйста, какие варианты обхода могут быть? Запись через промежуточный файл - это крайний вариант, хотелось бы обойти это. |
|||
1
BDA80
03.07.23
✎
10:57
|
ОбработкаПроверкиЗаполнения()?
|
|||
2
lodger
03.07.23
✎
11:02
|
(0) вот как раз ФоновыеЗадания.Выполнить и решает твою задачу. покажи как у тебя не получилось?
|
|||
3
YFedor
03.07.23
✎
11:53
|
(0) А почему нельзя писать в журнал регистрации?
|
|||
4
bUbA
03.07.23
✎
12:08
|
(2)
Если Отказ Тогда МассивПараметров = Новый Массив; МассивПараметров.Добавить(Источник.Ссылка); МассивПараметров.Добавить(МассивОшибок); Если Источник.ДополнительныеСвойства.Свойство("ДампЗаписи") Тогда МассивПараметров.Добавить(Источник.ДополнительныеСвойства.ДампЗаписи); КонецЕсли; ФоновыеЗадания.Выполнить("КонтрольДанных.ЗаписатьОшибкиВРегистр", МассивПараметров); //ЗаписатьОшибкиВРегистр(МассивПараметров); КонецЕсли; |
|||
5
bUbA
03.07.23
✎
12:09
|
(3) Журнал регистрации объемный и периодически очищается, неудобно с ним работать. Кроме того после записи ошибок в регистр их еще обрабатывать надо будет.
|
|||
6
bUbA
03.07.23
✎
12:12
|
(1) Идея хорошая, но судя по документации ОбработкаПроверкиЗаполнения не вызывается в случаях, если запись были инициирована программно. А большинство проверок будут проходить автоматически, например, при импорте контрагентов в базу при обменах с другими системами, в момент их записи.
|
|||
7
bUbA
03.07.23
✎
12:17
|
(1) Хотя тут я поторопился наверно, потому что в проверяемых реквизитах в ОбработкаПроверкиЗаполнения могут быть не все реквизиты, которые нас интересуют, поэтому удобнее получать объект и проверять произвольно, что нам надо
|
|||
8
lodger
03.07.23
✎
12:49
|
(4) ну а в КонтрольДанных.ЗаписатьОшибкиВРегистр сколько параметров, обязательный ли третий параметр, и как он выполняется в отладке?
|
|||
9
novichok79
03.07.23
✎
12:57
|
если бы я был 1Сником, то делал бы так:
писать в файлик или отправлять во внешнюю систему сбора логов, но 1Сина медленная сама по себе, так что писать в файлы. я уже так делал в одной высоконагруженной самописной конфигурации, году этак в 2018м. лезть для логов ошибок в транзакцию - слишком жирно получается. лезть для логов в помойку под названием журнал регистрации - муторно, точка отказа, которая еще и чистится хз когда. поэтому, мы пишем в файлики в попытОчке, ошибки разумеется игнорируем и да, абстрагируемся нах совсем от этой мерзкой ORMки 1С. отдельным фоновым эти файлики собираем, как нужно обрабатываем. фоновое в модуль, чтобы потом еще и смасштабировать на несколько разных решений. все четенько. |
|||
10
ejikbeznojek
03.07.23
✎
13:00
|
Что-то похожее, только наоборот вот тут обсуждалось.
Почему в модуле объекта не существует события ПослеЗаписи()? А так у тебя же справочники на основании чего-то создаются. Сделай после завершения транзакции проверку, на основании того же самого, все ли элементы создались. |
|||
11
bUbA
03.07.23
✎
13:27
|
(8) Процедура ЗаписатьОшибкиВРегистр(Знач МассивПараметров) Экспорт
О каком третьем параметре идет речь? О ключе для фонового задания? Если о нем, то он не обязателен и я не заполняю его. |
|||
12
bUbA
03.07.23
✎
13:31
|
(10) Кроме новых контрагентов будут проверяться и существующие, при попытке записать/внести изменения в них, поэтому после завершения транзакции я уже ничего в подписке на события сделать не могу, т.к. транзакция на момент выхода из процедуры активна.
|
|||
13
lodger
03.07.23
✎
14:03
|
(11) у тебя СП отобрали?
Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>) Параметры: <ИмяМетода> (обязательный) Тип: Строка. Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода. <Параметры> (необязательный) Тип: Массив. Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода. Все передаваемые параметры должны поддерживать сериализацию. В противном случае будет выдано исключение и фоновое задание не будет запущено. Если последние параметры метода имеют значения по-умолчанию, то их можно не задавать в массиве. Если все параметры метода имеют значение по-умолчанию, то массив можно не передавать вообще. Размер передаваемых данных ограничен 1 ГБ. Если внутреннее представление превышает указанное значение, будет вызвано исключение. Параметры большого размера рекомендуется передавать через базу данных. |
|||
14
lodger
03.07.23
✎
14:06
|
вот примерное описание этого финта
https://luckyea77.livejournal.com/4444578.html ищи строку При запуске фонового задания можно передать параметры |
|||
15
Галахад
гуру
03.07.23
✎
14:21
|
Что не понял. Перед записью ссылки-то нету, значить измерение будет не уникальным.
|
|||
16
bUbA
04.07.23
✎
10:08
|
(13) Действительно, тут я ошибся. Поправил параметры в процедуре и фоновое отработало как надо. Спасибо!
|
|||
17
bUbA
04.07.23
✎
10:09
|
(15) Есть 2 РС, существующие объекты пишутся в один регистр, а незаписанные данные в другой регистр со своими измерениями.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |