Использование выражений в языке запросов

Язык запросов

Синтаксис и применение Использование выражений в языке запросов в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

Использование выражений в языке запросов

Во многих конструкциях языка запросов могут использоваться выражения. Выражения языка запросов описываются следующим набором правил:

<Выражение>

|

<Разыменование поля> | <Агрегатная функция> | <Функция языка запросов> | <Операция выбора> |
<Приведение типа>[.<Разыменование поля>] | <Значение> |
<Выражение> <Бинарная операция> <Выражение> | <Унарная операция> <Выражение> | ( <Выражение> )

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

Выражения в списке полей выборки, в предложениях ИМЕЮЩИЕ, ИТОГИ, УПОРЯДОЧИТЬ ПО могут быть агрегатными функциями.

Выражение может быть функцией языка запросов. Могут использоваться операции выбора, и операции приведения типа значения.

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

Ограничения:
Максимальная длина цепочки операций одного приоритета не должна превышать 2048, например: v1 + v2 + v3 + ... + v2048.
Максимальное количество вложенных друг в друга операций разного приоритета, включая скобки, не должно превышать 2048.

Практические примеры

Унарные знаки, константы и параметры: проверить знак своей денежной поправки

Один запрос без источника вычисляет 13 полей из своих констант и четырёх параметров. Поправки 5, -5 и 0 показывают унарный плюс, унарный минус и различие отрицания суммы в скобках от отрицания одного слагаемого.

Где и как запускать

Полный серверный общий модуль учебной базы 8.5.1.1343; все значения и источники собственные. Локальные Python-проверки не являются выполнением BSL или запросов в 1С; код здесь не запускался.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. Полная функция расчёта и обе процедуры проверок включены. Допустимая поправка Число от -100 до 100 с точностью до сотых, название Строка длиной до 40.

  7. База фиксирована: 100.50. Дата параметра полностью задана: 06.10.2026 12:30:00; текущая дата компьютера не читается.

Процедура ВыполнитьПример() Экспорт
    Название = "Книга ""Азбука""";
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ""Учебный"" КАК Метка,
    |    &Название КАК Название,
    |    10.50 КАК ЧислоЛитерал,
    |    ИСТИНА КАК Включено,
    |    ЛОЖЬ КАК Выключено,
    |    ДАТАВРЕМЯ(2026, 10, 6, 12, 30, 0) КАК ДатаЛитерал,
    |    &ДатаПараметр КАК ДатаПараметр,
    |    &Поправка КАК СохранённаяПоправка,
    |    +&Поправка КАК Плюс,
    |    -&Поправка КАК Минус,
    |    &База + -&Поправка КАК ПослеСписания,
    |    -(&База + &Поправка) КАК ОтрицаниеСуммы,
    |    -&База + &Поправка КАК СуммаПослеОтрицания";
    Если Запрос.НайтиПараметры().Количество() <> 4 Тогда
        ВызватьИсключение "Ожидались четыре разных имени параметра";
    КонецЕсли;
    ПроверитьОтказПоправки(Запрос, "5", Название);
    ПроверитьОтказПоправки(Запрос, 101, Название);
    ПроверитьОтказПоправки(Запрос, 0.001, Название);
    Первый = ВыполнитьСвойРасчёт(Запрос, 5, Название);
    ПроверитьСвойРасчёт(Первый, Название, 5, 5, -5, 95.50, -105.50, -95.50);
    Второй = ВыполнитьСвойРасчёт(Запрос, -5, Название);
    ПроверитьСвойРасчёт(Второй, Название, -5, -5, 5, 105.50, -95.50, -105.50);
    Нулевой = ВыполнитьСвойРасчёт(Запрос, 0, Название);
    ПроверитьСвойРасчёт(Нулевой, Название, 0, 0, 0, 100.50, -100.50, -100.50);
    ПроверитьСвойРасчёт(Первый, Название, 5, 5, -5, 95.50, -105.50, -95.50);
    Сообщить(Запрос.Параметры.Поправка = 0);
