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