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