Как исправить ошибку «Значение не является значением объектного типа (Количество)» во внешней печатной форме 1С?

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

При создании или адаптации внешних печатных форм (ВПФ) на платформе 1С разработчики нередко сталкиваются с исключением: «Значение не является значением объектного типа (Количество)». Эта ошибка происходит в момент обращения к методам или свойствам переменной, которая вместо ожидаемого объекта (в данном случае массива или коллекции) содержит значение Неопределено или Null.

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

Анализ исходной ситуации и причины ошибки

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


Функция ПечатьСчетаФактуры(МассивОбъектов, ОбъектыПечати)
    ТабДокумент = Новый ТабличныйДокумент;
    
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ТабДокумент.ПолеСверху = 13;
    ТабДокумент.АвтоМасштаб = Истина;
    
    ПервыйДокумент = Истина;
    ВыводитьКолонтитул = МассивОбъектов.Количество() = 1;
    // ...

Платформа прерывает выполнение на строке вычисления переменной ВыводитьКолонтитул. Посмотрим, как вызывается эта функция в модуле внешней обработки:


Функция Печать() Экспорт 
    ТабДокумент = Новый ТабличныйДокумент;    
    ТабДокумент = ПечатьСчетаФактуры(,);    
    Возврат ТабДокумент;
КонецФункции

Проанализируем вызов ПечатьСчетаФактуры(,): запятые без указания переменных означают, что на вход передаются пустые значения, то есть параметры МассивОбъектов и ОбъектыПечати принимают значение Неопределено. Так как примитивный тип Неопределено не является объектом и не содержит метода Количество(), система 1С выбрасывает исключение.

Типичная ошибка при попытке ручной инициализации

Иногда начинающие специалисты пытаются обойти проблему следующим образом:


МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить("Документ.СчетФактураВыданный");

Выясним причину, почему такой подход некорректен. В типовых печатных формах параметр МассивОбъектов передается в запросы для выборки данных по конкретным документам (например, в конструкцию вида ГДЕ Документ В (&МассивОбъектов)). Если поместить туда строковое значение, запрос выдаст ошибку несоответствия типов. В массиве всегда должны находиться ссылки на реальные объекты информационной базы (тип ДокументСсылка.СчетФактураВыданный).

Пошаговое решение для конфигураций на обычных формах

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

  1. Создание реквизита: Добавим в реквизиты внешней обработки реквизит с точным именем СсылкаНаОбъект. В качестве типа укажем ссылку на целевой документ (например, ДокументСсылка.СчетФактураВыданный) или составной тип данных. Именно этот реквизит типовой механизм заполняет ссылкой на текущий документ при вызове печати из формы объекта или списка.
  2. Формирование массива ссылок: В теле экспортной функции Печать() создадим массив и добавим в него значение реквизита.
  3. Инициализация вспомогательных структур: Параметр ОбъектыПечати не должен оставаться пустым, так как он служит для связывания областей макета с ссылками. Инициализируем его объектом СписокЗначений.

Посмотрим на корректный пример кода модуля внешней обработки:


Функция Печать() Экспорт 
    
    МассивОбъектов = Новый Массив;
    Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        МассивОбъектов.Добавить(СсылкаНаОбъект);
    КонецЕсли;
    
    ОбъектыПечати = Новый СписокЗначений;
    
    ТабДокумент = ПечатьСчетаФактуры(МассивОбъектов, ОбъектыПечати);
    
    Возврат ТабДокумент;
    
КонецФункции

Пошаговое решение для конфигураций на БСП (Управляемые формы)

Если печатная форма создается для современной конфигурации на базе Библиотеки стандартных подсистем (БСП), функция Печать() без параметров вообще не используется платформой. Стандарт БСП требует наличия экспортной процедуры с определенной сигнатурой в модуле объекта.

Разберем правильный формат вызова для БСП:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // БСП автоматически передает выбранные документы в МассивОбъектов
    // Проверяем наличие команды печати в коллекции и формируем документ:
    ПараметрыПечати = Новый Структура;
    ТабДокумент = ПечатьСчетаФактуры(МассивОбъектов, ОбъектыПечати);
    
    // Привязываем сформированный табличный документ к коллекции печатных форм
    // (согласно стандартам БСП)
    
КонецПроцедуры

В этом случае платформа сама собирает массив ссылок на выделенные пользователем документы и передает его первым параметром. Ошибка с отсутствием метода отпадет сама собой.

Безопасная проверка входных параметров

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


Функция ПечатьСчетаФактуры(МассивОбъектов, ОбъектыПечати)
    
    // Проверяем корректность переданного массива
    Если ТипЗнч(МассивОбъектов) <> Тип("Массив") Или МассивОбъектов.Количество() = 0 Тогда
        Возврат Новый ТабличныйДокумент;
    КонецЕсли;
    
    // Проверяем инициализацию списка объектов печати
    Если ОбъектыПечати = Неопределено Тогда
        ОбъектыПечати = Новый СписокЗначений;
    КонецЕсли;
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ТабДокумент.ПолеСверху = 13;
    ТабДокумент.АвтоМасштаб = Истина;
    
    ПервыйДокумент = Истина;
    ВыводитьКолонтитул = (МассивОбъектов.Количество() = 1);
    
    // Далее следует алгоритм формирования макета и вывода областей
    
    Возврат ТабДокумент;
    
КонецФункции

Отладка внешней печатной формы

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

В обработчике команды вызовем процедуру печати следующим образом:


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

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

← На главную