Старая и новая методика проведения 1С
Контроль остатков при проведении пишут двумя способами, и на собесе просят сравнить их. Старая методика сначала читает остатки, потом пишет движения. Новая методика сначала пишет, потом ищет минус. Обе корректны при правильных блокировках, разница в цене.
// Так спрашивают: «Чем старая методика проведения отличается от новой?» «Где ставить блокировку в старой методике?» «Какие остатки проверять после записи движений?» «Зачем БлокироватьДляИзменения?»
Старая методика
Порядок: заблокировать остатки по товарам документа, прочитать их, сравнить с потребностью, при нехватке отказать, иначе записать движения. Блокировку ставят до чтения и сразу исключительную, потому что по прочитанному потом будут писать:
Если поставить блокировку после чтения, параллельный документ успеет прочитать тот же остаток, и оба спишут его. Если взять разделяемую блокировку, два документа прочитают вместе, а при записи движений сцепятся во взаимоблокировке.
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.ИсточникДанных = Товары;
Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Элемент.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();
// только теперь читаем остатки, сравниваем и пишем движенияНовая методика
Порядок обратный: записать движения, затем одним запросом найти товары документа, у которых остаток ушёл в минус, и отказать. Запись набора сама ставит исключительную блокировку на записываемые измерения, а отказ откатит движения вместе с транзакцией:
Вот что найдёт запрос после записи. До документа на складе молока 5 и хлеба 10, документ списывает 7 молока и 4 хлеба:
Остатки читаются без даты, то есть итоговые. Так проверка ловит и минус у документов, проведённых позже, если этот проводят задним числом: на момент документа остаток мог быть в порядке, а к концу учёта уйти в минус.
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина;
Движения.ТоварыНаСкладах.Загрузить(ТаблицаДвижений);
Движения.ТоварыНаСкладах.Записать();
Запрос.Текст =
"ВЫБРАТЬ Остатки.Номенклатура, Остатки.КоличествоОстаток
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(,
| (Номенклатура, Склад) В (ВЫБРАТЬ Т.Номенклатура, Т.Склад ИЗ ВТ_Товары КАК Т)) КАК Остатки
|ГДЕ Остатки.КоличествоОстаток < 0";
Если Не Запрос.Выполнить().Пустой() Тогда
Отказ = Истина; // плюс сообщение по каждому товару
КонецЕсли;Сравнение
Новая методика читает меньше и держит блокировки короче, поэтому её используют типовые конфигурации. Старая проще в отладке и понятнее, если логика списания зависит от прочитанного остатка, например при выборе партий.
Движения в обоих случаях формируют запросом по табличной части с группировкой и загружают в набор Загрузить(), а не циклом по строкам с обращением к реквизитам через точку.
Разделение итогов
Если у регистра включено разделение итогов, блокировка при записи учитывает служебный разделитель, и два документа по одному товару пишут параллельно в разные строки итогов. Каждый проверит остаток, не увидев чужого незафиксированного списания, и минус пройдёт. БлокироватьДляИзменения = Истина у набора ставит блокировку по измерениям без разделителя, и документы по одному товару встают в очередь.
Как отвечать: «Сравни старую и новую методику контроля остатков».
В старой сначала ставлю исключительную управляемую блокировку на товары и склады документа, потом читаю остатки, сравниваю и только потом пишу движения. В новой сначала пишу движения, запись набора сама ставит блокировку, а потом одним запросом ищу отрицательные итоговые остатки по товарам документа и при минусе отказываю, транзакция откатит движения. Новая читает меньше и держит блокировки короче, её используют типовые. Если у регистра разделение итогов, в новой методике обязательно ставлю БлокироватьДляИзменения.
Ответ даёт обе последовательности, говорит, кто ставит блокировку в каждой, сравнивает цену и закрывает самый тонкий момент с разделением итогов. Это ответ мидла и выше.
На чём валят
- −Ставят блокировку после чтения остатков. Параллельный документ уже прочитал те же данные. Блокировка, чтение, проверка, запись.
- −Берут разделяемую блокировку в старой методике. Два документа прочитают вместе и сцепятся при записи. Нужна исключительная.
- −Блокируют регистр целиком без полей. Все документы проводятся строго по одному. Блокируют товары и склады документа.
- −Включают разделение итогов и не ставят БлокироватьДляИзменения. Документы по одному товару пройдут параллельно, и минус проскочит.
Проверь себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- В чём суть «новой» методики контроля остатков?A)Контролировать остатки в регламентном задании после сменыB)Проверять остатки на клиентеC)Отказаться от контроля, допуская минус до инвентаризацииD)Записать движения, затем искать минусы
показать ответ и разбор
+D)Записать движения, затем искать минусы// разбор: По новой методике движения записываются сразу, с блокировкой изменяемых данных, а потом запрос проверяет, не стал ли остаток по затронутым товарам отрицательным. Если стал — отказ, и транзакция откатывает движения. Проверяются только реально изменённые измерения, и не нужно заранее читать остатки по всем строкам.
- Почему при новой методике запрос остатков после записи движений обычно не передаёт дату в
Остатки()?A)Дата недоступна в проведенииB)Без даты запрос быстрее, а точность проверки не важнаC)Нужен итоговый остаток, а не на датуD)Так требует разделение итогов при параллельной записипоказать ответ и разбор
+C)Нужен итоговый остаток, а не на дату// разбор: Если проводят документ задним числом, остаток на его момент может быть в порядке, а последующие документы уже ушли в минус. Проверка по текущим итогам ловит, что после записи этого документа товара не хватает на конец учёта. Конкретная стратегия зависит от политики: строгий контроль на момент документа тоже встречается.
- У регистра остатков включено разделение итогов. Зачем по новой методике набору движений ставят
БлокироватьДляИзменения = Истина?A)Чтобы набор нельзя было изменить после заполненияB)Блокировка товара и склада пойдёт без разделителяC)Чтобы отключить разделение итогов в регистреD)Чтобы заблокировать регистр целиком до конца транзакциипоказать ответ и разбор
+B)Блокировка товара и склада пойдёт без разделителя// разбор: С разделением итогов обычная блокировка при записи набора учитывает служебный разделитель, и два документа по одному товару и складу пишут параллельно, а проверка остатков после записи пропускает минус. Свойство заставляет платформу блокировать сочетание измерений без разделителя, и второй документ ждёт первого. Ставят его до записи набора, работает оно только в управляемом режиме блокировок.
- Чем новая методика выгоднее старой на большом документе с 1000 строк?A)Проверяет только ушедшие в минус позицииB)Не пишет движения при нехваткеC)Не требует блокировок: их заменяет проверка после записиD)Позволяет отрицательные остатки до конца смены
показать ответ и разбор
+A)Проверяет только ушедшие в минус позиции// разбор: Старая методика читает остатки по всем 1000 позициям до записи, держит блокировки и сравнивает в цикле. Новая пишет движения и одним запросом выбирает только те сочетания, где остаток стал меньше нуля, обычно их нет. Меньше данных читается, меньше кода, короче время блокировки.
- Почему при старой методике чтение остатков без блокировки даёт ошибку учёта?A)Оба документа спишут один остатокB)Запрос остатков без блокировки вернёт NULL вместо чиселC)Без блокировки движения документа не запишутся в регистрD)Платформа откажет второму
показать ответ и разбор
+A)Оба документа спишут один остаток// разбор: Чтение без блокировки не мешает параллельной транзакции прочитать тот же остаток. Оба документа видят 10 штук, каждый списывает по 8, и остаток уходит в минус. Перед чтением ставят исключительную управляемую блокировку на нужные товары и склады, тогда второй документ дождётся первого.
дальше
Теорию прочитал. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.