При настройке отчетов в режиме 1С:Предприятие часто возникает задача проверить тип документа в составном типе данных или регистраторе и вывести соответствующее значение. Пользователи и разработчики нередко пытаются применить привычную конструкцию из языка запросов ССЫЛКА прямо в пользовательском поле-выражении, однако отчет выдает синтаксическую ошибку о том, что поле не найдено или пропущено ключевое слово.
Разберем подробно, почему возникает эта ошибка и какими способами можно корректно проверить тип документа в механизмах системы компоновки данных.
Главная причина неудач при написании условий вида Регистратор.ДокументПродажи ССЫЛКА Документ.ВозвратТоваровОтКлиента заключается в том, что пользовательские поля и вычисляемые поля обрабатываются языком выражений СКД, а не языком запросов СУБД.
Выясним ключевые различия, о которых важно помнить:
ССЫЛКА поддерживается исключительно в текстах запросов. В синтаксисе языка выражений компоновки данных такого оператора нет.Регистратор.ДокументПродажи, а не Регистратор.Документ продажи)..Менеджер) в СКД разрешено напрямую от полей набора данных, но запрещено от результата функций (конструкции вроде ВЫРАЗИТЬ(...).Менеджер вызовут ошибку).Рассмотрим первый рабочий способ в пользовательском поле-выражении. В языке выражений СКД доступна функция ТипЗначения(), возвращающая тип переданного поля, и функция Тип(), получающая эталонный тип по его строковому представлению.
Для ссылочных типов документов строковое имя типа строится по правилу ДокументСсылка.<ИмяДокумента>. Посмотрим на пример корректного выражения:
ВЫБОР
КОГДА ТипЗначения(Регистратор.ДокументПродажи) = Тип("ДокументСсылка.ВозвратТоваровОтКлиента")
ТОГДА Регистратор.ДокументПродажи.Менеджер
ИНАЧЕ Менеджер
КОНЕЦ
В этом выражении система сначала проверяет фактический тип ссылки в поле Регистратор.ДокументПродажи. Если тип совпадает с документом возврата, выводится его менеджер, в противном случае подставляется менеджер по умолчанию.
Проанализируем второй способ, использующий функцию ВЫРАЗИТЬ в контексте языка выражений СКД. В отличие от языка запросов, где используется конструкция ВЫРАЗИТЬ(Поле КАК Тип), в формулах СКД функция принимает два параметра через запятую: само поле и строковое имя таблицы метаданных в кавычках.
Синтаксис функции имеет вид: ВЫРАЗИТЬ(Поле, "ИмяТаблицы"). Если проверяемое поле не относится к указанному типу таблицы, функция возвращает значение NULL. Это позволяет построить проверку типа от противного:
ВЫБОР
КОГДА ВЫРАЗИТЬ(Регистратор.ДокументПродажи, "Документ.ВозвратТоваровОтКлиента") ЕСТЬ НЕ NULL
ТОГДА Регистратор.ДокументПродажи.Менеджер
ИНАЧЕ Менеджер
КОНЕЦ
Обратим внимание: имя объекта конфигурации в строковом литерале "Документ.ВозвратТоваровОтКлиента" должно быть указано в точном соответствии с деревом метаданных конфигурации, без пробелов и опечаток.
Если отчет настраивается пользователем в режиме 1С:Предприятие, можно полностью избежать ручного ввода формул и потенциальных синтаксических ошибок. Для этого создадим специальный тип пользовательского поля.
Разберем по шагам порядок действий:
Регистратор.ДокументПродажи, укажем вид сравнения Тип и выберем из списка тип документа Возврат товаров от клиента.Регистратор.ДокументПродажи.Менеджер.Менеджер.Такой подход нагляден, не требует знания тонкостей синтаксиса и полностью исключает ошибки парсера формул.
Если доступно редактирование схемы компоновки данных в конфигураторе, наиболее производительным решением будет перенос условия непосредственно в запрос набора данных. На уровне СУБД оператор ССЫЛКА работает быстрее постобработки в отчете.
Посмотрим на пример реализации в тексте запроса набора данных:
ВЫБОР
КОГДА Партии.ДокументПродажи ССЫЛКА Документ.ВозвратТоваровОтКлиента
ТОГДА ВЫРАЗИТЬ(Партии.ДокументПродажи КАК Документ.ВозвратТоваровОтКлиента).Менеджер
ИНАЧЕ Партии.Менеджер
КОНЕЦ КАК ИтоговыйМенеджер
Такой вариант снимает вычислительную нагрузку с клиентского приложения и сервера при обработке схемы компоновки, а также гарантирует корректную типизацию реквизитов на уровне базы данных.