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