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

20.08.26

Разработка - Рефакторинг и качество кода

В интернете есть немало статей о том, как все таки вычислить причину ошибки "В данной транзакции уже происходили ошибки", но нет методов борьбы с ней. Исправляю этот факт на примере передачи ответственной, но сбойной работы другому сеансу с возвращением ее результатов.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Обход "В данной транзакции уже происходили ошибки"
.cf 44,78Kb
7 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Столкнулся в практике со случаем, когда при записи одного документа в некоторых ситуациях автоматически формируется другой, и этот другой в 95% случаев записывается и проводится штатным способом, а в остальных - проведение приводит к ошибке. Но 95% нельзя игнорировать и глупо отказываться от получения готового документа там, где только 5% неуспешны, ведь это явная экономия времени и небесконечной энергии сотрудников! Проблема в том, что если второстепенный документ записан, но не проведен, то в основном документе выскакивает ошибка "В данной транзакции уже происходили ошибки". Что такое вообще означает эта ошибка? А то, что в процессе транзакции была поймана ошибка, которая самим фактом своего существования мешает ее успешному завершению либо продолжению. Причем именно поймана, поскольку иначе исключение было бы передано пользователю раньше, в момент своего возникновения. Далее цитата с ИТС:

Следует заметить, что не всякая ошибка приводит к невозможности продолжения выполнения и фиксации транзакции, а именно ошибка базы данных. Исключения, не имеющие отношения к ошибкам базы данных, никакого влияния на возможность продолжения выполнения транзакции не оказывают.

Подробней про ошибки базы данных и вообще про данную ошибку можно почитать в хорошей статье "Безопасная работа с транзакциями во встроенном языке". Там же есть ссылка на статью ИТС. Я же опишу свои наблюдения:

1. При этом процесс записи основного документа не выполняется, так как транзакция полностью отменена

2. успешно записанный второстепенный документ также теряется вместе с неявной транзакцией записи основного документа

3. ошибка может указывать на определенную строчку в коде либо быть общей с предложением завершить работу (в примере есть переключатель для выведения ошибки - что характерно, если обращений к базе при записи больше не было, то будет общая ошибка) 

4. ситуация также осложнялась тем, что нарушался принцип идемпотентности, поскольку повторная запись уже не приводила к записи второстепенного документа - такое бывает.

Что я испробовал, прежде чем сдаваться перед этой ошибкой:

1. Выделить процедуру простой записи второстепенного документа в отдельную транзакцию - она тоже отменялась

2. При ошибке в проведении пытаться еще раз записать второстепенный документ, но в отдельной транзакции - получил ту же ошибку "В данной транзакции..."

3. Выделять проведение в отдельную транзакцию со своей попыткой - основная транзакция также остается сбойной!

Все дело в том, что по факту уровень вложенности транзакций (где-то видел фразу о том, что 1С вообще не поддерживает вложенных транзакций) не влияет на момент отмены транзакции из-за ошибок, как никакого влияния не оказывает и сам факт того, что ошибка была поймана блоком Попытка... Исключение. Наоборот, в этом блоке и стоит искать причину такой ошибки, ведь реально ошибку мы не видим, но транзакция портится!

Стоит также отметить, что ошибка не обязательно должна быть критической, достаточно взведенного флага Отказ = Истина при проведении второстепенного документа! Просто тогда зафиксированное в журнале исключение этого проведения будет выглядеть неконкретно: "по причине: Не удалось провести "ВторостепенныйДокумент 000000005 от 22.08.2026 13:19:52"!" и все.

Так что же делать? Отказываться от проведения второстепенного документа? Но экономия времени и сил на 95% документов... Нет. Тут и встали на помощь фоновые задания, ведь известно, что они выполняются в отдельном сеансе, а значит, и текущая транзакция на них не распространяется! Осталось только решить несколько вопросов:

1. как передать в функцию текущее состояние еще не записанного объекта

2. как получить результаты выполнения второстепенной задачи

3. как вообще вызвать функцию, которую не хочется помещать дальше модуля менеджера объекта

4. как не потерять полезных сообщений при работе с функцией

