1. Исходное техническое задание
Назначение и область применения Необходимо реализовать функционал для УТ / КА / ERP, который фиксирует ключевые действия пользователя в карточке номенклатуры, позволяет администратору управлять логированием без изменения кода и выводит результаты в отдельный отчет. Реализация допускается только в расширении.
Требования к структуре данных Создать Регистр сведений ЖурналДействийНоменклатуры.
-
Измерения: ДатаВремя (с точностью до секунд), Номенклатура, Пользователь, Действие (Перечисление). Индекс и состав измерений должны позволять быстрый отбор.
-
Ресурсы: Комментарий (Строка 250), ИмяФормы (Строка 100).
-
Ограничение: Записи создаются только программно, ручное редактирование запрещено правами.
Функциональные требования Логирование работает только при включенной настройке (булево). Фиксируются следующие события:
-
Открытие карточки: Комментарий «Открыта карточка». Должна быть защита от «шума» — фиксировать открытие не чаще 1 раза в 5 минут на сочетание (Пользователь + Номенклатура).
-
Запись номенклатуры: Комментарий «Записано».
-
Изменение цены: В карточку добавляется нетиповой реквизит формы «ТестоваяЦена» и кнопка. При изменении значения фиксируется лог «Цена: было X стало Y».
Права доступа и интерфейс Создать роль ПросмотрЖурналаНоменклатуры (только чтение регистра и открытие отчета). Разработать отчет на СКД с отборами по периоду и номенклатуре.
2. Архитектура решения и Метаданные
Для изоляции логики создана отдельная подсистема ЖурналДействийНоменклатуры. В состав расширения вошли:
-
Регистр сведений:
ЖурналДействийНоменклатуры(непериодический, независимый). ИзмерениеНоменклатурапроиндексировано. -
Перечисление:
ДействияНоменклатуры(ОткрытиеКарточки, Запись, ИзменениеЦены). -
Константа:
ВестиЖурналДействийНоменклатурыдля управления подсистемой в режиме Предприятия. -
Роли:
СА_ОсновнаяРольиПросмотрЖурналаНоменклатуры. -
Общий модуль:
ЖурналДействийНоменклатурыСервердля инкапсуляции бизнес-логики. -
Отчет: Вывод данных регистра на базе типовой схемы компоновки данных.
3. Техническая реализация (Под капотом)
Безопасная модификация интерфейса (UI)
Добавление нетиповых элементов (поле ввода цены и кнопка) на форму справочника «Номенклатура» реализовано исключительно программно, чтобы избежать конфликтов при обновлениях типовой конфигурации.
-
В обработчике
ПриСозданииНаСерверевызывается методИзменитьРеквизиты, который добавляет реквизитыТестоваяЦенаиТестоваяЦенаПредыдущая(Число 15.2). -
Элементы управления динамически выводятся в типовую группу
ГруппаДополнительныеРеквизитыс помощьюЭлементы.Добавить().
Перехват событий
Вмешательство в жизненный цикл карточки номенклатуры происходит через аннотации расширения:
-
Открытие: Обрабатывается через
&После("ПриСозданииНаСервере"). Лог пишется только при открытии уже записанного в базу элемента (проверкаЗначениеЗаполнено(Объект.Ссылка)). -
Запись: Фиксируется через
&После("ПослеЗаписиНаСервере"). -
Изменение цены: Контролируется клиентской процедурой. Серверный вызов для записи лога происходит только если текущая цена отличается от предыдущей и сам элемент номенклатуры уже записан в базу.
Защита от «шума» и отказоустойчивость
Вся работа с данными вынесена в серверный модуль:
-
Ограничение в 5 минут: Перед записью события «Открытие карточки» выполняется легковесный запрос
ВЫБРАТЬ ПЕРВЫЕ 1к регистру с отбором по Номенклатуре, Пользователю и условиемДатаВремя >= ТекущаяДатаСеанса() - 300. Если запись найдена, дубликат отсекается, а информация уходит в Журнал Регистрации (УровеньЖурналаРегистрации.Информация). -
Изолированная запись: Фиксация логов выполняется через
НаборЗаписейвнутри блокаПопытка...Исключение. В случае конфликта блокировок ошибка не прерывает работу пользователя, а тихо пишется в системный Журнал Регистрации средствами БСП (ЗаписьЖурналаРегистрации). -
Маппинг: Для гибкости кода используется функция
МапингСобытий(), связывающая внутренние числовые идентификаторы событий со ссылками перечисления.
4. Как протестировать функционал
-
Установите расширение (файл прикреплен к публикации).
-
Перейдите в раздел Журнал действий номенклатуры -> Сервис и включите константу «Вести журнал действий номенклатуры».
-
Откройте любую карточку товара, измените значение в новом поле Тестовая цена и сохраните элемент.
-
Проверьте результаты работы механизмов в отчете: Журнал действий номенклатуры -> Отчеты -> Журнал действий номенклатуры.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.7.402
Вступайте в нашу телеграмм-группу Инфостарт