КонецПроцедуры

Функция ВыполнитьСвойРасчёт(Запрос, Поправка, Название)
    Если ТипЗнч(Поправка) <> Тип("Число") Тогда
        ВызватьИсключение "Унарные операции нашего расчёта требуют число";
    КонецЕсли;
    Если Поправка < -100 Или Поправка > 100 Или Поправка * 100 <> Цел(Поправка * 100) Тогда
        ВызватьИсключение "Поправка должна быть от -100 до 100 с точностью до сотых";
    КонецЕсли;
    Если ТипЗнч(Название) <> Тип("Строка") Тогда
        ВызватьИсключение "Название нашего расчёта должно быть строкой";
    КонецЕсли;
    Если СтрДлина(Название) > 40 Тогда
        ВызватьИсключение "Название нашего расчёта длиннее 40 символов";
    КонецЕсли;
    Запрос.УстановитьПараметр("База", 100.50);
    Запрос.УстановитьПараметр("Поправка", Поправка);
    Запрос.УстановитьПараметр("Название", Название);
    Запрос.УстановитьПараметр("ДатаПараметр", Дата(2026, 10, 6, 12, 30, 0));
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Процедура ПроверитьОтказПоправки(Запрос, НевернаяПоправка, Название)
    Отклонено = Ложь;
    Попытка
        ВыполнитьСвойРасчёт(Запрос, НевернаяПоправка, Название);
    Исключение
        Отклонено = Истина;
    КонецПопытки;
    Если Не Отклонено Тогда
        ВызватьИсключение "Неверная поправка прошла подготовку нашего расчёта";
    КонецЕсли;
    Сообщить("Неверная поправка отклонена до установки параметров");
КонецПроцедуры

Процедура ПроверитьСвойРасчёт(Таблица, Название, Поправка, Плюс, Минус, ПослеСписания, ОтрицаниеСуммы, СуммаПослеОтрицания)
    Если Таблица.Количество() <> 1 Или Таблица.Колонки.Количество() <> 13 Тогда
        ВызватьИсключение "Ожидалась одна строка собственного расчёта из 13 полей";
    КонецЕсли;
    СтрокаРасчёта = Таблица[0];
    Если СтрокаРасчёта.Метка <> "Учебный" Или СтрокаРасчёта.Название <> Название
        Или СтрокаРасчёта.ЧислоЛитерал <> 10.50 Или СтрокаРасчёта.Включено <> Истина
        Или СтрокаРасчёта.Выключено <> Ложь Или СтрокаРасчёта.ДатаЛитерал <> Дата(2026, 10, 6, 12, 30, 0)
        Или СтрокаРасчёта.ДатаПараметр <> Дата(2026, 10, 6, 12, 30, 0)
        Или СтрокаРасчёта.СохранённаяПоправка <> Поправка Или СтрокаРасчёта.Плюс <> Плюс
        Или СтрокаРасчёта.Минус <> Минус Или СтрокаРасчёта.ПослеСписания <> ПослеСписания
        Или СтрокаРасчёта.ОтрицаниеСуммы <> ОтрицаниеСуммы
        Или СтрокаРасчёта.СуммаПослеОтрицания <> СуммаПослеОтрицания Тогда
        ВызватьИсключение "Полные значения собственного расчёта не совпали";
    КонецЕсли;
    Сообщить("Проверены все 13 полей собственного расчёта");
КонецПроцедуры