Не буду ходить вокруг да около, сразу стало понятно, что все эти проблемы уже решены в моем модуле многопоточного выполнения функций. И хотя изначально он не предназначен для обработки одного объекта, но никто ведь не запретит (и даже не узнает))). Также опишу и прямой вызов фонового задания.

Для примера дополнил тестовую конфигурацию из последней статьи следующим примером. Представим, что директор издал очень жесткий указ, чтобы ни один Счет на оплату не проводился без основания в виде Служебной записки. За нарушение - ставят к стенке, без разговоров. Никакие оправдания, что не успел, не действуют. В такой ситуации надо выручать коллег, и программист тут же написал следующий код в событии ПередЗаписью:

Если Не ЗначениеЗаполнено(ДокументОснование) Или ДокументОснование.ПолучитьОбъект() = Неопределено Тогда
    СлужебнаяЗаписка = Документы.СлужебнаяЗаписка.СоздатьДокумент();
    СлужебнаяЗаписка.Дата = ТекущаяДатаСеанса();
    СлужебнаяЗаписка.УстановитьНовыйНомер();
    СлужебнаяЗаписка.Комментарий = Комментарий;
    СлужебнаяЗаписка.СуммаДокумента = СуммаДокумента;
    Попытка
        СлужебнаяЗаписка.Записать(РежимЗаписиДокумента.Запись);
        ДокументЗаписан = Истина;
        СлужебнаяЗаписка.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        Если ДокументЗаписан = Истина Тогда
            Сообщить("Служебное основание записано, не проведено", СтатусСообщения.Важное);
            ЗаписьЖурналаРегистрации("Доработки.Отлавливание ошибок", УровеньЖурналаРегистрации.Ошибка,
                Метаданные.Документы.СлужебнаяЗаписка, СлужебнаяЗаписка.Ссылка,
                "Не удалось провести служебную записку. Причина: " + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Иначе
            Отказ = Истина;
            Сообщить("Не удалось ни записать, ни провести служебную записку", СтатусСообщения.ОченьВажное);
            ЗаписьЖурналаРегистрации("Доработки.Отлавливание ошибок", УровеньЖурналаРегистрации.Ошибка,
                Метаданные.Документы.СчетНаОплату, Ссылка, "Не удалось записать служебную записку. Причина: "
                + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        КонецЕсли;
    КонецПопытки;
    ДокументОснование = СлужебнаяЗаписка.Ссылка;
КонецЕсли;

Ожидая таким образом, что если документ не будет проведен, то хотя бы запишется и сотрудник сможет провести его вручную, выполнив условия. Каково же было его удивление, когда он увидел в журнале транзакций такое:

 

То есть очевидно, что запись оказалась отменена вместе с проведением! А у пользователя вышла ошибка "В данной транзакции уже происходили ошибки" и ничего!

Но этому программисту повезло, и он был хорошо знаком с механизмом фоновых заданий, поэтому быстро набросал процедуру для выполнения того же в фоновом задании:

Результат = Новый Структура("Успешно, Отказ, Ссылка", Ложь, Ложь);
Если ОписанияОбъекта.Количество() <> 1 Тогда
    ВызватьИсключение "Передано больше одного описания объекта";
КонецЕсли;
ОписаниеОбъекта = ОписанияОбъекта[0];
СлужебнаяЗаписка = Документы.СлужебнаяЗаписка.СоздатьДокумент();
СлужебнаяЗаписка.Дата = ТекущаяДатаСеанса();
СлужебнаяЗаписка.УстановитьНовыйНомер();
СлужебнаяЗаписка.Комментарий = ОписаниеОбъекта.Комментарий;
СлужебнаяЗаписка.СуммаДокумента = ОписаниеОбъекта.СуммаДокумента;
Попытка
    СлужебнаяЗаписка.Записать(РежимЗаписиДокумента.Запись);
    ДокументЗаписан = Истина;
    Результат.Ссылка = СлужебнаяЗаписка.Ссылка;
    СлужебнаяЗаписка.Записать(РежимЗаписиДокумента.Проведение);
    Результат.Успешно = Истина;
Исключение
    Если ДокументЗаписан = Истина Тогда
        Сообщить("Служебное основание записано, не проведено", СтатусСообщения.Важное);
        ЗаписьЖурналаРегистрации("Доработки.Отлавливание ошибок", УровеньЖурналаРегистрации.Ошибка,
            Метаданные.Документы.СлужебнаяЗаписка, СлужебнаяЗаписка.Ссылка,
            "Не удалось провести служебную записку. Причина: " + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    Иначе
        Результат.Отказ = Истина;
        Сообщить("Не удалось ни записать, ни провести служебную записку", СтатусСообщения.ОченьВажное);
        ЗаписьЖурналаРегистрации("Доработки.Отлавливание ошибок", УровеньЖурналаРегистрации.Ошибка,
            Метаданные.Документы.СчетНаОплату, ОписаниеОбъекта.Ссылка, "Не удалось записать служебную записку. Причина: "
            + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецЕсли;
КонецПопытки;
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);

, где ОписаниеОбъекта - это структура со всеми реквизитами и табличными частями ЭтогоОбъекта из модуля объекта счета на оплату. Как его получить, да просто:

Функция ОписаниеОбъекта(Знач Объект, ТипЗначения = Неопределено) Экспорт

	ОписаниеОбъекта = Новый Структура;
	Если ТипЗнч(Объект) = Тип("ДанныеФормыСтруктура") Тогда
		Если ТипЗнч(ТипЗначения) <> Тип("Тип") Или СтрНайти(ВРег(ТипЗначения), "ОБЪЕКТ") = 0 Тогда
			ВызватьИсключение "Тип реквизита формы должен быть указан явно как ...Объект";
		КонецЕсли;
		Объект = ДанныеФормыВЗначение(Объект, ТипЗначения);
	КонецЕсли;
	
	МетаданныеОбъекта = Объект.Метаданные();
		
	Для Каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл
		ОписаниеОбъекта.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]);
	КонецЦикла;
	
	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
		ОписаниеОбъекта.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]);
	КонецЦикла;
	
	Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
		ОписаниеОбъекта.Вставить(ТабличнаяЧасть.Имя, Объект[ТабличнаяЧасть.Имя].Выгрузить());
	КонецЦикла;
	
	Возврат ОписаниеОбъекта;
	
