Как эффективно отладить запрос к виртуальным таблицам регистра расчета в 1С?

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

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

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

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

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

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

Шаг 1. Перехват и отладка запроса из отладчика с помощью подсистемы "Инструменты разработчика" (ИР)

Запускать обычную консоль запросов и вручную заполнять сложные параметры (массивы строк, ссылки, списки значений) может быть трудоемко и приведет к ошибкам. Наиболее эффективный способ — использовать внешнюю подсистему Инструменты разработчика (ИР) авторства TLO.

Рассмотрим, как работает отладка запроса через ИР:

  1. Установим точку останова в коде программы непосредственно перед вызовом метода Запрос.Выполнить().
  2. В окне Табло или через меню Вычислить выражение (Ctrl + Shift + F9) вызовем экспортную функцию подсистемы ИР, передав в нее наш объект запроса: От(Запрос).
  3. Инструмент автоматически перехватит сформированный текст запроса, все установленные параметры (включая сложные массивы измерений и ссылки) и текущее состояние менеджера временных таблиц.
  4. Запрос откроется в интерактивной консоли запросов ИР. Здесь можно разобрать запрос в дерево и отдельно посмотреть результат выполнения каждой составляющей части ветки ОБЪЕДИНИТЬ ВСЕ.

Шаг 2. Пошаговая декомпозиция и локализация ошибки в запросе

Если подсистемы ИР нет под рукой, проанализируем проблему пошаговым упрощением кода в стандартной консоли запросов:

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


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

Убедимся, что реквизиты ПериодБазыНачало и ПериодБазыКонец заполнены и попадают на период, в котором у сотрудника были базовые начисления.

2. Разделение блоков объединения.
Исходный запрос объединяет результаты таблиц БазаОсновныеНачисления и БазаДополнительныеНачисления. Поочередно выполним каждую часть запроса отдельно, чтобы локализовать, какая именно из двух таблиц не возвращает строки.

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

Шаг 3. Корректная передача измерений и разрезов в параметры виртуальной таблицы

Рассмотрим пример правильного формирования запроса и передачи параметров измерений и разрезов через массивы строк, как это реализуется в типовых конфигурациях 1С:


// 1. Создаем массивы с именами измерений и разрезов
Измерения1 = Новый Массив;
Измерения1.Добавить("Подразделение");
Измерения1.Добавить("Сотрудник");

Разрезы = Новый Массив;
Разрезы.Добавить("СпособОтраженияВУчете");

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

Запрос = Новый Запрос(ТекстЗапроса);

// 3. Устанавливаем параметры запроса
Запрос.УстановитьПараметр("Измерения1", Измерения1);
Запрос.УстановитьПараметр("Разрезы", Разрезы);
Запрос.УстановитьПараметр("Командировка", ПланыВидовРасчета.ОсновныеНачисления.Командировка);
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
	// Обработка результатов
КонецЦикла;

Важное примечание: Обратите внимание на порядок параметров виртуальной таблицы базы:

  1. Первый параметр — ИзмеренияОсновногоРегистра (массив строк).
  2. Второй параметр — ИзмеренияБазовогоРегистра (массив строк).
  3. Третий параметр — Разрезы (массив строк).
  4. Четвертый параметр — Условие.

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

← На главную