Разработка и Конфигурация · 10 мин
Как выразить значение как документ в 1С
Как использовать функцию ВЫРАЗИТЬ в запросах 1С для приведения значения к типу документа: синтаксис, примеры кода, типичные ошибки и проверка результата.
Фраза «выразить как документ» в практике 1С почти всегда означает одну из двух задач: привести поле составного типа к конкретному типу документа в запросе с помощью функции ВЫРАЗИТЬ или получить ссылку на документ из строки, уникального идентификатора либо другого значения в коде. Обе задачи решаются штатными средствами платформы, но требуют понимания типов данных и ограничений языка запросов.
Чаще всего приведение типа нужно, когда реквизит хранит ссылки разных видов документов (например, «ДокументОснование» в регистрах или «РасчетныйДокумент» в документах оплаты). Без явного приведения к конкретному типу нельзя обратиться к реквизитам документа через точку — запрос вернёт NULL или ошибку. Функция ВЫРАЗИТЬ решает эту проблему и одновременно улучшает работу СУБД, сужая набор обрабатываемых таблиц.
Ниже разобраны синтаксис функции, практические примеры для типовых сценариев, способы получить ссылку на документ вне запроса, а также ошибки, из-за которых приведение не срабатывает или возвращает пустые значения.
Что делает функция ВЫРАЗИТЬ в языке запросов 1С
Функция ВЫРАЗИТЬ выполняет явное приведение значения поля к указанному типу данных. Для ссылочных типов синтаксис выглядит так: ВЫРАЗИТЬ(ИмяПоля КАК Документ.ИмяДокумента). Если значение поля действительно является ссылкой на указанный вид документа, результатом будет эта ссылка; если нет — NULL.
Важно понимать: ВЫРАЗИТЬ не преобразует данные физически, а лишь сообщает запросу, как интерпретировать значение. Платформа не может «сделать» из строки или числа ссылку на документ — приведение возможно только между совместимыми типами. Для ссылочных типов это означает: исходное поле должно иметь составной тип, в который входит нужный документ.
Помимо документов, ВЫРАЗИТЬ применяется для усечения строк (ВЫРАЗИТЬ(Поле КАК Строка(100))), уточнения чисел (Число(15,2)) и приведения к типам справочников, перечислений, планов счетов. Для дат и булевых значений приведение имеет свои ограничения, но в контексте документов они используются редко.
Как привести поле к типу документа в запросе
Типовой сценарий — документ «Счет на оплату» содержит реквизит «ДокументОснование» составного типа, а нужно получить реквизиты конкретного документа-основания. Без приведения обращение через точку к реквизиту составного поля приведёт к ошибке построения запроса или неявному соединению со всеми таблицами составного типа, что крайне медленно.
ВЫБРАТЬ
Счет.Ссылка КАК Счет,
ВЫРАЗИТЬ(Счет.ДокументОснование КАК Документ.ЗаказКлиента) КАК Заказ
ИЗ
Документ.СчетНаОплатуПокупателю КАК Счет
ГДЕ
Счет.ДокументОснование ССЫЛКА Документ.ЗаказКлиентаОбратите внимание на условие ССЫЛКА: оно отсекает записи, где основание — документ другого вида, и позволяет СУБД не соединять лишние таблицы. Комбинация «ССЫЛКА + ВЫРАЗИТЬ» считается хорошей практикой при работе с составными типами.
После приведения можно обращаться к реквизитам документа через точку от результата ВЫРАЗИТЬ, но с осторожностью: обращение через точку к полю приведённого выражения порождает соединение с таблицей документа. Если соединений много, запрос замедляется. Альтернатива — явное левое соединение с таблицей документа по условию равенства ссылок.
Если из составного поля нужен всего один-два реквизита, проще оставить ВЫРАЗИТЬ с обращением через точку. Если реквизитов много или поле используется в соединениях дальше по запросу, надёжнее сделать явное ЛЕВОЕ СОЕДИНЕНИЕ с таблицей документа — план запроса будет предсказуемее.
Как получить ссылку на документ в коде вне запроса
Если задача — «выразить как документ» значение в модуле (например, строку с уникальным идентификатором или номер документа), используются методы менеджера документа. Основные варианты:
- Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) — ссылка по известному GUID, даже если документа ещё нет в базе;
- Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер, Дата) — поиск по номеру в пределах периодичности нумерации;
- Документы.РеализацияТоваровУслуг.НайтиПоРеквизиту(ИмяРеквизита, Значение) — поиск по значению реквизита, по которому построен индекс.
Метод ПолучитьСсылку не проверяет существование объекта: он формирует ссылку по идентификатору. Проверить, есть ли реальный документ за ссылкой, можно через запрос или через проверку Ссылка.ПолучитьОбъект() на NULL — но второй способ дорогой по производительности. Лёгкий вариант — запрос вида «ВЫБРАТЬ Ссылка ИЗ Документ... ГДЕ Ссылка = &Ссылка».
Приведение типов при обмене и загрузке данных
При загрузке данных из файлов, веб-сервисов или других баз документ часто идентифицируется строкой GUID. Стандартный приём: создать объект УникальныйИдентификатор из строки, получить ссылку через ПолучитьСсылку, проверить существование и при отсутствии — создать новый документ с установкой ссылки через УстановитьСсылкуНового().
Такой подход сохраняет сквозную идентичность объектов между базами: один и тот же документ имеет одинаковый GUID во всех узлах обмена. Именно так работают типовые механизмы обмена данными. При ручной разработке загрузки важно обернуть создание УникальныйИдентификатор в попытку — некорректная строка вызовет исключение.
- 1Получите строку GUID из источника данных и проверьте её формат
- 2Создайте объект: Новый УникальныйИдентификатор(СтрокаGUID) в блоке Попытка
- 3Получите ссылку: Документы.ВидДокумента.ПолучитьСсылку(Идентификатор)
- 4Проверьте существование документа запросом по ссылке
- 5Если документа нет — создайте новый объект и вызовите УстановитьСсылкуНового(Ссылка)
- 6Заполните реквизиты и запишите документ
- 7Проверьте результат: документ доступен в списке и проводится без ошибок
Типичные ошибки при приведении к типу документа
Отдельная группа проблем — права доступа. Если у пользователя нет прав на вид документа, входящий в составной тип, запрос с ВЫРАЗИТЬ может вернуть ошибку доступа или неполные данные в зависимости от настроек RLS. Проверяйте запрос под целевой ролью, а не только под администратором.
Как проверить, что приведение сработало корректно
Базовая проверка — выполнить запрос в консоли запросов и убедиться, что приведённое поле заполнено для ожидаемых строк и равно NULL для документов других видов. Если поле пусто везде, почти наверняка исходный реквизит не содержит ссылок нужного вида или тип указан неверно.
Как проверить результат
Для строк с нужным видом основания поле содержит ссылку
Поле NULL во всех строках — неверный тип или пустой реквизит
Запрос с ССЫЛКА и ВЫРАЗИТЬ выполняется заметно быстрее варианта без приведения
Запрос тормозит — вероятно, остались обращения через точку к неприведённым составным полям
Запрос по ссылке возвращает строку, документ открывается в интерфейсе
Запрос пуст — документа с таким GUID нет, ссылка «битая»
Для массовых операций полезно дополнительно проверить количество «битых» ссылок запросом с левым соединением: если основание не NULL, а соединение с таблицей документа дало NULL, ссылка указывает на несуществующий объект. Такие ситуации возникают после некорректных обменов или удаления объектов без контроля ссылочной целостности.
Какой способ выбрать в разных ситуациях
Как выбрать действие
В большинстве рабочих задач хватает двух инструментов: ВЫРАЗИТЬ в запросах для составных типов и ПолучитьСсылку для интеграционных сценариев. Сложные конструкции с преобразованием значений через сериализацию или COM-соединения требуются редко и должны быть крайней мерой.
Что важно запомнить
ВЫРАЗИТЬ приводит поле составного типа к конкретному виду документа и работает только с совместимыми типами. В коде ссылку получают через ПолучитьСсылку по GUID или поиск по номеру и реквизитам. Всегда дополняйте приведение условием ССЫЛКА и проверяйте результат в консоли запросов.
Частые вопросы
Можно ли выразить строку как документ прямо в запросе?
Нет. Функция ВЫРАЗИТЬ не преобразует строковые значения в ссылки. Строку с GUID нужно сначала обработать в коде: создать УникальныйИдентификатор и получить ссылку через ПолучитьСсылку, а затем передать готовую ссылку в запрос параметром.
Почему ВЫРАЗИТЬ возвращает NULL, хотя основание заполнено?
Наиболее вероятные причины: реквизит хранит документ другого вида, чем указано в приведении, либо в метаданных реквизита составной тип не включает нужный документ. Проверьте тип реквизита в конфигураторе и фактические значения через запрос с ТИПЗНАЧЕНИЯ(Поле).
Чем условие ССЫЛКА отличается от ВЫРАЗИТЬ?
ССЫЛКА — это логическая проверка типа в условии ГДЕ: она фильтрует строки. ВЫРАЗИТЬ — приведение значения в списке выборки или соединении: оно меняет интерпретацию поля, но не отсекает строки, а ставит NULL для несовместимых значений. Вместе они дополняют друг друга.
Как привести значение к документу в СКД?
В запросе набора данных СКД функция ВЫРАЗИТЬ работает так же, как в обычном запросе. Дополнительно в настройках поля можно указать ограничение типа через параметры данных или выражение в закладке «Наборы данных» — это помогает компоновщику корректно строить отборы по ссылочным полям.
Что делать, если ПолучитьСсылку вернул ссылку на несуществующий документ?
Это штатное поведение: метод формирует ссылку по идентификатору без обращения к данным. Проверьте существование запросом по ссылке. Если документа нет и его нужно создать, используйте УстановитьСсылкуНового с этой же ссылкой — тогда GUID объекта совпадёт с внешним источником.
Влияет ли ВЫРАЗИТЬ на производительность запроса?
Да, причём положительно: явное приведение вместе с условием ССЫЛКА позволяет СУБД работать с одной таблицей вместо всех таблиц составного типа. На больших регистрах разница по времени выполнения может быть многократной. Замерять эффект удобно через консоль запросов с замером времени.