Код-ревью Senior Проведение документов обновлено

Ревью проверки остатков

Вопрос

Проведение расходного документа проверяет остатки. Найдите ошибки.

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

Коротко

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

Что должен найти ревьюер

  1. Ошибкастрока 2
    Нет управляемой блокировки перед чтением остатков: два документа одновременно спишут один товар.
  2. Производительностьстрока 3
    Остатки() без параметров: актуальные остатки по всем товарам и складам базы. Нужны момент документа и условие по складу и товарам документа.
  3. Ошибкастрока 3
    Не учтён склад: остаток на другом складе разрешит списание.
  4. Ошибкастрока 5
    Строки с одинаковым товаром проверяются по отдельности, суммарное количество может превысить остаток.
  5. Стильстрока 8
    Отказ без сообщения: пользователь не узнает, какого товара не хватает.
  6. Ошибкастрока 11
    Движения не формируются: Записывать = Истина при пустом наборе просто удалит старые движения.

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме