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

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

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

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

Исходный запрос к регистру расчета с базой

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


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

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

---

Анализ причин и пошаговое руководство по устранению ошибки

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

Шаг 1. Проверка фактических записей в физической таблице регистра

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

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


// Временный тестовый запрос без жесткого отбора по виду расчета
РегистрРасчета.НачисленияРаботников.БазаНачисленияРаботников(
    &парамИзмерения,
    &парамИзмерения,
    &парамРазрезы,
    Регистратор = &парамРегистратор)

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

Шаг 2. Анализ кода проведения документа-регистратора

Перейдите в модуль объекта документа, который формирует движения по регистру расчета. Проверьте обработку заполнения движений. Скорее всего, там жестко прописан конкретный вид расчета вместо динамической подстановки из табличной части документа. Найдите фрагмент кода, отвечающий за запись движений:


// Ошибочный вариант: жестко закодирован конкретный вид расчета
Движение = Движения.НачисленияРаботников.Добавить();
Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.БольничныйЛист; 
Движение.ПериодРегистрации = ПериодРегистрации;
// ... заполнение остальных реквизитов

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


// Правильный вариант: динамическое заполнение из данных строки документа
Для Каждого СтрокаТЧ Из Начисления Цикл
    Движение = Движения.НачисленияРаботников.Добавить();
    Движение.ВидРасчета = СтрокаТЧ.ВидРасчета; // Динамическая подстановка
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = СтрокаТЧ.Сотрудник;
    Движение.БазовыйПериодНачало = СтрокаТЧ.БазовыйПериодНачало;
    Движение.БазовыйПериодКонец = СтрокаТЧ.БазовыйПериодКонец;
КонецЦикла;

Шаг 3. Проверка связей в Плане видов расчета (ПВР)

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

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

Шаг 4. Контроль заполнения базового периода

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

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

---

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

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

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

← На главную