Имя: Пароль:
1C
1С v8
УПП 2.4 Док создается, присваивается номер, но не сохраняется
, , ,
0 ЭЦ
 
17.05.22
14:21
ГОСПОДА !
Требуется обработкой создать несколько документов ЗаказНаПеремещение и записать ссылки на них в регистр сведений.
Документы создаются, заполняются и записываются (при записи присваивается очередной номер)
Что наблюдается в отладчике и выдаются соответствующие сообщения.
Однако по завершении обработки выясняется, что в базе имеется только один документ (последний из создававшихся).
В регистре сведений также только одна запись.
Не понятно кода делись другие документы.
В чем тут может быть.
Прошу подсказать.
Заранее благодарен.
Код ниже
1 ЭЦ
 
17.05.22
14:24
тзПремещений = Новый ТаблицаЗначений;
    тзПремещений.Колонки.Добавить("Номенклатура");
    тзПремещений.Колонки.Добавить("Организация");
    тзПремещений.Колонки.Добавить("Вид");
    тзПремещений.Колонки.Добавить("Склад");
    тзПремещений.Колонки.Добавить("Количество");

// Тут заполняем тзПремещений    
    
    тзПремещений.Сортировать("Организация,Вид,Склад");
    тзДокументовПерезаписи = тзПремещений.Скопировать();
    тзДокументовПерезаписи.Свернуть("Организация,Вид,Склад");
    тзДокументовПерезаписи.Сортировать("Организация,Вид,Склад");
    Для Каждого СтрТЗ Из тзДокументовПерезаписи Цикл
        ЗаказДляперезаписи = НайдемЗаказНаПеремещениеДляПерезаписи(СтрТЗ);
                Если ЗаказДляперезаписи = Неопределено Тогда
            ДокЗП = Документы.ЗаказНаПеремещение.СоздатьДокумент();
            ТекстСообщения = "Создан новый заказ на перемещение ";
        Иначе
            ДокЗП = ЗаказДляперезаписи.ПолучитьОбъект();
            ТекстСообщения = "Перезаписан существующий заказ на перемещение ";
        КонецЕСли;
        
        СтруктураЗаказа = Новый Структура;
        СтруктураЗаказа.Вставить("Организация",СтрТЗ.Организация);
        СтруктураЗаказа.Вставить("СкладОтправитель",СтрТЗ.Склад);
        СтруктураЗаказа.Вставить("Цех", Цех );
        СтруктураЗаказа.Вставить("СкладПолучатель", СкладПолучатель);
        СтруктураЗаказа.Вставить("ВидСвязи", СтрТЗ.Вид);    
        
        СтруктураОтбора = Новый Структура;
        СтруктураОтбора.Вставить("Организация",СтрТЗ.Организация);
        СтруктураОтбора.Вставить("Склад",СтрТЗ.Склад);
        СтруктураОтбора.Вставить("Вид", СтрТЗ.Вид);
        мСтрокиНоменклатуры = тзПремещений.НайтиСтроки(СтруктураОтбора);
        
        ЗаполнимЗаказНаПеремещениеДляОрганизации(ДокЗП,СтруктураЗаказа,мСтрокиНоменклатуры);
        
        Попытка
            НачатьТранзакцию();
            ТекстОшибки = "заказа";
            ДокЗП.Записать();
        
            ТекстОшибки = "регистра";
        
            мз = РегистрыСведений.sСвязиОбъектов.СоздатьМенеджерЗаписи();
            мз.Источник = ДокЗП.Ссылка;
            мз.Получатель = Неопределено;
            мз.ВидСвязи = СтруктураЗаказа.ВидСвязи;
            мз.Прочитать();
            Если мз.Выбран() Тогда
                мз.ДатаСоздания = ТекущаяДата();
                мз.Ответственный = ПараметрыСеанса.ТекущийПользователь;
                мз.Записать();
            Иначе
                мз.Источник = ДокЗП.Ссылка;
                мз.Получатель = Неопределено;
                мз.ВидСвязи = СтруктураЗаказа.ВидСвязи;
                мз.ДатаСоздания = ТекущаяДата();
                мз.Ответственный = ПараметрыСеанса.ТекущийПользователь;
                мз.Записать();
            КонецЕСли;    
            
            ЗафиксироватьТранзакцию();
            Сообщить(ТекстСообщения  + " " + СокрЛП(ДокЗП));
        Исключение
            ОтменитьТранзакцию();
            Сообщить("Неудачная попытка записи " + ТекстОшибки + " " + СОКрлП(ДокЗП));
        КонецПопытки;
    КонецЦикла
