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