Как в запросе 1С и печатной форме Word подставить пустую строку вместо незаполненного реквизита?

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

При формировании печатных форм на базе шаблонов Microsoft Word (через механизм переменных документа DocVariables или закладки Bookmarks) разработчики часто сталкиваются с ошибкой: если реквизит документа не заполнен, в готовом файле Word вместо пустого места выводится сообщение вида «Ошибка! Переменная документа не указана».

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

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

Проанализируем, что происходит при выполнении запроса в платформе 1С:

  1. Когда в тексте запроса выполняется обращение через точку к реквизитам ссылочного поля (например, КадровыйПеревод.Руководитель.Представление или КадровыйПеревод.Руководитель.Наименование), платформа формирует неявное левое соединение с таблицей соответствующего справочника.
  2. Если реквизит Руководитель в документе не выбран (содержит пустую ссылку или NULL), результатом обращения через точку будет значение NULL, а не пустая строка "".
  3. Функция ПРЕДСТАВЛЕНИЕ(Поле) возвращает специальный системный тип, который предназначен для отображения в динамических списках и отчетах, но при программной выгрузке через COM-соединение или обработку шаблона также может возвращать пустое значение специального типа или NULL.
  4. При передаче значения типа NULL или Неопределено в объект Word платформа MS Office не может распознать тип данных переменной документа и генерирует служебный текст ошибки.

Вариант 1. Обработка незаполненного значения в тексте запроса

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

Если мы обращаемся к реквизиту Наименование, то можем использовать конструкцию ЕСТЬNULL или явное ветвление ВЫБОР КОГДА. Посмотрим на пример с использованием функции ЕСТЬNULL:

ЕСТЬNULL(КадровыйПеревод.Руководитель.Наименование, "") КАК ФИОДиректора

Однако более надежным и универсальным способом в языке запросов 1С является явная проверка на пустую ссылку и приведение типа с помощью функции ВЫРАЗИТЬ. Разберем данный пример:


ВЫБОР
    КОГДА КадровыйПеревод.Руководитель = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
        ИЛИ КадровыйПеревод.Руководитель ЕСТЬ NULL
    ТОГДА ""
    ИНАЧЕ ВЫРАЗИТЬ(КадровыйПеревод.Руководитель.Наименование КАК Строка(150))
КОНЕЦ КАК ФИОДиректора

В этом случае поле ФИОДиректора всегда будет иметь строковый тип данных, что исключит передачу значения NULL во внешний файл.

Вариант 2. Обработка параметров на уровне встроенного языка перед выводом в Word

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

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


// Встроенная функция Строка() автоматически преобразует NULL и Неопределено в ""
ЗначениеФИО = Строка(Выборка.ФИОДиректора);

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

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

Дополнительные рекомендации по оптимизации запроса печатной формы

Проанализируем исходный запрос документа и выделим скрытые ошибки, которые могут приводить к задвоению строк:

  1. Соединение с регистром сведений ДокументыФизическихЛиц: вложенный запрос выбирает данные без отбора по виду документа (например, Паспорт РФ). Если у физического лица зарегистрировано несколько документов (заграничный паспорт, водительское удостоверение, СНИЛС), левое соединение размножит записи документа. Необходимо обязательно накладывать условие на вид документа в секции ГДЕ.
  2. Соединение с контактной информацией: табличная часть КонтактнаяИнформация соединяется только по типу (Адрес или Телефон). Если у сотрудника внесено несколько телефонов (мобильный, рабочий, домашний), результат запроса также продублируется. Рекомендуется соединять данные с отбором по конкретному элементу справочника ВидыКонтактнойИнформации.
← На главную