В данной транзакции уже произошли ошибки

1. HAMMER_59 254 11.09.23 13:55 Сейчас в теме
Добрый день.

Пишу обмен между базами данных с использованием сервисов интеграции (1С:Шина).

Столкнулся с проблемой, которую решить пока не получается:

Алгоритм получения сообщения следующий (ОбработкаПолученияСообщения(Сообщения, Отказ))
1. Десериализую полученные данные в XDTO объект.
2. Пакет содержит список объектов, каждый из которых обрабатываю (создаю, изменяю объекты в базе).
3. При создании, изменении объектов возможны ошибки, при записи объектов.
4. Ошибки перехватываю конструкцией Попытка Исключение КонецПопытки.

А проблема заключается в том, что обработка получения сообщения выполняется в транзакции, и если произошла ошибка любое обращение к БД приводит к ошибке "В данной транзакции уже произошли ошибки".

Пока склоняюсь к варианту - записывать полученный пакет в БД, а обрабатывать уже позже.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. PlatonStepan 38 11.09.23 14:12 Сейчас в теме
любая открытая транзакция должна закрыться, неважно с каким статусом - принять/отказ.

поэтому бездумно гасить ошибки попытками нельзя.
отсюда общая конструкция открытия транзакции всегда должна быть следующего вида:

НачатьТранзакцию();
Попытка
	... // чтение или запись данных
	ЗафиксироватьТранзакцию();
Исключение
	ОтменитьТранзакцию();
	... // дополнительные действия по обработке исключения
КонецПопытки;
Показать


https://its.1c.ru/db/v8std/content/783/hdoc

если у вас такая конструкция, но ошибки остаются, значит не закрытые транзакции остаются в обработчиках тех объектов, которые записываются
3. HAMMER_59 254 11.09.23 14:57 Сейчас в теме
(2) Возможно я недостаточно понятно описал проблему - самое событие получение сообщения обрабатывается платформой 1С в транзакции, я сам не открываю никаких транзакций.
4. Stref75 11.09.23 15:20 Сейчас в теме
(3)
я сам не открываю никаких транзакций

но вы же пишите
Пакет содержит список объектов, каждый из которых обрабатываю (создаю, изменяю объекты в базе).
- т.е. внутри транзакции чтения сообщения вы открываете неявные транзакции записи объектов, и если объект не записался, транзакция прерывается. А поскольку 1С не поддерживает вложенных транзакций, крашится и внешняя транзакция чтения сообщения.
Как вариант - перед началом изменения объектов, проверять, не заблокирован ли он. Потому как блокировка объекта обычно и приведет к ошибке записи.
5. HAMMER_59 254 11.09.23 16:11 Сейчас в теме
(4) Заведомо известно, что возможны ошибки при записи объектов. Данные объекты нужно будет отдельно обрабатывать вручную. Вы советуете мне не записывать объекты в БД?

Летят Холмс с Ватсоном на воздушном шаре. И спят в полете. Просыпаются
над какой-то незнакомой землей, видят - внизу пастух коров пасет.
Снизились они и спрашивают мужика:
- Скажите, сэр, где мы находимся?
- На воздушном шаре.
- Спасибо, сэр! - и летят вверх. Холмс задумчиво говорит:
- Интересная местность, Ватсон! Программист пасет коров!
- Холмс, а с чего вы взяли, что он программист?
- Это элементарно! Во-первых, он долго думал над ответом. Во-вторых, его
ответ был абсолютно точен. И в третьих - абсолютно бесполезен!
Krotov_Valery; +1 Ответить
6. PlatonStepan 38 12.09.23 02:50 Сейчас в теме
(3) Обработчик получения сообщения в 1С:Шина описывает функцию гарантированной доставки.
Поэтому не подразумевается никаких ошибок/отказов.
Микроскоп !=молоток
8. Stref75 12.09.23 05:20 Сейчас в теме
(6)
подразумевается
или гарантируется?
7. Stref75 12.09.23 05:19 Сейчас в теме
(5) я советую не пытаться записывать объект, если заведомо известно, что его запись в данный момент не возможна. если прерывается транзакция чтения, то соответственно все изменения будут отменены. А при проверке на возможность записи отпадут несколько объектов. Как с ними поступать - это уже другой вопрос. Опять же имеет значение - либо весь пакет должен грузиться целиком, либо есть возможность дозагрузки необработаннных объектов по частям.
9. HAMMER_59 254 12.09.23 06:51 Сейчас в теме
(7) В планах было так:
1. Получать все зарегистрированные объекты из плана обмена и отправлять одним сообщением (объектом XDTO).
2. При получении сообщения - создавать все объекты без признака ОбменДанными.Загрузка = Истина. Я прекрасно понимаю что так существенно медленнее, но на данном этапе важнее скорость разработки готового решения, а скорость обменов не особо критична.
3. Ошибки при создании объектов возвращаются в ответном сообщении.

Сейчас в голове у меня два варианта:
1. Регистрировать объекты к обмены в собственном регистре сведений. Выгружать каждый объект отдельным сообщением.

2. При получении сообщения помещать данные в регистр сведение (хранилище значения). Затем отдельно обрабатывать полученные данные и высылать ответно сообщение.
10. HAMMER_59 254 12.09.23 09:31 Сейчас в теме
Похоже, решение найдено - у канала сервиса интеграции есть параметр "в транзакции".
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот