В запросах довольно распространенная задача — определить, к какому типу относится то или иное значение. Например, нужно в запросе определить тип документа, и если это приходная накладная — взять сумму документа с плюсом, а если расходная — с минусом. В этой статье рассмотрены конструкции языка запросов, позволяющие решить данную задачу.
Содержание
Стоит начать с того, что три конструкции — ТИП, ТИПЗНАЧЕНИЯ и ССЫЛКА — относятся к разным частям языка запросов 1С.
- ТИП — это литерал, который позволяет получить в запросе значение нужного типа. В этом случае мы заранее знаем, какой тип хотим получить.
- ТИПЗНАЧЕНИЯ — это функция, которая принимает в качестве параметра значение, и возвращает тип этого значения. Используется для определения заранее неизвестного типа значения в запросе.
- ССЫЛКА — это логический оператор, такой же как «>», «<«, и используется он при формировании условий.
Примеры использования
Основные способы применения конструкций ТИП и ТИПЗНАЧЕНИЯ в запросе — это сравнение типов в условиях, а также выбор типов в качестве полей в результате выполнения запроса. Оператор Ссылка используется в запросе для определения, является ли значение ссылкой на указанную таблицу, или нет. Например, является ли поле Покупатель ссылкой на справочник Контрагенты или на справочник ФизическиеЛица.
Рассмотрим несколько практических примеров.
Как в запросе проверить на соответствие нужному типу
Проверить, относится ли значение к нужному типу, можно двумя способами. Первый — самый универсальный, он подходит для любых значений — как для ссылочных типов, так и для примитивных. В запросе мы сравниваем результат функции ТИПЗНАЧЕНИЯ с нужным типом. Допустим, у нас есть регистр сведений с ресурсом составного типа «Значение», куда загружаются данные из внешнего источника (например, файла). Значение может быть числом, строкой или датой.
Данные в файле записаны в следующем формате:
ВЫБРАТЬ ДанныеФайла.ИмяФайла КАК ИмяФайла, ДанныеФайла.НомерСтрокиФайла КАК НомерСтрокиФайла, ДанныеФайла.НомерКолонки КАК НомерКолонки, ДанныеФайла.Значение КАК Значение ИЗ РегистрСведений.ДанныеФайла КАК ДанныеФайла ГДЕ ТИПЗНАЧЕНИЯ(ДанныеФайла.Значение) = ТИП(ДАТА)
В результате получим следующее:
Использование условного оператора ССЫЛКА
Оператор Ссылка может служить заменой условия ТИПЗНАЧЕНИЯ(…) = ТИП(…), но только для ссылочных типов. В результате его выполнения получается значение типа Булево. Оператор ССЫЛКА в запросе можно использовать в конструкции Выбор Когда … Тогда… Конец, в секции условий ГДЕ и Имеющие, а также для выбора в качестве поля запроса.
Предположим, у регистра Продажи есть два регистратора — документ РеализацияТоваров, и документ Возврат. Мы хотим в запросе вывести номер документа и сумму. Если это продажа — то положительную, если возврат — то отрицательную. В запросе используем конструкцию Выбор Когда… Конец.
ВЫБРАТЬ Продажи.Регистратор.Номер КАК НомерДокумента, ВЫБОР КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваров ТОГДА 1 ИНАЧЕ -1 КОНЕЦ * Продажи.Сумма КАК Сумма ИЗ РегистрНакопления.Продажи КАК Продажи
Выбор типа в качестве поля в запросе
Предположим, у регистра Продажи есть два регистратора — документ РеализацияТоваров, и документ ОтчетОРозничныхПродажах. Мы хотим в отчет вывести номер документа и тип этого документа. Запрос будет следующий:
ВЫБРАТЬ Продажи.Регистратор.Номер КАК НомерДокумента, ТИПЗНАЧЕНИЯ(Продажи.Регистратор) КАК ВидДокумента, Продажи.Сумма КАК Сумма ИЗ РегистрНакопления.ПродажиКАК Продажи
Еще один пример выбора типа в запросе в качестве поля. Допустим, мы хотим получить запросом таблицу, содержащую нужные нам типы, чтобы далее эту таблицу где-то использовать.
ВЫБРАТЬ ТИП(СТРОКА) КАК ТипСтрока, ТИП(ЧИСЛО) КАК ТипЧисло, ТИП(ДАТА) КАК ТипДата, ТИП(Документ.ПриходТоваров) КАК ТипДокумент
Важный момент. Не следует путать функцию языка 1С ТипЗнч и оператор ТИПЗНАЧЕНИЯ в запросе. И то и то предназначено для получения типа значения в 1С, но ТипЗнч нужно использовать в коде, а ТИПЗНАЧЕНИЯ — в тексте запроса.
Сэкономь часы на дебаге 1C!
Скачай PDF с топ-11 ошибок начинающих разработчиков + файл с примерами кода!