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