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