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