Разбор по шагам

  1. Весь текст — серверный общий модуль. Источника ИЗ и менеджера временных таблиц здесь нет: запрос возвращает одну вычисленную строку собственных значений.

  2. Строковый литерал Учебный, число 10.50, ИСТИНА, ЛОЖЬ и литерал ДАТАВРЕМЯ заданы в тексте. Название с кавычками и дата того же момента передаются отдельно параметрами.

  3. ДАТАВРЕМЯ в запросе задаёт год, месяц, день, час, минуту и секунду. В подготовке значения параметра используется отдельная функция встроенного языка Дата; синтаксисы не взаимозаменяемы.

  4. НайтиПараметры обнаруживает четыре имени: База,Поправка,Название,ДатаПараметр. Многократное использование Поправка не создаёт новые имена.

  5. Имена в УстановитьПараметр передаются без &, по правилам имён переменных; амперсанд используется для обращения внутри текста. Вызов УстановитьПараметр не делает произвольное значение подходящим для любой операции.

  6. Подготовительная функция принимает Число для Поправка. Строка "5" отклоняется, потому что унарные операции предназначены для ЧИСЛО; диапазон -100..100 и точность до сотых — дополнительные правила только этого урока.

  7. При Поправка=5 унарный + сохраняет 5, унарный - даёт -5, а 100.50 + -5 даёт ПослеСписания=95.50.

  8. ОтрицаниеСуммы вычисляет -(100.50+5)=-105.50; СуммаПослеОтрицания вычисляет -100.50+5=-95.50. Скобки задают область применения унарного минуса.

  9. При Поправка=-5 результаты Плюс=-5, Минус=5, ПослеСписания=105.50, ОтрицаниеСуммы=-95.50, СуммаПослеОтрицания=-105.50. Для нуля унарные знаки возвращают ноль.

  10. После трёх выполнений свойство Запрос.Параметры содержит текущую поправку 0. Первый результат по-прежнему хранит 5 и исходные суммы, что проверяют ещё раз.

  11. Для каждого выполнения проверить одну строку, 13 колонок и все 13 значений. Отрицательные опыты "5",101,0.001 завершаются до установки параметров и выполнения запроса.

Как проверить результат

  1. Четыре проверки полного состава 13 полей: поправки 5,-5,0 и повторная проверка исходного снимка 5; все завершаются без исключений.

  2. Для всех результатов метка Учебный, название Книга "Азбука", число 10.50, булевы Истина/Ложь и обе даты 06.10.2026 12:30:00 должны совпадать.

  3. Для поправки 5 ожидаемые пять вычислений 5,-5,95.50,-105.50,-95.50; для -5 — -5,5,105.50,-95.50,-105.50; для 0 — 0,0,100.50,-100.50,-100.50.

  4. Три сообщения об отклонённой поправке и последнее Истина для текущего параметра 0. Для границ -100 и 100 вручную замените вызов и соответствующие ожидаемые числа.

Ожидаемый результат

Полный модуль различает литералы и параметры, унарный и бинарный плюс, область отрицания и снимок результата. Числовые и строковые значения не склеиваются с текстом запроса.

На что обратить внимание

  1. Подпись Тип: Произвольный у метода УстановитьПараметр не отменяет требований конкретного выражения. Проверка типов для унарного знака нужна до вычисления.

  2. Для отрицательного входа унарный минус даёт положительный результат: -(-5)=5. Это не абсолютное значение для всех входов.

  3. Скобки здесь меняют только область арифметического выражения; они не создают подзапрос. Другие формы выражений — агрегатные функции, приведение типов и разыменование — не показаны этим уроком.

  4. Литералы NULL, НЕОПРЕДЕЛЕНО и ТИП перечислены общей нативной страницей, но не используются и не проверяются в данном расчёте.

  5. Нативная query_expressions.html ограничивает цепочки одного приоритета и вложения числом 2048; этот небольшой опыт не проверяет предельные размеры.

  6. Суммы учебные, без округления валют, налогов и правил конфигурации. Неверные имена параметров вроде 1Поправка и имена с пробелом не удовлетворяют нативному требованию именования переменных; такой вызов намеренно не включён в рабочую последовательность модуля.

  7. Python-тесты проверяют модель фиксированных значений Decimal и прямое совпадение нативных страниц установленной 8.5.1.1343. Выполнение BSL и запросов в 1С не проверялось.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.