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