Как проверить тип документа-основания в 1С при формировании печатной формы?

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

При разработке печатных форм (в том числе внешних печатных форм — ВПФ) часто возникает задача изменить состав выводимых данных или логику запроса в зависимости от того, какой именно документ выступает основанием (например, Акт выполненных работ или Заказ покупателя). Разберем, почему стандартные проверки могут не срабатывать, и как правильно реализовать условие по типу основания.

Проанализируем типичную ситуацию: разработчик получает реквизит основания запросом и пытается проверить его тип во встроенном языке с помощью конструкции Если ТипЗнч(Шапка.ДокументОснование) = Тип("ДокументСсылка.Акт") Тогда, однако условие не выполняется даже при наличии основания.

Выясним причины ошибок при проверке типа

Существует несколько распространенных причин, по которым условие по типу ссылки может игнорироваться:

  1. Неверное имя объекта метаданных: В функции Тип() необходимо передавать точное системное имя документа из дерева конфигурации, а не его пользовательский синоним. Например, если документ называется АктВыполненныхРабот, строка Тип("ДокументСсылка.Акт") вернет Неопределено, и условие всегда будет ложным.
  2. Разыменование составного типа через точку в запросе: Поле ДокументОснование имеет составной тип данных. Конструкция в запросе СчетНаОплату.ДокументОснование.Ссылка создает неявные левые соединения со всеми возможными таблицами документов. Если реквизит не заполнен или в нем хранится пустая ссылка другого вида, запрос вернет NULL. Проверка ТипЗнч(NULL) дает Тип("NULL"), из-за чего сравнение с типом документа не проходит.
  3. Пустые значения и незаполненные реквизиты: Если реквизит не выбран пользователем, он может содержать Неопределено или пустую ссылку.

Способ 1. Проверка типа ссылки во встроенном языке 1С

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

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


ВЫБРАТЬ
    СчетНаОплату.Ссылка КАК Ссылка,
    СчетНаОплату.ДокументОснование КАК ДокументОснование
ИЗ
    Документ.СчетНаОплату КАК СчетНаОплату
ГДЕ
    СчетНаОплату.Ссылка В(&МассивОбъектов)

Затем в коде встроенного языка обязательно проверяем заполненность реквизита и сравниваем его тип с точным именем метаданных:


Если ЗначениеЗаполнено(Шапка.ДокументОснование) Тогда
    Если ТипЗнч(Шапка.ДокументОснование) = Тип("ДокументСсылка.АктВыполненныхРабот") Тогда
        // Логика формирования данных на основании Акта
        ВыполнитьФормированиеПоАкту(Шапка.ДокументОснование);
    ИначеЕсли ТипЗнч(Шапка.ДокументОснование) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        // Логика формирования данных на основании Заказа
        ВыполнитьФормированиеПоЗаказу(Шапка.ДокументОснование);
    КонецЕсли;
КонецЕсли;

Способ 2. Определение типа непосредственно в запросе (рекомендуемый подход)

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

Посмотрим на пример формирования полей-флагов и явного приведения типов с помощью конструкции ВЫРАЗИТЬ:


ВЫБРАТЬ
    Счет.Ссылка КАК Ссылка,
    Счет.ДокументОснование КАК ДокументОснование,
    ВЫБОР
        КОГДА Счет.ДокументОснование ССЫЛКА Документ.АктВыполненныхРабот
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЭтоАкт,
    ВЫРАЗИТЬ(Счет.ДокументОснование КАК Документ.АктВыполненныхРабот) КАК ОснованиеАкт
ИЗ
    Документ.СчетНаОплату КАК Счет
ГДЕ
    Счет.Ссылка В(&МассивОбъектов)

Использование оператора ССЫЛКА позволяет избежать создания лишних соединений к системным таблицам и сразу в выборке запроса получить готовый булев признак для ветвления алгоритма:


Если Шапка.ЭтоАкт Тогда
    // Заполняем печатную форму по данным акта
КонецЕсли;

Особенности отладки внешних печатных форм

При работе с внешними печатными формами (ВПФ) точки останова в модуле обработки могут не срабатывать, если обработка уже подключена в справочник «Дополнительные отчеты и обработки». В этом случае платформа запускает временную копию файла из хранилища.

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

  1. Открываем файл внешней обработки через меню Файл → Открыть в режиме «1С:Предприятие» и вызываем процедуру печати напрямую, передав ссылку на тестируемый документ.
  2. Проверяем тип основания через вывод отладочных сообщений: Сообщить(Строка(ТипЗнч(Шапка.ДокументОснование)));.
  3. Убеждаемся, что в службе сервера 1С или строке запуска клиента включен флаг отладки (параметр -debug).
← На главную