Почему запрос к виртуальной таблице остатков регистра бухгалтерии возвращает пустой результат

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

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

Анализ проблемы: исходный некорректный запрос

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


ВЫБРАТЬ
    УчетЗаймовОстатки.Сотрудник,
    УчетЗаймовОстатки.ПланируемаяДатаВозвращения,
    УчетЗаймовОстатки.СуммаЗаймаОстатокДт КАК Сумма
ИЗ
    РегистрБухгалтерии.УчетЗаймов.Остатки(&ДатаДокумента, , ) КАК УчетЗаймовОстатки

На первый взгляд синтаксических ошибок нет: имя регистра верное, дата передана, поля выбраны. Однако при выполнении этот запрос не возвращает ожидаемых строк либо колонка Сумма содержит 0. Проанализируем внутреннее устройство регистра бухгалтерии, чтобы понять, почему так происходит.

Причина 1. Особенности расчета полей ОстатокДт и ОстатокКт

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

Рассмотрим подробнее механизм вычисления полей ОстатокДт и ОстатокКт:

  1. Дебетовое и кредитовое сальдо рассчитываются платформой исключительно с учетом признака активности счета (Активный, Пассивный, Активно-Пассивный).
  2. Для активного счета поле ОстатокДт равно сумме остатка, а ОстатокКт всегда равен 0.
  3. Для пассивного счета ОстатокДт всегда равен 0, а ОстатокКт принимает положительное значение кредитового остатка.
  4. Если в параметрах виртуальной таблицы не передан фильтр по конкретному счету и само поле Счет не включено в список выборки ВЫБРАТЬ, платформа выполняет группировку итогов без привязки к плану счетов. В этом случае определить активность счета и правильно разнести сальдо на дебет или кредит становится невозможно, поэтому дебетовые остатки обнуляются.

Причина 2. Сворачивание балансовых измерений

В регистрах бухгалтерии действует принцип двойной записи. Если измерение (например, Сотрудник) имеет признак «Балансовый» = Истина, платформа контролирует равенство дебетовых и кредитовых оборотов в разрезе этого измерения.

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

Решение: правильная фильтрация по счету

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


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

При передаче условия Счет = &ВыданныеЗаймы платформа однозначно определяет признак активности счета (в данном случае активный счет выданных займов) и корректно рассчитывает дебетовое сальдо в поле СуммаЗаймаОстатокДт.

Важные правила работы с виртуальной таблицей остатков

Разберем дополнительные требования, несоблюдение которых часто приводит к логическим ошибкам и снижению баллов на экзаменах «1С:Специалист»:

  1. Параметры таблицы против секции ГДЕ: условие по счету следует указывать именно во втором параметре виртуальной таблицы (Счет = &ВыданныеЗаймы), а не в блоке ГДЕ. Фильтрация через блок ГДЕ заставляет СУБД сначала рассчитать и сгруппировать все остатки по регистру, а затем отсечь лишние, что создает колоссальную нагрузку. Условие в параметрах транслируется непосредственно в SQL-запрос к таблице итогов.
  2. Точка расчета остатков: передача примитивной даты в первый параметр (&ДатаДокумента) приводит к получению остатков строго на начало указанной секунды. При проведении документов необходимо передавать объект МоментВремени() или использовать объект Новый Граница(МоментВремени(), ВидГраницы.Исключая), чтобы не захватывать движения самого проводимого документа.
  3. Субконто и измерения: если учет ведется не по отдельным балансовым измерениям регистра, а через субконто счета, соответствующие поля не появятся в выборке, пока в третий параметр виртуальной таблицы не будет передан список нужных видов субконто из плана видов характеристик.
  4. Управляемые блокировки: перед выполнением запроса на получение остатков в транзакции проведения документа обязательно следует устанавливать исключительную управляемую блокировку с помощью объекта БлокировкаДанных по пространству регистра бухгалтерии с фильтром по счету и ключевым аналитикам.
← На главную