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

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

Как записать данные формы в 1С: методы и практические приёмы

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

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

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

Ниже разобраны основные способы записи: интерактивная запись пользователем, программная запись из формы, запись объекта вне формы, а также преобразование данных формы в значение для сложных сценариев. Отдельно рассмотрены проверка результата, типичные ошибки и ограничения.

Как устроены данные формы и почему это важно

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

Из этого следуют два практических правила. Первое: пока запись не выполнена, данные можно потерять при закрытии формы — поэтому платформа отслеживает признак модифицированности и спрашивает пользователя о сохранении. Второе: программные обращения к объекту вне формы (через запросы или объектные методы) не видят несохранённые изменения формы.

Интерактивная запись: стандартные команды формы

Простейший способ — стандартные команды «Записать», «Записать и закрыть», а для документов — «Провести» и «Провести и закрыть». Они добавляются в командную панель формы автоматически и не требуют кода. Команда «Записать» сохраняет объект без закрытия формы, что удобно при длительном редактировании.

Если нужно вызвать запись из своей кнопки или по событию, используйте метод формы Записать() в клиентском обработчике. Метод возвращает Истина при успешной записи и Ложь при отказе — например, когда проверка заполнения не пройдена.

&НаКлиенте

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

Если Записать() Тогда

ПоказатьОповещениеПользователя("Данные сохранены");

Иначе

ПоказатьПредупреждение(, "Запись не выполнена. Проверьте обязательные поля.");

КонецЕсли;

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

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

Порядок интерактивной записи
  1. 1
    Заполните обязательные реквизиты формы
  2. 2
    Нажмите «Записать» или вызовите метод Записать() из своей команды
  3. 3
    Убедитесь, что метод вернул Истина, а модифицированность сброшена
  4. 4
    При отказе проверьте сообщения о незаполненных полях и исправьте данные

Программная запись объекта вне формы

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

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

НовыйЭлемент.Наименование = "Тестовая позиция";

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

ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

ДокОбъект.Дата = ТекущаяДатаСеанса();

// заполнение реквизитов и табличных частей

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

Преобразование данных формы в значение

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

&НаСервере

Процедура ПроверитьПередЗаписьюНаСервере()

ДокОбъект = РеквизитФормыВЗначение("Объект");

// работа с объектом: проверки, вычисления

ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

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

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

Способы записи данных

Метод формы Записать()

Штатный путь из формы: обновляет данные формы, сбрасывает модифицированность, вызывает события записи. Ограничение — доступен только в контексте формы.

Объект.Записать() вне формы

Подходит для обработок, регламентных заданий, обменов. Не связан с открытыми формами и требует аккуратности с блокировками.

ДанныеФормыВЗначение + Записать()

Гибкий вариант для сложной серверной логики, но форма не узнает о записи автоматически — нужен Прочитать() для синхронизации.

События записи и проверка заполнения

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

&НаСервере

Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда

ОбщегоНазначения.СообщитьПользователю("Укажите контрагента", , "Объект.Контрагент", , Отказ);

КонецЕсли;

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

Проверку заполнения можно также вызвать принудительно методом формы ПроверитьЗаполнение() — он возвращает Истина, если все обязательные реквизиты заполнены. Это удобно перед выполнением действий, которые имеют смысл только для корректно заполненного объекта.

Проверка результата и типичные ошибки

После записи убедитесь, что она действительно состоялась. Признаки успеха: метод Записать() вернул Истина, свойство Модифицированность сброшено в Ложь, у нового объекта появилась ссылка (Объект.Ссылка заполнена), для проведённого документа установлен признак проведения.

Если запись не выполняется, смотрите сообщения пользователю: чаще всего причина в незаполненных обязательных реквизитах, отказе в обработчиках записи, нарушении уникальности кода или номера, либо в конфликте блокировок при параллельном редактировании.

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

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

Возвращаемое значение Записать()
Норма

Истина — объект сохранён

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

Ложь — запись отклонена, читайте сообщения об ошибках

Модифицированность формы
Норма

Ложь после записи — несохранённых изменений нет

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

Истина — изменения не попали в базу

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

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

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

Пустая ссылка — объект не был записан

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

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

Метод формы сохраняет данные формы, обновляет её состояние и сбрасывает модифицированность. Метод объекта работает с экземпляром объекта в памяти и ничего не знает об открытых формах. Из формы почти всегда правильнее вызывать метод формы.

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

В форме передайте параметр: Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). Вне формы вызовите у объекта Записать(РежимЗаписиДокумента.Проведение). Учтите, что проведение может быть отклонено из-за проверок в модуле объекта.

Почему Записать() возвращает Ложь без видимых ошибок?

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

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

Используйте команду «Записать» или метод формы Записать() — форма останется открытой, модифицированность сбросится. Закрытие выполняют только команды «Записать и закрыть» и «Провести и закрыть».

Можно ли записать объект, открытый у другого пользователя?

Технически попытка выполнится, но при конкурентном доступе одна из записей завершится ошибкой конфликта блокировок. Для массовых изменений используйте обработки вне рабочего времени пользователей либо механизмы, устойчивые к блокировкам, с повторными попытками.

Как программно заполнить и записать элемент справочника?

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

Итог

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

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