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