Как правильно составить запрос к остаткам регистра бухгалтерии и свернуть данные по подразделениям в 1С

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

При разработке отчетов и обработок в 1С часто возникает задача получить актуальные остатки по взаиморасчетам с контрагентами на активно-пассивных счетах (например, на счете 76 «Расчеты с разными дебиторами и кредиторами»). Однако при обращении к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки разработчики нередко сталкиваются с ситуацией, когда запрос возвращает пустой результат или задваивает строки из-за разницы в разрезах учета. Разберем по шагам, как правильно конструировать такой запрос, на что обращать внимание при передаче параметров и как свернуть остатки по подразделениям.

Анализ типовых ошибок при обращении к виртуальной таблице остатков

Рассмотрим типовой пример запроса, с которого часто начинаются проблемы:


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

Проанализируем ключевые моменты, из-за которых данный запрос может возвращать некорректный результат или не возвращать строк вовсе:

  1. Жесткая привязка к Субконто1: На разных субсчетах счета 76 (например, 76.01, 76.05, 76.09, 76.НА) состав и порядок видов субконто могут существенно различаться. Если на субсчете первым субконто выступает не Контрагенты, а Договоры или Номенклатура, условие Субконто1 = &Контрагент отсечет все нужные движения.
  2. Специфика передачи периода: Если в параметр &Период передается обычная дата без включения границы (например, конец дня как дата), движения, записанные ровно на эту же секунду, не попадут в выборку.
  3. Фактическое сальдо перекрыто документами: При анализе данных важно сверять результат запроса со стандартным отчетом Оборотно-сальдовая ведомость по счету. Если в базе была проведена ручная операция или документ взаимозачета, нулевой остаток является корректным поведением системы.

Правильная работа с видами субконто в параметрах виртуальной таблицы

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

Когда мы передаем массив или фиксированный список видов субконто в третий параметр, платформа автоматически формирует виртуальные поля Субконто1, Субконто2 в соответствии с переданным списком, а не их порядком на конкретном субсчете плана счетов.

Посмотрим на пример правильного формирования запроса:


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

Разберем установку параметров в программном коде на встроенном языке:


Запрос = Новый Запрос;
Запрос.Текст = "..."; // Текст запроса выше

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

Запрос.УстановитьПараметр("ВидыСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСРазнымиДебиторамиИКредиторами);
Запрос.УстановитьПараметр("Организация", ВыбОрганизация);
Запрос.УстановитьПараметр("Контрагент", ВыбКонтрагент);

// Корректная установка границы периода
Если ЗначениеЗаполнено(ВыбДата) Тогда
    ГраницаПериода = Новый Граница(КонецДня(ВыбДата), ВидГраницы.ВключаяГраницу);
    Запрос.УстановитьПараметр("Период", ГраницаПериода); Иначе
    // Если дата не указана, передаем Неопределено для быстрого получения текущих итогов
    Запрос.УстановитьПараметр("Период", Неопределено);
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();

Как свернуть остатки по подразделениям

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

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

Если измерение регистра не указано в секции ВЫБРАТЬ и не используется в секциях группировки, платформа автоматически агрегирует (схлопывает) числовые ресурсы по всем значениям этого измерения.

Посмотрим на практические шаги для объединения данных:

  1. Полностью исключите поле ХозрасчетныйОстатки.Подразделение из списка выбираемых полей (ВЫБРАТЬ).
  2. Если в запросе использовались секции ИТОГИ или СГРУППИРОВАТЬ ПО, удалите поле Подразделение из списков группировочных полей.
  3. Убедитесь, что в условиях виртуальной таблицы (четвертый параметр) нет фильтрации по конкретному подразделению, если требуется получить общий итог по всей организации.

В результате СУБД выполнит агрегацию на уровне итоговых таблиц базы данных и вернет свернутую сумму по контрагенту и договору, полностью нивелировав расхождения между подразделениями.

Рекомендация по исправлению «зависших» остатков по подразделениям в учете

Если взаимозачет или закрытие расчетов прошли по разным подразделениям в закрытом периоде, открывать и перепроводить прошлые периоды категорически не рекомендуется. Для выравнивания аналитики в учете выполняют следующую последовательность действий:

  1. В текущем открытом периоде создают документ Операция, введенная вручную или Корректировка долга.
  2. Формируют внутреннюю проводку переноса остатка:
    Дт 76 (Подразделение-приемник, Контрагент, Договор) — Кт 76 (Подразделение-источник, Контрагент, Договор).
  3. После проведения такой операции оборотно-сальдовая ведомость с детализацией по подразделениям перестанет показывать встречные несвернутые остатки, а финансовый результат прошлых периодов останется неизменным.
← На главную