Почему в 1С выводится пустая табличная форма вместо макета и как это исправить

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

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

Причина 1. Заполнение параметров объекта Макет вместо параметров объекта ОбластьПечати

Выясним, как платформа 1С работает с макетами табличных документов. Когда мы вызываем метод ПолучитьОбласть("ИмяОбласти"), создается отдельный самостоятельный экземпляр области макета в памяти. Если заполнять параметры напрямую у макета (Макет.Параметры.ИмяПараметра = Значение), экземпляр области ОбластьПечати эти значения не получит.

Рассмотрим ошибку в коде:


Макет = ПолучитьМакет("Макет");
ОбластьПечати = Макет.ПолучитьОбласть("ДопСоглаш");

// ОШИБКА: заполнение параметров макета-родителя
Макет.Параметры.Гражданство = "Гражданин Российской Федерации";
Макет.Параметры.Заполнить(Выборка);

// Вывод области, параметры которой остались незаполненными
ТабДокумент.Вывести(ОбластьПечати);

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


Макет = ПолучитьМакет("Макет");
ОбластьПечати = Макет.ПолучитьОбласть("ДопСоглаш");

// ПРАВИЛЬНО: заполнение параметров полученной области
ОбластьПечати.Параметры.Гражданство = "Гражданин Российской Федерации";
ОбластьПечати.Параметры.Заполнить(Выборка);

ТабДокумент.Вывести(ОбластьПечати);

Причина 2. Пустая выборка запроса и условие Если Выборка.Следующий()

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

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


Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
    // Заполнение параметров...
    ТабДокумент.Вывести(ОбластьПечати);
КонецЕсли;

Возврат ТабДокумент;

Если запрос возвращает пустой результат (0 строк), метод Выборка.Следующий() возвращает значение Ложь. В этом случае тело условия полностью пропускается, команда ТабДокумент.Вывести(...) не выполняется ни разу, и функция возвращает инициализированный, но совершенно пустой ТабличныйДокумент.

Разберем основные поводы, по которым запрос может возвращать пустую выборку:

  1. Несоответствие типов данных в параметрах. Если параметр &СправочникСсылка передает ссылку на документ (например, ДокументПриемНаРаботу), а запрос выполняется к справочнику (Справочник.СотрудникиОрганизаций) с условием ГДЕ Ссылка = &СправочникСсылка, то такое сравнение всегда даст Ложь.
  2. Неверные условия в соединениях или предложении ГДЕ. При использовании ВНУТРЕННЕЕ СОЕДИНЕНИЕ отсутствие данных хотя бы в одной из соединяемых таблиц полностью исключает строку из результата.
  3. Периодические регистры сведений. Условия среза последних могут не возвращать данных, если на указанную дату записи в регистре отсутствуют.

Причина 3. Перезапись текста запроса и работа с объектом Запрос

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

Корректная структура функции формирования печатной формы

Рассмотрим правильный вариант реализации функции печати, исключающий появление пустой формы и оптимизирующий работу с базами данных:


Функция ПечатьМакет() Экспорт

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

КонецФункции

Резюме и рекомендации по отладке

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

  1. Заполнять параметры у объекта ОбластьПечати.Параметры, а не у объекта Макет.Параметры.
  2. Проверять результат выполнения запроса с помощью метода РезультатЗапроса.Пустой() или отладчика до входа в цикл выборки.
  3. Убеждаться в совпадении типов передаваемых ссылок в параметрах запроса и таблицах базы данных.
← На главную