При разработке функционала на платформе 1С часто возникает необходимость получить актуальную должность текущего пользователя. Начинающие разработчики нередко сталкиваются с ошибкой «Индекс находится за пределами массива» или получают пустой результат. Давайте вместе разберем, почему это происходит и как выстроить правильный алгоритм решения этой задачи.
Основная причина заключается в непонимании архитектуры справочников. В современных типовых конфигурациях (таких как Зарплата и Управление Персоналом, ERP, Комплексная автоматизация) справочник Пользователи не содержит кадровых данных напрямую. Он является системным объектом. Сотрудник же — это отдельный справочник, который связан с конкретным Физическим лицом.
Когда вы пытаетесь передать объект ПользователиКлиентСервер.ТекущийПользователь в функцию КадровыеДанныеСотрудников, система не находит соответствия, возвращает пустую коллекцию, а попытка обратиться к первому элементу массива [0] приводит к закономерной ошибке.
Чтобы получить данные, нам необходимо выстроить правильный путь поиска:
ТекущегоПользователя.ФизическоеЛицо, которое привязано к данному пользователю (реквизит ФизическоеЛицо справочника Пользователи).Физическим лицом.Рассмотрим пример кода, который учитывает архитектурные особенности современных конфигураций. Мы будем использовать штатный механизм КадровыйУчет, который является наиболее надежным способом получения данных.
// 1. Получаем текущего пользователя
Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
// 2. Получаем физическое лицо пользователя
ФизЛицо = Пользователь.ФизическоеЛицо;
// 3. Подготавливаем массив физических лиц для поиска
МассивФизЛицо = Новый Массив;
МассивФизЛицо.Добавить(ФизЛицо);
// 4. Получаем сотрудников по физическому лицу через стандартную функцию
// Внимание: метод КадровыйУчет.СотрудникиФизическихЛиц может отличаться в разных версиях БСП
Сотрудники = КадровыйУчет.СотрудникиФизическихЛиц(МассивФизЛицо);
// 5. Получаем кадровые данные
ДанныеОДолжностях = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Сотрудники, "Должность");
// 6. Всегда проверяем наличие данных перед обращением к массиву
Если ДанныеОДолжностях.Количество() > 0 Тогда
ДолжностьСтрока = ДанныеОДолжностях[0].Должность;
Иначе
ДолжностьСтрока = "Должность не определена";
КонецЕсли;
Часто возникает соблазн написать запрос к регистру КадроваяИсторияСотрудников. Однако это решение содержит скрытые риски. Рассмотрим, почему профессионалы рекомендуют избегать этого:
КадровыйУчет) позволяет вашему коду оставаться работоспособным при обновлениях конфигурации, так как логика сбора данных инкапсулирована внутри типовых модулей.Для того чтобы ваш код был надежным, всегда соблюдайте следующие правила:
Количество() результата запроса к кадровым данным. Это избавит вас от ошибок «Индекс за пределами массива».ФизическоеЛицо у текущего пользователя. Иногда в базе данных эта связь просто не установлена, что делает невозможным автоматическое получение должности.Физического лица может быть несколько записей в справочнике Сотрудники (основное место работы и внутреннее совместительство). В этом случае логика должна учитывать, какую именно должность (основную или по совместительству) вы хотите получить.Применяя данные подходы, вы сможете корректно интегрировать кадровые данные в свои отчеты или печатные формы, избегая распространенных ошибок и сохраняя высокое качество программного кода.