В процессе работы с базой данных 1С часто возникает необходимость проанализировать активность новых клиентов. Однако в типовых конфигурациях справочник Контрагенты по умолчанию не всегда содержит поле с датой создания элемента. Это создает определенные трудности при построении отчетов в СКД (Системе компоновки данных). В этой статье мы подробно разберем, как получить дату создания объекта, используя программные методы, особенности платформы и логику построения запросов.
Платформа 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С. Если объект был загружен из внешней системы (например, через веб-сервис или из другой базы) с сохранением исходного идентификатора, алгоритм может вернуть некорректную дату.
Если нам нужно обеспечить надежное хранение даты создания для новых контрагентов и быстро выводить ее в отчетах без сложных вычислений, лучше всего добавить соответствующий реквизит. Это позволит использовать поле ДатаСоздания непосредственно в запросах СКД, что значительно ускорит работу отчетов на больших объемах данных.
Разберем процесс реализации по шагам:
Контрагенты новый реквизит ДатаСоздания с типом Дата (состав даты: Дата и время).РаботаСОбъектамиСобытия) и добавим в него процедуру для заполнения этого реквизита.СправочникОбъект.Контрагенты, событие — ПередЗаписью.Посмотрим на пример кода для обработчика подписки:
Процедура ПриЗаписиКонтрагентаПередЗаписью(Источник, Отказ) Экспорт
// Проверяем, что это новый объект (еще не записан в базу)
Если Источник.ЭтоНовый() Тогда
// Заполняем дату создания текущим временем сервера
Источник.ДатаСоздания = ТекущаяДатаСеанса();
// По желанию можно фиксировать и автора создания, если есть такой реквизит
// Источник.Автор = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
// Если нужно отслеживать и изменения, можно добавить логику для реквизита ДатаИзменения
Если Источник.Модифицированность() И Не Источник.ЭтоНовый() Тогда
// Логика фиксации изменений
КонецЕсли;
КонецПроцедуры
Этот метод является самым надежным для будущего анализа, так как данные хранятся в явном виде и не зависят от логов журнала регистрации, которые могут быть очищены или утеряны при восстановлении базы.
Рассмотрим ситуацию, когда мы не можем менять конфигурацию (добавлять реквизиты) и не доверяем методу получения даты из GUID. В этом случае "новым" клиентом можно считать того, у кого первая продажа (или первое движение по взаиморасчетам) зафиксирована в отчетном периоде, а ранее движений не было.
Выясним причину, почему это эффективно для отчетов: нам важно не просто когда создали карточку контрагента, а когда он начал приносить прибыль. Проанализируем пример запроса для УТ 11 или ERP, который можно использовать в СКД:
// Сначала определим список "старых" клиентов, которые покупали что-то до начала нашего периода
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер
ПОМЕСТИТЬ ВТ_СтарыеКлиенты
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, &НачалоПериодаОтчета, , ) КАК ВыручкаОбороты;
////////////////////////////////////////////////////////////////////////////////
// Теперь выбираем продажи за период, исключая тех, кто уже закупался ранее
ВЫБРАТЬ
ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Клиент,
ВыручкаОбороты.СуммаВыручкиОборот КАК СуммаПродаж,
ВыручкаОбороты.ПериодМесяц КАК МесяцСоздания // Условно считаем первый месяц продажи
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериодаОтчета, &КонецПериодаОтчета, Авто, ) КАК ВыручкаОбороты
ГДЕ
НЕ ВыручкаОбороты.АналитикаУчетаПоПартнерам.Партнер В (ВЫБРАТЬ Ключ ИЗ ВТ_СтарыеКлиенты)
Такой подход позволяет динамически определять новых клиентов прямо в момент формирования отчета. Мы используем временную таблицу ВТ_СтарыеКлиенты, чтобы отсечь всех, кто имел обороты до выбранной даты. Те, кто остался — наши "новички" в рамках заданного интервала.
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), проанализируем настройки версионирования объектов. Если для справочника Контрагенты включено версионирование (Администрирование — Поддержка и обслуживание — История изменений), то дата создания — это дата самой первой версии объекта.
Преимущества этого способа:
ВерсииОбъектов.Рассмотрим, как это найти в базе: достаточно открыть карточку контрагента, перейти в меню "Еще" и выбрать пункт "История изменений". Если записи есть — вы увидите точное время создания первого варианта записи.
Подведем итог. Выбор метода зависит от ваших задач:
ПередЗаписью.СКД для тысяч контрагентов — плохая идея. Лучше заполнить этот реквизит один раз обработкой и в дальнейшем обращаться к готовому значению.Используя предложенные методы, вы сможете гибко настроить аналитику по новым контрагентам и обеспечить прозрачность ведения клиентской базы.