Что делать, если в 1С:УНФ пропала функция ПолучитьСотрудниковПользователя?

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

При обновлении конфигурации 1С:Управление нашей фирмой (УНФ) с достаточно старых релизов на современные версии (например, 1.6.23 и выше) разработчики часто сталкиваются с неприятной ошибкой: Метод объекта не обнаружен (ПолучитьСотрудниковПользователя). Эта проблема особенно актуальна, если в базе установлены сторонние расширения или доработки, например, от компании «ИжТиСи», которые продолжают обращаться к функционалу, признанному вендором устаревшим.

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

Причина возникновения проблемы: глобальный рефакторинг УНФ

Разберем ситуацию с точки зрения развития конфигурации. Ранее программный продукт носил название «Управление небольшой фирмой». В тот период большинство общих модулей имели соответствующий префикс. В ходе масштабного обновления и ребрендинга (переход к «Управлению нашей фирмой») фирма «1С» провела глубокий рефакторинг кода. Многие модули были переименованы (например, в УНФСервер, УНФСобытия), а часть функционала была перенесена непосредственно в модули менеджеров справочников или регистров.

Функция ПолучитьСотрудниковПользователя изначально располагалась в общем модуле УправлениеНебольшойФирмойСервер. В современных версиях этот модуль либо полностью удален, либо не содержит старых методов. Это и приводит к тому, что внешние доработки, «привыкшие» искать код по старому адресу, выдают ошибку при выполнении.

Анализ технической сути функции

Проанализируем, за что отвечала эта функция. Ее основной задачей было получение списка (массива) элементов справочника Сотрудники, которые закреплены за конкретным пользователем информационной базы. В старых редакциях эта связь хранилась в специализированном регистре сведений СотрудникиПользователя.

В актуальных версиях УНФ структура хранения данных изменилась:

  1. Связь между пользователем и сотрудником теперь чаще всего реализуется через реквизит Пользователь непосредственно в справочнике Сотрудники.
  2. Система стремится к уникальности связи «один пользователь — один сотрудник», хотя архитектурно всё еще может существовать несколько записей.
  3. Для получения этих данных теперь следует использовать запросы к справочнику Сотрудники или обращаться к новым общим модулям, работающим с персоналом.

Способ 1: Создание модуля-заглушки (быстрое решение)

Если ваша доработка (например, «БухгалтерскиеДанные») обращается к старому модулю в нескольких местах, самым эффективным способом будет создание «прослойки». Это позволит не переписывать код стороннего разработчика, к которому у вас может не быть полного доступа или желания его менять.

Выясним, как реализовать этот метод. Вам необходимо создать новый общий модуль с именем УправлениеНебольшойФирмойСервер (если он отсутствует) и установить у него флаг «Сервер» и «Вызов сервера». Внутри модуля следует разместить функцию, которая будет эмулировать старое поведение, но использовать современные структуры данных.

Рассмотрим пример кода для такого модуля:


Функция ПолучитьСотрудниковПользователя(Пользователь = Неопределено) Экспорт
    // Если параметр не передан, берем текущего пользователя сеанса
    Если Пользователь = Неопределено Тогда
        Пользователь = ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    
    МассивСотрудников = Новый Массив;
    
    // Используем запрос к справочнику Сотрудники, 
    // так как в новых версиях связь хранится там
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Сотрудники.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |	Сотрудники.Пользователь = &Пользователь
        |	И НЕ Сотрудники.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("Пользователь", Пользователь);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        МассивСотрудников.Добавить(Выборка.Ссылка);
    КонецЦикла;
    
    Возврат МассивСотрудников;
КонецФункции

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

Способ 2: Использование расширения конфигурации

Посмотрим на ситуацию со стороны правильной архитектуры. Чтобы не изменять типовую конфигурацию и не усложнять будущие обновления, рекомендуется вынести этот «костыль» в расширение. Создайте новое расширение, добавьте в него общий модуль с нужным именем и пропишите там код, приведенный выше.

Преимущества этого подхода:

Анализ проблем с тонким клиентом

Проанализируем замечание о том, что обращение к функции из тонкого клиента может не сработать. Если ваша доработка вызывает эту функцию непосредственно из формы, убедитесь, что в свойствах общего модуля стоят правильные галочки. Для работы из тонкого клиента модуль должен иметь свойство «Вызов сервера». Однако, если функция вызывается из другого серверного модуля (что чаще всего и происходит в доработках ИжТиСи), достаточно флага «Сервер».

Рекомендации по работе с внешними разработчиками

Если вы используете платные продукты, такие как компоненты от «1С-ИжТиСи», разберем алгоритм действий:

  1. Проверьте личный кабинет поставщика на наличие обновлений. Проблема исчезновения модулей при переходе с УНФ 1.4/1.5 на 1.6 хорошо известна, и скорее всего, у разработчика уже есть исправленная версия.
  2. Если обновления нет, напишите в службу поддержки. Укажите версию вашей конфигурации и текст ошибки.
  3. Если поддержка недоступна, воспользуйтесь Способом 1, описанным выше.

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

← На главную