Работа с справочниками в 1С:Предприятие — одна из самых частых задач как для пользователей, так и для разработчиков. Но как понять, что запись в справочнике была создана только что, а не редактировалась или существовала давно? Этот вопрос возникает при миграции данных, аудите изменений, настройке прав доступа или автоматизации бизнес-процессов. Например, бухгалтеру может понадобиться выгрузить только вновь добавленных контрагентов, а программисту — отследить создание дублей.

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

Независимо от того, работаете вы в 1С:Бухгалтерия 3.0, 1С:Управление торговлей 11 или 1С:ERP, принципы определения новых элементов универсальны. Однако в конфигурациях на управляемых формах (8.3+) и обычных формах (8.2) подходы могут отличаться — это критично учитывать при написании кода.

Прежде чем перейти к практике, ответим на ключевой вопрос: что вообще считать"новым" элементом? Для это может быть:

  • 📅 Запись, созданная менее суток/недели назад (по дате создания)
  • 🔄 Элемент, который ещё не участвовал в документах или регистрах
  • 🆕 Запись с флагом"ПометкаУдаления = Ложь" и отсутствием ссылок на неё
  • 🔍 Элемент, не имеющий истории изменений (для справочников с ведением истории)
📊 Как часто вам нужно определять новые элементы в 1С?
Ежедневно
Раз в неделю
Редко, по запросу
Никогда не приходилось

1. Стандартные поля справочника: ДатаСоздания и ПометкаУдаления

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

Чтобы проверить дату создания в интерфейсе:

  1. Откройте справочник (например, Контрагенты).
  2. Дважды кликните на элемент или нажмите Enter.
  3. В форме элемента найдите вкладку Ещё или Служебные — там обычно отображается Дата создания.

Программно дату создания можно получить так:

Справочник = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

Если Не Справочник.Пустая Тогда

Сообщить("Элемент создан:" + Справочник.ДатаСоздания);

КонецЕсли;

Однако есть нюансы:

  • ⚠️ В некоторых конфигурациях поле ДатаСоздания может быть скрыто или переименовано (например, в ДатаРегистрации).
  • 🔄 Если элемент был удалён и восстановлен, дата создания останется прежней, но появится поле ДатаУдаления.
  • 📌 В 1С:УТ 10.3 и более ранних версиях это поле могло отсутствовать — тогда придётся использовать альтернативные методы.
💡

Если в справочнике нет поля"ДатаСоздания", проверьте наличие реквизита"Дата" или"ДатаВвода" — иногда разработчики добавляют их вручную.

2. Проверка по истории изменений (для справочников с ведением истории)

Если в конфигурации включено ведение истории изменений для справочника (настройка в конфигураторе), можно анализировать записи журнала изменений. Это актуально для 1С:ERP, 1С:КА 2 и других комплексных решений, где важно отслеживать, кто и когда внёс правки.

Как это работает:

  • 📜 При создании элемента в журнале появляется запись с типом операции Добавление.
  • 🔍 Если записей нет или первая запись — Изменение, элемент не новый.

Пример кода для проверки истории:

ЖурналИзменений = РегистрыСведений.ЖурналИзмененийСправочников.СоздатьМенеджерЗаписей;

ЖурналИзменений.Отбор.Справочник.Установить(Справочник.Ссылка);

ЖурналИзменений.Отбор.ТипДействия.Установить(Перечисления.ТипыДействийЖурнала.Добавление);

ЖурналИзменений.Прочитать;

Если ЖурналИзменений.Количество > 0 Тогда

Сообщить("Элемент новый: первая запись в журнале — добавление");

Иначе

Сообщить("Элемент не новый или история не ведётся");

КонецЕсли;

Ограничения метода:

  • ⚠️ История может быть отключена в настройках конфигурации (проверьте в Администрирование → Настройки программы → История данных).
  • 🗑️ В больших базах журнал изменений может очищаться регламентными заданиями — тогда данные будут неполными.
Как включить ведение истории для справочника?

В конфигураторе откройте свойства справочника → вкладка"Прочее" → поставьте флаг"Вести историю изменений". После этого потребуется обновление базы.

3. Анализ ссылок на элемент: метод"сиротства"

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

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

  1. Используйте запрос с конструкцией ВЫБРАТЬ РАЗРЕШЕННЫЕ и проверкой по полю Ссылка.
  2. Проверьте ключевые регистры, где элемент мог бы использоваться (например, РегистрСведений.ЦеныНоменклатуры для справочника Номенклатура).

Пример запроса для поиска"сирот":

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

Запрос.Текст =

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| Справочник.Контрагенты КАК Контрагент

|ГДЕ

