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