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

Разработка и Конфигурация · 8 мин

Как записать элемент формы в 1С

Как записать элемент формы в 1С: методы Записать(), ЗаписатьВФорме, работа с данными формы, типичные ошибки и проверка результата. Примеры кода.

Под «записью элемента формы» в 1С чаще всего понимают две разные задачи: запись объекта, который редактируется в форме (справочника, документа, записи регистра), и программное заполнение реквизитов формы с последующим сохранением. Обе задачи решаются штатными средствами управляемой формы, но требуют понимания разницы между данными формы и объектом в базе данных.

Ключевой принцип: пока объект не записан, изменения существуют только в памяти клиента и сервера в виде данных формы. Запись переносит их в базу, запускает обработчики объекта (ОбработкаПроверкиЗаполнения, ПередЗаписью, ПриЗаписи) и контроль уникальности. Поэтому простое присвоение значений реквизитам формы не означает, что данные сохранены.

Ниже разобраны основные сценарии: стандартная запись через команду формы, программный вызов Записать(), запись элемента справочника из другой формы, создание нового элемента программно и типичные ошибки, из-за которых запись «не срабатывает».

Что происходит при записи объекта из формы

В управляемой форме основной реквизит (обычно Объект) имеет тип ДанныеФормыСтруктура — это не сам объект базы, а его представление. Когда пользователь нажимает «Записать» или «Записать и закрыть», платформа преобразует данные формы в объект, выполняет запись в базу и возвращает результат обратно в форму.

При этом последовательно вызываются события: ОбработкаПроверкиЗаполнения (проверка обязательных реквизитов), ПередЗаписью, ПриЗаписи на сервере. Если любой из обработчиков отменяет запись (параметр Отказ = Истина), объект в базу не попадает, а пользователь видит сообщение об ошибке.

Стандартная запись через команду формы

Самый простой способ — не писать код вовсе. В форме элемента справочника или документа платформа автоматически предоставляет команды «Записать», «Записать и закрыть», «Перечитать». Если форма создаётся в конфигураторе, убедитесь, что в командной панели выведена стандартная команда Записать из группы «Стандартные».

Если команда стандартная, платформа сама выполняет проверку заполнения, запись и обновление заголовка формы. Разработчику остаётся только настроить обработчики объекта в модуле, если нужна дополнительная логика (заполнение служебных полей, проверки, запись связанных данных).

Программная запись: метод Записать() формы

Когда запись нужно вызвать из собственной кнопки или по условию, используется метод управляемой формы Записать(). Он доступен и на клиенте, и на сервере, при необходимости принимает параметры записи.

&НаКлиенте

Процедура КомандаСохранить(Команда)

Если Не ПроверитьЗаполнение() Тогда

Возврат;

КонецЕсли;

Записать();

ОповеститьОбИзменении(Объект.Ссылка);

КонецПроцедуры

Для документов можно передать режим записи, например проведение: Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). После успешной записи полезно вызвать ОповеститьОбИзменении, чтобы открытые списки обновились.

Порядок программной записи из формы
  1. 1
    Проверьте заполнение обязательных реквизитов: ПроверитьЗаполнение()
  2. 2
    Вызовите Записать() на клиенте или в серверной процедуре
  3. 3
    Проверьте, что Объект.Ссылка заполнена — признак успешной записи
  4. 4
    Оповестите другие формы: ОповеститьОбИзменении(Объект.Ссылка)
  5. 5
    При необходимости закройте форму: Закрыть()

Запись элемента справочника программно, без формы

Частая задача — создать или изменить элемент справочника из другой формы (например, из обработки или формы документа). Здесь форма элемента не нужна: работа идёт напрямую с объектом.

&НаСервере

Процедура СоздатьКонтрагентаНаСервере()

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();

НовыйЭлемент.Наименование = "ООО Ромашка";

НовыйЭлемент.ИНН = "7707083893";

НовыйЭлемент.Записать();

КонецПроцедуры