| НЕ СУЩЕСТВУЕТ (

| ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ

| Документ.ЗаказПокупателя.Контрагент КАК Ссылка

| ГДЕ

| Документ.ЗаказПокупателя.Контрагент = Контрагент.Ссылка

| )

| И НЕ Контрагент.ПометкаУдаления";

Результат = Запрос.Выполнить;

Выборка = Результат.Выбрать;

Пока Выборка.Следующий Цикл

Сообщить("Новый элемент:" + Выборка.Контрагент.Наименование);

КонецЦикла;

Преимущества метода:

  • 🎯 Работает даже если дата создания не сохраняется.
  • 🔗 Позволяет найти элементы, созданные ошибочно (например, дубли).

Недостатки:

  • ⚠️ Медленный на больших базах — запрос может выполняться минутами.
  • 📌 Не подходит для справочников, элементы которых используются не в документах, а в других справочниках (например, Подразделения в Сотрудники).

Исключить помеченные на удаление|Проверить ссылки в документах|Проверить ссылки в регистрах сведений|Учесть ссылки из других справочников (если критично)

-->

4. Использование временных меток и сравнение с текущей датой

Если вам нужно найти элементы, созданные за последний день/неделю/месяц, проще всего сравнить ДатаСоздания с текущей датой. Этот метод универсален и работает во всех конфигурациях, где ведётся дата создания.

Пример кода для поиска элементов за последние 7 дней:

ДатаНачала = ТекущаяДата - 7; // Неделя назад

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

Запрос.Текст =

"ВЫБРАТЬ

| Справочник.Номенклатура.Ссылка КАК Ссылка,

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

| Справочник.Номенклатура.ДатаСоздания КАК ДатаСоздания

|ИЗ

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

|ГДЕ

| Справочник.Номенклатура.ДатаСоздания >= &ДатаНачала

| И НЕ Справочник.Номенклатура.ПометкаУдаления";

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

Результат = Запрос.Выполнить;

Для более гибкого анализа можно использовать относительные даты:

  • 📅 НачалоДня(ТекущаяДата) — элементы, созданные сегодня.
  • 📆 НачалоМесяца(ТекущаяДата) — элементы за текущий месяц.
  • 🗓️ ДобавитьМесяц(ТекущаяДата, -1) — элементы за последний месяц.

Важно учитывать:

  • ⚠️ В некоторых базах дата создания хранится с точностью до секунды, а где-то — только до дня. Это влияет на фильтрацию.
  • 🔄 Если сервер работает в другом часовом поясе, сравнение может давать неверные результаты.
💡

Для точного сравнения дат всегда используйте функции НачалоДня или КонецДня, чтобы избежать проблем с временем создания (например, элемент создан в 23:59, а запрос выполняется в 00:01 следующего дня).

5. Программные приёмы для разработчиков: события и обработчики

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

Пример кода для отметки новых элементов:

Процедура СправочникКонтрагентыПриЗаписи(Объект)

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

Объект.НовыйЭлемент = Истина; // Добавляем реквизит в справочник

// Или отправляем уведомление

Сообщить("Создан новый контрагент:" + Объект.Наименование);

КонецЕсли;

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

Альтернативные подходы:

  • 🔧 Триггеры базы данных: если работает на SQL Server или PostgreSQL, можно настроить триггеры на таблицы справочников (например, _ReferenceXXX).
  • 📡 Обмен данными: в распределённых базах новые элементы можно отслеживать через механизм обмена (узлы планов обмена).
  • 🤖 Регламентные задания: запускать проверку новых элементов по расписанию (например, раз в час).

Для сложных сценариев (например, интеграции с внешними системами) используйте механизм подписок на события:

Подписка = ПодпискиНаСобытия.СоздатьМенеджер;

Подписка.Добавить("Справочник.Контрагенты.ПриЗаписи","ОбщийМодуль.ОбработчикиСобытий.НовыйКонтрагент");

Остерегайтесь:

  • ⚠️ Обработчики ПриЗаписи срабатывают и при редактировании элемента — всегда проверяйте Объект.ЭтоНовый.
  • 🔄 В транзакционных системах (например, 1С:УТ с высокой нагрузкой) события могут замедлять работу.

6. Скрытые механизмы: анализ физических таблиц и метаданных

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

Способ 1: Анализ физических таблиц SQL

В на SQL-сервере каждый справочник хранится в отдельной таблице (например, _Reference123). Поле Date_Time или TS (timestamp) часто содержит дату последнего изменения. Пример запроса:

ВЫБРАТЬ

_Reference123._ID_RRef КАК Ссылка,

_Reference123._Description КАК Наименование,

_Reference123.Date_Time КАК ДатаИзменения

ИЗ

_Reference123

ГДЕ

