Какие новые функции появились в языке запросов и СКД в версии 8.3.20?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Долгое время разработчики на платформе 1С:Предприятие были ограничены в возможностях обработки данных непосредственно внутри запросов. Многие операции, такие как сложная работа со строками или тригонометрические вычисления, приходилось выполнять уже после получения выборки во встроенном языке, что негативно сказывалось на производительности. С выходом версии 8.3.20 ситуация кардинально изменилась. Платформа получила масштабное обновление языка запросов и системы компоновки данных (СКД).

В этой статье мы подробно разберем новые функции, проанализируем их синтаксис и выясним, как они транслируются на уровень СУБД для оптимизации работы ваших отчетов и обработок.

Функции для работы со строками в запросах

Работа с текстом — одна из самых частых задач. Ранее в запросах были доступны только простейшие операции вроде ПОДОБНО или конкатенации строк ограниченной длины. Теперь мы можем выполнять полноценное манипулирование строковыми данными прямо в SELECT.

Рассмотрим основные добавленные функции:

  1. СТРЗАМЕНИТЬ: Позволяет заменить все вхождения искомой подстроки на новую строку. Это незаменимо при нормализации данных или очистке артикулов от лишних символов.
  2. СТРДЛИНА: Возвращает количество символов в строке. Раньше для этого приходилось использовать обходные пути или вычислять длину во встроенном языке.
  3. СТРНАЙТИ: Помогает найти позицию первого вхождения подстроки в строку. Поиск ведется с начала строки, результат — число (индекс начинается с 1).
  4. ВРЕГ и НРЕГ: Функции приведения к верхнему и нижнему регистру теперь работают полноценно и транслируются в SQL-команды UPPER и LOWER.
  5. ЛЕВО и ПРАВО: Позволяют получить заданное количество символов с начала или конца строки соответственно.

Посмотрим на практический пример использования этих функций в тексте запроса:


ВЫБРАТЬ
    Номенклатура.Наименование КАК Оригинал,
    СТРЗАМЕНИТЬ(Номенклатура.Наименование, " ", "_") КАК БезПробелов,
    СТРДЛИНА(Номенклатура.Наименование) КАК ДлинаНазвания,
    ВРЕГ(ЛЕВО(Номенклатура.Наименование, 3)) КАК ПрефиксВерхнийРегистр
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    СТРНАЙТИ(Номенклатура.Наименование, "Акция") > 0

Важно понимать, что использование этих функций в секции ГДЕ может привести к сканированию всей таблицы (Table Scan), так как СУБД не всегда может эффективно использовать индексы по вычисляемым полям. Проанализируем это при проектировании высоконагруженных систем.

Математические и трансцендентные функции

Для сложных расчетов, особенно в блоках планирования, бюджетирования или при интеграции с научными системами, в язык запросов были добавлены математические функции, которые ранее были доступны только во встроенном языке (модуль Math).

Теперь мы можем использовать:

Ранее программисты использовали конструкцию ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 2)) для ограничения знаков после запятой. Однако ВЫРАЗИТЬ часто просто отсекает лишние знаки или ведет себя специфично в зависимости от СУБД. Новая функция ОКР выполняет честное математическое округление на стороне сервера базы данных.

Пример расчета сложного процента прямо в запросе:


ВЫБРАТЬ
    Продажи.СуммаОборот * POW(1 + &Ставка, &Период) КАК БудущаяСтоимость,
    SQRT(Продажи.СуммаОборот) КАК КвадратныйКореньСуммы,
    ОКР(Продажи.СуммаОборот, 0) КАК ЦелаяСумма
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи

Решение проблемы с получением GUID (UUID)

Одной из самых обсуждаемых проблем было отсутствие возможности получить уникальный идентификатор ссылки прямо в запросе. Это сильно усложняло задачи синхронизации данных с внешними системами. В 8.3.20 эта проблема была решена через расширение возможностей функции СТРОКА().

Теперь, если передать в функцию СТРОКА() поле ссылочного типа, запрос вернет не строковое представление объекта (его наименование), а строковое представление его UUID. Это позволяет выполнять соединения с внешними источниками данных, где идентификаторы хранятся в виде строк.

Пример получения идентификатора:


ВЫБРАТЬ
    Контрагенты.Ссылка КАК Ссылка,
    СТРОКА(Контрагенты.Ссылка) КАК ИдентификаторТекстом
ИЗ
    Справочник.Контрагенты КАК Контрагенты

Обратите внимание: функция СТРОКА() также поддерживает преобразование чисел, дат и булевых значений с учетом региональных настроек (национальных установок) информационной базы.

Особенности применения в Системе компоновки данных (СКД)

Разберем, как эти нововведения отразились на работе с отчетами. Все перечисленные функции стали доступны не только в запросах, но и в вычисляемых полях и выражениях ресурсов СКД.

Выясним разницу в выполнении:

Это дает гибкость: мы можем перенести часть вычислений на СУБД для ускорения получения данных или оставить их на стороне 1С, если нужно использовать функции, специфичные для встроенного языка.

Чего все еще не хватает в языке запросов?

Несмотря на огромный шаг вперед, проанализируем ограничения, которые остались в платформе. На текущий момент (даже в 8.3.20) все еще отсутствуют:

  1. Регулярные выражения (RegEx): Поиск по сложным паттернам все так же недоступен внутри запроса.
  2. Обратное преобразование типов: Если появилась функция СТРОКА(), то функций ЧИСЛО() или ДАТА() для преобразования из строки внутри запроса пока нет.
  3. Конкатенация строк неограниченной длины: Сложение строк типа "Строка неограниченной длины" (на стороне SQL — NVARCHAR(MAX) или TEXT) остается ограниченным в некоторых контекстах.

Подведем итог. Новые функции в 8.3.20 — это мощный инструмент в руках разработчика. Они позволяют писать более "чистый" код, перекладывать тяжелые расчеты на плечи SQL-сервера и значительно упрощают задачи по интеграции систем за счет легкого получения UUID. Рассмотрим внедрение этих функций в ваши текущие проекты при переходе на новую версию платформы.

← На главную