В практике кадровых аналитиков нередко возникают нестандартные задачи, требующие нетиповых решений. Одной из таких задач является необходимость извлечения наименований должностей в отчеты не из привычных справочников системы 1С, а непосредственно из общероссийских классификаторов, таких как ОКПДТР (Общероссийский классификатор профессий рабочих, должностей служащих и тарифных разрядов). Данные классификаторы хранятся в общих макетах программы в формате XML, что создает определенные технические сложности при работе с ними.

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