Получить консультацию

ТИП, ТИПЗНАЧЕНИЯ и ССЫЛКА в запросах 1С 8 – примеры использования

В запросах довольно распространенная задача – определить, к какому типу относится то или иное значение. Например, нужно в запросе определить тип документа, и если это приходная накладная – взять сумму документа с плюсом, а если расходная – с минусом. В этой статье рассмотрены конструкции языка запросов, позволяющие решить данную задачу.

Содержание

Стоит начать с того, что три конструкции – ТИП, ТИПЗНАЧЕНИЯ и ССЫЛКА – относятся к разным частям языка запросов 1С.

  1. ТИП – это литерал, который позволяет получить в запросе значение нужного типа. В этом случае мы заранее знаем, какой тип хотим получить.
  2. ТИПЗНАЧЕНИЯ – это функция, которая принимает в качестве параметра значение, и возвращает тип этого значения. Используется для определения заранее неизвестного типа значения в запросе.
  3. ССЫЛКА – это логический оператор, такой же как “>”, “<“, и используется он при формировании условий.

Примеры использования

Основные способы применения конструкций ТИП и ТИПЗНАЧЕНИЯ в запросе – это сравнение типов в условиях, а также выбор типов в качестве полей в результате выполнения запроса. Оператор Ссылка используется в запросе для определения, является ли значение ссылкой на указанную таблицу, или нет. Например, является ли поле Покупатель ссылкой на справочник Контрагенты или на справочник ФизическиеЛица.
Рассмотрим несколько практических примеров.

Как в запросе проверить на соответствие нужному типу

Проверить, относится ли значение к нужному типу, можно двумя способами. Первый – самый универсальный, он подходит для любых значений – как для ссылочных типов, так и для примитивных. В запросе мы сравниваем результат функции ТИПЗНАЧЕНИЯ с нужным типом. Допустим, у нас есть регистр сведений с ресурсом составного типа “Значение”, куда загружаются данные из внешнего источника (например, файла). Значение может быть числом, строкой или датой.

Данные в файле записаны в следующем формате:

Тип и ТипЗначения в запросе 1С
Тип в запросе в 1С пример
Выберем запросом только строки, где в поле Значение содержится дата:
ВЫБРАТЬ
	ДанныеФайла.ИмяФайла КАК ИмяФайла,
	ДанныеФайла.НомерСтрокиФайла КАК НомерСтрокиФайла,
	ДанныеФайла.НомерКолонки КАК НомерКолонки,
	ДанныеФайла.Значение КАК Значение
ИЗ
	РегистрСведений.ДанныеФайла КАК ДанныеФайла
ГДЕ
	ТИПЗНАЧЕНИЯ(ДанныеФайла.Значение) = ТИП(ДАТА)

В результате получим следующее:

Сравнить типЗначения с типом в запросе

Использование условного оператора ССЫЛКА

Оператор Ссылка может служить заменой условия ТИПЗНАЧЕНИЯ(…)  = ТИП(…), но только для ссылочных типов. В результате его выполнения получается значение типа Булево. Оператор ССЫЛКА в запросе можно использовать в конструкции Выбор Когда … Тогда… Конец, в секции условий ГДЕ и Имеющие, а также для выбора в качестве поля запроса.

Предположим, у регистра Продажи есть два регистратора – документ РеализацияТоваров, и документ Возврат. Мы хотим в запросе вывести номер документа и сумму. Если это продажа – то положительную, если возврат – то отрицательную. В запросе используем конструкцию Выбор Когда… Конец.

ВЫБРАТЬ
	Продажи.Регистратор.Номер КАК НомерДокумента,
	ВЫБОР
		КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваров
			ТОГДА 1
		ИНАЧЕ -1
	КОНЕЦ * Продажи.Сумма КАК Сумма
ИЗ
	РегистрНакопления.Продажи КАК Продажи

Выбор типа в качестве поля в запросе

Предположим, у регистра Продажи есть два регистратора – документ РеализацияТоваров, и документ ОтчетОРозничныхПродажах. Мы хотим в отчет вывести номер документа и тип этого документа. Запрос будет следующий:

ВЫБРАТЬ
	Продажи.Регистратор.Номер КАК НомерДокумента,
	ТИПЗНАЧЕНИЯ(Продажи.Регистратор) КАК ВидДокумента,
	Продажи.Сумма КАК Сумма
ИЗ
	РегистрНакопления.ПродажиКАК Продажи

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

ВЫБРАТЬ
	ТИП(СТРОКА) КАК ТипСтрока,
	ТИП(ЧИСЛО) КАК ТипЧисло,
	ТИП(ДАТА) КАК ТипДата,
	ТИП(Документ.ПриходТоваров) КАК ТипДокумент

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

пятнадцать − тринадцать =

К НАЧАЛУ