При разработке отчетов в системе 1С:Предприятие часто возникает задача получить данные об остатках и движениях по бухгалтерскому счету с детализацией по аналитике. Типичный пример: необходимо вывести список контрагентов, их долг на начало периода и оборот за период по определенному счету (например, по забалансовому счету 012.02). Нередко начинающие разработчики сталкиваются с ситуацией, когда вместо подробного списка запрос возвращает одну строку с общим итогом или вовсе пустые значения.
В этой статье мы подробно разберем, как правильно построить запрос к регистру бухгалтерии, как использовать виртуальные таблицы и избежать ошибок с группировкой по субконто.
Допустим, нам необходимо получить данные из регистра бухгалтерии Хозрасчетный по счету 012.02. Нас интересуют следующие колонки:
Если мы просто выберем ресурсы таблицы без правильного указания измерений (субконто), система свернет результат в одну общую запись. Давайте разберем, как это исправить и настроить запрос корректно.
Для решения задач, где одновременно требуются и остатки на начало/конец, и обороты за период, наиболее эффективно использовать виртуальную таблицу РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты. Эта таблица оптимизирована платформой и позволяет получить все необходимые данные в одном простом запросе, избегая сложных соединений физических таблиц.
При работе с этой таблицей важно правильно заполнить её параметры. Рассмотрим их подробнее:
Период или Авто.Счет = &Счет.Именно в параметре Субконто часто кроется причина ошибок. Если вы хотите получить данные в разрезе контрагентов, настоятельно рекомендуется передать в этот параметр массив видов субконто (например, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты). Это явно укажет системе, что под Субконто1 мы подразумеваем именно контрагента, даже если на счете настроено несколько видов аналитики.
Ситуация, когда запрос выводит "большой общий итог" вместо списка, обычно вызвана одной из двух причин:
1. Отсутствие группировки в выборке полей
В языке запросов 1С, если вы выбираете агрегатные поля (ресурсы), такие как СуммаНачальныйОстатокДт или СуммаОборотДт, но не выбираете ни одного поля измерения (разреза), система считает, что вы хотите получить итог по всей таблице. Чтобы получить разбивку, необходимо обязательно добавить в поля выборки поле Субконто1 (или Субконто2, в зависимости от настроек счета).
2. Ошибка в выборе номера Субконто
Это наиболее частая ошибка, которая обсуждалась в исходной теме. На бухгалтерских счетах аналитика хранится в полях Субконто1, Субконто2, Субконто3. Порядок этих субконто зависит от настройки Плана счетов в режиме "1С:Предприятие".
Представим, что на счете 012.02 настроена следующая аналитика:
Если в конструкторе запроса вы выберете поле Субконто1, полагая, что это Контрагент, вы получите группировку по Номенклатуре. Если при этом вы пытаетесь вывести представление контрагента, данные могут вообще не отобразиться или свернуться некорректно.
Давайте составим корректный запрос. Мы будем использовать виртуальную таблицу, укажем счет и выберем правильные поля. Предположим, что Контрагенты — это первое субконто на счете (или мы явно задали это в параметрах виртуальной таблицы).
ВЫБРАТЬ
БухОстаткиИОбороты.Субконто1 КАК Контрагент,
БухОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СальдоНаНачало,
БухОстаткиИОбороты.СуммаОборотДт КАК ОборотДт,
БухОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СальдоНаКонец
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
&НачПериода,
&КонПериода,
,
,
Счет = &Счет,
&ВидыСубконто,
) КАК БухОстаткиИОбороты
УПОРЯДОЧИТЬ ПО
Контрагент.Наименование
Обратите внимание на параметр &ВидыСубконто. В коде модуля, перед выполнением запроса, этот параметр следует заполнить:
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("012.02"));
Такой подход гарантирует, что в поле Субконто1 всегда будет именно Контрагент, независимо от того, каким по порядку он стоит в настройках счета в пользовательском режиме. Платформа сама сопоставит требуемый вид субконто с нужным полем таблицы.
В вопросе упоминался счет 012.02. Это забалансовый счет, используемый часто для учета ТМЦ, переданных в переработку или находящихся на ответственном хранении. Важной особенностью таких счетов является то, что у них часто отсутствует признак двойной записи в классическом понимании (актив/пассив сходится в балансе), но в регистре 1С записи по ним все равно имеют измерения Дебет и Кредит.
Поскольку счет 012 обычно является активным, остатки по нему всегда находятся в Дебете. Поэтому в запросе мы выбираем:
СуммаНачальныйОстатокДт — то, что было у нас (или у контрагента) на начало.СуммаОборотДт — поступление новых ценностей (увеличение долга/ответственности).СуммаОборотКт — списание ценностей (уменьшение долга).Если вы случайно выберете просто СуммаНачальныйОстаток (без Дт или Кт), для активного счета система вернет положительное число (дебетовый остаток), а для пассивного — тоже положительное (кредитовый остаток). Однако, чтобы избежать путаницы, лучше всегда явно указывать сторону счета (Дт), если вы точно знаете природу счета.
Виртуальная таблица ОстаткиИОбороты хороша тем, что она показывает записи, если за период был хотя бы остаток или хотя бы оборот. Однако, если у конкретного контрагента был остаток, но не было оборота, поле СуммаОборотДт вернет NULL (в зависимости от версии платформы и способа обращения может быть 0, но чаще NULL при соединениях). Для надежности рекомендуется использовать функцию ЕСТЬNULL в полях выборки, чтобы в отчете выводились красивые нули вместо пустоты.
Улучшенный вариант полей запроса:
ВЫБРАТЬ
БухОстаткиИОбороты.Субконто1 КАК Контрагент,
ЕСТЬNULL(БухОстаткиИОбороты.СуммаНачальныйОстатокДт, 0) КАК СальдоНаНачало,
ЕСТЬNULL(БухОстаткиИОбороты.СуммаОборотДт, 0) КАК ОборотДт
...
Если после выполнения запроса цифры вам кажутся подозрительными, самый простой способ проверки — сформировать стандартный отчет "Оборотно-сальдовая ведомость по счету" (ОСВ по счету) за тот же период.
Сравните итоги и построчные записи. Если в ОСВ данные разбиты по контрагентам корректно, а в вашем запросе — нет, значит, проблема стопроцентно в параметре Субконто вашего запроса. Вернитесь в конструктор запроса и убедитесь, что вы выбрали правильное поле (Субконто1, Субконто2 и т.д.) или, что еще лучше, задали вид субконто через параметры виртуальной таблицы. Для интерактивной проверки и отладки запроса с параметрами можно использовать консоль запросов для 1С с поддержкой управляемых форм.
Чтобы вывести сальдо и обороты в разрезе контрагентов и избежать "одной общей строки":
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты.СуммаНачальныйОстатокДт) для однозначности данных.