Начинающие разработчики платформы 1С:Предприятие 8 часто сталкиваются с термином"литерал", не до конца понимая его практическое значение в контексте написания кода. По сути, литерал — это константное значение, которое программист вписывает непосредственно в исходный текст программы, а не вычисляет в процессе выполнения. Понимание того, как интерпретатор платформы распознает эти значения, критически важно для грамотного написания запросов и процедур.

В отличие от переменных, содержимое которых может изменяться в ходе работы алгоритма, литералы в 1С остаются неизменными и служат"сырыми" данными для операций. Например, когда вы пишете Сумма = 100 + 200, числа 100 и 200 являются литералами. Система должна точно знать, к какому типу данных относится этот набор символов, чтобы корректно выделить память и применить нужные методы обработки.

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

Строковые литералы и работа с текстом

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

Однако работа со строками имеет свои нюансы, особенно когда сам текст содержит специальные символы. Если вам необходимо включить двойную кавычку внутрь строкового литерала, её нужно экранировать. В 1С для этого используется удвоение символа кавычки. Это отличает платформу от многих других языков программирования, где используется обратный слэш.

Рассмотрим пример корректного объявления строки с кавычкой внутри:

ТекстСообщения ="Он сказал:""Привет"" и ушел";

В данном случае строковый литерал будет содержать текст: Он сказал:"Привет" и ушел. Интерпретатор понимает пару кавычек как один отображаемый символ, а не как конец строки.

⚠️ Внимание: Использование одинарных кавычек для обозначения строк в 1С недопустимо. Система воспримет их как часть текста или выдаст ошибку, если они не экранированы корректно в контексте SQL-подобных конструкций.

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

💡

При передаче длинных строк в параметры запроса лучше использовать объект"Строка" явно, чем полагаться на автоматическое определение типа литерала.

Числовые константы и форматы записи

Числовые литералы представляют собой последовательность цифр, возможно, содержащую знак минус и десятичную точку. Важно отметить, что в 1С разделителем целой и дробной части является именно точка, а не запятая, как это принято в русском языке при обычном письме. Это строгое требование синтаксиса.

Платформа поддерживает запись чисел в различных форматах, включая целые числа и числа с плавающей точкой. При этом ведущие нули игнорируются, а пробелы внутри числа недопустимы. Разработчик должен быть внимателен при копировании данных из отчетов или Excel, где разделители могут отличаться.

  • 🔢 Целочисленные значения: 150, -42, 0
  • 🔢 Дробные значения: 3.14, -0.05, 100.00
  • 🔢 Научная нотация (в некоторых контекстах): 1.5E+10

При работе с денежными суммами и количеством товаров тип Число с фиксированной точностью, однако в виде литерала в коде вы просто пишете числовое значение. Система сама определит необходимый тип данных в зависимости от контекста использования, например, при присваивании переменной типа Число(15, 2).

Существует распространенная ошибка, когда разработчики пытаются использовать разделители тысяч (пробелы) внутри литерала для читаемости. Код Сумма = 1 000 000 вызовет ошибку компиляции. Числовой литерал должен быть непрерывной последовательностью символов.

💡

Всегда используйте точку в качестве десятичного разделителя в коде 1С, независимо от региональных настроек операциной системы пользователя.

Специфика представления дат и времени

Литералы даты и времени являются одной из самых специфических особенностей платформы 1С:Предприятие. В отличие от многих языков, где даты часто представляются строками или объектами, в 1С существует специальный синтаксический сахар для их объявления непосредственно в коде. Это упрощает чтение скриптов и снижает вероятность ошибок парсинга.

Для обозначения даты используется символ решетки #, который окружает значение с двух сторон. Внутри решеток указывается дата в формате ГГГГММДД или ГГГГММДДЧЧММСС. Разделители между компонентами даты (точка, дефис, слэш) допускаются для улучшения читаемости, но не являются обязательными.

Формат записи Пример литерала Описание
Полная дата #20231025# 25 октября 2023 года, время 00:00:00
Дата с разделителями #2023.10.25# Аналогично, более читаемый вариант
Дата и время #20231025143000# 25 октября 2023, 14:30:00
Только время #143000# Текущая дата, время 14:30:00

