Как реализовать автоматическую установку цен и себестоимости при проведении документов поступления и допрасходов в 1С?

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

Разберем типовую задачу автоматизации ценообразования: автоматический ввод и расчет цен номенклатуры при проведении документов Поступление товаров и услуг (или Приобретение товаров и услуг) и Поступление доп. расходов.

Понимание бизнес-логики задания

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

  1. Себестоимость в ценообразовании: В рамках подсистемы ценообразования под себестоимостью чаще всего понимается отдельный вид цены (например, Плановая себестоимость или Закупочная цена), который фиксируется в регистре сведений ЦеныНоменклатуры с помощью документа Установка цен номенклатуры.
  2. Поступление товаров: При проведении документа поступления базовая себестоимость партии определяется ценой закупки из накладной.
  3. Поступление допрасходов: Если к поступлению оформлен документ дополнительных расходов (транспортировка, таможня, страховка), себестоимость единицы номенклатуры увеличивается на сумму распределенных расходов: (Сумма поступления + Сумма доп. расхода) / Количество.
  4. Расчет цен по настройке: От рассчитанного базового вида цены (себестоимости) по заданным формулам или правилам наценки автоматически рассчитываются зависимые виды цен (оптовые, розничные, дилерские).

Архитектурные ограничения и риски

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

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

Вариант 1. Синхронное создание через подписки на события

Рассмотрим вариант реализации, когда документ установки цен формируется сразу в момент проведения документа поставки или допрасходов.

Для этого создадим две подписки на события:

  1. Подписка на событие ОбработкаПроведения для документов ПоступлениеТоваровУслуг и ПоступлениеДопРасходов. В обработчике выполняем поиск существующего документа установки цен по реквизиту ДокументОснование. Если документ найден — перезаполняем его, если нет — создаем новый.
  2. Подписка на событие ОбработкаУдаленияПроведения — для автоматического распроведения подчиненного документа установки цен при отмене проведения накладной.

Посмотрим на пример кода формирования документа установки цен:


Процедура ПриПроведенииПоступления(Источник, Отказ, РежимПроведения) Экспорт
    
    Если Отказ Или Источник.ПометкаУдаления Тогда
        Возврат;
    КонецЕсли;
    
    // Поиск ранее созданного документа установки цен по основанию
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Ссылка
        |ИЗ
        |	Документ.УстановкаЦенНоменклатуры
        |ГДЕ
        |	ДокументОснование = &ДокументОснование
        |	И Проведен";
    
    Запрос.УстановитьПараметр("ДокументОснование", Источник.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
    Иначе
        ДокОбъект = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
        ДокОбъект.Дата = Источник.Дата;
        ДокОбъект.ДокументОснование = Источник.Ссылка;
    КонецЕсли;
    
    // Заполнение табличной части и расчет цен по настройкам
    // (базовая себестоимость + зависимые виды цен по формулам)
    ЗаполнитьЦеныПоПоступлению(ДокОбъект, Источник);
    
    Попытка
        ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        Отказ = Истина;
        ЗаписьЖурналаРегистрации("УстановкаЦенАвто", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка проведения установки цен: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Вариант 2. Асинхронная обработка через очередь и регламентное задание

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

  1. При проведении документов поступления или допрасходов в отдельный регистр сведений (например, ОчередьПересчетаЦен) записывается ссылка на проведенный документ.
  2. По расписанию (например, каждые 5–10 минут или раз в сутки ночью) запускается регламентное задание, которое считывает очередь, рассчитывает итоговые суммы с учетом распределения допрасходов и формирует документы УстановкаЦенНоменклатуры пакетом.
  3. Для исключения создания избыточных записей в регистре цен рекомендуется использовать механизм порога срабатывания: изменять цену только в том случае, если новая себестоимость отклоняется от действующей более чем на заданный процент (порог разбега цен).
← На главную