Имя: Пароль:
1C
 
Проведение документа в попытке внутри транзакции падает по ошибке
0 nemoxp
 
15.10.25
13:40
Здравствуйте

Пожалуйста разъясните особенность:

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

При выполнении приведенного выше кода вызывается ошибка "В данной транзакции уже происходили ошибки!"

Если написать так, убрав проведение через попытку, то ошибки нет:

НачатьТранзакцию();
Попытка
    ДокументОбъект = Документы.ПеремещениеТоваров.СоздатьДокумент();
    //***** заполнение реквизитов документа *****
    //Запись объекта
    ДокументОбъект.ДополнительныеСвойства.Вставить("СШПНеобрабатывать", Истина);
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    ДокументОбъект.Записать();
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
КонецПопытки;

Почему так и как организовать проведение в попытке внутри транзакции?
1 maxab72
 
15.10.25
13:42
(0) поставь в Исключение оповещение об ошибке, читай и думай.
2 unenu
 
15.10.25
13:45
(1) только через переменную
ТекстОшибки = ОписаниеОшибки()
Сообщить(ТекстОшибки)
3 Мультук
 
гуру
15.10.25
13:47
(0)
Транзакции тут не нужны

    
    ДокументОбъект = Документы.ПеремещениеТоваров.СоздатьДокумент();
    //***** заполнение реквизитов документа *****
    //Запись объекта
    ДокументОбъект.ДополнительныеСвойства.Вставить("СШПНеобрабатывать", Истина);
    Попытка
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        ДокументОбъект.ОбменДанными.Загрузка = Истина;
        ДокументОбъект.Записать();
    КонецПопытки;
4 nemoxp
 
15.10.25
15:15
(3) У меня обмен через шину. Перед тем как создавать документ, я блокировку создаю:

    #Область БлокировкаПакета
    Блокировка = Новый БлокировкаДанных;
    Элемент = Блокировка.Добавить("Документ.ПеремещениеТоваров");
    Элемент.УстановитьЗначение("_Код", КодДокумента);
    Элемент.Режим = РежимБлокировкиДанных.Исключительный;
    Блокировка.Заблокировать();
    #КонецОбласти //БлокировкаПакета

Поэтому без транзакции никак
5 nemoxp
 
15.10.25
14:00
(1) чего-то будет не хватать в документе для проведения. например не заполнен склад получателя, потому что такого склада нет в базе. тогда этот объект надо записать.
6 Мультук
 
гуру
15.10.25
14:10
(5)
1) Я бы в транзакции в этом случае только записывал,
а дальше вне транзакции в  попытке исключении проводил.


2) "КодДокумента"
А, пардон, а ссылка не является более кошерным первичным ключом ?
Или обмен совсем не из 1С ?


P.S.
Склады это сильно. Каждые 5  мин новый склад ?
Что тогда творится с номенклатурами -- страшно подумать.
7 nemoxp
 
15.10.25
14:16
(6) обмен не из 1с. Есть код документа в другой базе, по нему и блокировка. При заполнении реквизитов документа записывается в "_Код".

Планируется делать дозапрос. Типа если склад не заполнен (не найден в 1С), то к другой системе делается дозапрос этого склада и через несколько минут повторно грузится документ.

Но мне пока нужно попытаться провести документ, иначе записать...
8 Fish
 
гуру
15.10.25
14:20
(7) " делается дозапрос этого склада и через несколько минут повторно грузится документ." - Зачем такие извращения? Ты дважды будешь разбирать документ.
Просто создавай новый склад, и потом уже отдельным заданием делай заполнение новых складов. А документы у тебя уже будут.
9 ejikbeznojek
 
15.10.25
14:24
(7)

ДокументЗаписан = ложь;
Попытка       ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ДокументЗаписан = истина;
Исключение
сообщить(ОписаниеОшибки())
КонецПопытки;

если не ДокументЗаписан тогда
Попытка      
ДокументОбъект.Записать();
ДокументЗаписан = истина;
Исключение
сообщить(ОписаниеОшибки())
КонецПопытки;
конецесли

если не ДокументЗаписан тогда
сообщить("Всё пропало")
конецесли
10 ejikbeznojek
 
15.10.25
14:27
там ещё транзакцию отменять наверное в исключении. Она ж битой становится вроде
11 H A D G E H O G s
 
15.10.25
14:31
(1) Без такого шмотка в типовой можно только посмотреть ковер
12 nemoxp
 
15.10.25
16:07
(8) Без этих извращений никак. Когда приходит документ я не знаю есть ли уже в базе нужные склады, номенклатура, контрагент, договор. В сообщении нет детального описания номенклатуры, склада и т.к., только код внешней базы. Я собираю не найденные данные и если что-то не нашлось не записываю документ, делаю дозапрос недостающих данных, загружаю их в 1С своими обработчиками и после гружу еще раз документ. Это обмен через шину.
13 nemoxp
 
15.10.25
16:08
Придумал сделать регистр сведений куда буду писать записанные документы и регламентным заданием буду проводить их по этому списку, потом удалять из регистра.
14 Timon1405
 
15.10.25
16:33
(13) если смотрите в эту сторону лучше сразу тогда РС ВыполнениеОтложенныхДействий. измерения объект, НомерПоПорядку(чтоб разные алгоритмы можно было делать). Ресурсы ТекстАлгоритма, Параметры, Состояние, ОписаниеОшибки итд на что фантазии хватит.
тогда успешно выполненные действия можно не удалять, а менять состояние в РС.
15 Ногаминебить
 
15.10.25
16:52
А что мешает сначала проверить есть ли склад, номенклатура, контрагент, договор и по итогу уже либо Запись, либо Проведение?
16 nemoxp
 
15.10.25
17:28
(15) Мешает то что могут быть разные случае из-за которых может не провестись. Все не проверить. Может договор такой есть, но пользователь изменил его вид или с аналитикой какие-то проблемы. Замучаешься все проверять.
17 JohnGilbert
 
15.10.25
20:44
Мммм...
  ДокументОбъект.ДополнительныеСвойства.Вставить("СШПНеобрабатывать", Истина);

Сладкий зхапах говна, под названием Dataareon