Работа с справочниками в 1С:Предприятие — одна из самых частых задач как для пользователей, так и для разработчиков. Но как понять, что запись в справочнике была создана только что, а не редактировалась или существовала давно? Этот вопрос возникает при миграции данных, аудите изменений, настройке прав доступа или автоматизации бизнес-процессов. Например, бухгалтеру может понадобиться выгрузить только вновь добавленных контрагентов, а программисту — отследить создание дублей.
В этой статье мы разберём все возможные способы определения новых элементов — от визуальных признаков в интерфейсе до программных методов с примерами кода. Вы узнаете, какие поля и свойства 1С хранят информацию о дате создания, как обойти ограничения платформы и какие ловушки подстерегают новичков. Особое внимание уделим скрытым механизмам, о которых не пишут в документации, но которые экономят часы работы.
Независимо от того, работаете вы в 1С:Бухгалтерия 3.0, 1С:Управление торговлей 11 или 1С:ERP, принципы определения новых элементов универсальны. Однако в конфигурациях на управляемых формах (8.3+) и обычных формах (8.2) подходы могут отличаться — это критично учитывать при написании кода.
Прежде чем перейти к практике, ответим на ключевой вопрос: что вообще считать"новым" элементом? Для 1С это может быть:
- 📅 Запись, созданная менее суток/недели назад (по дате создания)
- 🔄 Элемент, который ещё не участвовал в документах или регистрах
- 🆕 Запись с флагом"ПометкаУдаления = Ложь" и отсутствием ссылок на неё
- 🔍 Элемент, не имеющий истории изменений (для справочников с ведением истории)
1. Стандартные поля справочника: ДатаСоздания и ПометкаУдаления
Самый очевидный способ — использовать встроенные реквизиты справочника. В большинстве конфигураций (особенно типового решения) у справочников есть поле ДатаСоздания, которое автоматически заполняется при создании элемента. Его можно увидеть в форме элемента или программно получить через объект.
Чтобы проверить дату создания в интерфейсе:
- Откройте справочник (например,
Контрагенты). - Дважды кликните на элемент или нажмите
Enter. - В форме элемента найдите вкладку
ЕщёилиСлужебные— там обычно отображаетсяДата создания.
Программно дату создания можно получить так:
Справочник = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Не Справочник.Пустая Тогда
Сообщить("Элемент создан:" + Справочник.ДатаСоздания);
КонецЕсли;
Однако есть нюансы:
- ⚠️ В некоторых конфигурациях поле
ДатаСозданияможет быть скрыто или переименовано (например, вДатаРегистрации). - 🔄 Если элемент был удалён и восстановлен, дата создания останется прежней, но появится поле
ДатаУдаления. - 📌 В 1С:УТ 10.3 и более ранних версиях это поле могло отсутствовать — тогда придётся использовать альтернативные методы.
Если в справочнике нет поля"ДатаСоздания", проверьте наличие реквизита"Дата" или"ДатаВвода" — иногда разработчики добавляют их вручную.
2. Проверка по истории изменений (для справочников с ведением истории)
Если в конфигурации включено ведение истории изменений для справочника (настройка в конфигураторе), можно анализировать записи журнала изменений. Это актуально для 1С:ERP, 1С:КА 2 и других комплексных решений, где важно отслеживать, кто и когда внёс правки.
Как это работает:
- 📜 При создании элемента в журнале появляется запись с типом операции
Добавление. - 🔍 Если записей нет или первая запись —
Изменение, элемент не новый.
Пример кода для проверки истории:
ЖурналИзменений = РегистрыСведений.ЖурналИзмененийСправочников.СоздатьМенеджерЗаписей;
ЖурналИзменений.Отбор.Справочник.Установить(Справочник.Ссылка);
ЖурналИзменений.Отбор.ТипДействия.Установить(Перечисления.ТипыДействийЖурнала.Добавление);
ЖурналИзменений.Прочитать;
Если ЖурналИзменений.Количество > 0 Тогда
Сообщить("Элемент новый: первая запись в журнале — добавление");
Иначе
Сообщить("Элемент не новый или история не ведётся");
КонецЕсли;
Ограничения метода:
- ⚠️ История может быть отключена в настройках конфигурации (проверьте в
Администрирование → Настройки программы → История данных). - 🗑️ В больших базах журнал изменений может очищаться регламентными заданиями — тогда данные будут неполными.
Как включить ведение истории для справочника?
В конфигураторе откройте свойства справочника → вкладка"Прочее" → поставьте флаг"Вести историю изменений". После этого потребуется обновление базы.
3. Анализ ссылок на элемент: метод"сиротства"
Новый элемент справочника часто не имеет ссылок из других объектов базы: документов, регистров сведений или других справочников. Этот подход называют проверкой на"сиротство" — если на элемент ничего не ссылается, высока вероятность, что он создан недавно.
Как реализовать:
- Используйте запрос с конструкцией
ВЫБРАТЬ РАЗРЕШЕННЫЕи проверкой по полюСсылка. - Проверьте ключевые регистры, где элемент мог бы использоваться (например,
РегистрСведений.ЦеныНоменклатурыдля справочникаНоменклатура).
Пример запроса для поиска"сирот":
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Справочник.Контрагенты КАК Контрагент
|ГДЕ
| НЕ СУЩЕСТВУЕТ (
| ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Документ.ЗаказПокупателя.Контрагент КАК Ссылка
| ГДЕ
| Документ.ЗаказПокупателя.Контрагент = Контрагент.Ссылка
| )
| И НЕ Контрагент.ПометкаУдаления";
Результат = Запрос.Выполнить;
Выборка = Результат.Выбрать;
Пока Выборка.Следующий Цикл
Сообщить("Новый элемент:" + Выборка.Контрагент.Наименование);
КонецЦикла;
Преимущества метода:
- 🎯 Работает даже если дата создания не сохраняется.
- 🔗 Позволяет найти элементы, созданные ошибочно (например, дубли).
Недостатки:
- ⚠️ Медленный на больших базах — запрос может выполняться минутами.
- 📌 Не подходит для справочников, элементы которых используются не в документах, а в других справочниках (например,
ПодразделениявСотрудники).
Исключить помеченные на удаление|Проверить ссылки в документах|Проверить ссылки в регистрах сведений|Учесть ссылки из других справочников (если критично)
-->
4. Использование временных меток и сравнение с текущей датой
Если вам нужно найти элементы, созданные за последний день/неделю/месяц, проще всего сравнить ДатаСоздания с текущей датой. Этот метод универсален и работает во всех конфигурациях, где ведётся дата создания.
Пример кода для поиска элементов за последние 7 дней:
ДатаНачала = ТекущаяДата - 7; // Неделя назад
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник.Номенклатура.Ссылка КАК Ссылка,
| Справочник.Номенклатура.Наименование КАК Наименование,
| Справочник.Номенклатура.ДатаСоздания КАК ДатаСоздания
|ИЗ
| Справочник.Номенклатура КАК Справочник.Номенклатура
|ГДЕ
| Справочник.Номенклатура.ДатаСоздания >= &ДатаНачала
| И НЕ Справочник.Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Результат = Запрос.Выполнить;
Для более гибкого анализа можно использовать относительные даты:
- 📅
НачалоДня(ТекущаяДата)— элементы, созданные сегодня. - 📆
НачалоМесяца(ТекущаяДата)— элементы за текущий месяц. - 🗓️
ДобавитьМесяц(ТекущаяДата, -1)— элементы за последний месяц.
Важно учитывать:
- ⚠️ В некоторых базах дата создания хранится с точностью до секунды, а где-то — только до дня. Это влияет на фильтрацию.
- 🔄 Если сервер 1С работает в другом часовом поясе, сравнение может давать неверные результаты.
Для точного сравнения дат всегда используйте функции НачалоДня или КонецДня, чтобы избежать проблем с временем создания (например, элемент создан в 23:59, а запрос выполняется в 00:01 следующего дня).
5. Программные приёмы для разработчиков: события и обработчики
Если вам нужно отслеживать новые элементы в реальном времени (например, для автоматической обработки), используйте события справочников. В 1С 8.3 для этого предусмотрены обработчики ПередЗаписью и ПриЗаписи.
Пример кода для отметки новых элементов:
Процедура СправочникКонтрагентыПриЗаписи(Объект)
Если Объект.ЭтоНовый Тогда
Объект.НовыйЭлемент = Истина; // Добавляем реквизит в справочник
// Или отправляем уведомление
Сообщить("Создан новый контрагент:" + Объект.Наименование);
КонецЕсли;
КонецПроцедуры
Альтернативные подходы:
- 🔧 Триггеры базы данных: если 1С работает на SQL Server или PostgreSQL, можно настроить триггеры на таблицы справочников (например,
_ReferenceXXX). - 📡 Обмен данными: в распределённых базах новые элементы можно отслеживать через механизм обмена (узлы планов обмена).
- 🤖 Регламентные задания: запускать проверку новых элементов по расписанию (например, раз в час).
Для сложных сценариев (например, интеграции с внешними системами) используйте механизм подписок на события:
Подписка = ПодпискиНаСобытия.СоздатьМенеджер;
Подписка.Добавить("Справочник.Контрагенты.ПриЗаписи","ОбщийМодуль.ОбработчикиСобытий.НовыйКонтрагент");
Остерегайтесь:
- ⚠️ Обработчики
ПриЗаписисрабатывают и при редактировании элемента — всегда проверяйтеОбъект.ЭтоНовый. - 🔄 В транзакционных системах (например, 1С:УТ с высокой нагрузкой) события могут замедлять работу.
6. Скрытые механизмы: анализ физических таблиц и метаданных
Для опытных разработчиков есть недокументированные способы, которые позволяют определить новые элементы даже без явных полей даты создания. Эти методы требуют прав доступа к конфигуратору и знания структуры базы.
Способ 1: Анализ физических таблиц SQL
В 1С на 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
Если у вас есть доступ к серверу 1С, можно выполнить прямой запрос к базе:
Соединение = Новый 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)", Соединение);
⚠️ Внимание: Эти методы нарушают инкапсуляцию 1С и могут привести к:
- Нарушению поддержки от фирмы 1С (если используется нелицензионный доступ к таблицам).
- Ошибкам при обновлении платформы (структура таблиц может меняться).
- Проблемам с производительностью при большом количестве записей.
Перед использованием прямых SQL-запросов всегда делайте резервную копию базы. В некоторых конфигурациях (например, 1С:ERP) структуры таблиц могут отличаться от стандартных.
Сравнение методов: какой выбрать?
Выбор способа зависит от вашей задачи, уровня доступа и конфигурации 1С. Ниже таблица сравнения основных методов:
| Метод | Сложность | Точность | Требуемые права | Подходит для |
|---|---|---|---|---|
Поле ДатаСоздания |
⭐ | ⭐⭐⭐⭐ | Пользователь | Любые конфигурации с этим полем |
| Журнал изменений | ⭐⭐ | ⭐⭐⭐⭐ | Полные права | Конфигурации с ведением истории |
| Проверка ссылок ("сиротство") | ⭐⭐⭐ | ⭐⭐⭐ | Пользователь | Поиск неиспользуемых элементов |
| Сравнение с текущей датой | ⭐ | ⭐⭐⭐ | Пользователь | Отчёты по новым элементам |
События ПриЗаписи |
⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Разработчик | Автоматизация в реальном времени |
| Прямые SQL-запросы | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Администратор | Сложные аналитические задачи |
Для большинства задач достаточно комбинации поля ДатаСоздания + проверки ссылок. Если нужна высокая точность (например, для аудита), подключайте журнал изменений. Для автоматизации бизнес-процессов лучше использовать события.
⚠️ Внимание: В облачных версиях 1С (например, 1С:Фреш) доступ к физическим таблицам и некоторым методам может быть ограничен. Всегда проверяйте возможности вашей платформы перед внедрением сложных решений.
FAQ: Частые вопросы по определению новых элементов
Можно ли восстановить дату создания элемента, если поле ДатаСоздания отсутствует?
Да, но это потребует дополнительных действий:
- Если ведётся журнал изменений, возьмите дату первой записи.
- Если журнал отключён, попробуйте проанализировать даты первых документов, где используется элемент.
- В крайнем случае можно добавить поле
ДатаСозданияв конфигураторе и заполнить его регламентным заданием (например, по дате первого упоминания в базе).
Почему запрос по дате создания возвращает пустой результат, хотя элементы есть?
Возможные причины:
- Поле
ДатаСозданияскрыто или переименовано (проверьте в конфигураторе). - Элементы помечены на удаление (добавьте в запрос условие
ГДЕ НЕ ПометкаУдаления). - Даты хранятся в другом формате (например, без времени). Используйте
НачалоДнядля сравнения.
Как отследить, кто создал новый элемент?
Для этого нужно:
- Включить ведение истории изменений в справочнике.
- Использовать поле
Пользовательв журнале изменений или добавить реквизитСоздалв справочник, заполняемый в обработчикеПриЗаписи. - В 1С:ERP и 1С:КА 2 информация о пользователе может храниться в служебных полях (например,
CreatedBy).
Можно ли автоматически присваивать новым элементам определённый статус?
Да, эточная задача для обработчика ПриЗаписи. Пример:
Процедура СправочникНоменклатураПриЗаписи(Объект)
Если Объект.ЭтоНовый Тогда
Объект.Статус = Перечисления.СтатусыНоменклатуры.НоваяПозиция;
КонецЕсли;
КонецПроцедуры
Не забудьте добавить реквизит Статус в справочник и настроить права доступа на его изменение.
Как экспортировать только новые элементы в Excel?
Используйте запрос с фильтром по дате и библиотеку ЗаписьXML или Печать:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник.Контрагенты.Наименование,
| Справочник.Контрагенты.ИНН
|ИЗ
| Справочник.Контрагенты КАК Справочник.Контрагенты
|ГДЕ
| Справочник.Контрагенты.ДатаСоздания >= &ДатаНачала";
ДатаНачала = ТекущаяДата - 30; // Последние 30 дней
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Результат = Запрос.Выполнить;
Таблица = Результат.Выгрузить;
ПечатьТабличногоДокумента.Вывести(Таблица,"","", Истина);