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