Как рассчитать среднюю стоимость номенклатуры в 1С:ТОИР, если в регистре «Товары на складах» нет ресурса «Сумма»?

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

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

В этой статье мы подробно разберем, почему разработчики решения ТОИР приняли такое архитектурное решение, какие грубые ошибки совершают программисты при попытке «добыть» сумму через документы поступления, и как правильно решить эту задачу с точки зрения методологии 1С.

Почему в регистре «Товары на складах» нет ресурса «Сумма»?

В типовых конфигурациях торгового и финансового контура (таких как 1С:ERP, 1С:КА или 1С:УТ) мы привыкли к тому, что партионный учет и расчет себестоимости выполняются в специализированных регистрах накопления. Однако автономная конфигурация 1С:ТОИР спроектирована иначе:

  1. Облегчение транзакционной нагрузки: ТОИР — это прежде всего EAM-система (Asset Management), предназначенная для управления ремонтами, надежностью и планирования материально-технического обеспечения (МТО). Полноценный расчет себестоимости по FIFO/LIFO или средней скользящей при каждой складской операции сильно утяжелил бы проведение документов.
  2. Разделение контуров учета: Оперативный складской учет ТМЦ в ТОИР ведется только в количественном выражении. Вся стоимостная оценка запчастей, материалов и инструментов опирается на механизм регистрации цен номенклатуры.

Рассмотрим подробнее, к каким ошибкам приводят попытки обойти эту архитектуру «в лоб», и проанализируем правильные варианты решения задачи.

---

Ошибочный путь: Соединение регистра накопления с документами поступления

Очень часто у разработчиков возникает соблазн написать запрос, который связывает движения регистра ТоварыНаСкладах с табличными частями документов ПоступлениеТоваровУслуг (или ПриобретениеТоваровУслуг), чтобы вытащить оттуда цену. Рассмотрим пример такого типичного, но крайне неэффективного запроса:


ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    СУММА(ТоварыНаСкладах.ВНаличии * ЕСТЬNULL(ВложенныйЗапрос.Цена, 0)) КАК Стоимость
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    ЛЕВОЕ СОЕДИНЕНИЕ (
        SELECT 
            ПоступлениеТовары.Номенклатура КАК Номенклатура,
            ПоступлениеТовары.Ссылка КАК Ссылка,
            СРЕДНЕЕ(ПоступлениеТовары.Цена) КАК Цена
        ИЗ
            Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТовары
        ГДЕ
            ПоступлениеТовары.Ссылка.Проведен = ИСТИНА
        СГРУППИРОВАТЬ ПО
            ПоступлениеТовары.Номенклатура,
            ПоступлениеТовары.Ссылка
    ) КАК ВложенныйЗапрос
    ПО ТоварыНаСкладах.Регистратор = ВложенныйЗапрос.Ссылка
    И ТоварыНаСкладах.Номенклатура = ВложенныйЗапрос.Номенклатура
СГРУППИРОВАТЬ ПО
    ТоварыНаСкладах.Номенклатура

Выясним, почему этот подход категорически не рекомендуется использовать в реальных задачах:

---

Решение №1: Использование штатного механизма цен 1С:ТОИР (для автономной работы)

Разберем, как спроектирована стоимостная оценка в самом ТОИР. Программа рассчитывает стоимость ТМЦ, перемножая физическое количество на зарегистрированную в системе цену.

Для этого в системе используется регистр сведений ЦеныНоменклатуры. Чтобы данный механизм работал корректно, необходимо настроить автоматическую регистрацию цен при проведении документов поступления. В настройках параметров системы задается тип цены для фактического расчета себестоимости ремонта.

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


ВЫБРАТЬ
    ОстаткиТоваров.Номенклатура КАК Номенклатура,
    ОстаткиТоваров.Склад КАК Склад,
    ОстаткиТоваров.КоличествоОстаток КАК Количество,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена,
    ОстаткиТоваров.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Стоимость
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ОстаткиТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
        &Период, 
        ВидЦены = &ВидЦеныСебестоимости
    ) КАК ЦеныНоменклатуры
    ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатуры.Номенклатура

Преимущества данного подхода:

  1. Запрос работает с виртуальными таблицами 1С, которые максимально оптимизированы СУБД для быстрого извлечения данных.
  2. Учитываются абсолютно все складские остатки, независимо от того, каким документом они были оприходованы.
  3. Метод полностью соответствует типовой методологии разработчиков конфигурации ТОИР.

---

Решение №2: Использование финансового контура (при интеграции с ERP / КА / УТ)

Если ваша конфигурация 1С:ТОИР работает не изолированно, а интегрирована в единую информационную систему предприятия на базе 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, ситуация в корне меняется.

В этом случае количественный учет и планирование ремонтов ведутся в ТОИР, а полноценный финансовый учет, партионный расчет и расчет себестоимости списания выполняются на стороне ERP. При проведении расчетов закрытия месяца ERP заполняет стоимостные показатели.

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


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

Важное примечание: Использовать данный регистр напрямую в базе ТОИР можно только в том случае, если включен полноценный обмен и данные регистра ПартииТоваровОрганизаций мигрируют в базу ТОИР. Если обмен настроен только на уровне документов, то стоимостную оценку следует производить исключительно на стороне ERP-системы, транслируя готовые результаты обратно в отчеты ТОИР.

---

Подведем итоги

Попытки «скрестить» количественный регистр ТоварыНаСкладах с табличными частями документов закупки — это тупиковый путь, который приводит к медленной работе программы и недостоверным данным в отчетах.

Для получения корректной стоимости ТМЦ в 1С:ТОИР всегда используйте один из двух подходов:

← На главную