Имя: Пароль:
1C
1С v8
Стоит ли делать принудительное начало/завершение транзакции при перепроведении документов?
0 DenYuliya
 
14.12.22
17:50
Всем привет.
Такой вопрос: Стоит ли использовать принудительное начало и завершение транзакции при перепроведении массива документов? Что то вроде примера ниже, с использованием конструкций НачатьТранзакцию();, ЗафиксироватьТранзакцию();. Или можно и обойтись?
Объем данных возможен большой, до 100 тыс документов.
Смотрю примеры, не везде используется НачатьТранзакцию()


        ТабДокументов = ОтобратьДокументы();  ///получаем ТЗ со списком док, которые надо перепровести
    Для Каждого СтрокаТЗ Из ТабДокументов Цикл          
        ДокСсылка = СтрокаТЗ.Ссылка.ПолучитьОбъект();  
        НачатьТранзакцию();
        Попытка
            ДокСсылка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
            ЗафиксироватьТранзакцию();
        Исключение
            Если ТранзакцияАктивна() Тогда
               ОтменитьТранзакцию();
            КонецЕсли;
            ВызватьИсключение;        
        КонецПопытки;
    КонецЦикла;
1 Aleksey
 
14.12.22
17:52
Именно так делать не стоит
2 DenYuliya
 
14.12.22
17:53
(1) почему?
3 Kassern
 
14.12.22
17:54
(0) это имеет смысл, когда проводится связка документов и вам нужно убедиться, что все документы из связки записались без ошибки, в противном случае - отменить транзакцию.
4 Kassern
 
14.12.22
17:54
У вас  ДокСсылка.Записать() - итак в транзакции выполняется
5 tesei
 
14.12.22
17:55
Транзакция в транзакции - оксюморон. Зачем столько документов перепроводить?
6 DenYuliya
 
14.12.22
17:55
(3) связка - имеется в виду логическая связка? Если использовать при групповом приведении логически не связанных между собой документах - использование   ЗафиксироватьТранзакцию(); навредит, или смысла просто не будет?
7 DenYuliya
 
14.12.22
17:56
(5) восстановить сбившуюся при переносе последовательность
8 Kassern
 
14.12.22
17:58
(6) Например вы проводите Реализацию, и меняете статус у заказа клиента. Первое у вас прошло успешно, а на втором вы словили ошибку с блокировками к примеру. Если вы выполняли это в транзакции, то можете ее отменить и тогда реализация так же откатится. В противном случае у вас реализация будет закрытая, а заказ - нет.
9 Aleksey
 
14.12.22
17:58
(7) и? ты начинаешь транзакцию, затем в рамках проведения платформа сама открывает неявную транзакцию. В результате у тебя только увеличиваются расходы на проведения
10 DenYuliya
 
14.12.22
17:58
(4) читала на хабре статью на эту тему, https://habr.com/ru/post/419715/ , вообще увлекательно, конечно. Пример взят оттуда.
11 Aleksey
 
14.12.22
17:59
Такая конструкция имеет право на жизнь когда у тебя в рамках одной транзакции проводиться пакет документов. К примеру начал транзакцию провел 100 документов зафиксировал транзакцию
12 DenYuliya
 
14.12.22
17:59
(8) я поняла, да, логическая связка между документами. В противном случае - использование конструкции ЗафиксироватьТранзакцию(); увеличит время обработки массива документов, так?
13 DenYuliya
 
14.12.22
18:01
(11) О, а вот это интересно. Можно же разбить массив из, например, 100 тысяч документов на пакеты по 100 документов, и проводить их в транзакциях? Можно какой-нибудь пример, или "кодовое слово для поиска"? Посмотрела бы, как это реализовать.
14 Aleksey
 
14.12.22
18:01
(10) что то не нашел там такого примера
там есть

НачатьТранзакцию();
Попытка
    ДелаемЧтоТо();
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

Т.е. в делаем что то возможно создаются справочники, проводятся документы
15 Aleksey
 
14.12.22
18:03
(13) надо смотреть. Ибо такая конструкция была актуально для 7-ки, так как на скуле при большом объеме документов падала скорость проведения, поэтому и били на пакеты.
Возможно для 8-ке это уже не актуально
16 DenYuliya
 
