Как настроить версионирование регистра сведений и отследить удаление данных в 1С:ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

В процессе администрирования и сопровождения конфигурации «1С:Зарплата и управление персоналом 3.1» (ЗУП 3.1) специалисты часто сталкиваются с загадочным исчезновением ключевых данных. Одной из типичных проблем является внезапная пропажа или изменение стажей сотрудников. Поскольку данные о стажах напрямую влияют на расчет больничных листов и пособий, оперативное выявление причин их изменения становится первоочередной задачей.

В этой статье мы подробно разберем, как устроено хранение стажей в системе, почему стандартный механизм версионирования конфигурации не отображает регистры сведений, и рассмотрим три практических метода решения этой проблемы: от использования встроенных платформенных механизмов до создания быстрого логирования изменений через расширение конфигурации.

Где именно хранятся стажи сотрудников в ЗУП 3.1?

Прежде чем приступать к отслеживанию изменений, выясним структуру хранения этих данных в базе. В конфигурации ЗУП 3.1 сведения о стажах (страховой стаж, общий стаж, стаж работы на севере и другие виды) жестко привязаны к физическому лицу. Они хранятся в независимом периодическом регистре сведений РегистрСведений.СтажиФизическихЛиц. Этот регистр имеет следующую структуру:

Когда пользователь вносит изменения в карточке сотрудника по ссылке «Трудовая деятельность», система производит перезапись набора записей в этом регистре сведений по конкретному физическому лицу.

Почему стандартное версионирование БСП не видит регистры сведений?

При переходе в меню «Администрирование — Общие настройки — История изменений» пользователи и администраторы видят список справочников и документов, для которых можно включить запись версий. Однако независимых регистров сведений в этом списке нет. Проанализируем, почему так происходит.

Типовой механизм «Версионирование объектов», входящий в состав Библиотеки стандартных подсистем (БСП), ориентирован исключительно на работу с ссылочными типами данных (справочники, документы). Вся история версий записывается в регистр сведений РегистрСведений.ВерсииОбъектов, где ведущее измерение Объект имеет тип ссылки. Поскольку отдельная запись или набор записей независимого регистра сведений не обладает уникальной ссылкой (UUID), механизм БСП технически не может хранить их истории «из коробки».

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

Решение 1. Платформенный механизм «История данных» (версии 8.3.11 и выше)

Начиная с версии платформы 1С:Предприятие 8.3.11, разработчикам доступен мощный встроенный механизм — «История данных». В отличие от версии БСП, этот механизм реализован на уровне СУБД самой платформой и умеет работать с любыми таблицами базы данных, включая независимые регистры сведений.

Выясним по шагам, как активировать этот инструмент для отслеживания изменений стажа:

  1. Включение истории данных в Конфигураторе: Откройте конфигурацию базы данных, найдите ветку РегистрыСведений и выберите СтажиФизическихЛиц. В палитре свойств этого регистра найдите свойство «История данных» и установите для него значение «Использовать».
  2. Настройка прав доступа: Для того чтобы платформа автоматически записывала версии при изменении регистра, у пользователей (или у ролей, под которыми они работают) должны быть активны соответствующие права на этот регистр. Перейдите в свойства ролей и убедитесь, что для регистра СтажиФизическихЛиц отмечены права:
    • Чтение истории данных
    • Просмотр истории данных
    • Обновление истории данных
    Рекомендуем выполнять эти настройки через расширение конфигурации, чтобы не снимать основную конфигурацию ЗУП 3.1 с поддержки.
  3. Просмотр изменений: Платформа не предоставляет встроенного стандартного интерфейса для просмотра истории регистров сведений в режиме «1С:Предприятие». Чтобы увидеть, кто и когда изменил запись, можно воспользоваться обработкой из состава «Инструментов разработчика» или написать небольшую внешнюю обработку, которая программно вызывает метод работы с историей данных:
    
    МенеджерИстории = ИсторияДанных.СоздатьМенеджер(Метаданные.РегистрыСведений.СтажиФизическихЛиц);
    // Далее производится выборка версий по конкретному ключу записи
    

Решение 2. Экспресс-метод логирования через расширение (Журнал регистрации)

Если вам требуется мгновенный результат без изменения структуры метаданных и разворачивания тяжелых механизмов хранения версий, самым надежным решением станет перехват события записи в модуле набора записей регистра с фиксацией изменений в системном Журнале регистрации.

Для реализации этого метода мы создадим расширение конфигурации и добавим в него обработчик события ПередЗаписью для регистра сведений СтажиФизическихЛиц. Рассмотрим пример реализации кода, который сравнивает записываемые данные с уже существующими в базе и детально логирует факт удаления или изменения стажа:


