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