При разработке и внедрении внешних печатных форм в конфигурациях 1С, таких как 1С:Зарплата и Управление Персоналом (ЗУП), мы можем столкнуться с различными сложностями. Одной из распространенных проблем является ошибка "Значение не является значением объектного типа (ВысотаТаблицы)". Давайте рассмотрим эту проблему подробно, выясним ее причины и найдем эффективные способы решения.
Представим ситуацию, когда мы создали внешнюю печатную форму для документа "Прием на работу" в ЗУП. При попытке ее распечатать, после ввода необходимых данных в форме настроек, система выдает ошибку:
Значение не является значением объектного типа (ВысотаТаблицы) {ОбщаяФорма.ПечатьДокументов.Форма(675)}:ЕстьТабличныеДокументы = ЕстьТабличныеДокументы Или ПечатнаяФорма.ТабличныйДокумент.ВысотаТаблицы <> 0; {ОбщаяФорма.ПечатьДокументов.Форма(67)}:ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм); {ОбщийМодуль.УправлениеПечатьюКлиент.Модуль(198)}:ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, КлючУникальности); {ВнешняяОбработка.ДоговорПоставкоДем.Форма.ФормаНастроек.Форма(34)}:УправлениеПечатьюКлиент.ПечатьДокументов(МассивПечатныхФорм, ОбъектыПечати, ЭтаФорма); [ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
Этот стек вызова ошибки очень показателен. Он указывает, что проблема возникает в общей форме
ОбщаяФорма.ПечатьДокументов
ВысотаТаблицы
ПечатнаяФорма.ТабличныйДокумент
ПечатнаяФорма.ТабличныйДокумент
Неопределено
ВысотаТаблицы
Давайте посмотрим на предоставленный код, чтобы выявить причину.
Начнем с кода формы настроек, который инициирует процесс печати:
&НаКлиенте
Процедура ПечатьПродолжить(Команда)
// ... сбор данных из формы ...
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(Объект.СсылкаНаОбъект,"Трудовая договор");
МассивПечатныхФорм = ПечатьНаСервере(ОбъектыПечати, СтруктураДанных);
УправлениеПечатьюКлиент.ПечатьДокументов(МассивПечатныхФорм, ОбъектыПечати, ЭтаФорма);
Закрыть;
КонецПроцедуры
&НаСервере
Функция ПечатьНаСервере(ОбъектыПечати, ПараметрыПечати)
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ОбъектыПечати[0].Значение);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ТрудовойДоговорДалини");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода;
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, ПараметрыПечати);
МассивПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
Возврат МассивПечатныхФорм;
КонецФункции
В этом коде мы видим стандартный вызов серверной функции
ПечатьНаСервере
Печать
УправлениеПечатьюКлиент.ПечатьДокументов
Теперь обратимся к модулю самой внешней печатной формы. Нас интересует процедура
Печать
СформироватьПечатнуюФорму
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, ПараметрыПечати) Экспорт
//УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПФ_Трудовой_Договор_Внешний", "Трудовой договор с водителями", СформироватьПечатнуюФормуДоговора(МассивОбъектов, ОбъектыПечати, ПараметрыВывода));
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ТрудовойДоговорДалини") Тогда
ПечатьТрудовогоДоговора (МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
КонецЕсли;
КонецПроцедуры
Процедура ПечатьТрудовогоДоговора (МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ТрудовойДоговорДалини",
НСтр("ru='Трудовой договор с водителями'"),
СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыВывода));
КонецПроцедуры
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати, ПараметрыПечати)
КонецФункции
При внимательном рассмотрении представленного кода мы замечаем очень важную деталь. Функция
СформироватьПечатнуюФорму
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати, ПараметрыПечати) КонецФункции
В 1С, если функция не содержит оператор
Возврат
Неопределено
ПечатьТрудовогоДоговора
СформироватьПечатнуюФорму
СформироватьПечатнуюФорму
Неопределено
Неопределено
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию
ВывестиТабличныйДокументВКоллекцию
Неопределено
ПечатьДокументов
Неопределено
ВысотаТаблицы
Неопределено
Пользователь подтвердил это, указав, что код в этой функции был закомментирован или не дописан, и после раскомментирования/добавления логики формирования печатной формы, проблема была решена.
Для исправления этой ошибки нам необходимо гарантировать, что функция
СформироватьПечатнуюФорму
ТабличныйДокумент
В самом начале функции
СформироватьПечатнуюФорму
ТабличныйДокумент
ВысотаТаблицы
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати, ПараметрыПечати)
ТабДок = Новый ТабличныйДокумент; // Инициализируем табличный документ
// ... здесь будет код по заполнению макета ...
Возврат ТабДок; // Обязательный возврат табличного документа
КонецФункции
Внутри функции
СформироватьПечатнуюФорму
ТабДок
ТабличныйДокумент
Вывести()
ОтображатьСетку()
ОтображатьЗаголовки()
Приведем пример структуры функции формирования:
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати, ПараметрыПечати) Экспорт
// 1. Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить(); // Очищаем на всякий случай
ТабДок.ИмяПараметровПечати = "ПараметрыПечати_ТрудовойДоговорДалини";
// 2. Получаем объект документа "Прием на работу"
ДокументОбъект = СсылкаНаОбъект[0].ПолучитьОбъект(); // СсылкаНаОбъект - это массив ссылок
// 3. Получаем макет печатной формы
Макет = ПолучитьМакет("ТрудовойДоговорДалини"); // Предполагается, что макет добавлен в обработку
// 4. Определяем области макета
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьДанные = Макет.ПолучитьОбласть("Данные");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// 5. Заполняем параметры макета данными из документа и ПараметровПечати
// Например, для заголовка:
ОбластьЗаголовок.Параметры.Заполнить(ДокументОбъект);
ОбластьЗаголовок.Параметры.ДатаПечати = ТекущаяДата();
// Заполнение параметров из СтруктураДанных, переданной из формы настроек
ОбластьДанные.Параметры.СерияПаспорта = ПараметрыПечати.Серия;
ОбластьДанные.Параметры.НомерПаспорта = ПараметрыПечати.Номер;
ОбластьДанные.Параметры.КемВыдан = ПараметрыПечати.КемВыдан;
ОбластьДанные.Параметры.ДатаВыдачи = ПараметрыПечати.ДатаВыдачи;
ОбластьДанные.Параметры.КодПодразделения = ПараметрыПечати.КодПодразделения;
ОбластьДанные.Параметры.ДатаНачалаРаботы = ПараметрыПечати.ДатаНачалаРаботы;
ОбластьДанные.Параметры.РазмерТарифнойСтавки = ПараметрыПечати.РазмерТарифнойСтавкий; // Опечатка в названии, исправим на РазмерТарифнойСтавки
ОбластьДанные.Параметры.ЗаработнаяПлата = ПараметрыПечати.ЗаработнаяПлата;
// Также заполняем данные из самого документа
ОбластьДанные.Параметры.НомерДокумента = ДокументОбъект.Номер;
ОбластьДанные.Параметры.ДатаДокумента = ДокументОбъект.Дата;
ОбластьДанные.Параметры.Сотрудник = ДокументОбъект.Сотрудник;
// ... и так далее для всех необходимых полей ...
// 6. Выводим области в табличный документ
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьДанные);
ТабДок.Вывести(ОбластьПодвал);
// 7. Настраиваем параметры вывода (если необходимо)
ТабДок.ПараметрыСтраницы.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПараметрыСтраницы.МасштабПечати = 100;
// 8. Возвращаем заполненный табличный документ
Возврат ТабДок;
КонецФункции
Обратите внимание на то, что
СсылкаНаОбъект
СформироватьПечатнуюФорму
СсылкаНаОбъект[0].ПолучитьОбъект()
Даже если мы раскомментируем код или напишем его заново, могут возникнуть другие нюансы, приводящие к аналогичным ошибкам:
Если ... Тогда ... Иначе ... КонецЕсли;
Возврат ТабДок;
Неопределено
Решение: Всегда инициализируйте
ТабличныйДокумент
Возврат ТабДок;
ТабличныйДокумент
Структуру
Массив
Решение: Всегда проверяйте тип возвращаемого значения в отладчике. Убедитесь, что это именно
ТабличныйДокумент
СформироватьПечатнуюФорму
ТабличныйДокумент
Решение: Используйте отладчик для пошагового выполнения кода внутри функции
СформироватьПечатнуюФорму
Для точного определения места и причины ошибки мы рекомендуем использовать отладчик 1С:
ПечатьПродолжить
МассивПечатныхФорм = ПечатьНаСервере(ОбъектыПечати, СтруктураДанных);
ПечатьНаСервере
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, ПараметрыПечати);
Печать
ПечатьТрудовогоДоговора
СформироватьПечатнуюФорму
СформироватьПечатнуюФорму
Возврат ТабДок;
F10
F11
ПечатьНаСервере
F11
ОбработкаОбъект.Печать
F11
Печать
ПечатьТрудовогоДоговора
СформироватьПечатнуюФорму
F11
СформироватьПечатнуюФорму
ТабДок
После выхода из функции
СформироватьПечатнуюФорму
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию
Процедура ПечатьТрудовогоДоговора (МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
РезультатФормирования = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыВывода);
// Здесь поставьте точку останова и в окне "Табло" проверьте "РезультатФормирования".
// Его тип должен быть "ТабличныйДокумент".
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ТрудовойДоговорДалини",
НСтр("ru='Трудовой договор с водителями'"),
РезультатФормирования);
КонецПроцедуры
Если
РезультатФормирования
Неопределено
СформироватьПечатнуюФорму
Ошибка "Значение не является значением объектного типа (ВысотаТаблицы)" при выводе внешней печатной формы в 1С чаще всего указывает на то, что функция, ответственная за формирование табличного документа, либо не возвращает никакого значения (
Неопределено
СформироватьПечатнуюФорму
Всегда помните о необходимости явного создания объекта
ТабличныйДокумент