&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, Замещение)
	
	// Если запись производится с замещением, проанализируем старые данные
	Если Замещение Тогда
		
		Для Каждого ЗаписьНовая Из ЭтотОбъект Цикл
			
			// Сформируем запрос для получения текущего состояния записи в базе
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|	Стажи.ДатаОтсчета КАК ДатаОтсчета,
				|	Стажи.РазмерМесяцев КАК РазмерМесяцев,
				|	Стажи.РазмерДней КАК РазмерДней
				|ИЗ
				|	РегистрСведений.СтажиФизическихЛиц КАК Стажи
				|ГДЕ
				|	Стажи.ФизическоеЛицо = &ФизическоеЛицо
				|	И Стажи.ВидСтажа = &ВидСтажа";
				
			Запрос.УстановитьПараметр("ФизическоеЛицо", ЗаписьНовая.ФизическоеЛицо);
			Запрос.УстановитьПараметр("ВидСтажа", ЗаписьНовая.ВидСтажа);
			
			РезультатЗапроса = Запрос.Выполнить();
			Если Не РезультатЗапроса.Пустой() Тогда
				Выборка = РезультатЗапроса.Выбрать();
				Выборка.Следующий();
				
				// Проверим, изменились ли данные стажа
				Если Выборка.ДатаОтсчета <> ЗаписьНовая.ДатаОтсчета 
					Или Выборка.РазмерМесяцев <> ЗаписьНовая.РазмерМесяцев 
					Или Выборка.РазмерДней <> ЗаписьНовая.РазмерДней Тогда
					
					ТекстЛога = ШаблонФМ(
						"Изменен стаж по физ. лицу: %1. Вид стажа: %2. Старые значения: %3 (Месяцев: %4, Дней: %5). Новые значения: %6 (Месяцев: %7, Дней: %8)",
						ЗаписьНовая.ФизическоеЛицо,
						ЗаписьНовая.ВидСтажа,
						Выборка.ДатаОтсчета, Выборка.РазмерМесяцев, Выборка.РазмерДней,
						ЗаписьНовая.ДатаОтсчета, ЗаписьНовая.РазмерМесяцев, ЗаписьНовая.РазмерДней
					);
					
					ЗаписьЖурналаРегистрации(
						"ИзменениеСтажаСотрудника",
						УровеньЖурналаРегистрации.Предупреждение,
						Метаданные.РегистрыСведений.СтажиФизическихЛиц,
						,
						ТекстЛога
					);
				КонецЕсли;
			КонецЕсли;
			
		КонецЦикла;
		
		// Обработка ситуации полного удаления записей по физлицу
		Если ЭтотОбъект.Количество() = 0 И ЭтотОбъект.Отбор.ФизическоеЛицо.Использование Тогда
			
			ФизЛицоОтбор = ЭтотОбъект.Отбор.ФизическоеЛицо.Значение;
			ТекстЛогаОчистки = "Произведено удаление или полная очистка записей о стажах по физическому лицу: " + СокрЛП(ФизЛицоОтбор);
			
			ЗаписьЖурналаРегистрации(
				"УдалениеСтажаСотрудника",
				УровеньЖурналаРегистрации.Предупреждение,
				Метаданные.РегистрыСведений.СтажиФизическихЛиц,
				,
				ТекстЛогаОчистки
			);
			
		КонецЕсли;
		
	КонецЕсли;
	
	// Вызов оригинального обработчика события
	ПродолжитьВызов(Отказ, Замещение);
	
КонецПроцедуры

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

Решение 3. Обходной путь в рамках БСП — версионирование родителя

Если вы хотите использовать исключительно типовой интерфейс БСП «История изменений» без написания сложных обработок просмотра истории, можно применить архитектурный обходной путь.

Поскольку записи регистра СтажиФизическихЛиц логически подчинены элементам справочника ФизическиеЛица, мы можем искусственно вызывать запись новой версии справочника при любом изменении его стажей. Для этого:

  1. В настройках хранения истории изменений БСП включите версионирование для справочника «Физические лица».
  2. Создайте подписку на событие ПриЗаписи регистра сведений СтажиФизическихЛиц в расширении.
  3. В обработчике события программно находите соответствующее физическое лицо и принудительно инициируйте запись версии для этого объекта с помощью стандартных механизмов БСП:
    
    // Пример программного создания версии объекта БСП
    Справочники.ФизическиеЛица.ЗаписатьВерсиюОбъекта(ФизическоеЛицо);
    

При сравнении версий физического лица в стандартном отчете БСП вы увидите, что в момент изменения записей в подчиненном регистре была зафиксирована новая версия карточки физлица с указанием автора изменений.

Скрытые системные причины: почему стажи могут «исчезать» сами?

Проанализируем ситуацию, когда пользователи утверждают, что не удаляли стаж. В ЗУП 3.1 существует ряд фоновых автоматических процессов, способных непреднамеренно перезаписывать или очищать данные регистра сведений:

Использование предложенного нами экспресс-метода логирования в Журнал регистрации (Решение 2) позволит быстро определить, под чьим сеансом (конкретного пользователя или системной учетной записи фонового задания обмена) произошло удаление записей.

← На главную