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

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