Каждый бухгалтер и менеджер по продажам, работающий в программах на платформе 1С (таких как «Управление торговым предприятием», «Управление производственным предприятием» или «Управление торговлей» старых редакций), рано или поздно сталкивается с ситуацией, когда в документе Возврат товаров от покупателя колонка «Себестоимость» упорно остается пустой. Это вызывает панику: ведь если себестоимость не заполнится, то исказятся отчеты по валовой прибыли, а финансовый результат компании за месяц окажется неверным.
В этой статье мы подробно разберем, почему возникает эта проблема, как устроена логика партионного учета в 1С при оформлении возвратов, почему в старых документах себестоимость «была», а при перевыборе товара «исчезает», и какие практические шаги нужно предпринять, чтобы исправить ситуацию и автоматизировать этот процесс.
Для начала проанализируем ситуацию, в которой оказался автор темы. Он заметил, что при вводе нового документа возврата себестоимость в табличной части не рассчитывается. При этом в информационной базе существуют аналогичные старые документы, в которых себестоимость заполнена, хотя поле Документ партии (документ отгрузки) там тоже пустое. Попытка перевыбрать номенклатуру в этих «правильных» старых документах приводит к тому, что ранее заполненная себестоимость очищается и больше не возвращается.
Для того чтобы понять, почему программа ведет себя именно так, нам необходимо обратиться к архитектуре партионного учета в конфигурациях 1С (в частности, на обычных формах, таких как УТП 1.2 или УПП 1.3).
В типовой логике 1С себестоимость возвращаемого товара не может быть определена «из ниоткуда». Программа должна четко понимать, по какой стоимости этот товар нужно вернуть на баланс организации и в регистры партионного учета. Здесь существует два принципиально разных режима работы системы.
Это наиболее правильный с точки зрения методологии учета вариант. Рассмотрим, как он работает:
Документ партии. В качестве этого документа выступает документ отгрузки — чаще всего это Реализация товаров и услуг или Отчет о розничных продажах.Партии товаров на складах (или соответствующему регистру для розницы/производства) и смотрит, по какой именно себестоимости данный товар был списан в момент продажи.Продажи себестоимость.При таком подходе колонка «Себестоимость» в табличной части документа на форме вообще может быть скрыта или недоступна для редактирования, так как все расчеты происходят строго в момент проведения документа в автоматическом режиме.
Бывают ситуации, когда покупатель возвращает товар, проданный очень давно, либо вообще купленный в другой информационной базе (например, до переноса данных). В этом случае указать конкретный Документ партии физически невозможно.
Как в этой ситуации ведет себя программа?
Теперь мы можем легко объяснить загадочное поведение старых документов, которое так взволновало автора темы. В тех старых «правильных» документах себестоимость была заполнена вручную предыдущими пользователями (бухгалтерами или менеджерами). Когда автор открыл документ и перевыбрал номенклатуру, сработал стандартный обработчик платформы ПриИзмененииНоменклатуры. Он полностью очистил строку табличной части и инициализировал ее параметры заново. Поскольку документ партии в строке по-прежнему отсутствовал, авторасчет не запустился, а старое значение, введенное вручную, было безвозвратно затерто.
Проанализируем, к каким последствиям приводит проведение документа Возврат товаров от покупателя с незаполненной себестоимостью и без указания документа партии:
Продажи себестоимость с нулевой суммой. При формировании отчета «Валовая прибыль» вы увидите, что выручка уменьшилась на сумму возврата (в продажных ценах), а себестоимость продаж не скорректировалась. Это приведет к занижению или неадекватному завышению вашей прибыли в отчетах.Партии товаров на складах. При последующей продаже этого товара он спишется по нулевой себестоимости, что опять же исказит будущие отчеты о прибылях и убытках.Рассмотрим практические варианты решения этой проблемы, начиная от самых простых пользовательских действий и заканчивая техническими доработками для программистов.
Самый надежный и методологически верный способ избежать пустой себестоимости — всегда создавать документы возврата на основании документов отгрузки.
Реализация товаров и услуг, по которому производилась продажа данного товара покупателю.Возврат товаров от покупателя.Документ партии ссылкой на эту реализацию. Вам останется только скорректировать количество, если возвращается не вся партия товара. При проведении себестоимость спишется идеально точно.Если документ возврата уже создан вручную, не обязательно его удалять. Можно привязать документы партии прямо в табличной части:
Добавить из документов отгрузки или Заполнить по документу отгрузки.Если связать возврат с конкретной отгрузкой невозможно (например, возврат товара, проданного в прошлом году в другой учетной системе), выполните следующие действия:
Ведомость по партиям товаров на складах или отчет Валовая прибыль за период, когда предположительно приобретался или продавался этот товар.Если менеджеры оформляют сотни возвратов в день и физически не могут искать документы отгрузки для каждого товара, этот процесс можно и нужно автоматизировать. Рассмотрим, как это сделать с помощью доработки конфигурации или внешней обработки.
Нам необходимо написать алгоритм, который при выборе номенклатуры (или по кнопке «Заполнить себестоимость») будет автоматически искать последнюю продажу этого товара данному контрагенту и подставлять себестоимость оттуда.
Разберем пример запроса, который позволяет получить себестоимость последней продажи товара контрагенту из регистра накопления Продажи и сопутствующего регистра себестоимости:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПродажиСебестоимость.Стоимость КАК СебестоимостьЕдиницы,
| ПродажиСебестоимость.Количество КАК КоличествоПродано,
| ПродажиСебестоимость.ДокументДвижения КАК ДокументОтгрузки
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК Продажи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
| ПО Продажи.Регистратор = ПродажиСебестоимость.ДокументДвижения
| И Продажи.Номенклатура = ПродажиСебестоимость.Номенклатура
|ГДЕ
| Продажи.ДоговорКонтрагента.Владелец = &Покупатель
| И Продажи.Номенклатура = &Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Продажи.Период УБЫВ";
Запрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(ТекущаяДата(), -6)); // Ищем за последние полгода
Запрос.УстановитьПараметр("КонецПериода", ТекущаяДата());
Запрос.УстановитьПараметр("Покупатель", СсылкаНаОбъект.Контрагент);
Запрос.УстановитьПараметр("Номенклатура", ТекущаяСтрока.Номенклатура);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Рассчитываем себестоимость единицы, если в регистре хранится общая стоимость партии
Если Выборка.КоличествоПродано <> 0 Тогда
ТекущаяСтрока.Себестоимость = (Выборка.СебестоимостьЕдиницы / Выборка.КоличествоПродано) * ТекущаяСтрока.Количество;
ТекущаяСтрока.ДокументПартии = Выборка.ДокументОтгрузки;
КонецЕсли;
КонецЕсли;
Этот код можно поместить во внешнюю обработку заполнения табличной части (чтобы не снимать конфигурацию с поддержки) или внедрить непосредственно в модуль формы документа в процедуру ТоварыНоменклатураПриИзменении.
Использование такого подхода позволит автоматизировать рутинную работу менеджеров: программа сама найдет последнюю сделку с клиентом, подставит правильный документ партии (отгрузки) и рассчитает корректную себестоимость возврата. В результате ваш партионный учет всегда будет оставаться в актуальном и непротиворечивом состоянии, а бухгалтеры больше не будут жаловаться на некорректную валовую прибыль.