Как реализовать возврат товара через отрицательное количество в 1С?

Программист Управленческий учет
← На главную

Иногда при разработке собственных конфигураций (или доработке существующих) возникает нестандартная задача: реализовать возврат товара поставщику не через отдельный документ «Возврат», а путем ввода отрицательного количества в обычной «Приходной накладной». То есть, если мы указываем в строке табличной части 20 штук — товар приходуется на склад, а если -20 штук — списывается со склада как возврат. Давайте подробно разберем, как технически реализовать такую задачу, какие есть подводные камни и как правильно организовать контроль остатков.

Основы работы с регистрами накопления

Для начала вспомним, что учет товаров на складах в 1С ведется с помощью регистров накопления с видом Остатки. У такого регистра есть два вида движения: Приход (увеличивает остаток) и Расход (уменьшает остаток).

Когда мы сталкиваемся с отрицательным количеством в документе, мы можем пойти двумя путями при формировании движений:

  1. Смена вида движения: Анализируем знак введенного количества. Если число положительное, делаем движение с видом Приход. Если отрицательное — меняем вид движения на Расход, а само значение ресурса (количество) записываем по модулю (как положительное число).
  2. Использование отрицательных ресурсов («Красное сторно»): Мы всегда делаем движение с видом Приход, но передаем в ресурс то значение, которое указано в документе (с учетом знака). Если там -20, то система прибавит минус 20 к остатку, что математически приведет к списанию товара.

Рассмотрим пример реализации первого варианта в модуле объекта документа:


Для Каждого СтрокаТЧ Из Товары Цикл
    Движение = Движения.ОстаткиТоваров.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = СтрокаТЧ.Номенклатура;
    
    Если СтрокаТЧ.Количество > 0 Тогда
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Количество = СтрокаТЧ.Количество;
    Иначе
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        // Берем число по модулю
        Движение.Количество = -СтрокаТЧ.Количество; 
    КонецЕсли;
КонецЦикла;

Альтернативный подход: Реквизит операции

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


Для Каждого СтрокаТЧ Из Товары Цикл
    Движение = Движения.ОстаткиТоваров.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = СтрокаТЧ.Номенклатура;
    Движение.Количество = СтрокаТЧ.Количество;

    Если ВидОперации = Перечисления.ВидыОпераций.Поступление Тогда
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    ИначеЕсли ВидОперации = Перечисления.ВидыОпераций.Возврат Тогда
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    КонецЕсли;
КонецЦикла;

Этот способ более прозрачен для пользователя и снижает риск случайных ошибок ввода.

Контроль отрицательных остатков

Если мы списываем товар со склада (возвращаем поставщику), нам необходимо убедиться, что товар физически есть на остатках. В среде разработчиков 1С для этого используется «новая методика» проведения документов.

Разберем логику «новой методики» по шагам:

  1. Мы устанавливаем свойство Движения.ОстаткиТоваров.Записывать = Истина; и свойство Движения.ОстаткиТоваров.Очищать = Истина;.
  2. Безусловно формируем и записываем движения (в том числе списания) в регистр. Для этого вызываем метод Движения.Записать();.
  3. Делаем запрос к виртуальной таблице Остатки нашего регистра накопления с учетом границы текущего документа.
  4. Если запрос возвращает строки, где ресурс КоличествоОстаток < 0, мы выводим пользователю сообщение об ошибке (нехватке товара) и устанавливаем флаг Отказ = Истина;. Транзакция отменяется, документ не проводится.

Такой подход позволяет избежать проблем с блокировками (deadlocks) при параллельной работе пользователей и считается стандартом при сдаче экзаменов 1С.

Влияние на расчет себестоимости и партии

Несмотря на кажущуюся простоту отрицательных количеств, проанализируем, к чему это может привести в более сложной системе. Главная проблема — расчет себестоимости (ФИФО, скользящая средняя).

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

Использование минусов в типовых конфигурациях 1С

Справедливости ради, отметим, что отрицательные количества встречаются и в типовых продуктах фирмы «1С»:

Подводя итог, можно сказать, что технически реализовать возврат через минус несложно (достаточно правильно настроить формирование записей в РегистрыНакопления и написать запрос контроля остатков). Однако, с точки зрения архитектуры управленческого учета, использование отдельного реквизита «Операция» или выделенного документа «Возврат» является более предпочтительным, безопасным и масштабируемым решением.

← На главную