Как узнать дату создания контрагента в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Способ 1. Извлечение даты из уникального идентификатора (GUID)

Платформа 1С:Предприятие при создании нового объекта генерирует уникальный идентификатор (GUID). Если этот идентификатор относится к версии 1 (time-based), в нем зашифровано время его создания. Рассмотрим, как программно «вытащить» эти данные. Этот метод удобен тем, что позволяет узнать дату создания даже для тех объектов, которые были введены в базу давно, без необходимости доработки конфигурации.

Проанализируем алгоритм преобразования 16-ричной строки идентификатора в формат Дата. Разберем по шагам функцию, которую можно использовать в общем модуле или модуле отчета:


Функция ПолучитьДатуСозданияИзСсылки(Ссылка) Экспорт
    
    // Получаем уникальный идентификатор
    ГУИД = Ссылка.УникальныйИдентификатор();
    СтрокаГУИД = СтрЗаменить(Строка(ГУИД), "-", "");
    
    // GUID в 1С версии 1 имеет структуру, где части времени перемешаны.
    // Нам нужно собрать строку в правильном порядке.
    Строка16 = Сред(СтрокаГУИД, 13, 3) + Сред(СтрокаГУИД, 9, 4) + Сред(СтрокаГУИД, 1, 8);
    
    // Переводим из 16-ричной системы в десятичную (количество 100-наносекундных интервалов)
    Разрядность = СтрДлина(Строка16);
    ЧислоСек = 0;
    Для Позиция = 1 По Разрядность Цикл
        Символ = НизкийРегистр(Сред(Строка16, Позиция, 1));
        ЗначениеСимвола = Найти("123456789abcdef", Символ);
        ЧислоСек = ЧислоСек + ЗначениеСимвола * Pow(16, Разрядность - Позиция);
    КонецЦикла;
    
    // Вычисляем количество секунд (делим на 10 000 000 для перевода из наносекунд)
    ЧислоСек = ЧислоСек / 10000000;
    
    // Точка отсчета для UUID v1 — 15 октября 1582 года.
    // Также необходимо добавить смещение часового пояса сервера.
    ДатаСоздания = Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени();
    
    Возврат ДатаСоздания;
    
КонецФункции

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

Способ 2. Архитектурно правильный подход: Дополнительный реквизит и подписка

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

Разберем процесс реализации по шагам:

  1. Добавим в справочник Контрагенты новый реквизит ДатаСоздания с типом Дата (состав даты: Дата и время).
  2. Создадим общий модуль (например, РаботаСОбъектамиСобытия) и добавим в него процедуру для заполнения этого реквизита.
  3. Настроим Подписку на событие. В качестве источника выберем СправочникОбъект.Контрагенты, событие — ПередЗаписью.

Посмотрим на пример кода для обработчика подписки:


Процедура ПриЗаписиКонтрагентаПередЗаписью(Источник, Отказ) Экспорт
    
    // Проверяем, что это новый объект (еще не записан в базу)
    Если Источник.ЭтоНовый() Тогда
        // Заполняем дату создания текущим временем сервера
        Источник.ДатаСоздания = ТекущаяДатаСеанса();
        
        // По желанию можно фиксировать и автора создания, если есть такой реквизит
        // Источник.Автор = ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    
    // Если нужно отслеживать и изменения, можно добавить логику для реквизита ДатаИзменения
    Если Источник.Модифицированность() И Не Источник.ЭтоНовый() Тогда
         // Логика фиксации изменений
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Аналитический метод через запрос (поиск первой продажи)

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

Выясним причину, почему это эффективно для отчетов: нам важно не просто когда создали карточку контрагента, а когда он начал приносить прибыль. Проанализируем пример запроса для УТ 11 или ERP, который можно использовать в СКД:


// Сначала определим список "старых" клиентов, которые покупали что-то до начала нашего периода
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер
ПОМЕСТИТЬ ВТ_СтарыеКлиенты
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, &НачалоПериодаОтчета, , ) КАК ВыручкаОбороты;

////////////////////////////////////////////////////////////////////////////////
// Теперь выбираем продажи за период, исключая тех, кто уже закупался ранее
ВЫБРАТЬ
    ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Клиент,
    ВыручкаОбороты.СуммаВыручкиОборот КАК СуммаПродаж,
    ВыручкаОбороты.ПериодМесяц КАК МесяцСоздания // Условно считаем первый месяц продажи
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериодаОтчета, &КонецПериодаОтчета, Авто, ) КАК ВыручкаОбороты
ГДЕ
    НЕ ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер В (ВЫБРАТЬ Ключ ИЗ ВТ_СтарыеКлиенты)

Такой подход позволяет динамически определять новых клиентов прямо в момент формирования отчета. Мы используем временную таблицу ВТ_СтарыеКлиенты, чтобы отсечь всех, кто имел обороты до выбранной даты. Те, кто остался — наши "новички" в рамках заданного интервала.

Способ 4. Использование механизмов БСП (Версионирование)

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

Преимущества этого способа:

Рассмотрим, как это найти в базе: достаточно открыть карточку контрагента, перейти в меню "Еще" и выбрать пункт "История изменений". Если записи есть — вы увидите точное время создания первого варианта записи.

Резюме и рекомендации

Подведем итог. Выбор метода зависит от ваших задач:

  1. Если нужно быстро получить данные по старым объектам без изменения конфигурации — используйте функцию расшифровки GUID.
  2. Если вы проектируете систему на долгосрок — обязательно добавьте реквизит и подписку на событие ПередЗаписью.
  3. Для маркетинговых отчетов (анализ "первой покупки") лучше использовать запрос к регистрам накопления, так как дата создания карточки в базе может не совпадать с датой реального начала сотрудничества.
  4. Всегда помните о производительности: вычислять дату из GUID прямо в запросе СКД для тысяч контрагентов — плохая идея. Лучше заполнить этот реквизит один раз обработкой и в дальнейшем обращаться к готовому значению.

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

← На главную