В современных торговых системах на базе 1С:Управление торговлей 11.5 менеджеры по продажам часто сталкиваются с необходимостью видеть актуальную наценку непосредственно в момент формирования заказа (удобно через аналитика цен и остатков в заказе клиента). Основная сложность заключается в том, что полноценная себестоимость в 1С формируется только после выполнения процедуры Закрытие месяца. Рассмотрим, как настроить систему и какие программные методы использовать, чтобы получать максимально приближенные к реальности данные в оперативном режиме.
Проанализируем типичный подход: создание запроса к виртуальной таблице оборотов регистра накопления СебестоимостьТоваров. На первый взгляд, это кажется логичным, но на практике мы сталкиваемся с рядом проблем:
Передача товаров между организациями себестоимость на организации-продавце будет отсутствовать или отображаться как отрицательный остаток, что искажает общую картину.Начиная с последних версий УТ 11, разработчики 1С добавили специализированный механизм кэширования себестоимости. Рассмотрим подробнее регистр сведений СтоимостьТоваров. Это «золотой ключик» для решения нашей задачи, позволяющий провести анализ списанной номенклатуры с выводом себестоимости и ценой продажи без закрытия месяца.
Преимущества этого регистра:
Выясним, как правильно обратиться к этим данным. Нам необходимо получить срез последних данных из этого регистра. Пример логики запроса:
ВЫБРАТЬ
СтоимостьТоваров.Стоимость КАК СтоимостьЕдиницы,
СтоимостьТоваров.СтоимостьБезНДС КАК СтоимостьБезНДС
ИЗ
РегистрСведений.СтоимостьТоваров.СрезПоследних(&Период, Номенклатура = &Номенклатура) КАК СтоимостьТоваров
Важно помнить, что данные в этом регистре появляются только после того, как регламентное задание Предварительное закрытие месяца успешно завершило расчет. Если данных нет, следует использовать «запасной» вариант — цену последней закупки.
Разберем ситуацию, когда себестоимость не рассчитывается из-за использования схемы Интеркампани. Если менеджер продает товар, принадлежащий другой организации внутри группы, предварительное закрытие месяца не сможет определить его стоимость, пока не будет зафиксирована передача.
Для решения этой проблемы выполним следующие шаги:
Таким образом, документы передачи будут создаваться оперативно в фоновом режиме. После их создания предварительное закрытие месяца (которое мы тоже запускаем по расписанию раз в 5–10 минут) сможет корректно «протащить» себестоимость от владельца к продавцу и учитывать дополнительные расходы с аналитикой по заказам/реализациям.
Посмотрим на механизм заданий к расчету — процесс ускоряет оперативный расчет себестоимости в УТ 11. В УТ 11 расчет ведется на основании регистра сведений ЗаданияКРасчетуСебестоимости. Если вы видите, что себестоимость не обновляется, проанализируйте состояние этого регистра. Если в нем скапливаются тысячи записей, значит, фоновое задание не успевает их обрабатывать.
Рекомендуем настроить Предварительное закрытие месяца со следующими параметрами:
Рассмотрим, как правильно интегрировать расчет наценки в форму ЗаказКлиента — задача решается через себестоимость и закупочные цены в заказе клиента. Вместо того чтобы вычислять всё в запросе при каждом изменении строки, создадим серверную функцию, которая будет возвращать структуру с данными о себестоимости.
Проанализируем пример кода для заполнения колонки «Наценка»:
&НаСервере
Процедура РассчитатьНаценкуНаСервере(СтрокаТовара)
// 1. Пытаемся получить данные из РС СтоимостьТоваров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтоимостьТоваров.Стоимость КАК Себестоимость
|ИЗ
| РегистрСведений.СтоимостьТоваров.СрезПоследних(&Период, Номенклатура = &Номенклатура) КАК СтоимостьТоваров";
Запрос.УстановитьПараметр("Номенклатура", СтрокаТовара.Номенклатура);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Себестоимость > 0 Тогда
ТекущаяСебестоимость = Выборка.Себестоимость;
Иначе
// 2. Если данных нет, берем цену последней закупки
ТекущаяСебестоимость = ЦенообразованиеВызовСервера.ПолучитьПоследнююЦенуЗакупки(СтрокаТовара.Номенклатура);
КонецЕсли;
Если ТекущаяСебестоимость > 0 Тогда
СтрокаТовара.Наценка = ((СтрокаТовара.Цена - ТекущаяСебестоимость) / ТекущаяСебестоимость) * 100;
Иначе
СтрокаТовара.Наценка = 0;
КонецЕсли;
КонецПроцедуры
Важный момент: Если ваша база имеет большой объем данных, выполнение запроса для каждой строки в цикле может замедлить работу. В таком случае лучше собрать все товары из табличной части в массив и получить все цены одним запросом во временную таблицу, а затем распределить их по строкам.
Подводя итог, отметим основные правила получения оперативной себестоимости в УТ 11.5:
Стоимость товаров — ваш основной источник данных.Следуя этим рекомендациям, вы сможете обеспечить менеджеров актуальной информацией о прибыльности сделок без существенного снижения производительности системы. Для этой задачи есть анализ прибыли и рентабельности без закрытия месяца.