Если в литерале указано только время, система автоматически подставит текущую дату сеанса. Если указано только число (например, #25#), это будет интерпретировано как день текущего месяца и года. Такая гибкость позволяет быстро фильтровать данные в запросах без сложных функций преобразования.

Однако стоит быть осторожным с двухзначным форматом года. Хотя платформа обычно корректно обрабатывает сокращенные записи, явное указание четырех знаков года (YYYY) является лучшей практикой для избежания проблем с переходом столетий.

Что будет если указать несуществующую дату?

Если вы укажете литерал #20230230# (30 февраля), система при компиляции или выполнении выдаст ошибку"Неверный формат даты", так как такая дата не существует в календаре.

Булевы значения и неопределенность

Логические литералы в 1С представлены ключевыми словами Истина и Ложь. Они регистронезависимы, что означает, что вы можете писать их как ИСТИНА, истина или ИсТиНа — компилятор поймет их одинаково. Эти значения используются для управления потоком выполнения программы и фильтрации данных.

Особое место в системе типов занимает значение Неопределено (или Null в терминологии баз данных). Это специальный литерал, обозначающий отсутствие значения. Важно не путать его с нулем, пустой строкой или датой начала эпохи. Неопределено означает, что значение неизвестно или не установлено.

В условиях отбора запросов проверка на неопределенность требует особого синтаксиса. Нельзя использовать обычное сравнение на равенство. Вместо этого применяются конструкции ЕСТЬ NULL или НЕ ЕСТЬ NULL. Попытка сравнить поле с литералом Неопределено через знак"=" в запросе часто приводит к тому, что строки с пустыми значениями не попадают в выборку.

⚠️ Внимание: В встроенном языке использование оператора = для сравнения с Неопределено вернет Ложь, если переменная действительно не определена. Для проверки используйте функцию ЗначениеЗаполнено или явное сравнение в зависимости от версии платформы.

Использование булевых литералов делает код более читаемым по сравнению с использованием чисел 0 и 1. Явная запись Если Активен = Истина Тогда понятнее, чем Если Активен = 1 Тогда, хотя технически в некоторых контекстах они могут быть взаимозаменяемы.

Литералы в языке запросов 1С

Язык запросов 1С имеет свой собственный синтаксис работы с константами, который частично пересекается со встроенным языком, но имеет критические отличия. В тексте запроса строковые литералы также заключаются в кавычки, но экранирование работает иначе. Одиночная кавычка внутри строки запроса часто требует удвоения или использования специальных параметров.

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

Пример неправильной и правильной вставки даты:

// Плохо: конкатенация строк

Запрос.Текст ="ВЫБРАТЬ * ИЗ Таблица ГДЕ Дата = #" + Формат(Дата,"ЧЦ=4; ЧВ=2") +"#";

// Хорошо: использование параметров

Запрос.Текст ="ВЫБРАТЬ * ИЗ Таблица ГДЕ Дата = &Период";

Запрос.Параметры.Вставить("Период", Дата);

Использование параметров не только защищает от ошибок синтаксиса литералов, но и ускоряет выполнение запроса за счет кэширования плана выполнения.

📊 Как вы чаще всего передаете даты в запросы?
Через конкатенацию строк
Через параметры запроса
Через временные таблицы
Использую СКД

Распространенные ошибки и отладка

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

При отладке стоит обращать внимание на подсветку синтаксиса в редакторе кода. Если литерал не подсвечивается ожидаемым цветом (например, строка остается черной вместо синей), это верный признак того, что кавычки расставлены неверно или использованы недопустимые символы.

  • 🛑 Использование кириллических кавычек «» вместо английских""
  • 🛑 Лишние пробелы внутри числового литерала
  • 🛑 Отсутствие замыкающей решетки в дате #2023.01.01

Также стоит помнить о локализации. Хотя ключевые слова 1С можно писать на английском или русском языке, строковые литералы чувствительны к кодировке. При обмене данными с внешними системами могут возникать проблемы с отображением спецсимволов, если литерал содержит национальные алфавиты.

☑️ Чек-лист проверки литералов перед запуском

Выполнено: 0 / 5
Можно ли использовать переменные внутри строкового литерала?

Нет, строковый литерал — это статический текст. Если вам нужно вставить значение переменной внутрь строки, необходимо использовать оператор сложения + или функцию Формат для сборки итоговой строки. Например: "Привет," + ИмяСотрудника.

В чем разница между 0 и Неопределено в числовом поле?

0 — это конкретное числовое значение, равное нулю. Неопределено означает отсутствие значения. В отчетах и расчетах они ведут себя по-разному: участие в суммировании нуля меняет результат (не меняет сумму, но считается фактом наличия записи), а неопределенность обычно игнорируется или требует специальной обработки.

Почему дата #20230101# не равна #2023.01.01#?

На самом деле, эти литералы равны. Платформа 1С нормализует формат даты при компиляции. Разделители внутри решеток игнорируются при определении значения, поэтому оба варианта обозначают 1 января 2023 года. Разница лишь в визуальном представлении в коде.

Как записать очень большое число в литерале?

В 1С нет ограничения на количество цифр в литерале числа, кроме общих ограничений типа данных (до 30 знаков для типа Число). Вы можете написать число любой длины, главное — не использовать пробелы для группировки разрядов внутри литерала.