Почему внешняя печатная форма или отчет выводится без данных и как это исправить?

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

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

Причина 1. Ошибки при передаче параметров даты в запрос

Проанализируем наиболее частую причину пустой выборки — некорректное сравнение дат в секции ГДЕ текста запроса.

В конфигурациях 1С (включая «Зарплата и управление персоналом 3.1») реквизиты кадровых регистров сведений, такие как ДатаПриема или ДатаУвольнения, чаще всего хранятся с нулевым временем (00:00:00). Если пользователь вводит значение в поле формы, в реквизит может попадать дата с ненулевой временной составляющей (например, текущее время сеанса). В результате строгое условие равенства ДатаПриема = &Парам не находит совпадений, и результат запроса оказывается пустым.

Посмотрим, как правильно передавать параметр даты из формы на сервер:

  1. Проверка привязки поля ввода к реквизиту: убедимся, что у элемента формы корректно заполнен путь к данным (ПутьКДанным) и тип реквизита строго ограничен типом Дата (состав даты: «Дата»).
  2. Приведение к началу дня: перед установкой параметра запроса явно приведем дату к началу суток с помощью встроенной функции НачалоДня().
  3. Использование диапазона в запросе: если дата может содержать произвольное время, в запросе надежнее проверять попадание в интервал суток.

Рассмотрим пример правильной установки параметров и конструкции запроса:


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

Причина 2. Лишняя работа со временным хранилищем при выводе печатных форм

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

Разберем по шагам оптимизированную схему вывода печатной формы:

  1. На клиенте создаем новый экземпляр табличного документа через Новый ТабличныйДокумент.
  2. Передаем этот объект по ссылке в серверную процедуру вместе с входными параметрами отбора.
  3. На сервере заполняем переданный табличный документ.
  4. После завершения серверного вызова на клиенте вызываем метод Показать().

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура СформироватьОтчет(Команда)
    
    ТабДок = Новый ТабличныйДокумент;
    СформироватьНаСервере(Объект.ВхДата, ТабДок);
    ТабДок.Показать("Список принятых сотрудников");
    
КонецПроцедуры

Причина 3. Свойства ячеек макета и имена параметров

Если запрос возвращает строки, но метод ОбластьДетальныхЗаписей.Параметры.Заполнить(Выборка) оставляет ячейки пустыми, выясним причину в свойствах макета:

  1. Тип заполнения ячейки: в свойствах каждой ячейки области «Детали» свойство Заполнение должно иметь значение Параметр (а не Текст).
  2. Соответствие имен: имя параметра ячейки должно в точности совпадать с псевдонимом поля в выборке запроса (например, ФизическоеЛицоПредставление или ТекущаяДолжностьПредставление).

Особенности структуры регистров кадрового учета

В типовых конфигурациях (ЗУП 3.1, ERP 2, КА 2) регистр сведений ТекущиеКадровыеДанныеСотрудников уже содержит измерение ФизическоеЛицо. Следовательно, выполнять дополнительное левое соединение со справочником Сотрудники для получения физического лица не требуется, что снижает нагрузку на СУБД и упрощает текст запроса.

Важно: регистр ТекущиеКадровыеДанныеСотрудников является непериодическим и хранит только актуальное состояние на текущий момент. Если требуется сформировать отчет по кадровым событиям за прошлые периоды или срез на историческую дату, следует использовать периодические регистры кадровой истории или функции программного интерфейса типовых конфигураций.

← На главную