2 shuhard
 
17.05.22
14:33
(0)[Не понятно кода делись другие документы.] ты же пишешь в один документ
3 ЭЦ
 
17.05.22
14:43
(2) Каждый раз срабатывает
          ДокЗП = Документы.ЗаказНаПеремещение.СоздатьДокумент();
и при записи генерится новый номер
т.е. документы разные
4 shuhard
 
17.05.22
15:03
(3) мы же видим, что документ один
5 ЭЦ
 
17.05.22
15:20
(4) Я думаю причина не в этом.
У меня тут много других доков создается также (В цикле создаются документы и присваиваются одной переменной, которая каждый раз обновляется) - везде все норм.
А тут попа.
6 vicof
 
17.05.22
15:21
И транзакции не откатываются?
7 shuhard
 
17.05.22
15:24
(5) запиши события в журнал - получишь ответ
8 ЭЦ
 
17.05.22
18:07
(6) Прошел все отладчиком.
и вывод сообщения вставил - ни каких признаков откатывания транзакций не видно
9 shuhard
 
17.05.22
18:09
(8) ещё раз - запиши в журнал регистрации и выведи из транзакции
10 Злопчинский
 
17.05.22
18:24
могу ошибаться, но смысла в
        Попытка
            НачатьТранзакцию();
нет
.
правильнее
.
НачатьТранзакцию();
Попытка
11 ЭЦ
 
17.05.22
19:10
(9) Нашел.
Ошибка - в моем алгоритме поиска документа для перезаписи.
Так что извиняйте?
(10) Нет правильно сначала Попытка потом НачатьТранзакцию()
тогда при ошибке в транзакции будет выскакивать на исключение.
12 Злопчинский
 
17.05.22
19:20
(11) "сначала Попытка потом НачатьТранзакцию()
тогда при ошибке в транзакции будет выскакивать на исключение."
(могу ошибаться)
Кто это тебе сказал?
13 Злопчинский
 
17.05.22
19:22
(11) при чем здесь "ошибка в транзакции"...?
Попытка - это отлов ошибки выполнения.
а будет при этом открыта транзакция или нет - это уже совсем другое и к попытке отношения не имеет.
НачатьТранзакцию() - само по себе нихера не блокирует и не делает такого что именно на НачатьТранзакцию() можно сломаться.
Поэтому пихать начатьТранзакцию() в Попытку - масло масленое...
.
пусть спецы по снеговику меня поправят если что
14 Камчадал
 
naïve
17.05.22
19:28
Смотря какая транзакция и какой код в ней, а есть правила как включать попытку в транзакцию, можно посмотреть на итс. Транзакция и попытка это разные вещи. Но вполне уживаются вместе. Хотя я сам не любитель конструкций попытка исключение
15 Камчадал
 
naïve
17.05.22
19:29
Особенно популярная ошибка, что:в данной транзакции уже происходили ошибки
16 ЭЦ
 
17.05.22
19:32
(13) Попытка позволяет продолжить выполнение программы при возникновении ошибки - вызывается исключение которое можно обрабатывать любым способом
- например - отменить незавершенную транзакцию
Транзакция - обеспечивает синхронную запись или не запись в базу всех объектов внутри транзакции.
т.е они все либо записываются либо все не записываются
17 Злопчинский
 
17.05.22
19:33
(16) и где здесь что начатьТранзакция() д.б. внутри попытки?
18 Злопчинский
 
17.05.22
19:34
(14) НачатьТранзакцию() - ошибку вызвать может?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший