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