Почему не меняются суммы при изменении разрезов в запросе к виртуальной таблице «База» регистра расчета?

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

Работа с регистрами расчета в 1С — одна из самых сложных тем для разработчиков. Особенную трудность вызывает виртуальная таблица База, которая используется для получения сумм, накопленных за базовый период (например, расчет среднего заработка или премий от оклада). Часто возникают ситуации, когда при изменении параметров запроса (разрезов или условий) результат остается неизменным. Разберем детально, почему это происходит и как заставить виртуальную таблицу работать правильно.

Анализ исходного запроса

Рассмотрим типовой запрос, который часто вызывает вопросы у разработчиков при попытке детализировать данные. Проанализируем структуру обращения к виртуальной таблице БазаНачисленияРаботников:


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

В данном случае разработчик пытается изменить параметр &парамРазрезы, подставляя туда ДатаНачалаСобытия вместо ПериодРегистрации, или вовсе очищая его, но суммы в колонке РезультатБаза не меняются. Выясним причину такого поведения системы.

Как устроена виртуальная таблица «База»

Виртуальная таблица База не является простым хранилищем данных. Это результат сложного соединения (JOIN) основной таблицы регистра с базовыми таблицами этого же или других регистров. Чтобы понять, почему суммы не «разваливаются» по нужным нам полям, нужно рассмотреть назначение четырех параметров этой таблицы:

  1. Измерения основного регистра: Определяют, по каким полям текущей записи мы ищем соответствия (например, «Сотрудник»).
  2. Измерения базового регистра: Определяют поля, из которых берутся суммы (например, тот же «Сотрудник»).
  3. Разрезы: Самый важный параметр для нашего случая. Он определяет поля, в разрезе которых должна быть получена сумма базы.
  4. Условие: Фильтр, накладываемый на основные записи (те, для которых мы считаем базу).

Причина №1: Отсутствие признака «Базовое» в метаданных

Проанализируем параметр «Разрезы». Если мы указываем в нем поле ДатаНачалаСобытия, система должна разделить общую сумму базы на подсуммы, соответствующие каждой дате. Однако это произойдет только в том случае, если в конфигураторе для данного реквизита регистра расчета установлен флаг «Базовое».

Важный момент: Если поле не помечено как базовое в свойствах регистра, 1С просто игнорирует его использование в параметре «Разрезы». В результате запрос возвращает агрегированную сумму, как если бы параметр был пустым. Чтобы исправить это, необходимо зайти в свойства регистра расчета на вкладку «Данные», найти нужный реквизит (например, ДатаНачалаСобытия) и убедиться, что он входит в состав базовых полей.

Причина №2: Группировка по периоду регистрации

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

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

Причина №3: Ошибка в четвертом параметре (Условие)

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

Условие в 4-м параметре фильтрует записи, ДЛЯ которых мы рассчитываем базу, но не записи, ИЗ которых она состоит.

Если вы хотите изменить состав начислений, которые входят в «Заработок» (то есть то, что суммируется), вам нужно менять не запрос, а настройки Плана видов расчета. Именно там, на закладке «Расчет», определяется список «Ведущих» и «Базовых» видов расчета. Фильтр в запросе ВидРасчета В (&парамЗаработок) лишь говорит системе: «Найди мне базу только для этих конкретных строчек регистра».

Пошаговый алгоритм решения проблемы

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

  1. Проверьте свойства реквизита в конфигураторе. Убедитесь, что реквизиты, используемые в параметре &парамРазрезы, отмечены как Базовые. Без этого детализация невозможна.
  2. Проверьте заполнение базового периода. Посмотрите на записи в регистре через «Все функции» (Функции для технического специалиста). Если поля БазовыйПериодНачало и БазовыйПериодКонец не заполнены в регистраторе, виртуальная таблица не найдет никаких данных для суммирования.
  3. Сопоставьте измерения. Проверьте первый и второй параметры виртуальной таблицы. Обычно они должны быть идентичны (например, передаем массив, содержащий "Сотрудник", "Организация"). Если в основном регистре есть измерение «Сотрудник», а в базовом мы его не указали, система может выдать общую сумму по всем сотрудникам сразу.
  4. Используйте конструктор запроса. При работе с виртуальными таблицами лучше использовать конструктор, чтобы корректно заполнить параметры ИзмеренияОсновногоРегистра и ИзмеренияБазовогоРегистра в виде массивов или строк через запятую.

Рассмотрим пример правильного заполнения параметров, если нам нужна детализация по конкретному разрезу:


// Пример формирования параметров в коде 1С
ПараметрыИзмерений = "Сотрудник, Подразделение";
ПараметрыРазрезов = "ВидРасчета, ПериодРегистрации, ДатаНачалаСобытия"; // ДатаНачалаСобытия должна быть БАЗОВОЙ

Запрос.УстановитьПараметр("парамИзмерения", ПараметрыИзмерений);
Запрос.УстановитьПараметр("парамРазрезы", ПараметрыРазрезов);

Соблюдение этих правил позволит вам гибко управлять данными регистра расчета и получать точные суммы базы в любых необходимых аналитических разрезах.

← На главную