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