КонецФункции

Теперь осталось только запустить процедуру в фоновом задании и получить результат:

ОписаниеОбъекта = ДлительныеОперацииСервер.ОписаниеОбъекта(ЭтотОбъект);
НастройкиВыполнения = ДлительныеОперацииСервер.НастройкиВыполнения(1, 1, , Истина);
МассивДанных = Новый Массив;
МассивДанных.Добавить(ОписаниеОбъекта);
РезультатыВыполнения = ДлительныеОперацииСервер.ВыполнитьФункциюПорциями(МассивДанных,
	"Документы.СчетНаОплату.СоздатьСчетОснование", Новый Массив, НастройкиВыполнения);
Если РезультатыВыполнения.Количество() Тогда
	Если РезультатыВыполнения[0] = Неопределено Или РезультатыВыполнения[0].Отказ Тогда
		Отказ = Истина;
	Иначе
		ДокументОснование = РезультатыВыполнения[0].Ссылка;
	КонецЕсли;
Иначе
	Отказ = Истина;
КонецЕсли;

На этом все поставленные задачи решены: к счету прикреплена записанная, но не проведенная служебка - основание, которую пользователь сможет спокойно провести самостоятельно. Условия соблюдены.

 

"А был бы я бедный?" - подумал программист, - "Сколько кода мне пришлось бы написать?". И быстро набросал код, необходимый для вызова фонового задания вручную:

ОписаниеОбъекта = ДлительныеОперацииСервер.ОписаниеОбъекта(ЭтотОбъект);
ПараметрыФункции = Новый Массив;
ПараметрыФункции.Добавить(ОписаниеОбъекта);
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
ПараметрыФункции.Добавить(АдресРезультата);

