В крупных холдинговых структурах, использующих механизм Интеркампани в 1С:ERP, часто возникает задача автоматизации расчета цен при передаче товаров между собственными организациями. Стандартных механизмов наценки на «базовый вид цен» не всегда достаточно, особенно когда требуется учитывать реальную себестоимость с учетом дополнительных расходов или специфических условий отгрузки. В таких случаях мы прибегаем к использованию Произвольного запроса к базе данных в настройках вида цен.
Рассмотрим ситуацию, когда при нажатии кнопки «Рассчитать по данным ИБ и формулам» система не выдает никаких результатов, хотя данные в базе визуально присутствуют. Разберем пошагово, как правильно составить запрос, какие регистры использовать и какие регламентные операции должны быть выполнены для корректного формирования трансфертных цен.
Прежде чем переходить к написанию кода, проанализируем, как 1С:ERP хранит данные, необходимые для расчета трансфертной цены. Основная проблема часто заключается в том, что пользователь пытается получить данные из регистров, которые в конкретный момент времени пусты или не содержат итоговых сумм.
Для реализации схемы «Себестоимость + Процент наценки» нам могут понадобиться следующие источники данных:
ВыручкаИСебестоимостьПродаж: содержит информацию о продажах сторонним клиентам, которые инициируют потребность в интеркампани-передаче.РезервыТоваровОрганизаций: в нем фиксируются «потребности» в передаче товаров, когда одна организация продает товар, фактически принадлежащий другой.СтоимостьТоваров: хранит предварительно рассчитанную стоимость (себестоимость) товаров на складах.СебестоимостьТоваров: основной регистр, данные в котором появляются только после выполнения регламентной операции «Расчет себестоимости».Выясним причину, почему расчет может не срабатывать. Чаще всего это происходит из-за того, что в информационной базе еще не сформированы записи в регистре ВыручкаИСебестоимостьПродаж с заполненной колонкой себестоимости, либо не распределены запасы по организациям.
Рассмотрим пример сложного запроса, который позволяет собрать данные о потребностях в товарах и их текущей себестоимости. Этот запрос используется в настройке Вида цен с методом «Произвольный запрос к базе данных».
Сначала мы формируем временную таблицу сегментов номенклатуры, чтобы учитывать только нужные нам позиции:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Сегменты.Номенклатура КАК Номенклатура,
Сегменты.Характеристика КАК Характеристика,
ИСТИНА КАК ИспользуетсяОтборПоСегментуНоменклатуры
ПОМЕСТИТЬ ОтборПоСегментуНоменклатуры
ИЗ
РегистрСведений.НоменклатураСегмента КАК Сегменты
{ГДЕ
Сегменты.Сегмент.* КАК СегментНоменклатуры,
Сегменты.Номенклатура.* КАК Номенклатура,
Сегменты.Характеристика.* КАК Характеристика}
ИНДЕКСИРОВАТЬ ПО
Сегменты.Номенклатура,
Сегменты.Характеристика,
ИспользуетсяОтборПоСегментуНоменклатуры
;
Далее проанализируем ситуацию с резервами. Важно понимать, что регистр РезервыТоваровОрганизаций является оперативным. Мы собираем из него данные о приходах (потребностях), возникших в рамках интеркампани за выбранный период:
ВЫБРАТЬ
Резервы.Регистратор КАК Регистратор,
Резервы.Организация КАК ОрганизацияВладелец,
Резервы.КорОрганизация КАК ОрганизацияПродавец,
Резервы.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
Резервы.АналитикаУчетаНоменклатуры.Характеристика КАК Характеристика,
Резервы.АналитикаУчетаНоменклатуры.МестоХранения КАК Склад,
СУММА(Резервы.Количество) КАК Количество
ПОМЕСТИТЬ РезервыЗаПериод
ИЗ
РегистрНакопления.РезервыТоваровОрганизаций КАК Резервы
ГДЕ
Резервы.Количество > 0
И Резервы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
И Резервы.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Резервы.Регистратор,
Резервы.Организация,
Резервы.КорОрганизация,
Резервы.АналитикаУчетаНоменклатуры.Номенклатура,
Резервы.АналитикаУчетаНоменклатуры.Характеристика,
Резервы.АналитикаУчетаНоменклатуры.МестоХранения
;
Ключевым этапом является соединение этих данных с фактической выручкой и себестоимостью. Обратите внимание на использование параметров &НачалоПериода и &КонецПериода. Если в системе не выполнено «Закрытие месяца», данные в ВыручкаИСебестоимостьПродаж могут не содержать суммовых оценок, что приведет к пустому результату расчета цены.
В финальной части запроса мы рассчитываем цену как сумму различных составляющих себестоимости (стоимость без НДС, доп. расходы, трудозатраты, постатейные расходы) и умножаем на коэффициент наценки:
ВЫБРАТЬ
1 КАК Коэффициент,
Выручка.Номенклатура КАК Номенклатура,
Выручка.Характеристика КАК Характеристика,
ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК Упаковка,
Константы.ВалютаУправленческогоУчета КАК Валюта,
(ЕСТЬNULL(СтоимостьТоваровСрезПоследних.СтоимостьБезНДС, 0)
+ ЕСТЬNULL(СтоимостьТоваровСрезПоследних.СтоимостьДопРасходыБезНДС, 0)
+ ЕСТЬNULL(СтоимостьТоваровСрезПоследних.Трудозатраты, 0))
* (100 + &Процент) / 100 КАК Цена
ИЗ
Выручка КАК Выручка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтоимостьТоваров.СрезПоследних({(&ДатаДокумента)}) КАК СтоимостьТоваровСрезПоследних
ПО Выручка.ОрганизацияПродавец = СтоимостьТоваровСрезПоследних.Организация
И Выручка.Номенклатура = СтоимостьТоваровСрезПоследних.АналитикаУчетаНоменклатуры.Номенклатура
Если запрос написан верно, но кнопка расчета не дает результата, проанализируем последовательность действий в программе. Для того чтобы данные «проросли» в регистры, необходимо соблюсти следующий порядок:
Реализация товаров и услуг от имени организации-продавца, у которой фактически товара нет.Передача товаров между организациями. Это можно сделать через помощник оформления передач в разделе «Финансовый результат и контроллинг».ВыручкаИСебестоимостьПродаж, то колонки стоимости заполнятся только после выполнения обработки «Закрытие месяца» (или хотя бы предварительного расчета себестоимости).Важный нюанс: при работе с регистром СтоимостьТоваров (срез последних) помните, что данные в нем обновляются также после расчета себестоимости. Если вы только что ввели документы и не запустили расчет, срез последних вернет данные за прошлый период или не вернет их вовсе для новых позиций.
Посмотрим на ситуацию с точки зрения производительности. Использование Регистратора в условиях соединения (как в примере запроса) может существенно замедлить работу системы при большом документообороте. Рекомендуем группировать данные по Номенклатуре, Характеристике и Организации без детализации до конкретного документа отгрузки, если бизнес-логика позволяет усреднять трансфертную цену за период.
Также проанализируем настройки НДС. Если в Виде цены установлен флаг «Цена включает НДС», убедитесь, что в формуле запроса вы складываете именно поля «С НДС» (например, Стоимость, ПостатейныеПостоянныеСНДС). В противном случае возникнет расхождение в суммах взаиморасчетов между компаниями группы.
Подведем итог: для корректного расчета трансфертной цены в 1С:ERP недостаточно просто написать SQL-запрос. Необходимо обеспечить наличие данных в регистрах путем правильной настройки цепочки Интеркампани и своевременного выполнения регламентных операций по расчету финансового результата.