Разработка и Конфигурация · 10 мин
Как присвоить значение переменной в 1С
Как присвоить переменную в 1С: оператор присваивания, типы данных, работа с реквизитами объектов, типичные ошибки и примеры кода на встроенном языке.
Присваивание значения переменной — базовая операция встроенного языка 1С:Предприятие, с которой начинается любой программный код. Переменная в 1С не требует предварительного объявления типа: достаточно указать имя, поставить знак равенства и записать значение справа. Тип переменной определяется автоматически в момент присваивания и может меняться в ходе выполнения модуля.
Несмотря на простоту синтаксиса, у начинающих разработчиков регулярно возникают ошибки: путаница между присваиванием и сравнением, попытка присвоить значение несуществующему реквизиту, потеря данных из-за несовпадения типов. Ниже разобраны все основные сценарии — от простого присваивания литерала до работы с реквизитами объектов и параметрами процедур.
Базовый синтаксис присваивания
Оператор присваивания в 1С выглядит так: слева — имя переменной, затем знак равенства, справа — значение или выражение. Строка обязательно завершается точкой с запятой. Пропуск точки с запятой — самая частая синтаксическая ошибка новичков, конфигуратор выдаст сообщение «Ожидается символ ';'».
ИмяКлиента = "ООО Ромашка";
Количество = 10;
Цена = 1500.50;
ДатаОтгрузки = '20260115';
Активен = Истина;
Имена переменных могут содержать русские и латинские буквы, цифры и знак подчёркивания, но не могут начинаться с цифры. Регистр букв значения не имеет: переменные Сумма и сумма — это одна и та же переменная. Тем не менее принято придерживаться единого стиля написания, чтобы код был читаемым.
Ключевые слова языка (Если, Тогда, Функция, Процедура и другие) нельзя использовать как имена переменных. Пробелы внутри имени недопустимы — вместо них используйте подчёркивание или «верблюжью» нотацию: СуммаДокумента, Дата_Оплаты.
Какие значения можно присваивать
Встроенный язык 1С поддерживает несколько примитивных типов, которые чаще всего присваиваются переменным. Строки заключаются в двойные кавычки, числа пишутся без кавычек с точкой в качестве разделителя дробной части, даты — в одинарных кавычках в формате ГГГГММДД, булевы значения — словами Истина и Ложь.
| Тип | Пример присваивания | Особенности |
|---|---|---|
| Строка | Текст = "Привет"; | Кавычки внутри строки удваиваются |
| Число | Сумма = 1250.75; | Разделитель дробной части — точка |
| Дата | Дата = '20260301'; | Одинарные кавычки, формат ГГГГММДД |
| Булево | Флаг = Истина; | Только Истина или Ложь |
| Неопределено | Х = Неопределено; | Отсутствие значения |
Особое значение Неопределено означает, что переменной не присвоено никакого осмысленного значения. Оно часто встречается в параметрах по умолчанию и при проверке результата функций. Не путайте его с пустой строкой или нулём — это разные значения, и сравнение Неопределено = "" вернёт Ложь.
Переменной можно присваивать не только литералы, но и результаты выражений, обращения к функциям и значения других переменных: Итого = Количество * Цена; или ТекущаяДата = ТекущаяДатаСеанса();. Выражение справа вычисляется полностью, и только потом результат записывается в переменную.
Объявление переменных через Перем
В модулях 1С переменные можно объявлять явно с помощью ключевого слова Перем. Это обязательно для переменных уровня модуля, которые должны быть доступны во всех процедурах и функциях модуля, а также для экспортных переменных, видимых из других модулей.
Перем СчетчикОпераций; // переменная модуля
Перем ТекущийПользователь Экспорт; // видна извне
Процедура РассчитатьИтог()
Перем ЛокальнаяСумма; // доступна только внутри процедуры
ЛокальнаяСумма = 100;
КонецПроцедуры
Внутри процедур и функций объявление через Перем необязательно: переменная создаётся автоматически при первом присваивании. Однако явное объявление считается хорошим тоном — оно защищает от опечаток. Если включена проверка модулей, конфигуратор предупредит об использовании необъявленных имён.
Присваивание реквизитам объектов и данных формы
На практике чаще всего приходится присваивать значения не локальным переменным, а реквизитам объектов конфигурации — документов, справочников, записей регистров. Синтаксис тот же, но слева стоит обращение через точку к реквизиту объекта.
НовыйДок = Документы.РеализацияТоваров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Комментарий = "Создан программно";
НовыйДок.Записать();
Критически важный момент: присваивание значения реквизиту объекта не сохраняет его в базу данных. Изменения фиксируются только после вызова метода Записать(). Если забыть записать объект, все присвоенные значения будут потеряны при завершении кода.
При работе с управляемой формой данные хранятся в реквизитах формы, и обращение к ним идёт через контекст формы: Объект.Сумма = 100; — здесь Объект — основной реквизит формы, связанный с данными документа. Изменения в форме попадут в базу только при записи объекта из формы или программно.
Присваивание через параметры процедур и функций
Передача значений между процедурами — частый сценарий, где присваивание работает неочевидно. По умолчанию параметры передаются по ссылке: если внутри процедуры присвоить параметру новое значение, оно изменится и в вызывающем коде. Ключевое слово Знач перед параметром меняет поведение — передаётся копия, и исходная переменная остаётся нетронутой.
Процедура Увеличить(Число)
Число = Число + 1; // изменит переменную вызывающего кода
КонецПроцедуры
Процедура УвеличитьКопию(Знач Число)
Число = Число + 1; // исходная переменная не изменится
КонецПроцедуры
Возврат значения из функции — тоже форма присваивания: оператор Возврат Выражение; передаёт результат в точку вызова, где его обычно сразу присваивают переменной: Результат = РассчитатьСкидку(Сумма);. Если функция завершилась без Возврата, переменной будет присвоено Неопределено.
Проверка результата и отладка присваивания
Убедиться, что переменной присвоено ожидаемое значение, проще всего через отладчик конфигуратора. Установите точку останова на строке после присваивания, запустите отладку и посмотрите значение в табло или через «Вычислить выражение» (Shift+F9). Там же виден фактический тип значения.
Для быстрой проверки без отладчика используйте Сообщить() или ТипЗнч():
Сообщить("Сумма = " + Сумма + ", тип: " + ТипЗнч(Сумма));
Проверяйте не только само значение, но и тип: число 100 и строка "100" выглядят одинаково в сообщении, но ведут себя по-разному в сравнениях и арифметике. Для явного преобразования типов используйте функции Число(), Строка(), Дата().
Как проверить результат
Совпадает с ожидаемым значением и типом
Неопределено или тип отличается от ожидаемого
После Записать() данные видны в базе
Реквизит присвоен, но Записать() не вызван
Каждый оператор завершён точкой с запятой
Конфигуратор сообщает о синтаксической ошибке
Типичные ошибки при присваивании
Первая и самая массовая ошибка — использование одиночного «=» там, где нужно сравнение, и наоборот. В 1С один и тот же символ «=» служит и для присваивания, и для сравнения, поэтому компилятор не всегда может распознать ошибку: Если Х = 5 Тогда — корректное сравнение, а Х = 5; — присваивание. Контекст определяет смысл.
Вторая группа ошибок связана с типами: присваивание строки реквизиту числового типа, попытка сложить число со строкой, присваивание ссылки реквизиту примитивного типа. При несовпадении типов реквизитов объектов платформа либо выполнит преобразование, либо выдаст ошибку исполнения — поведение зависит от конкретной пары типов.
Третья типичная ситуация — обращение к несуществующему реквизиту объекта. Код Док.НесуществующийРеквизит = 1; вызовет ошибку «Поле объекта не обнаружено». Перед присваиванием убедитесь, что реквизит есть в метаданных объекта и имя написано точно.
Что важно запомнить
Присваивание выполняется оператором «=» с точкой с запятой в конце, тип переменной определяется автоматически. Изменения реквизитов объектов сохраняются в базу только после Записать(). Для контроля используйте отладчик и проверяйте тип значения через ТипЗнч().
Частые вопросы
Можно ли присвоить переменной значение другого типа повторно?
Да. Встроенный язык 1С имеет динамическую типизацию: одной переменной можно последовательно присвоить число, затем строку, затем дату. Тип каждый раз будет соответствовать последнему присвоенному значению. Однако в реквизитах объектов конфигурации тип фиксирован метаданными, и присвоить произвольный тип не получится.
Чем отличается присваивание в запросе от присваивания в коде?
В языке запросов 1С нет оператора присваивания переменным — там значения вычисляются в полях выборки и передаются через параметры: Запрос.УстановитьПараметр("Сумма", 100);. Результат запроса выгружается в таблицу значений, и уже из неё в коде значения присваиваются обычным оператором «=».
Как присвоить значение по умолчанию, если переменная пустая?
Используйте условный оператор или конструкцию с проверкой: Если Не ЗначениеЗаполнено(Переменная) Тогда Переменная = ЗначениеПоУмолчанию; КонецЕсли;. Функция ЗначениеЗаполнено() корректно обрабатывает пустые строки, нулевые даты, Неопределено и пустые ссылки.
Почему после присваивания реквизиту формы значение не видно в базе?
Реквизит формы живёт только в памяти клиентского сеанса. Чтобы данные попали в информационную базу, объект нужно записать — кнопкой «Записать» в форме или программным вызовом метода записи. До записи все присвоенные значения существуют только в контексте открытой формы.
Можно ли присвоить одно значение сразу нескольким переменным?
Цепочного присваивания вида А = Б = 5; во встроенном языке 1С нет — такая конструкция вызовет ошибку. Каждой переменной значение присваивается отдельным оператором: А = 5; Б = 5; или Б = 5; А = Б;.