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

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

Как определить, что документ новый в 1С 8.3

Как определить, что документ новый в 1С 8.3: метод ЭтоНовый(), проверка ссылки, признаки в форме и запросах. Примеры кода, типичные ошибки и FAQ.

В программировании на платформе 1С:Предприятие 8.3 часто требуется понять, записан ли документ в информационную базу или он только что создан и существует лишь в памяти. От этого зависят проверки заполнения, нумерация, обмены данными и логика обработчиков. Платформа предоставляет несколько способов такой проверки, и у каждого есть свои условия применения.

Основной инструмент — метод ЭтоНовый() объектного типа «ДокументОбъект». Однако в формах, запросах и при работе со ссылками логика отличается: у нового документа нет ссылки в базе, а объект и ссылка — разные сущности. Ниже разобраны все рабочие сценарии с примерами кода и типичными ошибками.

Метод ЭтоНовый() — основной способ проверки

Метод ЭтоНовый() доступен у объектов типа «ДокументОбъект». Он возвращает булево значение: Истина, если документ ещё ни разу не записан в информационную базу, и Ложь, если запись уже существует. Метод работает только с объектом, а не со ссылкой.

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

Если НовыйДок.ЭтоНовый() Тогда

Сообщить("Документ ещё не записан в базу");

КонецЕсли;

НовыйДок.Записать();

Если Не НовыйДок.ЭтоНовый() Тогда

Сообщить("Теперь документ сохранён");

КонецЕсли;

Важно понимать момент переключения: признак сбрасывается только после успешной записи. Если запись прервалась из-за ошибки проверки заполнения или исключения, документ остаётся «новым», даже если пользователь уже нажимал «Записать».

Проверка нового документа в модуле формы

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

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

// Документ новый, ссылки ещё нет

КонецЕсли;

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

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

Обработчик ПередЗаписью и ПриЗаписи

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

Порядок проверки в форме
  1. 1
    Откройте модуль формы документа
  2. 2
    В нужном обработчике добавьте условие Если Объект.Ссылка.Пустая() Тогда
  3. 3
    Разместите логику для нового документа внутри условия
  4. 4
    Проверьте поведение: создайте документ, запишите его и откройте повторно — ветка нового документа не должна сработать

Как проверить новизну, если есть только ссылка

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

Если СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда

// Ссылка пустая — документ не записан

КонецЕсли;

// Или короче:

Если СсылкаНаДокумент.Пустая() Тогда

// Не записан

КонецЕсли;

Если ссылка непустая, но нужно убедиться, что документ реально существует в базе (а не является «битой ссылкой» после удаления), используйте запрос:

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 РеализацияТоваровУслуг.Ссылка

|ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка";

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

Если Запрос.Выполнить().Пустой() Тогда

// Документа с такой ссылкой в базе нет

КонецЕсли;

Сравнение способов проверки

ЭтоНовый()

Подходит для объекта документа в модуле объекта или после ПолучитьОбъект(). Не работает у ссылки.

Ссылка.Пустая()

Универсальный вариант для форм и кода со ссылками. Не отличает «битую» ссылку от существующего документа.

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

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

Особенности в событиях записи и подписках

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

Учтите тонкость: в событии ПриЗаписи (после записи) метод ЭтоНовый() уже вернёт Ложь, потому что запись выполнена. Если нужно знать, была ли это первая запись, сохраните признак в ПередЗаписью через ДополнительныеСвойства:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

ДополнительныеСвойства.Вставить("ЭтоНовыйДокумент", ЭтоНовый());

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

Типичные ошибки при определении нового документа

Ошибки в этой теме почти всегда связаны с путаницей между объектом и ссылкой либо с неверным моментом проверки. Ниже — самые частые случаи.

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

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

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

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

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

Создание нового документа
Норма

Ветка для нового документа срабатывает один раз при открытии или первой записи

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

Ветка срабатывает повторно при перезаписи уже существующего документа

Открытие ранее записанного документа
Норма

Условие ЭтоНовый() / Ссылка.Пустая() возвращает Ложь

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

Условие возвращает Истина — проверьте, не работаете ли вы с копией объекта

Отмена записи с ошибкой
Норма

После неуспешной записи документ по-прежнему считается новым

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

Логика считает документ записанным, хотя в базе его нет

FAQ

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

Да. Проверка Объект.Ссылка.Пустая() в управляемой форме выполняется на клиенте без серверного вызова, так как ссылка уже доступна в данных формы. Это предпочтительный способ для клиентских обработчиков.

Почему ЭтоНовый() возвращает Ложь, хотя документ только что создан?

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

Чем отличается пустая ссылка от Неопределено?

Пустая ссылка — это типизированное значение вида «ДокументСсылка.РеализацияТоваровУслуг» с нулевым уникальным идентификатором. Неопределено — отсутствие значения вообще. Сравнивать нужно с пустой ссылкой конкретного вида документа или использовать метод Пустая().

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

В запросе понятия «новый документ» нет: запрос видит только данные, уже записанные в базу. Если документа нет в результате запроса по ссылке — он либо новый, либо удалён. Различить эти случаи запросом нельзя.

Работает ли ЭтоНовый() для справочников и других объектов?

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

Можно ли по уникальному идентификатору понять, что документ новый?

Нет. Уникальный идентификатор присваивается объекту при создании, ещё до записи, поэтому его наличие не означает, что документ сохранён в базе. Используйте ЭтоНовый() или проверку ссылки.

Итог

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

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