_Reference123.Date_Time > {ts'2026-01-01 00:00:00'}

Способ 2: Использование метаданных версий объектов

В конфигураторе можно получить версию объекта через МETADATA. Новые элементы обычно имеют более высокую версию, чем старые.

Способ 3: Проверка через OLE DB или ADO

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

Соединение = Новый COMОбъект("ADODB.Connection");

Соединение.Open("Provider=SQLOLEDB;Data Source=SRV-1C;Initial Catalog=Base1C;User ID=sa;Password=123;");

Запрос = Новый COMОбъект("ADODB.Recordset");

Запрос.Open("SELECT _ID_RRef, _Description, Date_Time FROM _Reference123 WHERE Date_Time > DATEADD(day, -1, GETDATE)", Соединение);

⚠️ Внимание: Эти методы нарушают инкапсуляцию и могут привести к:

  • Нарушению поддержки от фирмы (если используется нелицензионный доступ к таблицам).
  • Ошибкам при обновлении платформы (структура таблиц может меняться).
  • Проблемам с производительностью при большом количестве записей.
💡

Перед использованием прямых SQL-запросов всегда делайте резервную копию базы. В некоторых конфигурациях (например, 1С:ERP) структуры таблиц могут отличаться от стандартных.

Сравнение методов: какой выбрать?

Выбор способа зависит от вашей задачи, уровня доступа и конфигурации . Ниже таблица сравнения основных методов:

Метод Сложность Точность Требуемые права Подходит для
Поле ДатаСоздания ⭐⭐⭐⭐ Пользователь Любые конфигурации с этим полем
Журнал изменений ⭐⭐ ⭐⭐⭐⭐ Полные права Конфигурации с ведением истории
Проверка ссылок ("сиротство") ⭐⭐⭐ ⭐⭐⭐ Пользователь Поиск неиспользуемых элементов
Сравнение с текущей датой ⭐⭐⭐ Пользователь Отчёты по новым элементам
События ПриЗаписи ⭐⭐⭐ ⭐⭐⭐⭐⭐ Разработчик Автоматизация в реальном времени
Прямые SQL-запросы ⭐⭐⭐⭐ ⭐⭐⭐⭐ Администратор Сложные аналитические задачи

Для большинства задач достаточно комбинации поля ДатаСоздания + проверки ссылок. Если нужна высокая точность (например, для аудита), подключайте журнал изменений. Для автоматизации бизнес-процессов лучше использовать события.

⚠️ Внимание: В облачных версиях (например, 1С:Фреш) доступ к физическим таблицам и некоторым методам может быть ограничен. Всегда проверяйте возможности вашей платформы перед внедрением сложных решений.

FAQ: Частые вопросы по определению новых элементов

Можно ли восстановить дату создания элемента, если поле ДатаСоздания отсутствует?

Да, но это потребует дополнительных действий:

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

Возможные причины:

  • Поле ДатаСоздания скрыто или переименовано (проверьте в конфигураторе).
  • Элементы помечены на удаление (добавьте в запрос условие ГДЕ НЕ ПометкаУдаления).
  • Даты хранятся в другом формате (например, без времени). Используйте НачалоДня для сравнения.
Как отследить, кто создал новый элемент?

Для этого нужно:

  • Включить ведение истории изменений в справочнике.
  • Использовать поле Пользователь в журнале изменений или добавить реквизит Создал в справочник, заполняемый в обработчике ПриЗаписи.
  • В 1С:ERP и 1С:КА 2 информация о пользователе может храниться в служебных полях (например, CreatedBy).
Можно ли автоматически присваивать новым элементам определённый статус?

Да, эточная задача для обработчика ПриЗаписи. Пример:

Процедура СправочникНоменклатураПриЗаписи(Объект)

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

Объект.Статус = Перечисления.СтатусыНоменклатуры.НоваяПозиция;

КонецЕсли;

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

Не забудьте добавить реквизит Статус в справочник и настроить права доступа на его изменение.

Как экспортировать только новые элементы в Excel?

Используйте запрос с фильтром по дате и библиотеку ЗаписьXML или Печать:

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

Запрос.Текст =

"ВЫБРАТЬ

| Справочник.Контрагенты.Наименование,

| Справочник.Контрагенты.ИНН

|ИЗ

| Справочник.Контрагенты КАК Справочник.Контрагенты

|ГДЕ

| Справочник.Контрагенты.ДатаСоздания >= &ДатаНачала";

ДатаНачала = ТекущаяДата - 30; // Последние 30 дней

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

Результат = Запрос.Выполнить;

Таблица = Результат.Выгрузить;

ПечатьТабличногоДокумента.Вывести(Таблица,"","", Истина);