При формировании печатных форм на базе шаблонов Microsoft Word (через механизм переменных документа DocVariables или закладки Bookmarks) разработчики часто сталкиваются с ошибкой: если реквизит документа не заполнен, в готовом файле Word вместо пустого места выводится сообщение вида «Ошибка! Переменная документа не указана».
Разберем детально механизм возникновения этой проблемы, а также рассмотрим правильные способы ее устранения в тексте запроса и в коде модуля формирования печатной формы.
Проанализируем, что происходит при выполнении запроса в платформе 1С:
КадровыйПеревод.Руководитель.Представление или КадровыйПеревод.Руководитель.Наименование), платформа формирует неявное левое соединение с таблицей соответствующего справочника.Руководитель в документе не выбран (содержит пустую ссылку или NULL), результатом обращения через точку будет значение NULL, а не пустая строка "".ПРЕДСТАВЛЕНИЕ(Поле) возвращает специальный системный тип, который предназначен для отображения в динамических списках и отчетах, но при программной выгрузке через COM-соединение или обработку шаблона также может возвращать пустое значение специального типа или NULL.NULL или Неопределено в объект Word платформа MS Office не может распознать тип данных переменной документа и генерирует служебный текст ошибки.Рассмотрим, как гарантированно получить пустую строку нужного типа непосредственно в выборке запроса.
Если мы обращаемся к реквизиту Наименование, то можем использовать конструкцию ЕСТЬNULL или явное ветвление ВЫБОР КОГДА. Посмотрим на пример с использованием функции ЕСТЬNULL:
ЕСТЬNULL(КадровыйПеревод.Руководитель.Наименование, "") КАК ФИОДиректора
Однако более надежным и универсальным способом в языке запросов 1С является явная проверка на пустую ссылку и приведение типа с помощью функции ВЫРАЗИТЬ. Разберем данный пример:
ВЫБОР
КОГДА КадровыйПеревод.Руководитель = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
ИЛИ КадровыйПеревод.Руководитель ЕСТЬ NULL
ТОГДА ""
ИНАЧЕ ВЫРАЗИТЬ(КадровыйПеревод.Руководитель.Наименование КАК Строка(150))
КОНЕЦ КАК ФИОДиректора
В этом случае поле ФИОДиректора всегда будет иметь строковый тип данных, что исключит передачу значения NULL во внешний файл.
Часто наиболее простым и архитектурно правильным подходом является нормализация значений непосредственно в процедуре заполнения шаблона Word перед передачей структуры параметров.
Рассмотрим, как преобразовать полученные из выборки значения в явный строковый формат с помощью функции Строка():
// Встроенная функция Строка() автоматически преобразует NULL и Неопределено в ""
ЗначениеФИО = Строка(Выборка.ФИОДиректора);
// Либо используем явную проверку перед установкой параметра
Если Выборка.ФИОДиректора = NULL Или Выборка.ФИОДиректора = Неопределено Тогда
ЗначениеДляШаблона = "";
Иначе
ЗначениеДляШаблона = СокрЛП(Выборка.ФИОДиректора);
КонецЕсли;
При использовании механизмов Библиотеки Стандартных Подсистем (БСП) для работы с офисными документами рекомендуется обходить результирующую структуру параметров и приводить все незаполненные поля к пустой строке, так как механизм печати БСП строго требует примитивных типов данных (Строка, Число, Дата, Булево).
Проанализируем исходный запрос документа и выделим скрытые ошибки, которые могут приводить к задвоению строк:
ДокументыФизическихЛиц: вложенный запрос выбирает данные без отбора по виду документа (например, Паспорт РФ). Если у физического лица зарегистрировано несколько документов (заграничный паспорт, водительское удостоверение, СНИЛС), левое соединение размножит записи документа. Необходимо обязательно накладывать условие на вид документа в секции ГДЕ.КонтактнаяИнформация соединяется только по типу (Адрес или Телефон). Если у сотрудника внесено несколько телефонов (мобильный, рабочий, домашний), результат запроса также продублируется. Рекомендуется соединять данные с отбором по конкретному элементу справочника ВидыКонтактнойИнформации.