Для изменения существующего элемента получите объект по ссылке: ЭлементОбъект = Ссылка.ПолучитьОбъект(), измените реквизиты и вызовите Записать(). Помните, что ПолучитьОбъект() блокирует элемент на время редактирования, поэтому не держите объект открытым дольше необходимого.

Заполнение реквизитов формы перед записью

Если нужно программно заполнить поля открытой формы, обращайтесь к основному реквизиту: Объект.Наименование = "Новое значение". Изменения сразу видны пользователю, но в базу попадут только после вызова Записать(). Это удобно для сценариев «заполнить по шаблону» или «скопировать данные из другого документа».

Для табличных частей работайте с коллекцией Объект.Товары: добавляйте строки методом Добавить(), заполняйте поля строки. После записи объекта табличная часть сохраняется вместе с ним автоматически.

bsl
СтрокаТЧ = Объект.Товары.Добавить();
СтрокаТЧ.Номенклатура = НайденнаяНоменклатура;
СтрокаТЧ.Количество = 1;
Записать();

Проверка результата и обработка ошибок

Признак успешной записи — заполненная ссылка у нового объекта и отсутствие сообщений об ошибках. Программно можно обернуть запись в попытку и перехватить исключение:

Попытка

НовыйЭлемент.Записать();

Исключение

Сообщить("Ошибка записи: " + ОписаниеОшибки());

КонецПопытки;

Типичные причины отказа записи: не заполнены обязательные реквизиты, нарушена уникальность кода или наименования (если включён контроль), сработал отказ в обработчике ПередЗаписью, нет прав на запись у текущего пользователя, объект заблокирован другим сеансом.

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

Как проверить результат

Ссылка у нового объекта
Норма

Объект.Ссылка заполнена после Записать()

Тревожный признак

Ссылка пустая — запись не выполнена

Сообщения пользователю
Норма

Нет сообщений об ошибках

Тревожный признак

Есть сообщения об отказе или незаполненных полях

Список элементов
Норма

Новый элемент виден в списке после обновления

Тревожный признак

Элемент отсутствует — проверяйте права и обработчики

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

Чем отличается Записать() формы от Записать() объекта?

Метод формы работает с данными формы: преобразует их в объект, записывает и обновляет форму. Метод объекта (СправочникОбъект.Записать()) работает напрямую с базой и используется вне формы — в обработках, фоновых заданиях, серверных процедурах.

Как записать документ с проведением из формы?

Вызовите Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). Если проведение не требуется, используйте РежимЗаписиДокумента.Запись — документ сохранится без движений по регистрам.

Почему после Записать() форма всё равно помечена как изменённая?

Обычно это значит, что после записи код снова изменил реквизиты формы (например, в обработчике ПослеЗаписи). Проверьте, не модифицируются ли данные после вызова записи, либо сбросьте признак через Модифицированность = Ложь.

Как записать элемент, не открывая форму, из внешней обработки?

В серверной процедуре создайте объект через Справочники.Имя.СоздатьЭлемент() или получите существующий через Ссылка.ПолучитьОбъект(), заполните реквизиты и вызовите Записать(). Форма элемента для этого не нужна.

Запись отменяется с ошибкой в ПередЗаписью — где искать причину?

Откройте модуль объекта в конфигураторе и посмотрите обработчики ПередЗаписью и ОбработкаПроверкиЗаполнения: там могут быть проверки, устанавливающие Отказ = Истина. Также проверьте подписки на события — логика может находиться в общих модулях.

Можно ли записать табличную часть отдельно от объекта?

Нет. Табличная часть хранится внутри объекта и сохраняется только вместе с ним при вызове Записать(). Измените строки в Объект.ИмяТабличнойЧасти и запишите весь объект целиком.

Итог

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

Изменение реквизитов формы не сохраняет данные — запись выполняется только вызовом Записать(). В форме используйте метод формы, вне формы — работайте с объектом на сервере. После записи проверяйте ссылку и сообщения об ошибках, а списки обновляйте через ОповеститьОбИзменении.