Как в пользовательском поле СКД проверить тип документа?

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

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

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

В чем разница между языком запросов и языком выражений СКД

Главная причина неудач при написании условий вида Регистратор.ДокументПродажи ССЫЛКА Документ.ВозвратТоваровОтКлиента заключается в том, что пользовательские поля и вычисляемые поля обрабатываются языком выражений СКД, а не языком запросов СУБД.

Выясним ключевые различия, о которых важно помнить:

  1. Оператор ССЫЛКА поддерживается исключительно в текстах запросов. В синтаксисе языка выражений компоновки данных такого оператора нет.
  2. Имена полей не следует заключать в квадратные скобки без необходимости, а наименования реквизитов должны строго совпадать с метаданными (без пробелов, например Регистратор.ДокументПродажи, а не Регистратор.Документ продажи).
  3. Разыменование полей через точку (например, получение реквизита .Менеджер) в СКД разрешено напрямую от полей набора данных, но запрещено от результата функций (конструкции вроде ВЫРАЗИТЬ(...).Менеджер вызовут ошибку).

Способ 1. Проверка через функции ТипЗначения и Тип

Рассмотрим первый рабочий способ в пользовательском поле-выражении. В языке выражений СКД доступна функция ТипЗначения(), возвращающая тип переданного поля, и функция Тип(), получающая эталонный тип по его строковому представлению.

Для ссылочных типов документов строковое имя типа строится по правилу ДокументСсылка.<ИмяДокумента>. Посмотрим на пример корректного выражения:


ВЫБОР 
    КОГДА ТипЗначения(Регистратор.ДокументПродажи) = Тип("ДокументСсылка.ВозвратТоваровОтКлиента") 
        ТОГДА Регистратор.ДокументПродажи.Менеджер 
    ИНАЧЕ Менеджер 
КОНЕЦ

В этом выражении система сначала проверяет фактический тип ссылки в поле Регистратор.ДокументПродажи. Если тип совпадает с документом возврата, выводится его менеджер, в противном случае подставляется менеджер по умолчанию.

Способ 2. Проверка через функцию ВЫРАЗИТЬ и условие ЕСТЬ НЕ NULL

Проанализируем второй способ, использующий функцию ВЫРАЗИТЬ в контексте языка выражений СКД. В отличие от языка запросов, где используется конструкция ВЫРАЗИТЬ(Поле КАК Тип), в формулах СКД функция принимает два параметра через запятую: само поле и строковое имя таблицы метаданных в кавычках.

Синтаксис функции имеет вид: ВЫРАЗИТЬ(Поле, "ИмяТаблицы"). Если проверяемое поле не относится к указанному типу таблицы, функция возвращает значение NULL. Это позволяет построить проверку типа от противного:


ВЫБОР 
    КОГДА ВЫРАЗИТЬ(Регистратор.ДокументПродажи, "Документ.ВозвратТоваровОтКлиента") ЕСТЬ НЕ NULL 
        ТОГДА Регистратор.ДокументПродажи.Менеджер 
    ИНАЧЕ Менеджер 
КОНЕЦ

Обратим внимание: имя объекта конфигурации в строковом литерале "Документ.ВозвратТоваровОтКлиента" должно быть указано в точном соответствии с деревом метаданных конфигурации, без пробелов и опечаток.

Способ 3. Использование пользовательского поля выбора без написания формул

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

Разберем по шагам порядок действий:

  1. В настройках отчета перейдем на закладку Пользовательские поля.
  2. Нажмем кнопку добавления и выберем пункт Новое поле выбор... (вместо «Новое поле выражение...»).
  3. В открывшемся окне зададим заголовок поля.
  4. В табличной части вариантов выбора добавим новую строку.
  5. В колонке Отбор настроим стандартный отбор СКД: выберем поле Регистратор.ДокументПродажи, укажем вид сравнения Тип и выберем из списка тип документа Возврат товаров от клиента.
  6. В колонке Значение укажем поле Регистратор.ДокументПродажи.Менеджер.
  7. В нижней строке Иначе укажем стандартное поле Менеджер.

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

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

Если доступно редактирование схемы компоновки данных в конфигураторе, наиболее производительным решением будет перенос условия непосредственно в запрос набора данных. На уровне СУБД оператор ССЫЛКА работает быстрее постобработки в отчете.

Посмотрим на пример реализации в тексте запроса набора данных:


ВЫБОР
    КОГДА Партии.ДокументПродажи ССЫЛКА Документ.ВозвратТоваровОтКлиента
        ТОГДА ВЫРАЗИТЬ(Партии.ДокументПродажи КАК Документ.ВозвратТоваровОтКлиента).Менеджер
    ИНАЧЕ Партии.Менеджер
КОНЕЦ КАК ИтоговыйМенеджер

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

← На главную