Как решить проблему со смещением субконто в отчете по затратам для 1С:УПП

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

При разработке отчетов по затратам и анализу закупок услуг в конфигурации 1С:Управление производственным предприятием (УПП) разработчики часто сталкиваются с классической архитектурной особенностью регистра бухгалтерии — смещением позиций субконто на различных счетах дебета.

Например, на счете 20 Субконто1 может быть зарезервировано под «Номенклатурные группы», Субконто2 — под «Статьи затрат», а Субконто3 — под «Подразделения». В то же время на счете 26 или 44 порядок аналитик совершенно другой: Субконто1 — это «Статьи затрат», а Субконто2 — «Подразделения». Попытка построить прямой запрос к физической таблице или таблице движений и сгруппировать данные по полям СубконтоДт1 или СубконтоДт2 приводит к тому, что в одну колонку отчета попадают разнородные данные (и статьи затрат, и подразделения, и номенклатура).

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

Почему происходит смещение субконто и в чем ограничение таблицы ДвиженияССубконто

Физическая таблица проводок и виртуальная таблица РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто возвращают субконто в том порядке (индексах), в котором они физически привязаны к конкретному счету в плане счетов. Для платформы 1С:Предприятие поля СубконтоДт1, СубконтоДт2 и СубконтоДт3 — это лишь порядковые номера аналитик на счете, а не конкретные сущности.

Когда мы пытаемся выполнить группировку или наложить условия на эти поля напрямую, СУБД группирует их «как есть». В результате статья затрат «Аренда» со счета 26 (где она первая) и подразделение «Администрация» со счета 20 (где оно второе) не могут быть корректно выведены в иерархической структуре отчета.

Рассмотрим, какими способами можно обойти это ограничение платформы.

Решение 1. Использование параметров виртуальной таблицы оборотов (самый эффективный способ)

Если для вашего отчета не требуется выводить детальные записи вплоть до каждой отдельной строки документа (регистратора), а достаточно получить сводные данные по оборотам, лучшим решением будет использование виртуальных таблиц Хозрасчетный.Обороты или Хозрасчетный.ОборотыДтКт.

Главный секрет этого метода заключается в использовании параметра Субконто (или СубконтоДт / СубконтоКт). Если мы передадим в этот параметр строго определенный массив видов субконто, платформа автоматически «выровняет» их в результирующей выборке.

Разберем по шагам, как это реализовать:

  1. Создаем массив видов субконто в программном коде и передаем его в параметры запроса.
  2. В параметрах виртуальной таблицы указываем этот массив.
  3. В результате запроса поля СубконтоДт1 и СубконтоДт2 будут строго соответствовать переданному порядку видов субконто, независимо от их реального расположения на счетах дебета.

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


// В модуле отчета или обработки формируем массив нужных аналитик
МассивВидовСубконто = Новый Массив;
МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат);
МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Подразделения);

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВидыСубконтоДт", МассивВидовСубконто);
Запрос.УстановитьПараметр("НачалоПериода", ПериодНачало);
Запрос.УстановитьПараметр("КонецПериода", ПериодКонец);
Запрос.УстановитьПараметр("СчетЗатрат", ПланыСчетов.Хозрасчетный.ЗатратыНаПроизводство); // Группа счетов
Запрос.УстановитьПараметр("СчетКредита", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками); // 60.01

Запрос.Текст = 
"ВЫБРАТЬ
|	ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК СтатьяЗатрат,
|	ХозрасчетныйОборотыДтКт.СубконтоДт2 КАК Подразделение,
|	ХозрасчетныйОборотыДтКт.СчетДт КАК СчетЗатрат,
|	ХозрасчетныйОборотыДтКт.СуммаОборот КАК Сумма
|ИЗ
|	РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
|		&НачалоПериода,
|		&КонецПериода,
|		,
|		СчетДт В ИЕРАРХИИ(&СчетЗатрат),
|		&ВидыСубконтоДт,
|		СчетКт В ИЕРАРХИИ(&СчетКредита),
|		,
|		
|	) КАК ХозрасчетныйОборотыДтКт";

Преимущества этого подхода: высокая скорость выполнения запроса на уровне СУБД, отсутствие лишних логических условий и гарантированно правильное распределение аналитики по колонкам отчета.

Решение 2. Выравнивание субконто через ВЫБОР КОГДА на таблице движений

Что делать, если в отчете обязательно нужно показывать детальные записи: конкретные регистраторы, текстовые содержания проводок, номера строк и комментарии? В этом случае использовать таблицы оборотов не получится — придется обращаться к таблице ХозрасчетныйДвиженияССубконто.

