Разработка и Конфигурация · 9 мин
Как реквизиту присвоить значение в 1С
Как присвоить значение реквизиту объекта в 1С: в форме, в коде, через заполнение по умолчанию и обмен данными. Примеры на встроенном языке и типичные ошибки.
Присвоение значения реквизиту — базовая операция в 1С, с которой сталкиваются и пользователи, и разработчики. Реквизитом называется поле объекта конфигурации: справочника, документа, обработки или регистра. В зависимости от того, где выполняется работа — в форме, в программном коде, при обмене данными или при настройке значений по умолчанию, — способ присвоения отличается.
Главное различие — между интерактивным вводом (пользователь заполняет поле в форме) и программным присвоением (значение устанавливается кодом на встроенном языке). Второй случай требует понимания, в каком контексте выполняется код: на клиенте или на сервере, в модуле объекта или в модуле формы. От этого зависит, будет ли запись сохранена и не потеряется ли значение при закрытии формы.
Ниже разобраны основные сценарии: присвоение в коде, работа с реквизитами формы, значения по умолчанию, заполнение табличных частей и особенности ссылочных типов. Для каждого случая приведены примеры и ограничения.
Что такое реквизит и какие типы значений он принимает
Реквизит — это именованное поле объекта конфигурации с заданным типом данных. Тип определяет, какие значения допустимы: строка, число, дата, булево, ссылка на другой объект, перечисление. Попытка присвоить значение несовместимого типа приведёт либо к ошибке исполнения, либо к неявному преобразованию, которое не всегда даёт ожидаемый результат.
Узнать тип реквизита можно в конфигураторе: откройте объект (например, справочник «Номенклатура»), перейдите на вкладку «Данные» и посмотрите колонку «Тип» у нужного реквизита. Если реквизит составного типа (например, «строка или ссылка»), присваиваемое значение должно соответствовать хотя бы одному из перечисленных типов.
Особый случай — реквизиты ссылочного типа. Им нельзя присвоить строку с наименованием: нужна именно ссылка на существующий объект. Получить её можно поиском по коду, наименованию или через создание нового элемента.
Как присвоить значение реквизиту в программном коде
Базовый синтаксис — оператор присваивания через точку от переменной объекта. Сначала объект получают (создают новый или находят существующий), затем присваивают значения реквизитам и записывают объект. Без вызова метода Записать() изменения останутся только в памяти и не попадут в базу данных.
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Бумага А4";
НовыйЭлемент.Артикул = "A4-80";
НовыйЭлемент.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
НовыйЭлемент.Записать();
Для существующего объекта сначала получают ссылку, затем вызывают метод ПолучитьОбъект() — только после этого реквизиты доступны для изменения. Работа напрямую со ссылкой позволяет читать реквизиты, но не изменять их.
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Не Ссылка.Пустая() Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Проверен";
Объект.Записать();
КонецЕсли;
Присвоение значения ссылочному реквизиту
Ссылочному реквизиту присваивают результат поиска или создания объекта. Типичная ошибка — присвоить строку вместо ссылки: код выполнится с ошибкой несоответствия типов либо запишет пустое значение.
ДокОбъект.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");
Присвоение значения реквизиту формы
Реквизиты формы — это данные, которые существуют только в открытой форме и не сохраняются в базу напрямую. В модуле формы к ним обращаются по имени, как к обычным переменным. Присвоение выполняется тем же оператором «=».
&НаКлиенте
Процедура УстановитьКоличество(Команда)
Количество = 1;
КонецПроцедуры
Если форма связана с объектом (например, форма документа), данные объекта доступны через свойство Объект. Присвоение выглядит как Объект.Реквизит = Значение, а сохранение произойдёт при записи формы — методом Записать() или по кнопке «Записать» интерфейса.
Учитывайте контекст исполнения: в клиентских процедурах (директива &НаКлиенте) недоступны запросы и прямое обращение к данным базы. Если для вычисления значения нужны данные из базы, присвоение выполняют в серверной процедуре (&НаСервере), а результат возвращают на клиент.
Значение по умолчанию через конфигуратор
Если реквизит при создании объекта должен получать стандартное значение без написания кода, используйте свойство «Значение заполнения» в конфигураторе. Откройте палитру свойств реквизита, найдите это свойство и укажите константу подходящего типа: число, строку, дату или ссылку на предопределённый элемент.
Для более гибкой логики — например, подстановки текущего пользователя или склада из настроек — используется обработчик «Обработка заполнения» в модуле объекта. Он срабатывает при создании объекта и при стандартной команде «Заполнить».
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
КонецПроцедуры
В типовых конфигурациях подстановка текущего пользователя обычно выполняется через функциональность БСП (библиотеки стандартных подсистем), а не прямым обращением к имени пользователя. При доработке типовой конфигурации ориентируйтесь на существующие механизмы, чтобы не конфликтовать с обновлениями.
Заполнение реквизитов табличной части
Табличная часть — это коллекция строк внутри объекта, у каждой строки свои реквизиты. Присвоение выполняется после добавления строки методом Добавить(): возвращается объект строки, реквизитам которого и присваиваются значения.
СтрокаТовара = ДокОбъект.Товары.Добавить();
СтрокаТовара.Номенклатура = НайденнаяСсылка;
СтрокаТовара.Количество = 5;
СтрокаТовара.Цена = 1200;
Для изменения существующих строк перебирайте табличную часть в цикле «Для Каждого». Изменения вступят в силу после записи объекта-владельца: табличная часть не записывается отдельно.
- 1Получите объект: создайте новый или найдите существующий и вызовите ПолучитьОбъект()
- 2Присвойте значения реквизитам оператором «=» с учётом типов
- 3Заполните табличные части через Добавить() и присвоение реквизитам строк
- 4Вызовите Записать() для сохранения в базе
- 5Откройте объект в пользовательском режиме и проверьте результат
Проверка результата и типичные ошибки
После присвоения убедитесь, что значение действительно сохранилось. Откройте объект в режиме предприятия и проверьте поле визуально. Программно значение можно проверить, перечитав объект из базы или выполнив запрос по изменённому реквизиту.
Как проверить результат
Поле показывает присвоенное значение после повторного открытия
Поле пустое — объект не был записан
Ссылочный реквизит содержит ссылку, числовой — число
Ошибка несоответствия типов при выполнении кода
Строки видны после записи объекта-владельца
Строки пропали — объект не записан после изменений
Отдельная группа проблем — обмены данными. Если реквизит заполняется правилами конвертации, ручное или программное изменение может быть перезаписано при следующей синхронизации. Перед доработкой проверьте, не участвует ли реквизит в планах обмена.
Частые вопросы
Как присвоить пустое значение реквизиту?
Для ссылочных реквизитов используйте пустую ссылку: Справочники.Номенклатура.ПустаяСсылка(). Для строки — пустую строку "", для числа — 0, для даты — '00010101'. Универсальный вариант — Неопределено, если тип реквизита его допускает.
Почему присвоенное значение не сохраняется?
Чаще всего не вызван метод Записать() после присвоения. Также проверьте, что изменяется объект, полученный через ПолучитьОбъект(), а не сама ссылка, и что запись не блокируется правами доступа или проверками заполнения.
Как присвоить значение реквизиту документа при его создании из другого документа?
Используйте обработчик ОбработкаЗаполнения в модуле объекта: параметр ДанныеЗаполнения содержит ссылку на документ-основание, реквизиты которого можно прочитать и перенести в новый документ.
Можно ли присвоить значение реквизиту без прав на изменение объекта?
Нет, в пользовательском режиме права проверяются при записи. В коде можно использовать УстановитьПривилегированныйРежим(Истина), но это обход безопасности — применяйте его осознанно и только там, где это оправдано логикой задачи.
Как присвоить значение реквизиту сразу у многих объектов?
Выполните запрос или выборку по нужным объектам, в цикле получайте каждый объект через ПолучитьОбъект(), присваивайте значение и записывайте. Для больших объёмов делайте это пакетами в транзакции и обязательно на копии базы.
Чем присвоение отличается для реквизита объекта и реквизита формы?
Реквизит объекта хранится в базе и сохраняется методом Записать(). Реквизит формы существует только в открытой форме и пропадает при её закрытии, если отдельно не перенесён в данные объекта или другое хранилище.