Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Пакетное создание документов. Блокировка данных

Пакетное создание документов. Блокировка данных
Я
   Wefast
 
01.07.19 - 13:22
Обработка создает документы. Нужно чтобы все эти документы находились рядом.

Я так понимаю на время работы обработки мне нужно заблокировать возможность создания документов пользователем.

Как это правильно делается?

Просто перед началом цикла где создаются документы написать

    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("Документы.МойДок");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Блокировка.Заблокировать();

Я не очень понимаю в какой момент документы разблокируются. И я так понимаю пользователи даже не смогут открыть документы в это время.

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

Или документы на самом деле создадутся по мере работы обработки. А по окончании транзакции либо удалятся если была ошибка, либо останутся на месте и станут видны?

Или нужно как то совместить транзакцию и блокировку?
 
 
   H A D G E H O G s
 
1 - 01.07.19 - 13:24
Ты все правильно сказал
   H A D G E H O G s
 
2 - 01.07.19 - 13:25
НачатьТранзакцию()
//Тут другой пользователь еще может создать док


Блокировка.Заблокировать(); 
// Тут другой пользователь уже не может


ЗафиксироватьТранзакцию();
// Тут другой пользователь уже может
   H A D G E H O G s
 
3 - 01.07.19 - 13:28
Для текущей транзакции и текущего пользователя
Документы записываются сразу же в момент
ДокОбъект.Записать()
и получают номера
Однако, если будет ошибка и выполнение не дойдет до ЗафиксироватьТранзакцию() - то все откатится до начального состояния
Для всех других пользователей доки создадутся мгновенно, после ЗафиксироватьТранзакцию()
   Wefast
 
4 - 01.07.19 - 13:35
(3) тогда все делать в транзакции не обязательно?(только если мне нужно проследить чтобы все документы в принципе создались) Последовательность сохранится только если я напишу Заблокировать(), правильно?
   Cyberhawk
 
5 - 01.07.19 - 13:36
(4) Блокировка вне транзакции в упр. режиме вызывает исключение, а в авт. просто не работает
   Wefast
 
6 - 01.07.19 - 13:43
Значит как итог это будет так?
Процедура СозданиеДок()


  НачатьТранзакцию();
    Блокировка = Новый БлокировкаДанных; 
    ЭлементБлокировки = Блокировка.Добавить("Документы.МойДок"); 
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; 
    Блокировка.Заблокировать(); 

    Для Стр из ТЧ Цикл
      Док = Документы.МойДок.СоздатьДокумент();
      Док.Записать()
    КонецЦикла;
  Попытка
    ЗафиксироватьТранзакцию();
  Исключение
    ОтменитьТранзакцию();
  КонецПопытки;
КонецПроцедуры
   Cyberhawk
 
7 - 01.07.19 - 13:47
Цикл неправильно организован. Запись документа в попытке и в исключении взвод флага отказа. Вне цикла - анализ флага и фиксация / отмена транзакции.
   Wefast
 
8 - 01.07.19 - 13:52
(7)

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

Но спасибо, наверное так правильно с точки зрения хорошего тона писать, надо мне это или нет.
   Cyberhawk
 
9 - 01.07.19 - 14:04
(8) "если запись документа сделать через попытку, то транзакция не выпадет с ошибкой и можно будет записать то что может записаться" // Увы, в одной транзакции такого не добиться - нужно как минимум две (в первой записываем всех и собираем удачных кандидатов и откатываем транзакцию, во второй уже записываем только удачных)
   Wefast
 
10 - 01.07.19 - 14:09
(9) тогда зачем запись делать через попытку? Не понимаю, если все равно при попытке записи попадет в исключение с отменой транзакции, зачем делать запись через попытку.
 
 Рекламное место пустует
   Cyberhawk
 
11 - 01.07.19 - 14:14
(10) Чтобы собрать перечень ошибок сразу по всей выборке, а не свалиться в исключение на первой же ошибке
   Cyberhawk
 
12 - 01.07.19 - 14:14
Конечно же оба подхода имеют право на существование - все зависит от ситуации и потребности

Список тем форума
Рекламное место пустует  Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует