Как исправить ошибку «СотрудникПредставление» при вводе сотрудника в веб-клиенте 1С:ЗУП?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При разработке расширений для конфигурации 1С:Зарплата и управление персоналом (ЗУП) 3.1 программисты часто сталкиваются с тем, что функционал, идеально работающий в тонком клиенте, начинает выдавать критические ошибки в веб-клиенте. Одной из таких проблем является ошибка при попытке ручного ввода (подбора по строке) сотрудника в поле формы. Рассмотрим ситуацию, когда при вводе первой же буквы система выдает сообщение: «Значение не является значением объектного типа (СотрудникПредставление)».

Проанализируем ситуацию и выявим причину

Ошибка локализуется в общем модуле СотрудникиРасширенный. В типовом коде системы происходит обработка данных, полученных в результате поиска по введенной строке. Проанализируем фрагмент кода, на который указывает стек ошибки:


Если Не ПустаяСтрока(СтрокаПоиска) И Не СтрНачинаетсяС(ВРег(ДанныеСотрудника.СотрудникПредставление), ВРег(СтрокаПоиска)) Тогда
    // Логика фильтрации
КонецЕсли;

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

Выясним основные причины, почему это происходит именно в веб-клиенте:

  1. Особенности сериализации: При динамическом формировании списка выбора в веб-браузере данные могут передаваться не полностью, если объект не был инициализирован должным образом в расширении.
  2. Полнотекстовый поиск: Механизм автоподбора в ЗУП часто опирается на индексы полнотекстового поиска. Если индекс не актуален, веб-клиент может вернуть пустую таблицу результатов, что приводит к обращению к несуществующему свойству объекта.
  3. Связи параметров выбора: В расширении для поля Сотрудник могут быть не перенесены или не настроены СвязиПараметровВыбора (Choice Parameter Links), такие как фильтр по организации или периоду.

Способ 1: Использование собственного обработчика АвтоПодбор

Разберем наиболее надежное решение, которое применил автор темы. Если типовой механизм ОбработкаПолученияДанныхВыбора в справочнике Сотрудники дает сбой в веб-клиенте, мы можем перехватить процесс поиска непосредственно на форме в расширении.

Для этого выполним следующие шаги:

  1. Найдем на форме наше поле Сотрудник.
  2. Создадим для него событие АвтоПодбор.
  3. В обработчике события установим СтандартнаяОбработка = Ложь и реализуем собственный алгоритм поиска.

Рассмотрим пример кода:


&НаКлиенте
Процедура ИмяПоляСотрудникАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    // Отключаем стандартный механизм, вызывающий ошибку
    СтандартнаяОбработка = Ложь;
    
    // Вызываем серверную функцию для получения корректного списка сотрудников
    ДанныеВыбора = ПолучитьСписокСотрудниковДляПодбора(Текст);
    
КонецПроцедуры

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

Такой подход полностью исключает обращение к проблемному участку типового кода в модуле СотрудникиРасширенный, так как мы самостоятельно управляем списком ДанныеВыбора.

Способ 2: Проверка метаданных и связей параметров выбора

Проанализируем ситуацию глубже. Иногда ошибка возникает из-за того, что в расширение добавлено поле, но не добавлены все параметры, которые ожидает типовой код. В ЗУП 3.1 подбор сотрудника сильно зависит от контекста: организации, даты и подразделения.

Посмотрим на свойства поля Сотрудник в типовой форме и сравним с вашим полем в расширении:

Способ 3: Обновление индексов полнотекстового поиска

Как показывает практика работы с веб-клиентом, он более чувствителен к состоянию поисковых индексов. Если ошибка «плавающая» или возникает только на определенных данных, стоит выполнить обслуживание базы данных.

Рассмотрим порядок действий для администратора:

  1. Зайдите в раздел Администрирование — Обслуживание.
  2. Выберите пункт Управление полнотекстовым поиском.
  3. Нажмите кнопку Очистить индекс, а затем Обновить индекс.

После полного обновления индекса структура ДанныеСотрудника в типовых модулях должна начать заполняться корректно, что может устранить ошибку без внесения изменений в код.

Резюме

Для быстрого решения проблемы в условиях сжатых сроков наиболее эффективным является Способ 1 — программное переопределение события АвтоПодбор. Это гарантирует стабильную работу веб-клиента независимо от состояния индексов и сложности типовых механизмов ЗУП. Однако для долгосрочной перспективы рекомендуется также проверить актуальность индексов и корректность настройки связей параметров в метаданных расширения.

← На главную