ПараметрыВызова = Новый Массив;
ПараметрыВызова.Добавить("Документы.СчетНаОплату.СоздатьСлужебноеОснование");
ПараметрыВызова.Добавить(ПараметрыФункции);
Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьМетодКонфигурации", ПараметрыВызова);
Задание.ОжидатьЗавершенияВыполнения();
Для Каждого Сообщение Из Задание.ПолучитьСообщенияПользователю() Цикл
	Сообщение.Сообщить();
КонецЦикла;
РезультатыВыполнения = ПолучитьИзВременногоХранилища(АдресРезультата);
Если РезультатыВыполнения = Неопределено Тогда
	Отказ = Истина;
Иначе
	Если РезультатыВыполнения.Отказ Тогда
		Отказ = Истина;
	Иначе
		ДокументОснование = РезультатыВыполнения.Ссылка;
	КонецЕсли;
КонецЕсли;

Как обычно - зная, что хочешь сделать, можно написать не намного сложнее, но зачем? Код функции создания служебки также немного изменил.

Вывод. Здесь был показан конкретный пример ошибки, но он может быть и любым другим. Главное, чтобы была возможность выделить в отдельный метод и передать сериализуемые параметры (легко ищется в синтакс-помощнике по слову "Сериализуется"). Сериализуется не все, что можно передать с клиента на сервер - например, нельзя сериализовать ДанныеФормыСтруктура, то есть реквизит "Объект" формы, как и саму форму, конечно. Результат также должен быть сериализуемым, если он нужен. В остальном ограничений быть не должно, единственное, что нужно учитывать при реализации прямого алгоритма вызова фонового задания, так это что, ВыполнитьМетодКонфигурации может устанавливать безопасный режим, соответственно, например, никаких HTTPСоединение, если у вас это работает:

ПрофильБезопасностиИБ = СтандартныеПодсистемыСервер.ПрофильБезопасностиДляВыполнитьВычислить();
Если ЗначениеЗаполнено(ПрофильБезопасностиИБ) Тогда
	УстановитьБезопасныйРежим(ПрофильБезопасностиИБ);
КонецЕсли;

С ВыполнитьФункциюПорциями такого ограничения нет, там код считается безопасным только потому, что вызывается из кода базы (раньше в БСП было так).

И ВСЕГДА записывайте в журнал регистрации ошибки, пойманные блоком Попытка, чтобы поиск причины "В данной транзакции уже происходили ошибки" не превращался в пытку! Иначе зачем он вообще нужен)

Совместимость 8.3.25 - из-за паузы, ее переделал на совместимую с файловыми базами. Если у вас клиент-серверная, хватайте Паузу-Оптовик для легаси кода из статьи, она совместима с более низкими версиями. А насчет паузы отрицания в контексте данной статьи это не запрещено, поскольку это не ошибка базы данных. Даже ошибка выполнения запроса не каждая приводит к отмене транзакции: например, ошибка заполнения параметра спокойно поймается и дальнейшие операции с базой данных будут разрешены, а вот с делением на ноль такого уже не будет. Всем успешных транзакций!

Вступайте в нашу телеграмм-группу Инфостарт

Транзакция фоновые задания ошибка

См. также

Рефакторинг и качество кода Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Продолжение статьи «BSL Language Server внутри 1С:EDT: коннектор, которого не хватало». Там мы научили EDT видеть расширенную диагностику BSLLS, а здесь замкнем контур: научим ИИ-агентов автоматически исправлять эти ошибки строго по официальным стандартам разработки 1С.

02.09.2026    1250    malikov_pro    2    

6

Нейросети Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

В справочнике дополнительных обработок любой базы старше трёх лет лежит два-три десятка файлов. Часть писали вы, часть предыдущий разработчик, часть прислал подрядчик. Завтра одну из них надо править, и первый вопрос не "как править", а "что она вообще делает". Обычный ответ - открыть и читать: полторы тысячи строк это полдня. Показываю, как уложиться в пять минут: пять шагов, у каждого сказано, что он даёт. Внутри распределение 1 135 находок по ста чужим обработкам (четыре первых места из шести - одно и то же), что нашлось в наших собственных обработках, и честный список того, чего этот способ не даёт.

01.09.2026    1246    nedomolkov.ivan    6    

2

Инструментарий разработчика Нейросети Рефакторинг и качество кода Программист 1С 8.3 Абонемент ($m)

