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