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