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