Синтаксис и применение Комментарии в языке запросов в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
Комментарии в языке запросов
Текст запроса может включать комментарии. Комментарием считается часть строки, начинающаяся с последовательности символов // и продолжающаяся до конца строки:
// Это комментарий
При выполнении запроса комментарии игнорируются.
Практические примеры
Комментарии как лексические данные: проверить конец строки и четыре полных результата
Маркер из двух Unicode47 является данными согласованного испытания, не поясняющим исходным комментарием. Реальные тексты запросов отличают игнорируемый хвост от новой строки и от неизменяемого строкового параметра.
Где и как запускать
Полный серверный общий модуль УчебныйЯзык новой собственной пустой конфигурации УчебныеПравилаЗапросов85, платформа8.5.1.1343. BSL/запросы/1С здесь не запускались.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
Создайте НОВУЮ отдельную пустую учебную базу8.5.1.1343, не копию приложения. Имя конфигурации УчебныеПравилаЗапросов85, совместимость отключена. Нет справочников, документов, перечислений, регистров, планов, последовательностей, бизнес-процессов, общих реквизитов, подписок, регламентных заданий, внешних источников или расширений базы/сеанса. Единственный сеанс; ошибки прав не считаются результатом.
Все модули сеанса/приложения, остальные обработчики и формы вручную пусты. Создайте только свой общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские/внешнее соединение выключены; повторное использование=НеИспользовать. Полный основной текст заменяет этот модуль целиком, все helpers рядом с экспортной точкой, не внутри.
Сначала подготовьте метаданные и вставьте ПОЛНЫЙ серверный модуль. Затем в новом Конфигураторе сохраните конфигурацию и нажмите F7: обновить конфигурацию базы данных. Обновление выполняйте вне транзакции, только для своего нового пустого стенда; дождитесь окончания. До F7 проверка Метаданные.Имя может не отражать подготовленную конфигурацию. После подготовки отдельной формы начните свежий сеанс 1С и только тогда нажмите Выполнить. Здесь Конфигуратор/F7/1С не выполнялись.
Новая собственная внешняя обработка УчебныйПускЛексическихДанных85 → управляемая Форма → команда Выполнить, одноимённое действие и кнопка. Остальные модули пусты. Полный отдельный модуль формы:
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственные полные проверки завершены");
КонецПроцедуры&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныйЯзык.ВыполнитьПример();
КонецПроцедурыGuard сверяет пустой состав метаданных, все3read-only источника расширений и отсутствие изменений расширениями, запрещает активную чужую транзакцию. Текст пустых модулей — явное ручное условие, не результат недоступного BSL-чтения. Хранилище данного урока: четыре скалярных запроса, без ВТ/менеджера. Никаких прикладных записей/чтения объектов/транзакций.
Python — только фиксированная модель данных/ожиданий и статические проверки. Direct HBK подтверждает текст установленной справки, но не исполнение BSL/запросов или маршрутизацию Дата акселератора. Полные результаты нужно вручную проверить в новом своём стенде.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
ПроверитьСвоеЦелое(0);
ПроверитьСвоеЦелое(9999);
ПроверитьОтказСвоегоЦелого(Неопределено);
ПроверитьОтказСвоегоЦелого(Null);
ПроверитьОтказСвоегоЦелого(Истина);
ПроверитьОтказСвоегоЦелого("7");
ПроверитьОтказСвоегоЦелого(-1);
ПроверитьОтказСвоегоЦелого(10000);
ПроверитьОтказСвоегоЦелого(0.5);
Число = 7;
Маркер = Символ(47) + Символ(47);
Перевод = Символы.ПС;
Метка = Маркер + "own";
ПроверитьСвоиЛексическиеДанные(Маркер, Перевод, Метка);
Базовый = "ВЫБРАТЬ &Число КАК Результат, &Метка КАК Метка";
Хвост = "ВЫБРАТЬ &Число " + Маркер + " +1000" + Перевод + "КАК Результат, &Метка КАК Метка";
СледующаяСтрока = "ВЫБРАТЬ &Число " + Маркер + " +1000" + Перевод + "+3 КАК Результат, &Метка КАК Метка";
БезМаркера = "ВЫБРАТЬ &Число +1000" + Перевод + "+3 КАК Результат, &Метка КАК Метка";
ПроверитьСвойЛексическийЗапрос(Базовый, Число, Метка, 7);
ПроверитьСвойЛексическийЗапрос(Хвост, Число, Метка, 7);
ПроверитьСвойЛексическийЗапрос(СледующаяСтрока, Число, Метка, 10);
ПроверитьСвойЛексическийЗапрос(БезМаркера, Число, Метка, 1010);
ПроверитьСвоиЛексическиеДанные(Маркер, Перевод, Метка);
Если ТипЗнч(Число) <> Тип("Число") Или Число <> 7 Тогда
ВызватьИсключение "Своё числовое исходное значение изменилось";
КонецЕсли;
ПроверитьСвойПустойСтенд();
Сообщить("Четыре полных результата7/7/10/1010; строковая метка и Unicode данные сохранены");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция СовпадаетСвояСтрока(СтрокаТаблицы, Ожидание, Поля, Колонки)
Для Каждого Имя Из Поля Цикл
Если Не Ожидание.Свойство(Имя, Значение) Тогда
ВызватьИсключение "Нет собственного ожидания поля " + Имя;
КонецЕсли;
Факт = СтрокаТаблицы.Получить(Колонки.Индекс(Колонки.Найти(Имя)));
Если ТипЗнч(Факт) <> ТипЗнч(Значение) Тогда
Возврат Ложь;
КонецЕсли;
Если Факт <> Значение Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Процедура ПроверитьСвоюПолнуюТаблицу(Таблица, Ожидания, Поля, Порядок)
Если ТипЗнч(Таблица) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Нужна своя полная ТаблицаЗначений";
КонецЕсли;
Если Таблица.Колонки.Количество() <> Поля.Количество() Или Таблица.Количество() <> Ожидания.Количество() Тогда
ВызватьИсключение "Не совпали полные размеры своего результата";
КонецЕсли;
Для Каждого Имя Из Поля Цикл
Если Таблица.Колонки.Найти(Имя) = Неопределено Тогда
ВызватьИсключение "Не найдена своя колонка " + Имя;
КонецЕсли;
КонецЦикла;
Использованные = Новый Массив;
Если Ожидания.Количество() > 0 Тогда
Для Индекс = 0 По Ожидания.Количество() - 1 Цикл
Если Порядок Тогда
Если Не СовпадаетСвояСтрока(Таблица[Индекс], Ожидания[Индекс], Поля, Таблица.Колонки) Тогда
ВызватьИсключение "Не совпали все типы, значения или порядок своей строки";
КонецЕсли;
Иначе
Найден = -1;
Для Кандидат = 0 По Ожидания.Количество() - 1 Цикл
Если Использованные.Найти(Кандидат) = Неопределено Тогда
Если СовпадаетСвояСтрока(Таблица[Индекс], Ожидания[Кандидат], Поля, Таблица.Колонки) Тогда
Найден = Кандидат;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Найден = -1 Тогда
ВызватьИсключение "Не совпал полный unordered состав с кратностями";
КонецЕсли;
Использованные.Добавить(Найден);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоеЦелое(Количество)
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Нужно своё Число, не Null, Неопределено или Булево";
КонецЕсли;
Если Количество < 0 Или Количество > 9999 Или Количество <> Цел(Количество) Тогда
ВызватьИсключение "Нужно собственное целое0..9999";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьОтказСвоегоЦелого(Количество)
Отклонён = Ложь;
Попытка
ПроверитьСвоеЦелое(Количество);
Исключение
Отклонён = Истина;
Сообщить("Ручной опыт: неверное своё число отклонено. " + ОписаниеОшибки());
КонецПопытки;
Если Не Отклонён Тогда
ВызватьИсключение "Ожидался отказ своего числового валидатора";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоиЛексическиеДанные(Маркер, Перевод, Метка)
Если ТипЗнч(Маркер) <> Тип("Строка") Или ТипЗнч(Перевод) <> Тип("Строка") Или ТипЗнч(Метка) <> Тип("Строка") Тогда
ВызватьИсключение "Все свои лексические данные должны иметь тип Строка";
КонецЕсли;
Если СтрДлина(Маркер) <> 2 Или СтрДлина(Перевод) <> 1 Тогда
ВызватьИсключение "Нужны ровно два символа маркера и один перевод строки";
КонецЕсли;
Если КодСимвола(Маркер, 1) <> 47 Или КодСимвола(Маркер, 2) <> 47 Или КодСимвола(Перевод) <> 10
Или Метка <> Маркер + "own" Тогда
ВызватьИсключение "Не совпал полный собственный Unicode fixture";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойЛексическийЗапрос(Текст, Число, Метка, ОжидаемоеЧисло)
Если ТипЗнч(Текст) <> Тип("Строка") Или ТипЗнч(Метка) <> Тип("Строка") Тогда
ВызватьИсключение "Свои текст и метка должны иметь тип Строка";
КонецЕсли;
ПроверитьСвоеЦелое(Число);
ПроверитьСвоеЦелое(ОжидаемоеЧисло);
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("Число", Число);
Запрос.УстановитьПараметр("Метка", Метка);
Ожидания = Новый Массив;
Ожидания.Добавить(Новый Структура("Результат,Метка", ОжидаемоеЧисло, Метка));
Поля = Новый Массив;
Поля.Добавить("Результат");
Поля.Добавить("Метка");
ПроверитьСвоюПолнуюТаблицу(Запрос.Выполнить().Выгрузить(), Ожидания, Поля, Истина);
КонецПроцедурыУчебныйПускЛексическихДанных85.Форма
Собственная внешняя обработка УчебныйПускЛексическихДанных85 → управляемая Форма → Модуль
Отдельный полный клиентский/серверный модуль формы; серверный вызов без контекста своего общего модуля. Не смешивать с основным BSL.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственные полные проверки завершены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныйЯзык.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
В новом пустом стенде сначала подготовить метаданные, вставить весь серверный модуль и подготовить отдельную форму. Затем сохранить и обновить конфигурацию базы данных F7 вне транзакции; начать свежий сеанс и нажать Выполнить. Guard сверяет8.5.1.1343/имя/пустые метаданные/расширения/отсутствие чужой транзакции. ВТ и их менеджера здесь нет.
Число7 — собственный фиксированный числовой параметр. До опытов две границы0/9999 принимаются, Неопределено/Null/Булево/строка/отрицательное/10000/дробное отвергаются собственным валидатором, не ошибкой native комментариев.
Символ(47) возвращает строковый Unicode символ. Собрать его дважды как явно названный fixture; Перевод=Символы.ПС. Проверить типы Строка, длины2/1 и коды47/47/10. Код не добавляет новых поясняющих комментариев или doc-блоков.
Метка=маркер+own передаётся параметром &Метка, а не конкатенируется как инструкция. Каждый запрос возвращает её полностью в отдельной строковой колонке; маркер в данных параметра не меняет арифметику.
Базовый полный запрос без ИЗ вычисляет7 и метку. Проверить ровно одну строку, две именованные колонки Результат/Метка, точные типы Число/Строка и значения.
Во втором реальном тексте после &Число стоит маркер и хвост+1000; КАК Результат находится уже на следующей строке. Native игнорирует хвост до конца строки: полный числовой результат7, метка прежняя.
В третьем тексте после перевода строки есть+3. Комментарий на него не распространяется; полный результат10 с прежней меткой. Это проверка границы строки, не удаления всего остатка запроса.
Контроль без маркера содержит7+1000, а после перевода+3. Полный результат1010 подтверждает, что второй/третий опыт действительно различаются лексически.
Никакой catch не оборачивает положительные запросы/полные проверки. Все четыре выполнения используют реальные Запрос.Выполнить и общий полный checker; результаты не выдаются из фиктивного getter.
После четырёх запросов снова проверить полный Unicode fixture и тип/значение исходного7. Объяснение правила — в prose, а согласованный маркер в собранных текстах — именно объект испытания, не обход AGENTS.
Как проверить результат
Четыре независимых полных результата: (7,маркер+own),(7,маркер+own),(10,маркер+own),(1010,маркер+own); типы Число/Строка, ровно2колонки/1строка каждый.
Полный исходный fixture до/после: Число7, маркер Строка длина2 с кодами47/47, перевод Строка длина1 код10, метка неизменна.
Семь неверных числовых вводов, включая отдельные Null/Неопределено/Булево, отклоняются до запросов. Границы0/9999 проходят.
Нет ВТ, менеджера, прикладных записей, транзакции или поясняющих исходных комментариев. Guard/положительные проверки не скрываются catch.
Ожидаемый результат
Нативное правило комментариев проверяется четырьмя полными лексическими испытаниями и контрастом с неизменяемыми параметрическими данными.
На что обратить внимание
Только новый собственный пустой стенд. Прикладные объекты и реальные рабочие данные не нужны; здесь никакой BSL/1С/БД/F7 не исполнялись.
Python моделирует только фиксированные данные и собственные ожидания. Статические/native проверки не доказывают исполнение запроса в1С.
Все полные типы/значения/кратности и требуемый порядок проверяются отдельно; количество или одинаковая сумма не заменяют полный состав.
ДЛЯ ИЗМЕНЕНИЯ (FORUPDATEStatement), РАЗРЕШЕННЫЕ (KeyWordsALLOWED) и РазмерХранимыхДанных (StoredDataSize) разобраны в самостоятельных уроках с собственными сеансами, правами и данными. Этот урок общей грамматики не заменяет их отдельные задачи.
Это явно согласованный лексический fixture, а не добавление поясняющих комментариев к исходникам и не маскировка обхода AGENTS.
Комментарий заканчивается в конце строки. Если перенести алиас внутрь игнорируемого хвоста, его имя уже не гарантируется; такого неподтверждённого автоматического имени урок не обещает.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.