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

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

Как в 1С проверить, что объект записан

Способы проверить, что объект записан в 1С: методы Записать(), ПроверитьЗаполнение(), ПустаяСсылка(), транзакции, типичные ошибки и примеры кода.

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

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

Как устроена запись объекта в 1С

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

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

Проверка через Попытка/Исключение

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

Попытка

НовыйОбъект.Записать();

Записан = Истина;

Исключение

Записан = Ложь;

ТекстОшибки = ОписаниеОшибки();

ЗаписьЖурналаРегистрации("Запись объекта",

УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);

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

Не «глотайте» исключение молча: минимум — зафиксируйте его в журнале регистрации или верните вызывающему коду. Иначе диагностика проблем превратится в поиск иголки в стоге сена.

Проверка по ссылке: ПустаяСсылка() и ПроверитьЗаполнение()

После успешной записи у объекта появляется непустая ссылка (если она не была установлена заранее). Проверка выглядит так:

Если НЕ Объект.Ссылка.Пустая() Тогда

// объект записан

КонецЕсли;

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

Если Объект.ПроверитьЗаполнение() Тогда

Объект.Записать();

Иначе

// сообщить пользователю о незаполненных полях

КонецЕсли;

Проверка записи через запрос к базе

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

Запрос = Новый Запрос(

"ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка

|ИЗ Справочник.Номенклатура КАК Т

|ГДЕ Т.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка);

Записан = НЕ Запрос.Выполнить().Пустой();

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

Сравнение вариантов

Попытка/Исключение вокруг Записать()

Универсально и надёжно; подходит почти всегда. Требует обработки ошибки.

Проверка Ссылка.Пустая()

Просто и быстро, но работает только для новых объектов и не ловит отказ в транзакции.

Запрос по ссылке

Даёт факт наличия в базе; лишнее обращение к СУБД, избыточно сразу после Записать().

ПолучитьОбъект() = Неопределено

Подходит для проверки чужой ссылки; медленнее запроса и грузит объект в память.

Запись в транзакции: особенности проверки

Если запись выполняется внутри явной транзакции (НачатьТранзакцию()), успешный Записать() ещё не означает, что данные попали в базу: до ЗафиксироватьТранзакцию() всё может быть отменено. Проверять «записанность» имеет смысл только после фиксации.

НачатьТранзакцию();

Попытка

Объект.Записать();

// другие операции

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение ОписаниеОшибки();

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

Обязательно отменяйте транзакцию в ветке исключения — «висающая» транзакция держит блокировки и мешает другим пользователям.

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

Типичные ошибки при проверке записи

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

Отдельно отметим режим ОбменДанными.Загрузка = Истина: он отключает большинство проверок и обработчиков. Запись почти всегда «проходит», но данные могут быть некорректными. Проверять целостность в этом случае нужно собственной логикой после загрузки.

Контрольные точки

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

Ссылка объекта после Записать()
Норма

Ссылка не пустая, метод Пустая() возвращает Ложь

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

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

Журнал регистрации
Норма

Нет ошибок по событию записи

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

Ошибки прав, блокировок или уникальности

Запрос к базе по ссылке
Норма

Запрос возвращает одну строку

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

Пустой результат — объекта в базе нет

Форма объекта
Норма

Объект открывается и перезаписывается без ошибок

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

Сообщение 'Объект не найден'

FAQ

Возвращает ли метод Записать() значение Истина при успехе?

Нет. Метод Записать() ничего не возвращает. Успех определяется отсутствием исключения; для контроля используйте Попытка/Исключение или проверку ссылки после вызова.

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

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

Ссылка у объекта заполнена, но в базе его нет. Как так?

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

Как проверить запись, если используется ОбменДанными.Загрузка = Истина?

Стандартные проверки в этом режиме отключены, поэтому полагаться на них нельзя. После записи проверяйте критичные реквизиты собственным кодом и при необходимости делайте контрольный запрос к базе.

Нужно ли проверять запись при интерактивной работе пользователя?

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

Что делать, если Записать() падает с ошибкой блокировки?

Это значит, что объект изменяет другой сеанс. Корректная реакция — отменить транзакцию, зафиксировать ошибку и повторить попытку позже или сообщить пользователю. Не используйте циклические повторы без задержки и ограничения числа попыток.

Итог

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

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