К статье
Практический материал

Разработка и Конфигурация · 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; вызовет ошибку «Поле объекта не обнаружено». Перед присваиванием убедитесь, что реквизит есть в метаданных объекта и имя написано точно.

Типичные ошибки
01
Пропуск точки с запятой — модуль не проходит синтаксическую проверку
02
Присваивание без Записать() — изменения объекта теряются и не попадают в базу
03
Несовпадение типов — строка вместо числа приводит к ошибке исполнения или неверным расчётам
04
Опечатка в имени реквизита — ошибка «Поле объекта не обнаружено» в момент выполнения
05
Ожидание, что параметр с Знач изменит исходную переменную — копия изменяется, оригинал нет
Итог

Что важно запомнить

Присваивание выполняется оператором «=» с точкой с запятой в конце, тип переменной определяется автоматически. Изменения реквизитов объектов сохраняются в базу только после Записать(). Для контроля используйте отладчик и проверяйте тип значения через ТипЗнч().

Частые вопросы

Можно ли присвоить переменной значение другого типа повторно?

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

Чем отличается присваивание в запросе от присваивания в коде?

В языке запросов 1С нет оператора присваивания переменным — там значения вычисляются в полях выборки и передаются через параметры: Запрос.УстановитьПараметр("Сумма", 100);. Результат запроса выгружается в таблицу значений, и уже из неё в коде значения присваиваются обычным оператором «=».

Как присвоить значение по умолчанию, если переменная пустая?

Используйте условный оператор или конструкцию с проверкой: Если Не ЗначениеЗаполнено(Переменная) Тогда Переменная = ЗначениеПоУмолчанию; КонецЕсли;. Функция ЗначениеЗаполнено() корректно обрабатывает пустые строки, нулевые даты, Неопределено и пустые ссылки.

Почему после присваивания реквизиту формы значение не видно в базе?

Реквизит формы живёт только в памяти клиентского сеанса. Чтобы данные попали в информационную базу, объект нужно записать — кнопкой «Записать» в форме или программным вызовом метода записи. До записи все присвоенные значения существуют только в контексте открытой формы.

Можно ли присвоить одно значение сразу нескольким переменным?

Цепочного присваивания вида А = Б = 5; во встроенном языке 1С нет — такая конструкция вызовет ошибку. Каждой переменной значение присваивается отдельным оператором: А = 5; Б = 5; или Б = 5; А = Б;.