Вам досталась чужая обработка на полторы тысячи строк. Автор уволился, документации нет, а править её завтра. Обработка читает код за вас: что он делает, что в нём не так и с чего начинать. Всё считается локально, в интернет ничего не уходит.

10 стартмани

01.09.2026    463    1    nedomolkov.ivan    5    

1

Рефакторинг и качество кода Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Рассказываю, как подключить к языковым моделям (в Cursor, VS Code, Claude Code) настоящий Синтакс-помощник 1С - со всеми типами, методами, параметрами, примерами кода, контекстами вызова и версиями платформы. Без ручного парсинга HTML: плагин для 1C:EDT в один клик выгружает официальную справку в Docker-контейнер с MCP-сервером и гибридным поиском (FTS5 + векторный индекс).

01.09.2026    1144    malikov_pro    4    

4

Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

Синтаксический контроль прошёл, валидатор формы прошёл, сборка прошла, автопрогон написал что ошибок нет. Через час четыре падения подряд, все на том, что мы сами не нажимали. Разбираю все четыре, включая самое коварное: загрузчик молча выбрасывает элемент формы из-за одной буквы в теге, и отладка уходит в модуль, где всё правильно.

01.09.2026    844    nedomolkov.ivan    0    

2

Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Если вы разрабатываете в 1C:EDT, то наверняка знакомы со штатной системой статического анализа через плагин 1C:Code style V8. Но вы также могли заметить, что база встроенных правил давно не обновлялась: последний стабильный релиз плагина вышел ещё в декабре 2023 года. Чтобы вернуть в EDT свежие и актуальные проверки, я форкнул и доработал проект коннектора к BSL Language Server. В этой статье расскажу, как устроена интеграция, зачем она нужна в эпоху LLM и как подключить плагин за пять минут.

01.09.2026    886    malikov_pro    5    

4

Инструментарий разработчика Рефакторинг и качество кода Программист 1С 8.3 1С 8.5 Абонемент ($m)

Внешняя обработка для 1С, которая ищет в коде нарушения стандартов БСП и платформы (модальные вызовы, запросы в цикле, незакрытый привилегированный режим и др.) и часть из них чинит автоматически. Работает по фрагменту кода и по всей выгрузке конфигурации, с фоновым режимом через БСП и отчётом по найденному.

3 стартмани

27.08.2026    382    0    KonMa    0    

2

Перенос данных 1C Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

Правила обмена умеют лежать в двух местах сразу: в макете конфигурации, где их находит глобальный поиск и где их так удобно поправить, и в регистре сведений, откуда они на самом деле исполняются. Пока не проверишь, какой источник включён у плана обмена, правка макета выглядит сделанной и не делает ничего. Разбор задачи, где одно и то же значение ставки оказалось зашито в четырёх местах трёх разных слоёв: карта соответствий в модуле веб-сервиса, обработчик "ПослеЗагрузки" в правиле обмена, числовой ВЫБОР с внутренним ИНАЧЕ 0 внутри сгенерированных правил и общий модуль интеграции с внешним поставщиком чеков. Отдельно - почему у истории с вернувшимися карточками нет доказанной причины, хотя признак сузили до одного вида номенклатуры, и как тестовый прогон на пяти записях сломал сходимость итогового отчёта.

27.08.2026    714    nedomolkov.ivan    0    

1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 13 20.08.26 10:53 Сейчас в теме
Как из проблемы сделать пять и нагадить на 5 лет вперед - практическое руководство.
2. n_mezentsev 166 20.08.26 12:19 Сейчас в теме
(1) Поясните, в чем нагадить? Использовать фоновые задания нельзя что ли? Это моветон?
3. gybson 13 20.08.26 12:49 Сейчас в теме
(2) Самая простая ситуация - ошибка в коде при записи записки. Моментально получаем ту же самую проблему, которая была. Или ошибка уже после создания записки - куча записок без созданного документа. Или проблема в коде фонового задания и оно возвращает строку "Спасибо за вызов". Или проблема в коде, который вызывается из этого кода. Неопределенность множится кратно и 5% проблем растет кратно. Диагностика затруднена, мы смотрим журнал и не видим единой картины.