14.12.22
18:07
(14) не сказано, что под "что-то" имеется в виду "что угодно, кроме перепроведения массива документов"))). ЧЕм плох пример?
(15) ну вот как раз проблема, что при перепроведении большого объема документов - очень падает скорость проведения. И они не успевают провестись все.
17 Aleksey
 
14.12.22
18:10
(16) "ЧЕм плох пример" это вырожденный случай
18 DenYuliya
 
14.12.22
18:16
(17) эм, не поняла, в каком плане "вырожденный случай"?
Если честно, я что-то запуталась.
Короче, не стоит применять "НачатьТранзакцию" при стандартных случаях, верно?
Если все-таки конструкция применена, это как-то делает хуже, или просто "не по фен-шую"?
19 DenYuliya
 
14.12.22
18:26
(8) хм... еще вопрос. А если немного меняем условие и вместо "Перепровести массив документов" берем "Перепровести массив документов по одному контрагенту, где каждый документ влияет на статус последующего" (например, не проведется второй документ из ста и все, в сотом некорректный статус)- в этом случае прямое объявление начала транзакции уместно, верно я понимаю?
20 Aleksey
 
14.12.22
18:35
(18) Такое чувство что у за каждый тест из зарплаты деньги вычитают. Причем как минимум ползарплаты в минус уйдет, если ты просто запустишь проверку теории.

Теория без практики нечто. Какая разница что я или кто-то еще скажет. Накидал пример запустил на копии несколько раз тест и сравнил результаты.
Хз может на твоем железе и с твоей версии платформы "стоит применять "НачатьТранзакцию" при стандартных случаях" так как это даст прирост в скорости как в 10 раз.
Либо наооборот ты не увидишь разницы (разница в пределах погрешности). Главное не жадничий и не проверяй теорию на 2-х документах. Это не показательно. Чем больше документов тем яснее будет результат
21 DenYuliya
 
14.12.22
18:42
(18) да не, надеюсь не вычитают. Пытаюсь прощупать, совсем х**ню спорола с этой транзакцией, или как))). А то никогда ее не использовала, а тут на тебе - видимо и не надо было)
22 DenYuliya
 
14.12.22
18:44
(20) в (21) это было в ответ на (20)
23 lodger
 
14.12.22
18:44
(21) обычно, явную транзакцию используют, что провести или записать сразу массив связанных между собой объектов.
чтобы в случае одного отказа - отменилась запись всей очерченной группы.
24 lodger
 
14.12.22
18:47
второй трюк - транзакция для ускорения.
просто взводим счетчик и фиксируем транзакцию каждые 500-1000-2000 объектов. размер порции варьируется от мощностей сервера.
будучи зафиксированными одновременно - снижаются накладные расходы на каждую отдельную запись, но добавляются на общую фиксацию большого пакета. тут надо смотреть по месту - в зависимости от архитектуры и конкретной СУБД может даже увеличить время записи.
25 DenYuliya
 
14.12.22
18:47
(23) Да, уже вроде бы поняла, не зря спросила. А если в какой-то момент принудительно рубанешь транзакцию - все предыдущее тоже не завершится?
26 lodger
 
14.12.22
18:48
а начинать и закрывать транзакцию для каждого отдельного объекта = баловство и никакого толку. все минусы и ни одного плюса.
27 lodger
 
14.12.22
18:48
(25) всё что было поставлено к записи в течении открытой транзакции - потеряется.
28 DenYuliya
 
14.12.22
18:49
(24) а могли бы примерно показать (или "что мне поискать"), как реализовать "и фиксируем транзакцию каждые 500-1000-2000 объектов"?
(26) минусы - увеличение времени обработки?
29 lodger
 
14.12.22
19:01
(28) минусы - увеличение времени обработки? - да. увеличение нагрузки и времени.

примерно показать - примерно уже рассказал в тексте. а как конкретно не нашел примера в сети, или не смог составить запрос.

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

    Если ТранзакцияАктивна() Тогда
        ЗафиксироватьТранзакцию();
    КонецЕсли;
30 DenYuliya
 
14.12.22
19:09
(29) спасибо большое за пример, мне в части

Если счетчикобъектов = 500 Тогда
ЗафиксироватьТранзакцию();
счетчикобъектов = 0;
НачатьТранзакцию();
КонецЕсли


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