Добрый день.
Есть задача: перед и после проведения документа проводить связанные документы.
В обработке проведения код
Создание документов вынесена в общий модуль. Грубо говоря, код такой
При любой ошибке в процедуре создания документа полностью ломается транзакция и проведение основного документа ломается. Как этого можно выкрутиться?
Есть задача: перед и после проведения документа проводить связанные документы.
В обработке проведения код
Процедура ОбработкаПроведения(Отказ, Режим)
СоздатьДокументыПеред();
//код проведения
СоздатьДокументыПосле()
КонецПроцедуры
Создание документов вынесена в общий модуль. Грубо говоря, код такой
Процедура СоздатьДокументыПеред()
//Здесь через транзакцию, так как на самом деле документы создаются пакетами и их может быть несколько
НачатьТранзакцию();
Попытка
СоздатьДокумент(1);
СоздатьДокумент(2);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;
КонецПроцедуры
Процедура СоздатьДокумент()
//Создание документа
//Здесь происходит ошибка или вызывается исключение
КонецПроцедуры
ПоказатьПри любой ошибке в процедуре создания документа полностью ломается транзакция и проведение основного документа ломается. Как этого можно выкрутиться?
Найденные решения
(21) 1С:Предприятие 8 не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня.
Возможно у вас в СоздатьДокумент(1) есть ВызватьИсключение ...?
Возможно у вас в СоздатьДокумент(1) есть ВызватьИсключение ...?
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) не совсем понятно, в вопросе звучит проводить, в коде создание...
В любом случае как вариант:
1. Проводите документ как обычно, в некое хранилище (рег. сведений, например) записываете его.
2. Стартует обработка (можно фоново) к-рая идет в этот регистр, находит там документ и начинает делать то что у вас в процедуре. Перепроводит последовательно созданные и обрабатываемый документ (если надо).
3. Обработка затирает в регистре данные по обработанному документу.
В любом случае как вариант:
1. Проводите документ как обычно, в некое хранилище (рег. сведений, например) записываете его.
2. Стартует обработка (можно фоново) к-рая идет в этот регистр, находит там документ и начинает делать то что у вас в процедуре. Перепроводит последовательно созданные и обрабатываемый документ (если надо).
3. Обработка затирает в регистре данные по обработанному документу.
(2)так не получится, потому что для проведения исходного документа нужен результат движений документов, которые он создает.
Создание документов - это обработка создания и заполнения документа с последующим проведением.
проведение обработкой после тоже определенные проблемы. Так как я не смогу пропихнуть отказ в проведение основного документа.
Создание документов - это обработка создания и заполнения документа с последующим проведением.
проведение обработкой после тоже определенные проблемы. Так как я не смогу пропихнуть отказ в проведение основного документа.
(6)вы же понимаете, что бизнес ставит задачу. Грубо говоря проводится документ продажи с одной организации, а так как бухгалтера не хотят делать руками документы, то необходимо автоматом делать документы списания с промежуточной и поступления на нужную организацию.
(8)Когда всё будет висеть и тормозить, бизнес виноватого найдёт)) И не себя))
Это же не нужно делать при каждом проведении/перепроведении?
Например, кнопку на форму: "создать связные документы". Родительский документ сделали: провели - нажали (вроде как создать на основании) - получили связные.
Это же не нужно делать при каждом проведении/перепроведении?
Например, кнопку на форму: "создать связные документы". Родительский документ сделали: провели - нажали (вроде как создать на основании) - получили связные.
(14) У меня всегда транзакция активна, так как обработка проведения происходит в транзакции. В общем, я хотел упрощенно описать схему чтоб было понятней, но упустил некоторые важные нюансы, из-за которых не понятно зачем вообще все делалось.
Если коротко, те которые проводят документы могут не знать, где остатки. Да, у нас программисты уже не смеются.
В общем начал экспериментировать с проверкой остатков дополнительной перед проведением. Хотяб немного приблизился к тому что мне надо.
Не пойму почему при ОтменитьТранзакцию() во вложенной транзакции портит все транзакции. Видимо, все таки, прийдется выносить все на отдельную кнопку и там уже делать все что мне нужно
Если коротко, те которые проводят документы могут не знать, где остатки. Да, у нас программисты уже не смеются.
Процедура СоздатьДокументыПеред()
НачатьТранзакцию();
Для каждого Организация из списокОрганизаций цикл
Попытка
СоздатьДокумент1(Организация);
СоздатьДокумент2(Организация);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;
КонецЦикла;
КонецПроцедуры
ПоказатьВ общем начал экспериментировать с проверкой остатков дополнительной перед проведением. Хотяб немного приблизился к тому что мне надо.
Не пойму почему при ОтменитьТранзакцию() во вложенной транзакции портит все транзакции. Видимо, все таки, прийдется выносить все на отдельную кнопку и там уже делать все что мне нужно
(19) Попробуйте так:
Процедура СоздатьДокументыПеред()
Для каждого Организация из списокОрганизаций цикл
НачатьТранзакцию();
СоздатьДокумент1(Организация);
Если ТранзакцияАктивна() Тогда
СоздатьДокумент2(Организация);
Иначе
ОтменитьТранзакцию();
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(20)
Не доходит так до строки "Если ТранзакцияАктивна() Тогда",
Если ошибка при записи документа, то дальше код не выполняется.
Если СоздатьДокумент1 возвращает ложь и я отменяю транзакцию, то основная транзакция также становится поломанной. И после этого ЗафиксироватьТранзакцию() не отрабатывает с ошибкой "Транзакция не активна", хотя перед ней ТранзакцияАктивна() = истина
Не доходит так до строки "Если ТранзакцияАктивна() Тогда",
Если ошибка при записи документа, то дальше код не выполняется.
Если СоздатьДокумент1 возвращает ложь и я отменяю транзакцию, то основная транзакция также становится поломанной. И после этого ЗафиксироватьТранзакцию() не отрабатывает с ошибкой "Транзакция не активна", хотя перед ней ТранзакцияАктивна() = истина
(21) 1С:Предприятие 8 не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня.
Возможно у вас в СоздатьДокумент(1) есть ВызватьИсключение ...?
Возможно у вас в СоздатьДокумент(1) есть ВызватьИсключение ...?
(20) Что за бред?
НачатьТранзакцию();
Попытка
СоздатьДокумент1();
СоздатьДокумент2();
////
СоздатьДокумент9999();
//
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
// Другие действия по отмене дальнейшего проведения
КонецПопытки;
Показать
(22)
Так это то что было изначально, кроме проверки на активную транзакцию, которая всегда возвращает истина в любом состоянии в текущей ситуации.
Не работает так. Если ошибка при проведении документа(остатков не хватило, например) - транзакция ломается. Тоже самое, если ВызватьИсключение в процедуре.
Так это то что было изначально, кроме проверки на активную транзакцию, которая всегда возвращает истина в любом состоянии в текущей ситуации.
Не работает так. Если ошибка при проведении документа(остатков не хватило, например) - транзакция ломается. Тоже самое, если ВызватьИсключение в процедуре.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот