SAM, спасибо! Всё понятно, кроме
3. формируем из результата запроса движения по РН "ОстаткиНоменклатуры", записываем, не забываем про блокировку
Можете поподробнее раскрыть? Я думал, что блокировки для старой и новой методик выглядят след. образом:
P.S. по поводу Движения.Регистр.Записать(), действительно, в голове каша была. В статье написано следуюущее:
При установленном свойстве "Удалять автоматически" в самом начале транзакции проведения система автоматически записывает пустые наборы записей в регистры, тем самым очищая старые движения. Это физически происходит, запись, со всеми вытекающими транзакциями и блокировками.
Видимо это ещё с 8.1 у меня привычка всегда руками очищать движения. Спасибо Вам большое
UPD.: убрал
Движения.ПартииНоменклатуры.Записать();
Теперь при перепроведении система подцепляет предыдущие движения документа по данному регистру... Что-то я совсем запустался.
Как при старой методике при перепроведении документа очищать предыдущие движения без Записать() ?
Прошу прощения, если запутал
Во-первых, в документах Удаление движений ставим в "Удалять автоматически при отмене проведения" (так установлено изначально). Если укажем, что "Удалять автоматически" - движения будут очищаться автоматом перед началом проведения, но это лишняя запись в базу, которая не всегда нам нужна.
При новой методике проведения:
1.Движения.Регистр.Очистить(); - можно очистить набор движений, но не обязательно, в описании Аттестации указано, что формы управляемые. Если движения не читать заранее, то набор будет пуст. Но можно и очистить, вряд ли это будет ошибкой, главное не записывать!
2. Формируем набор движений.
3. Движения.Регистр.БлокироватьДляИзменения = Истина; - блокируем для изменений.Важно, чтобы у Регистра стоял флаг разделения итогов, иначе БлокироватьДляИзменения не работает!
4. Далее на выбор:
Движения.Регистр.Записать(); - пишем набор движений по регистру
либо
Движения.Регистр.Записывать = Истина; - устанавливаем флаг, затем
Движения.Записать(); - будут записаны только те движения, у которых выставили Записывать = Истина
что важно Движения.Регистр.Записать() оказывается не сбрасывает флаг, поэтому такая конструкция:
Движения.Регистр.Записывать = Истина;
Движения.Регистр.Записать();
будет ошибкой для новой методики, т.к. мы пишем движения явно, а затем, по окончанию транзакции, платформой будут писаться все движения с установленным флагом, т.е. запись еще раз.
При записи новые движения заместят старые, если идет перепроведение.
5. проверка на отрицательные остатки и т.д.
При старой методике:
1. Я использовал такую конструкцию:
Движения.Регистр.Очистить();
Движения.Регистр.БлокироватьДляИзменения = Истина;
Движения.Регистр.Записать();
Павел Чистов в своей статье предлагает использовать такой код только для оперативного проведения, обернуть в
Если РежимПроведения=РежимПроведенияДокумента.Оперативный Тогда
...
КонецЕсли;
однако на форуме я видел сообщения, что на аттестации такой вариант не понравился принимающему.
Т.к. сдавал дистанционно, и не было возможности поспорить, оставил только эти три строки, т.е. очищаем набор, блокируем, если вдруг это перепроведение и какие то движения там уже были, и записываем пустой набор.
Далее Блокировка = Новый БлокировкаДанных;
читаем, формируем набор движений и ставим флаг Записывать=Истина; чтобы движения записались при окончании транзакции. И все
Еще замечание - при оперативном проведении запрос выполнять не на пустую дату, а в качестве момента времени передавать Неопределено.
Т.е. при новой методике
Запрос.УстановитьПараметр("Момент",?(РежимПроведение=РежимПроведенияДокумента.Оперативный,Неопределено,Новый Граница(МоментВремени(),ВидГраницы.Включая)));