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