Разработка и Конфигурация · 8 мин
Как записать элемент формы в 1С
Как записать элемент формы в 1С: методы Записать(), ЗаписатьВФорме, работа с данными формы, типичные ошибки и проверка результата. Примеры кода.
Под «записью элемента формы» в 1С чаще всего понимают две разные задачи: запись объекта, который редактируется в форме (справочника, документа, записи регистра), и программное заполнение реквизитов формы с последующим сохранением. Обе задачи решаются штатными средствами управляемой формы, но требуют понимания разницы между данными формы и объектом в базе данных.
Ключевой принцип: пока объект не записан, изменения существуют только в памяти клиента и сервера в виде данных формы. Запись переносит их в базу, запускает обработчики объекта (ОбработкаПроверкиЗаполнения, ПередЗаписью, ПриЗаписи) и контроль уникальности. Поэтому простое присвоение значений реквизитам формы не означает, что данные сохранены.
Ниже разобраны основные сценарии: стандартная запись через команду формы, программный вызов Записать(), запись элемента справочника из другой формы, создание нового элемента программно и типичные ошибки, из-за которых запись «не срабатывает».
Что происходит при записи объекта из формы
В управляемой форме основной реквизит (обычно Объект) имеет тип ДанныеФормыСтруктура — это не сам объект базы, а его представление. Когда пользователь нажимает «Записать» или «Записать и закрыть», платформа преобразует данные формы в объект, выполняет запись в базу и возвращает результат обратно в форму.
При этом последовательно вызываются события: ОбработкаПроверкиЗаполнения (проверка обязательных реквизитов), ПередЗаписью, ПриЗаписи на сервере. Если любой из обработчиков отменяет запись (параметр Отказ = Истина), объект в базу не попадает, а пользователь видит сообщение об ошибке.
Стандартная запись через команду формы
Самый простой способ — не писать код вовсе. В форме элемента справочника или документа платформа автоматически предоставляет команды «Записать», «Записать и закрыть», «Перечитать». Если форма создаётся в конфигураторе, убедитесь, что в командной панели выведена стандартная команда Записать из группы «Стандартные».
Если команда стандартная, платформа сама выполняет проверку заполнения, запись и обновление заголовка формы. Разработчику остаётся только настроить обработчики объекта в модуле, если нужна дополнительная логика (заполнение служебных полей, проверки, запись связанных данных).
Программная запись: метод Записать() формы
Когда запись нужно вызвать из собственной кнопки или по условию, используется метод управляемой формы Записать(). Он доступен и на клиенте, и на сервере, при необходимости принимает параметры записи.
&НаКлиенте
Процедура КомандаСохранить(Команда)
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
Записать();
ОповеститьОбИзменении(Объект.Ссылка);
КонецПроцедуры
Для документов можно передать режим записи, например проведение: Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). После успешной записи полезно вызвать ОповеститьОбИзменении, чтобы открытые списки обновились.
- 1Проверьте заполнение обязательных реквизитов: ПроверитьЗаполнение()
- 2Вызовите Записать() на клиенте или в серверной процедуре
- 3Проверьте, что Объект.Ссылка заполнена — признак успешной записи
- 4Оповестите другие формы: ОповеститьОбИзменении(Объект.Ссылка)
- 5При необходимости закройте форму: Закрыть()
Запись элемента справочника программно, без формы
Частая задача — создать или изменить элемент справочника из другой формы (например, из обработки или формы документа). Здесь форма элемента не нужна: работа идёт напрямую с объектом.
&НаСервере
Процедура СоздатьКонтрагентаНаСервере()
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.Наименование = "ООО Ромашка";
НовыйЭлемент.ИНН = "7707083893";
НовыйЭлемент.Записать();
КонецПроцедуры
Для изменения существующего элемента получите объект по ссылке: ЭлементОбъект = Ссылка.ПолучитьОбъект(), измените реквизиты и вызовите Записать(). Помните, что ПолучитьОбъект() блокирует элемент на время редактирования, поэтому не держите объект открытым дольше необходимого.
Заполнение реквизитов формы перед записью
Если нужно программно заполнить поля открытой формы, обращайтесь к основному реквизиту: Объект.Наименование = "Новое значение". Изменения сразу видны пользователю, но в базу попадут только после вызова Записать(). Это удобно для сценариев «заполнить по шаблону» или «скопировать данные из другого документа».
Для табличных частей работайте с коллекцией Объект.Товары: добавляйте строки методом Добавить(), заполняйте поля строки. После записи объекта табличная часть сохраняется вместе с ним автоматически.
СтрокаТЧ = Объект.Товары.Добавить();
СтрокаТЧ.Номенклатура = НайденнаяНоменклатура;
СтрокаТЧ.Количество = 1;
Записать();Проверка результата и обработка ошибок
Признак успешной записи — заполненная ссылка у нового объекта и отсутствие сообщений об ошибках. Программно можно обернуть запись в попытку и перехватить исключение:
Попытка
НовыйЭлемент.Записать();
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;
Типичные причины отказа записи: не заполнены обязательные реквизиты, нарушена уникальность кода или наименования (если включён контроль), сработал отказ в обработчике ПередЗаписью, нет прав на запись у текущего пользователя, объект заблокирован другим сеансом.
Как проверить результат
Объект.Ссылка заполнена после Записать()
Ссылка пустая — запись не выполнена
Нет сообщений об ошибках
Есть сообщения об отказе или незаполненных полях
Новый элемент виден в списке после обновления
Элемент отсутствует — проверяйте права и обработчики
Частые вопросы
Чем отличается Записать() формы от Записать() объекта?
Метод формы работает с данными формы: преобразует их в объект, записывает и обновляет форму. Метод объекта (СправочникОбъект.Записать()) работает напрямую с базой и используется вне формы — в обработках, фоновых заданиях, серверных процедурах.
Как записать документ с проведением из формы?
Вызовите Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). Если проведение не требуется, используйте РежимЗаписиДокумента.Запись — документ сохранится без движений по регистрам.
Почему после Записать() форма всё равно помечена как изменённая?
Обычно это значит, что после записи код снова изменил реквизиты формы (например, в обработчике ПослеЗаписи). Проверьте, не модифицируются ли данные после вызова записи, либо сбросьте признак через Модифицированность = Ложь.
Как записать элемент, не открывая форму, из внешней обработки?
В серверной процедуре создайте объект через Справочники.Имя.СоздатьЭлемент() или получите существующий через Ссылка.ПолучитьОбъект(), заполните реквизиты и вызовите Записать(). Форма элемента для этого не нужна.
Запись отменяется с ошибкой в ПередЗаписью — где искать причину?
Откройте модуль объекта в конфигураторе и посмотрите обработчики ПередЗаписью и ОбработкаПроверкиЗаполнения: там могут быть проверки, устанавливающие Отказ = Истина. Также проверьте подписки на события — логика может находиться в общих модулях.
Можно ли записать табличную часть отдельно от объекта?
Нет. Табличная часть хранится внутри объекта и сохраняется только вместе с ним при вызове Записать(). Измените строки в Объект.ИмяТабличнойЧасти и запишите весь объект целиком.
Что важно запомнить
Изменение реквизитов формы не сохраняет данные — запись выполняется только вызовом Записать(). В форме используйте метод формы, вне формы — работайте с объектом на сервере. После записи проверяйте ссылку и сообщения об ошибках, а списки обновляйте через ОповеститьОбИзменении.