← вся теориятеория к собесу · Проведение документов

Старая и новая методика проведения 1С

разбор писал Даниил, автор Сеньорчика

Зачем это спрашивают

Контроль остатков при проведении пишут двумя способами, и на собесе просят сравнить их. Старая методика сначала читает остатки, потом пишет движения. Новая методика сначала пишет, потом ищет минус. Обе корректны при правильных блокировках, разница в цене.

// Так спрашивают: «Чем старая методика проведения отличается от новой?» «Где ставить блокировку в старой методике?» «Какие остатки проверять после записи движений?» «Зачем БлокироватьДляИзменения?»

Старая методика

Порядок: заблокировать остатки по товарам документа, прочитать их, сравнить с потребностью, при нехватке отказать, иначе записать движения. Блокировку ставят до чтения и сразу исключительную, потому что по прочитанному потом будут писать:

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

Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.ИсточникДанных = Товары;
Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Элемент.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();
// только теперь читаем остатки, сравниваем и пишем движения

Новая методика

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

Вот что найдёт запрос после записи. До документа на складе молока 5 и хлеба 10, документ списывает 7 молока и 4 хлеба:

Остатки читаются без даты, то есть итоговые. Так проверка ловит и минус у документов, проведённых позже, если этот проводят задним числом: на момент документа остаток мог быть в порядке, а к концу учёта уйти в минус.

Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина;
Движения.ТоварыНаСкладах.Загрузить(ТаблицаДвижений);
Движения.ТоварыНаСкладах.Записать();

Запрос.Текст =
"ВЫБРАТЬ Остатки.Номенклатура, Остатки.КоличествоОстаток
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(,
|    (Номенклатура, Склад) В (ВЫБРАТЬ Т.Номенклатура, Т.Склад ИЗ ВТ_Товары КАК Т)) КАК Остатки
|ГДЕ Остатки.КоличествоОстаток < 0";
Если Не Запрос.Выполнить().Пустой() Тогда
    Отказ = Истина;  // плюс сообщение по каждому товару
КонецЕсли;

Сравнение

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

Движения в обоих случаях формируют запросом по табличной части с группировкой и загружают в набор Загрузить(), а не циклом по строкам с обращением к реквизитам через точку.

Разделение итогов

Если у регистра включено разделение итогов, блокировка при записи учитывает служебный разделитель, и два документа по одному товару пишут параллельно в разные строки итогов. Каждый проверит остаток, не увидев чужого незафиксированного списания, и минус пройдёт. БлокироватьДляИзменения = Истина у набора ставит блокировку по измерениям без разделителя, и документы по одному товару встают в очередь.

Как отвечать: «Сравни старую и новую методику контроля остатков».

В старой сначала ставлю исключительную управляемую блокировку на товары и склады документа, потом читаю остатки, сравниваю и только потом пишу движения. В новой сначала пишу движения, запись набора сама ставит блокировку, а потом одним запросом ищу отрицательные итоговые остатки по товарам документа и при минусе отказываю, транзакция откатит движения. Новая читает меньше и держит блокировки короче, её используют типовые. Если у регистра разделение итогов, в новой методике обязательно ставлю БлокироватьДляИзменения.

Ответ даёт обе последовательности, говорит, кто ставит блокировку в каждой, сравнивает цену и закрывает самый тонкий момент с разделением итогов. Это ответ мидла и выше.

На чём валят

  • −Ставят блокировку после чтения остатков. Параллельный документ уже прочитал те же данные. Блокировка, чтение, проверка, запись.
  • −Берут разделяемую блокировку в старой методике. Два документа прочитают вместе и сцепятся при записи. Нужна исключительная.
  • −Блокируют регистр целиком без полей. Все документы проводятся строго по одному. Блокируют товары и склады документа.
  • −Включают разделение итогов и не ставят БлокироватьДляИзменения. Документы по одному товару пройдут параллельно, и минус проскочит.

Проверь себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #oc_posting_methods1 / 5
    В чём суть «новой» методики контроля остатков?
    A)Контролировать остатки в регламентном задании после смены
    B)Проверять остатки на клиенте
    C)Отказаться от контроля, допуская минус до инвентаризации
    D)Записать движения, затем искать минусы
    показать ответ и разбор
    +D)Записать движения, затем искать минусы

    // разбор: По новой методике движения записываются сразу, с блокировкой изменяемых данных, а потом запрос проверяет, не стал ли остаток по затронутым товарам отрицательным. Если стал — отказ, и транзакция откатывает движения. Проверяются только реально изменённые измерения, и не нужно заранее читать остатки по всем строкам.

  2. #oc_posting_methods2 / 5
    Почему при новой методике запрос остатков после записи движений обычно не передаёт дату в Остатки()?
    A)Дата недоступна в проведении
    B)Без даты запрос быстрее, а точность проверки не важна
    C)Нужен итоговый остаток, а не на дату
    D)Так требует разделение итогов при параллельной записи
    показать ответ и разбор
    +C)Нужен итоговый остаток, а не на дату

    // разбор: Если проводят документ задним числом, остаток на его момент может быть в порядке, а последующие документы уже ушли в минус. Проверка по текущим итогам ловит, что после записи этого документа товара не хватает на конец учёта. Конкретная стратегия зависит от политики: строгий контроль на момент документа тоже встречается.

  3. #oc_posting_methods3 / 5
    У регистра остатков включено разделение итогов. Зачем по новой методике набору движений ставят БлокироватьДляИзменения = Истина?
    A)Чтобы набор нельзя было изменить после заполнения
    B)Блокировка товара и склада пойдёт без разделителя
    C)Чтобы отключить разделение итогов в регистре
    D)Чтобы заблокировать регистр целиком до конца транзакции
    показать ответ и разбор
    +B)Блокировка товара и склада пойдёт без разделителя

    // разбор: С разделением итогов обычная блокировка при записи набора учитывает служебный разделитель, и два документа по одному товару и складу пишут параллельно, а проверка остатков после записи пропускает минус. Свойство заставляет платформу блокировать сочетание измерений без разделителя, и второй документ ждёт первого. Ставят его до записи набора, работает оно только в управляемом режиме блокировок.

  4. #oc_posting_methods4 / 5
    Чем новая методика выгоднее старой на большом документе с 1000 строк?
    A)Проверяет только ушедшие в минус позиции
    B)Не пишет движения при нехватке
    C)Не требует блокировок: их заменяет проверка после записи
    D)Позволяет отрицательные остатки до конца смены
    показать ответ и разбор
    +A)Проверяет только ушедшие в минус позиции

    // разбор: Старая методика читает остатки по всем 1000 позициям до записи, держит блокировки и сравнивает в цикле. Новая пишет движения и одним запросом выбирает только те сочетания, где остаток стал меньше нуля, обычно их нет. Меньше данных читается, меньше кода, короче время блокировки.

  5. #oc_posting_methods5 / 5
    Почему при старой методике чтение остатков без блокировки даёт ошибку учёта?
    A)Оба документа спишут один остаток
    B)Запрос остатков без блокировки вернёт NULL вместо чисел
    C)Без блокировки движения документа не запишутся в регистр
    D)Платформа откажет второму
    показать ответ и разбор
    +A)Оба документа спишут один остаток

    // разбор: Чтение без блокировки не мешает параллельной транзакции прочитать тот же остаток. Оба документа видят 10 штук, каждый списывает по 8, и остаток уходит в минус. Перед чтением ставят исключительную управляемую блокировку на нужные товары и склады, тогда второй документ дождётся первого.

дальше

Теорию прочитал. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.