Как программно получить себестоимость номенклатуры в 1С:ERP?

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

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

Особенности архитектуры себестоимости в 1С:ERP

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

  1. Способ оценки стоимости: Если в учетной политике установлено «Средняя за месяц», то точная цена единицы товара будет известна только после того, как система учтет все поступления и все расходы за календарный месяц.
  2. Дополнительные расходы: Услуги по доставке, хранению или таможенные пошлины могут быть распределены на себестоимость товаров значительно позже самого факта поступления товаров.
  3. Партионный учет: При использовании FIFO стоимость списания зависит от того, из какой именно партии (документа поступления) был взят товар.

Регистр сведений «Стоимость товаров» — самый быстрый путь

Рассмотрим подробнее РегистрСведений.СтоимостьТоваров. Это вспомогательный регистр, который специально предназначен для того, чтобы быстро получать рассчитанную стоимость единицы товара без выполнения сложных запросов к регистрам накопления. Данные в него попадают после выполнения регламентной операции «Расчет себестоимости».

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

Недостатки: если расчет за месяц не производился, данных в регистре не будет или они будут неактуальными. Также он не является периодическим в привычном понимании 1С, так как хранит срез данных по итогам расчетов.

Регистр накопления «Себестоимость товаров»

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

Разберем, как построить запрос к этому регистру. Важно помнить, что в ERP 2.5 данные разделены на суммы с НДС и без НДС. Посмотрим на пример структуры запроса:


ВЫБРАТЬ
    СебестоимостьТоваровОстатки.КоличествоОстаток КАК Кол,
    СебестоимостьТоваровОстатки.СтоимостьОстаток КАК СуммаБезНДС,
    СебестоимостьТоваровОстатки.СтоимостьСНДСОстаток КАК СуммаСНДС
ИЗ
    РегистрНакопления.СебестоимостьТоваров.Остатки(&ДатаОстатков, 
        Организация = &Организация 
        И Номенклатура = &Номенклатура) КАК СебестоимостьТоваровОстатки

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

Программные модули: СебестоимостьТоваровСервер

В типовом решении 1С:ERP реализован мощный программный интерфейс для работы с расчетами. Если вам необходимо получить данные так, как это делает сама система в отчетах (например, в отчете «Себестоимость товаров организации»), обратите внимание на общий модуль СебестоимостьТоваровСервер. Хотя в нем нет функции типа ПолучитьЧисло(), в нем реализованы методы для подготовки временных таблиц с данными о стоимости.

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

Использование «Предварительного расчета»

Если ваша задача — вывести примерную себестоимость в печатную форму или отчет в середине месяца, необходимо понимать разницу между типами расчета:

Для программного доступа к этим данным лучше всего использовать методы менеджера регистра РегистрНакопления.СебестоимостьТоваров, предварительно убедившись, что в системе настроено расписание для фонового расчета себестоимости.

Практические рекомендации по реализации

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

  1. Проверить наличие данных в РегистреСведений.СтоимостьТоваров за последний закрытый период. Это даст максимально точную «историческую» себестоимость.
  2. Если нужны оперативные данные, выполнить запрос к остаткам РегистраНакопления.СебестоимостьТоваров.
  3. Если в учетной политике используется FIFO, анализируйте данные в разрезе партий через регистр ПартииТоваровОрганизаций.
  4. Всегда уточняйте у бизнес-заказчика, какая сумма требуется: с НДС или без НДС, так как это принципиально разные показатели в ERP.

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

← На главную