При разработке отчетов и печатных форм в среде 1С программисты часто сталкиваются с ситуациями, когда запрос отказывается принимать параметры или возвращает пустой результат. В данной статье мы подробно разберем, почему возникает ошибка при обращении к перечислениям через ЗНАЧЕНИЕ, а также проанализируем процесс вывода сложных запросов с итогами в табличный документ на примере формы Т-11а.
Рассмотрим распространенную ситуацию: при написании условия в запросе разработчик пытается обратиться к конкретному значению перечисления. Ошибка «Неверные параметры» часто возникает из-за несоблюдения строгого синтаксиса платформы. Проанализируем пример некорректного кода:
ГДЕ ГруппаНачисленияУдержанияВыплаты = ЗНАЧЕНИЕ(Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено)
Причина ошибки кроется в использовании множественного числа. В языке запросов 1С при использовании оператора ЗНАЧЕНИЕ (или VALUE) тип объекта метаданных всегда указывается в единственном числе. Выясним, как должен выглядеть правильный вариант:
Перечисления на Перечисление.Правильный синтаксис:
ГДЕ
НачисленияУдержанияПоСотрудникам.ГруппаНачисленияУдержанияВыплаты = ЗНАЧЕНИЕ(Перечисление.ГруппыНачисленияУдержанияВыплаты.Начислено)
Важно помнить, что оператор ЗНАЧЕНИЕ вычисляется на этапе компиляции запроса. Если вам необходимо передавать значение динамически, лучше использовать параметры запроса (например, &ГруппаВыплаты) и устанавливать их через метод Запрос.УстановитьПараметр().
Разберем еще один критический момент, который может привести к тому, что печатная форма останется пустой. В коде автора была допущена логическая ошибка в блоке условий периода:
И НачисленияУдержанияПоСотрудникам.Период <= &НачалоПериода
И НачисленияУдержанияПоСотрудникам.Период >= &КонецПериода
Проанализируем ситуацию: если НачалоПериода — это 1 января, а КонецПериода — 31 января, то система ищет записи, дата которых одновременно МЕНЬШЕ 1 января и БОЛЬШЕ 31 января. Таких записей не существует. Правильным подходом будет использование оператора МЕЖДУ или исправление знаков сравнения:
ГДЕ
НачисленияУдержанияПоСотрудникам.Период МЕЖДУ &НачалоПериода И &КонецПериода
Теперь перейдем к самой сложной части — выводу результатов запроса, содержащего конструкцию ИТОГИ ПО, в макет печатной формы. Когда мы используем итоги, результат запроса представляет собой иерархическую структуру. Посмотрим, как правильно организовать обход такой выборки.
Разберем по шагам алгоритм, который позволяет вывести общую сумму по сотруднику и детальные записи под ней:
Сотрудник), используя метод Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Сотрудник").ВыборкаПоГруппировкам.Выбрать().Вывести() внутри цикла.Рассмотрим пример правильной реализации в коде:
РезультатЗапроса = Запрос.Выполнить();
// Получаем выборку по сотрудникам (группировка ИТОГИ)
ВыборкаПоГруппировкам = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Сотрудник");
Пока ВыборкаПоГруппировкам.Следующий() Цикл
// Здесь мы можем получить агрегированную сумму по сотруднику
ОбщаяСуммаПоСотруднику = ВыборкаПоГруппировкам.Сумма;
// Получаем вложенную выборку детальных записей для этого сотрудника
ВыборкаДетальныеЗаписи = ВыборкаПоГруппировкам.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Заполняем параметры строки макета
ОбластьСтрока.Параметры.ЛичныеДанныеФИО = ВыборкаДетальныеЗаписи.ФизическоеЛицо;
ОбластьСтрока.Параметры.РаботаДолжность = ВыборкаДетальныеЗаписи.Должность;
ОбластьСтрока.Параметры.СуммаПремии = ВыборкаДетальныеЗаписи.Сумма;
// КРИТИЧЕСКИ ВАЖНО: Выводим область в табличный документ внутри цикла!
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
КонецЦикла;
Проанализируем, почему данные могут не отображаться, даже если запрос работает корректно:
1. Местоположение метода Вывести(). Если вызывать ТабличныйДокумент.Вывести(ОбластьСтрока) после завершения цикла (как это было в исходном вопросе), в документ попадет только последняя обработанная запись. Чтобы увидеть всех сотрудников, метод должен находиться внутри цикла Пока ... Следующий().
2. Имена параметров. Проверьте соответствие имен в коде (ОбластьСтрока.Параметры.ИмяПараметра) и имен, заданных в ячейках макета. Помните, что 1С чувствительна к регистру и пробелам в именах параметров.
3. Склонение ФИО. При заполнении кадровых форм (таких как Т-11а) часто требуется винительный падеж ФИО. Простое присваивание ссылки ФизическоеЛицо выведет имя в именительном падеже. В конфигурации "Зарплата и управление персоналом" рекомендуется использовать встроенные функции для склонения, например, СклонениеФИО.Просклонять().
В заключение дадим совет по работе с данными в 1С:ЗУП. Использование физической таблицы РегистрНакопления.НачисленияУдержанияПоСотрудникам не всегда является оптимальным. Для получения итоговых сумм за период лучше использовать виртуальную таблицу Обороты. Это не только повысит производительность, но и упростит работу с итогами, так как данные будут предварительно сгруппированы самой СУБД.
Также обратите внимание на разницу между полями Период и ПериодРегистрации. В кадровых отчетах часто важнее именно месяц, за который начислена премия (регистрация), а не конкретная дата записи в регистр.
Соблюдение этих правил позволит вам создавать надежные и быстрые механизмы печати документов в системе 1С:Предприятие.