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