Как получить статью затрат из бухгалтерских проводок в запросе 1С

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

При разработке отчетов или обработок в 1С часто возникает задача получить детальную аналитику из бухгалтерского регистра Хозрасчетный. Одной из самых распространенных проблем является извлечение статьи расходов (статьи затрат) в связке со списываемой номенклатурой. Трудность заключается в том, что на разных счетах бухгалтерского учета (например, 20, 25, 26 или 44) статьи затрат могут находиться на разных позициях: где-то это Субконто1, а где-то — Субконто2.

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

Анализ проблемы обращения к СубконтоДт1/СубконтоДт2

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

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

Использование физических таблиц субконто

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

Разберем алгоритм решения по шагам:

  1. Выберем данные из таблицы субконто для дебета (где обычно фиксируются затраты).
  2. Выберем данные из таблицы субконто для кредита (где обычно находится списываемая номенклатура).
  3. Соединим эти данные по регистратору и номеру строки.
  4. Отфильтруем записи по конкретным видам субконто, используя системные значения ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.

Посмотрим на пример реализации такого запроса с использованием временных таблиц:


ВЫБРАТЬ
    СубконтоДт.Регистратор КАК Регистратор,
    СубконтоКт.Значение КАК Номенклатура,
    СубконтоДт.НомерСтроки КАК НомерСтроки,
    СубконтоДт.Значение КАК СтатьяЗатрат
ПОМЕСТИТЬ ВТ_ОборотыАналитика
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Субконто КАК СубконтоДт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Субконто КАК СубконтоКт
        ПО СубконтоДт.Регистратор = СубконтоКт.Регистратор
            И СубконтоДт.НомерСтроки = СубконтоКт.НомерСтроки
ГДЕ
    СубконтоДт.Регистратор = &Документ
    И СубконтоДт.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет)
    И СубконтоКт.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Кредит)
    И СубконтоДт.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат)
    И СубконтоКт.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура)

ИНДЕКСИРОВАТЬ ПО
    Регистратор,
    НомерСтроки
;

В данном фрагменте мы четко определяем, что нам нужно значение субконто с видом СтатьиЗатрат по дебету и Номенклатура по кредиту. Это делает запрос независимым от порядка аналитик на счете.

Оптимизация и получение дополнительных реквизитов

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

Выясним причину важности ВЫРАЗИТЬ: поле Значение в таблице субконто — это ЛюбаяСсылка. Если мы напишем СубконтоКт.Значение.ЕдиницаИзмерения, СУБД создаст огромный LEFT JOIN ко всем справочникам системы. Чтобы этого избежать, мы "подсказываем" системе конкретный тип.

Рассмотрим итоговый запрос:


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

Альтернативный подход: Виртуальная таблица ОборотыДтКт

Хотя работа с физическими таблицами надежна, 1С предоставляет специализированный инструмент для анализа корреспонденций — виртуальную таблицу ОборотыДтКт. Проанализируем, как она может упростить задачу.

В параметрах этой таблицы можно передать массив видов субконто. Если мы передадим виды субконто СтатьиЗатрат и Номенклатура, система сама подготовит колонки, к которым можно будет обращаться более удобно. Однако стоит помнить, что ОборотыДтКт лучше подходит для итоговых данных за период, а для анализа движений конкретного документа (регистратора) физические таблицы часто отрабатывают быстрее и точнее, особенно если нужно видеть каждую строку проводки.

Важные замечания по видам учета

Работая с регистром Хозрасчетный, всегда учитывайте следующие моменты:

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

← На главную