Иногда при разработке собственных конфигураций (или доработке существующих) возникает нестандартная задача: реализовать возврат товара поставщику не через отдельный документ «Возврат», а путем ввода отрицательного количества в обычной «Приходной накладной». То есть, если мы указываем в строке табличной части 20 штук — товар приходуется на склад, а если -20 штук — списывается со склада как возврат. Давайте подробно разберем, как технически реализовать такую задачу, какие есть подводные камни и как правильно организовать контроль остатков.
Для начала вспомним, что учет товаров на складах в 1С ведется с помощью регистров накопления с видом Остатки. У такого регистра есть два вида движения: Приход (увеличивает остаток) и Расход (уменьшает остаток).
Когда мы сталкиваемся с отрицательным количеством в документе, мы можем пойти двумя путями при формировании движений:
Приход. Если отрицательное — меняем вид движения на Расход, а само значение ресурса (количество) записываем по модулю (как положительное число).Приход, но передаем в ресурс то значение, которое указано в документе (с учетом знака). Если там -20, то система прибавит минус 20 к остатку, что математически приведет к списанию товара.Рассмотрим пример реализации первого варианта в модуле объекта документа:
Для Каждого СтрокаТЧ Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Если СтрокаТЧ.Количество > 0 Тогда
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Количество = СтрокаТЧ.Количество;
Иначе
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
// Берем число по модулю
Движение.Количество = -СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
Вместо того чтобы заставлять пользователей вводить минусы, проанализируем более классический подход. Добавим в шапку документа реквизит ВидОперации (например, перечисление со значениями «Поступление» и «Возврат»). Пользователь всегда вводит положительные числа в табличную часть, но логика проведения меняется в зависимости от выбранной операции.
Для Каждого СтрокаТЧ Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Движение.Количество = СтрокаТЧ.Количество;
Если ВидОперации = Перечисления.ВидыОпераций.Поступление Тогда
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
ИначеЕсли ВидОперации = Перечисления.ВидыОпераций.Возврат Тогда
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
КонецЕсли;
КонецЦикла;
Этот способ более прозрачен для пользователя и снижает риск случайных ошибок ввода.
Если мы списываем товар со склада (возвращаем поставщику), нам необходимо убедиться, что товар физически есть на остатках. В среде разработчиков 1С для этого используется «новая методика» проведения документов.
Разберем логику «новой методики» по шагам:
Движения.ОстаткиТоваров.Записывать = Истина; и свойство Движения.ОстаткиТоваров.Очищать = Истина;.Движения.Записать();.Остатки нашего регистра накопления с учетом границы текущего документа.КоличествоОстаток < 0, мы выводим пользователю сообщение об ошибке (нехватке товара) и устанавливаем флаг Отказ = Истина;. Транзакция отменяется, документ не проводится.Такой подход позволяет избежать проблем с блокировками (deadlocks) при параллельной работе пользователей и считается стандартом при сдаче экзаменов 1С.
Несмотря на кажущуюся простоту отрицательных количеств, проанализируем, к чему это может привести в более сложной системе. Главная проблема — расчет себестоимости (ФИФО, скользящая средняя).
При использовании полноценного документа «Возврат товаров поставщику» система четко понимает, какую именно партию мы возвращаем и по какой стоимости нужно списать складские запасы. Если же мы просто «шмаляем минусы» в обычной приходной накладной, алгоритмы списания партий могут отработать некорректно: количество спишется, а стоимостная оценка зависнет, что приведет к перекосам в финансовых результатах.
Справедливости ради, отметим, что отрицательные количества встречаются и в типовых продуктах фирмы «1С»:
Подводя итог, можно сказать, что технически реализовать возврат через минус несложно (достаточно правильно настроить формирование записей в РегистрыНакопления и написать запрос контроля остатков). Однако, с точки зрения архитектуры управленческого учета, использование отдельного реквизита «Операция» или выделенного документа «Возврат» является более предпочтительным, безопасным и масштабируемым решением.