Для конкретно этого случая, когда начальник злой и жалко коллег это может и подойдет как забавное хулиганство (хотя можно и после записи формы это сделать), но как постоянная практика это чудовищно.

Т.е. вот взять создание с-ф, например, автоматически при загрузке в БУХ. Ой чё может быть.
4. n_mezentsev 166 20.08.26 13:24 Сейчас в теме
(1)
(3)
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	ГСЧ = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
	Решка = ГСЧ.СлучайноеЧисло(1, 10);
	Если Решка > 5 Тогда
		ВызватьИсключение "Вам выпала решка";
	КонецЕсли;
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	ВызватьИсключение "Что-то пошло не так";
КонецПроцедуры
Показать

Да, при записи служебки иногда происходит ошибка, тогда идет отказ при записи счета, только и всего. А у вас сплошные фантазии, не нужно бояться фоновых заданий, они точно также возвращают хоть отказ, хоть любое другое сериализуемое значение. Да, бывают очень-очень редкие случаи, когда фоновое задание таки вернет Неопределено, но тогда тоже Отказ, если вы не заметили.
P.S. начальник не злой, просто пример дурацкий привел, наверное
5. gybson 13 20.08.26 13:42 Сейчас в теме
(4) Так он и раньше происходил. Если документ записать 10 раз, сколько записок создастся?

Вы создали подписку на неприятности. Очень много вариантов что пойдет не так и чего не хватит. При неумелом использовании, да еще внутри команды, можно будет год или два блох ловить.
6. n_mezentsev 166 20.08.26 14:20 Сейчас в теме
(5) Фоновое задание запускается и выполняется в процессе записи (не в фоне), поэтому создастся в любом случае только одна записка - то есть до момента, когда поле не будет заполнено. Так что все нормально, мы просто передаем работу в другой сеанс и ждем, пока он доделает свою работу и четко отчитается о результатах!
9. gybson 13 21.08.26 11:10 Сейчас в теме
(6) Сейчас, судя по коду, при ошибке записи основного документа, записка будет все-равно создана. Т.е. нужен еще второй вызов фонового задания, который удалит лишний документ. Это еще более усложнит код и дальнейшее его развитие. Если вы что-то пишете в журнал, вам нужен +1 человек в штат, который будет контролировать журнал, иначе вам придется это делать, а у вас своей работы полно и значит все-равно нужен еще человек. Плюс накладные расходы на "ловлю блох", когда в неделю раз-два спрашивают откуда взялся документ или наоборот не взялся. Если применить этот механизм еще 2-3 раза, то проще будет уволиться, чем разгребать последствия. И не дай Бог кто-то массово перезапишет документы за год и тогда всплывет ошибка.
10. n_mezentsev 166 21.08.26 12:07 Сейчас в теме
(9) Зачем вызов, поле ДокументОснование запишется независимо от успешности проведения, а значит лишний он будет только если человек откажется от создания счета вовсе - тогда уже вопрос к человеку, почему он записал служебную записку (он понимает это) и не пометил ее как ненужную. Но я так понимаю, вам заходит транзакционность события записи, да осознанно от нее отходим, потому что она начинает мешать своей строгостью. Журнал мониторю постоянно, это обычно минут 5-10 максимум в день при какой-то сотне пользователей, ну а если серьезная ошибка, то да включаюсь в работу до победного (зато бывают случаи, вот сегодня последний, когда ко мне приходят с ошибкой, а я уже ее исправил - говорю "Перезапустите 1С")
7. bulpi 218 20.08.26 16:39 Сейчас в теме
Нужно устранить те 5% ошибок, а не городить целую подсистему, чтобы их обойти. Какой-то треш.
8. n_mezentsev 166 20.08.26 16:51 Сейчас в теме
(7) Ох, не цените вы простоту обращения к фоновым заданиям, если для вас это городить систему. А в том, что касается 5% легко сказать, да трудно сделать (в оригинале я сократил этот процент, но не думаю, что до 0, потому что некоторые вещи без человеческого участия не решить)))
Для отправки сообщения требуется регистрация/авторизация