Почему не заполняется себестоимость в документе «Возврат товаров от покупателя» в 1С?

Бухгалтер 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

Каждый бухгалтер и менеджер по продажам, работающий в программах на платформе 1С (таких как «Управление торговым предприятием», «Управление производственным предприятием» или «Управление торговлей» старых редакций), рано или поздно сталкивается с ситуацией, когда в документе Возврат товаров от покупателя колонка «Себестоимость» упорно остается пустой. Это вызывает панику: ведь если себестоимость не заполнится, то исказятся отчеты по валовой прибыли, а финансовый результат компании за месяц окажется неверным.

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

Понимание проблемы: почему программа не заполняет себестоимость автоматически?

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

Для того чтобы понять, почему программа ведет себя именно так, нам необходимо обратиться к архитектуре партионного учета в конфигурациях 1С (в частности, на обычных формах, таких как УТП 1.2 или УПП 1.3).

В типовой логике 1С себестоимость возвращаемого товара не может быть определена «из ниоткуда». Программа должна четко понимать, по какой стоимости этот товар нужно вернуть на баланс организации и в регистры партионного учета. Здесь существует два принципиально разных режима работы системы.

Режим 1: Автоматическое определение себестоимости по документу партии

Это наиболее правильный с точки зрения методологии учета вариант. Рассмотрим, как он работает:

  1. В шапке документа возврата или непосредственно в строке табличной части «Товары» заполняется реквизит Документ партии. В качестве этого документа выступает документ отгрузки — чаще всего это Реализация товаров и услуг или Отчет о розничных продажах.
  2. При проведении возврата система обращается к движениям этого документа отгрузки по регистру накопления Партии товаров на складах (или соответствующему регистру для розницы/производства) и смотрит, по какой именно себестоимости данный товар был списан в момент продажи.
  3. Именно эта историческая себестоимость используется для оприходования товара обратно на склад и для сторнирования себестоимости в регистре Продажи себестоимость.

При таком подходе колонка «Себестоимость» в табличной части документа на форме вообще может быть скрыта или недоступна для редактирования, так как все расчеты происходят строго в момент проведения документа в автоматическом режиме.

Режим 2: Ручное указание себестоимости (документ партии не заполнен)

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

Как в этой ситуации ведет себя программа?

  1. Поскольку связь с исходной продажей утеряна, 1С не может самостоятельно определить, по какой стоимости товар был списан. Партионный учет требует абсолютной точности, и система не имеет права «додумывать» или усреднять эти показатели на лету при заполнении строки.
  2. Программа делает колонку «Себестоимость» (а также «Себестоимость НУ» для налогового учета) доступной для ручного редактирования пользователем.
  3. Пользователь обязан заполнить это поле вручную. Значение себестоимости можно подсмотреть в отчетах (например, в ведомости по партиям) на дату предполагаемой продажи или ввести экспертную оценку стоимости возвращаемого имущества.

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

Влияние пустой себестоимости на учет и отчетность

Проанализируем, к каким последствиям приводит проведение документа Возврат товаров от покупателя с незаполненной себестоимостью и без указания документа партии:

Разберем по шагам: как решить проблему и правильно заполнить себестоимость

Рассмотрим практические варианты решения этой проблемы, начиная от самых простых пользовательских действий и заканчивая техническими доработками для программистов.

Вариант 1. Использование механизма «Ввод на основании»

Самый надежный и методологически верный способ избежать пустой себестоимости — всегда создавать документы возврата на основании документов отгрузки.

  1. Найдите документ Реализация товаров и услуг, по которому производилась продажа данного товара покупателю.
  2. Нажмите кнопку «Создать на основании» (или используйте соответствующее меню) и выберите Возврат товаров от покупателя.
  3. Программа автоматически перенесет всю номенклатуру, цены, а главное — заполнит реквизит Документ партии ссылкой на эту реализацию. Вам останется только скорректировать количество, если возвращается не вся партия товара. При проведении себестоимость спишется идеально точно.

Вариант 2. Заполнение документов отгрузки внутри возврата

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

  1. В документе возврата обратите внимание на командную панель табличной части «Товары». Найдите там кнопку «Заполнить».
  2. Используйте функции Добавить из документов отгрузки или Заполнить по документу отгрузки.
  3. Система предложит вам выбрать документ реализации и автоматически привяжет его к строкам возврата. Поля партий заполнятся, и себестоимость рассчитается автоматически при проведении.

Вариант 3. Ручное заполнение себестоимости по данным отчетов

Если связать возврат с конкретной отгрузкой невозможно (например, возврат товара, проданного в прошлом году в другой учетной системе), выполните следующие действия:

  1. Откройте отчет Ведомость по партиям товаров на складах или отчет Валовая прибыль за период, когда предположительно приобретался или продавался этот товар.
  2. Найдите партионную стоимость или себестоимость единицы этого товара.
  3. В документе возврата в строке товара найдите колонку «Себестоимость» (и, если необходимо, «Себестоимость НУ») и введите полученную сумму вручную.
  4. Проведите документ. Программа примет указанную вами сумму в качестве новой стоимости партии для возвращенного товара.

Решение для программистов: автоматизация заполнения себестоимости

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

Нам необходимо написать алгоритм, который при выборе номенклатуры (или по кнопке «Заполнить себестоимость») будет автоматически искать последнюю продажу этого товара данному контрагенту и подставлять себестоимость оттуда.

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


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

Запрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(ТекущаяДата(), -6)); // Ищем за последние полгода
Запрос.УстановитьПараметр("КонецПериода", ТекущаяДата());
Запрос.УстановитьПараметр("Покупатель", СсылкаНаОбъект.Контрагент);
Запрос.УстановитьПараметр("Номенклатура", ТекущаяСтрока.Номенклатура);

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    
    // Рассчитываем себестоимость единицы, если в регистре хранится общая стоимость партии
    Если Выборка.КоличествоПродано <> 0 Тогда
        ТекущаяСтрока.Себестоимость = (Выборка.СебестоимостьЕдиницы / Выборка.КоличествоПродано) * ТекущаяСтрока.Количество;
        ТекущаяСтрока.ДокументПартии = Выборка.ДокументОтгрузки;
    КонецЕсли;
КонецЕсли;

Этот код можно поместить во внешнюю обработку заполнения табличной части (чтобы не снимать конфигурацию с поддержки) или внедрить непосредственно в модуль формы документа в процедуру ТоварыНоменклатураПриИзменении.

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

← На главную