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

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

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

Свойство isNew: основной инструмент разработчика

Самым прямым и рекомендуемым способом определить статус записи является использование встроенного свойства isNew. Это свойство доступно для всех объектов метаданных, поддерживающих ссылки, и возвращает логическое значение. Если объект только что создан в памяти и еще не записан в базу данных, свойство вернет Истина.

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

Рассмотрим пример кода, демонстрирующий правильную проверку:

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

// Логика для нового элемента

Объект.Наименование = "Новый элемент";

КонецЕсли;

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

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

💡

Всегда используйте встроенный метод ЭтоНовый() вместо ручных проверок UUID или пустоты ссылки, если это возможно. Это гарантирует корректную работу при любых обновлениях платформы.

Анализ ссылки объекта и пустого UUID

Когда прямой доступ к свойству isNew затруднен (например, при работе с универсальными коллекциями или в некоторых запросах), разработчики обращаются к анализу ссылки. Ссылка на новый, еще не записанный объект, имеет специфическую структуру. Ее уникальная часть (UUID) состоит из нулей.

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

Для более глубокой проверки можно анализировать сам идентификатор. Новый объект имеет UUID, равный 00000000-0000-0000-0000-000000000000. Сравнение с этим значением дает точный результат, но код становится менее читаемым. Рекомендуется использовать встроенную функцию ПустаяСсылка() для улучшения читаемости:

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

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

КонецЕсли;

📊 Какой метод проверки вы используете чаще?
Свойство ЭтоНовый()
Проверка ПустаяСсылка()
Сравнение UUID
В зависимости от задачи

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

Особенности проверки в модуле формы

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

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

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

⚠️ Внимание: В обработчике ПриЧтенииНаСервере объект уже считан из базы, поэтому свойство ЭтоНовый вернет Ложь, даже если вы только что открыли карточку существующего элемента.

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

☑️ Чек-лист проверки в форме

Выполнено: 0 / 4

Использование в запросах и выборках

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

В запросах напрямую проверить "новизну" объекта нельзя, так как запрос работает с уже сохраненными данными. Но можно эмулировать эту проверку, анализируя наличие записи в базе. Если вы формируете временную таблицу с новыми объектами, они не попадут в основной запрос до момента записи.

Для обработки новых объектов в цикле часто используется следующая конструкция:

Сценарий Метод проверки Результат
Открытие формы Форма.ЭтоНовый() Истина для нового, Ложь для старого
Модуль объекта Объект.ЭтоНовый() Зависит от состояния в памяти
Выборка из БД ПустаяСсылка() Всегда Ложь (данные из БД)
Создание в коде Объект.ЭтоНовый() Истина до вызова Записать()

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

Тонкости работы с временными хранилищами

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

Обработка копирования и создания дублей

Один из самых сложных случаев — отличить создание с нуля от копирования существующего объекта. При копировании система создает новый объект в памяти (isNew = Истина), но заполняет его реквизиты данными старого объекта. Ссылка при этом остается пустой до момента записи.

Если ваша бизнес-логика требует разного поведения для "чистого" создания и копирования, простого свойства isNew недостаточно. Вам потребуется использовать дополнительные флаги или анализировать контекст открытия формы. Например, можно передавать параметр в форму, указывающий на режим копирования.

В модуле объекта часто используют событие ОбработкаЗаполнения. Оно срабатывает при копировании и позволяет отследить этот факт. В этом обработчике свойство ЭтоНовый все еще будет истинным, но вы уже знаете, что данные скопированы.

⚠️ Внимание: Не полагайтесь только на заполненность полей для определения копирования. Пользователь может вручную ввести те же данные при создании нового элемента. Используйте системные события.

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

💡

Копирование объекта технически является созданием нового объекта с заполненными данными. Различие видно только через контекст вызова или дополнительные флаги.

Частые ошибки и оптимизация кода

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

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

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

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

💡

Используйте отладчик 1С для просмотра значения свойства isNew в реальном времени. Это поможет понять, в какой именно момент объект меняет свой статус с нового на существующий.

FAQ: Часто задаваемые вопросы

Может ли свойство ЭтоНовый() вернуть Ложь для объекта, который еще не записан в базу?

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

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

В языке запросов 1С нет понятия "новый объект", так как запросы работают с сохраненными данными. Если вам нужно найти объекты, созданные сегодня, используйте поле ДатаСоздания или сравнивайте с текущей датой в условиях отбора.

Почему при копировании элемента справочника свойство ЭтоНовый истинно?

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

Влияет ли проведение документа на свойство ЭтоНовый?

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