Как настроить расчет трансфертной цены в 1С:ERP через произвольный запрос к базе данных?

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

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

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

Анализ механизмов Интеркампани и формирования себестоимости

Прежде чем переходить к написанию кода, проанализируем, как 1С:ERP хранит данные, необходимые для расчета трансфертной цены. Основная проблема часто заключается в том, что пользователь пытается получить данные из регистров, которые в конкретный момент времени пусты или не содержат итоговых сумм.

Для реализации схемы «Себестоимость + Процент наценки» нам могут понадобиться следующие источники данных:

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

Выясним причину, почему расчет может не срабатывать. Чаще всего это происходит из-за того, что в информационной базе еще не сформированы записи в регистре ВыручкаИСебестоимостьПродаж с заполненной колонкой себестоимости, либо не распределены запасы по организациям.

Разбор программного кода запроса для расчета цены

Рассмотрим пример сложного запроса, который позволяет собрать данные о потребностях в товарах и их текущей себестоимости. Этот запрос используется в настройке Вида цен с методом «Произвольный запрос к базе данных».

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сегменты.Номенклатура КАК Номенклатура,
    Сегменты.Характеристика КАК Характеристика,
    ИСТИНА КАК ИспользуетсяОтборПоСегментуНоменклатуры
ПОМЕСТИТЬ ОтборПоСегментуНоменклатуры
ИЗ
    РегистрСведений.НоменклатураСегмента КАК Сегменты
{ГДЕ
    Сегменты.Сегмент.* КАК СегментНоменклатуры,
    Сегменты.Номенклатура.* КАК Номенклатура,
    Сегменты.Характеристика.* КАК Характеристика}
 ИНДЕКСИРОВАТЬ ПО
    Сегменты.Номенклатура,
    Сегменты.Характеристика,
    ИспользуетсяОтборПоСегментуНоменклатуры
;

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


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

Ключевым этапом является соединение этих данных с фактической выручкой и себестоимостью. Обратите внимание на использование параметров &НачалоПериода и &КонецПериода. Если в системе не выполнено «Закрытие месяца», данные в ВыручкаИСебестоимостьПродаж могут не содержать суммовых оценок, что приведет к пустому результату расчета цены.

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


ВЫБРАТЬ
    1 КАК Коэффициент,
    Выручка.Номенклатура КАК Номенклатура,
    Выручка.Характеристика КАК Характеристика,
    ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК Упаковка,
    Константы.ВалютаУправленческогоУчета КАК Валюта,
    (ЕСТЬNULL(СтоимостьТоваровСрезПоследних.СтоимостьБезНДС, 0) 
    + ЕСТЬNULL(СтоимостьТоваровСрезПоследних.СтоимостьДопРасходыБезНДС, 0) 
    + ЕСТЬNULL(СтоимостьТоваровСрезПоследних.Трудозатраты, 0)) 
    * (100 + &Процент) / 100 КАК Цена
ИЗ
    Выручка КАК Выручка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтоимостьТоваров.СрезПоследних({(&ДатаДокумента)}) КАК СтоимостьТоваровСрезПоследних
ПО Выручка.ОрганизацияПродавец = СтоимостьТоваровСрезПоследних.Организация
    И Выручка.Номенклатура = СтоимостьТоваровСрезПоследних.АналитикаУчетаНоменклатуры.Номенклатура

Почему расчет цен может не работать: пошаговый чек-лист

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

  1. Оформление продажи: должен быть проведен документ Реализация товаров и услуг от имени организации-продавца, у которой фактически товара нет.
  2. Распределение запасов: необходимо убедиться, что запущено регламентное задание «Распределение запасов по организациям». Именно оно связывает продажу одной организации с остатками другой.
  3. Оформление передачи: должен быть создан (хотя бы в черновике) документ Передача товаров между организациями. Это можно сделать через помощник оформления передач в разделе «Финансовый результат и контроллинг».
  4. Расчет себестоимости: это самый важный момент. Если вы используете в запросе данные из регистра ВыручкаИСебестоимостьПродаж, то колонки стоимости заполнятся только после выполнения обработки «Закрытие месяца» (или хотя бы предварительного расчета себестоимости).

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

Оптимизация и рекомендации

Посмотрим на ситуацию с точки зрения производительности. Использование Регистратора в условиях соединения (как в примере запроса) может существенно замедлить работу системы при большом документообороте. Рекомендуем группировать данные по Номенклатуре, Характеристике и Организации без детализации до конкретного документа отгрузки, если бизнес-логика позволяет усреднять трансфертную цену за период.

Также проанализируем настройки НДС. Если в Виде цены установлен флаг «Цена включает НДС», убедитесь, что в формуле запроса вы складываете именно поля «С НДС» (например, Стоимость, ПостатейныеПостоянныеСНДС). В противном случае возникнет расхождение в суммах взаиморасчетов между компаниями группы.

Подведем итог: для корректного расчета трансфертной цены в 1С:ERP недостаточно просто написать SQL-запрос. Необходимо обеспечить наличие данных в регистрах путем правильной настройки цепочки Интеркампани и своевременного выполнения регламентных операций по расчету финансового результата.

← На главную