Имя: Пароль:
1C
 
Запись в базу при отмене транзакции
,
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 РС, существующие объекты пишутся в один регистр, а незаписанные данные в другой регистр со своими измерениями.