Долгое время разработчики на платформе 1С:Предприятие были ограничены в возможностях обработки данных непосредственно внутри запросов. Многие операции, такие как сложная работа со строками или тригонометрические вычисления, приходилось выполнять уже после получения выборки во встроенном языке, что негативно сказывалось на производительности. С выходом версии 8.3.20 ситуация кардинально изменилась. Платформа получила масштабное обновление языка запросов и системы компоновки данных (СКД).
В этой статье мы подробно разберем новые функции, проанализируем их синтаксис и выясним, как они транслируются на уровень СУБД для оптимизации работы ваших отчетов и обработок.
Работа с текстом — одна из самых частых задач. Ранее в запросах были доступны только простейшие операции вроде ПОДОБНО или конкатенации строк ограниченной длины. Теперь мы можем выполнять полноценное манипулирование строковыми данными прямо в SELECT.
Рассмотрим основные добавленные функции:
UPPER и LOWER.Посмотрим на практический пример использования этих функций в тексте запроса:
ВЫБРАТЬ
Номенклатура.Наименование КАК Оригинал,
СТРЗАМЕНИТЬ(Номенклатура.Наименование, " ", "_") КАК БезПробелов,
СТРДЛИНА(Номенклатура.Наименование) КАК ДлинаНазвания,
ВРЕГ(ЛЕВО(Номенклатура.Наименование, 3)) КАК ПрефиксВерхнийРегистр
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
СТРНАЙТИ(Номенклатура.Наименование, "Акция") > 0
Важно понимать, что использование этих функций в секции ГДЕ может привести к сканированию всей таблицы (Table Scan), так как СУБД не всегда может эффективно использовать индексы по вычисляемым полям. Проанализируем это при проектировании высоконагруженных систем.
Для сложных расчетов, особенно в блоках планирования, бюджетирования или при интеграции с научными системами, в язык запросов были добавлены математические функции, которые ранее были доступны только во встроенном языке (модуль Math).
Теперь мы можем использовать:
SIN, COS, TAN, ASIN, ACOS, ATAN.POW (возведение в степень), SQRT (квадратный корень), EXP (экспонента), LOG (натуральный логарифм), LOG10 (десятичный логарифм).ОКР.Ранее программисты использовали конструкцию ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 2)) для ограничения знаков после запятой. Однако ВЫРАЗИТЬ часто просто отсекает лишние знаки или ведет себя специфично в зависимости от СУБД. Новая функция ОКР выполняет честное математическое округление на стороне сервера базы данных.
Пример расчета сложного процента прямо в запросе:
ВЫБРАТЬ
Продажи.СуммаОборот * POW(1 + &Ставка, &Период) КАК БудущаяСтоимость,
SQRT(Продажи.СуммаОборот) КАК КвадратныйКореньСуммы,
ОКР(Продажи.СуммаОборот, 0) КАК ЦелаяСумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Одной из самых обсуждаемых проблем было отсутствие возможности получить уникальный идентификатор ссылки прямо в запросе. Это сильно усложняло задачи синхронизации данных с внешними системами. В 8.3.20 эта проблема была решена через расширение возможностей функции СТРОКА().
Теперь, если передать в функцию СТРОКА() поле ссылочного типа, запрос вернет не строковое представление объекта (его наименование), а строковое представление его UUID. Это позволяет выполнять соединения с внешними источниками данных, где идентификаторы хранятся в виде строк.
Пример получения идентификатора:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
СТРОКА(Контрагенты.Ссылка) КАК ИдентификаторТекстом
ИЗ
Справочник.Контрагенты КАК Контрагенты
Обратите внимание: функция СТРОКА() также поддерживает преобразование чисел, дат и булевых значений с учетом региональных настроек (национальных установок) информационной базы.
Разберем, как эти нововведения отразились на работе с отчетами. Все перечисленные функции стали доступны не только в запросах, но и в вычисляемых полях и выражениях ресурсов СКД.
Выясним разницу в выполнении:
Это дает гибкость: мы можем перенести часть вычислений на СУБД для ускорения получения данных или оставить их на стороне 1С, если нужно использовать функции, специфичные для встроенного языка.
Несмотря на огромный шаг вперед, проанализируем ограничения, которые остались в платформе. На текущий момент (даже в 8.3.20) все еще отсутствуют:
СТРОКА(), то функций ЧИСЛО() или ДАТА() для преобразования из строки внутри запроса пока нет.NVARCHAR(MAX) или TEXT) остается ограниченным в некоторых контекстах.Подведем итог. Новые функции в 8.3.20 — это мощный инструмент в руках разработчика. Они позволяют писать более "чистый" код, перекладывать тяжелые расчеты на плечи SQL-сервера и значительно упрощают задачи по интеграции систем за счет легкого получения UUID. Рассмотрим внедрение этих функций в ваши текущие проекты при переходе на новую версию платформы.