Чтобы вытащить статью затрат в отдельное поле независимо от ее позиции, нам потребуется применить конструкцию ВЫБОР КОГДА совместно с оператором проверки типа ССЫЛКА.

Проанализируем пример такого запроса:


ВЫБРАТЬ
	ХозрасчетныйДвиженияССубконто.Регистратор КАК Документ,
	ХозрасчетныйДвиженияССубконто.Регистратор.Дата КАК ДатаДокумента,
	ХозрасчетныйДвиженияССубконто.СчетДт КАК СчетДт,
	
	// Проверяем по очереди все три субконто дебета на соответствие типу СтатьиЗатрат
	ВЫБОР
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт1 ССЫЛКА Справочник.СтатьиЗатрат
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт1
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт2 ССЫЛКА Справочник.СтатьиЗатрат
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт2
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт3 ССЫЛКА Справочник.СтатьиЗатрат
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт3
		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)
	КОНЕЦ КАК СтатьяЗатрат,

	// Аналогично выравниваем Подразделения
	ВЫБОР
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт1 ССЫЛКА Справочник.ПодразделенияОрганизаций
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт1
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт2 ССЫЛКА Справочник.ПодразделенияОрганизаций
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт2
		КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт3 ССЫЛКА Справочник.ПодразделенияОрганизаций
			ТОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт3
		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
	КОНЕЦ КАК ПодразделениеДт,

	ХозрасчетныйДвиженияССубконто.Сумма КАК Сумма
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&Дата1, &Дата2, , , ) КАК ХозрасчетныйДвиженияССубконто
ГДЕ
	ХозрасчетныйДвиженияССубконто.СчетДт В ИЕРАРХИИ(&Счет)
	И ХозрасчетныйДвиженияССубконто.СчетКт В ИЕРАРХИИ(&СчетКт)

Важное предупреждение по быстродействию: Использование оператора ССЫЛКА для нескольких полей субконто в больших базах данных может приводить к существенному замедлению работы отчета. СУБД вынуждена выполнять левые соединения (LEFT JOIN) со всеми таблицами справочников, типы которых могут храниться в субконто. Используйте этот метод только тогда, когда детальные записи действительно необходимы, и по возможности ограничивайте период выборки данных.

Решение 3. Переход на учетные механизмы РАУЗ (Расширенная аналитика учета затрат)

Если ваша база 1С:УПП работает в режиме РАУЗ (что является стандартом для абсолютного большинства производственных предприятий на этой конфигурации), то сбор аналитики по затратам через Регистр бухгалтерии является методологической ошибкой.

При включенном РАУЗ детальный аналитический учет на счетах регламентированного учета (20, 23, 25, 26, 44) в регистре бухгалтерии может просто не вестись в полном объеме или вестись упрощенно. Все данные по затратам с максимальной детализацией пишутся в специализированные регистры накопления.

Для регламентированного учета основным источником данных выступает регистр накопления УчетЗатратРегл. Вся сложная аналитика в нем хранится в виде связей через специальные справочники-ключи: КлючиАналитикиВидаУчета и КлючиАналитикиУчетаЗатрат.

Преимущество этого регистра в том, что все его измерения независимы. Статья затрат и подразделение лежат в строго определенных реквизитах ключей аналитики, и никакого "смещения" там нет по определению. Пример запроса для получения данных по затратам из РАУЗ:


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

Преимущества использования РАУЗ: скорость работы запросов возрастает в десятки раз по сравнению с регистром бухгалтерии. Данные получаются абсолютно точными, полностью соответствующими себестоимости и закрытию месяца. Кроме того, в типовой конфигурации УПП уже есть мощный отчет «Ведомость по учету затрат», в настройках которого можно вывести любую комбинацию аналитик без написания кода.

Решение 4. Использование регистра накопления «Закупки»

Поскольку первоначальная задача автора формулировалась как «анализ закупок услуг», стоит рассмотреть еще один альтернативный источник данных. Покупка любых услуг у сторонних контрагентов в УПП оформляется документом «Поступление товаров и услуг».

При проведении этого документа данные о закупках всегда попадают в регистр накопления Закупки. Если вам нужно анализировать именно объемы приобретенных услуг в разрезе поставщиков, договоров и самих услуг (номенклатуры), обращение к регистру бухгалтерии излишне усложняет задачу.

Достаточно построить простой и быстрый запрос к таблице Закупки.Обороты:


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

Этот способ позволяет избежать любых трудностей с планом счетов и субконто, обеспечивая при этом мгновенное формирование отчета даже на базах объемом в несколько терабайт.

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

Выбор оптимального метода зависит от конкретной задачи:

← На главную