Как исправить ошибку «Значение должно быть ссылкой или именем предопределённого объекта» при выборе контрагента в 1С:УТ 11?

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

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

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

Разберем техническую причину возникновения ошибки

Проблема кроется в процедуре ОбщегоНазначения.ЗначенияРеквизитовОбъекта. Данная функция является «фундаментом» для получения данных из базы. Она ожидает, что первым параметром ей передадут либо ссылку на объект (например, СправочникСсылка.Контрагенты), либо имя предопределенного элемента.

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

Почему ошибка не возникает при выборе из истории?

Рассмотрим интересный нюанс, упомянутый в обсуждении: если выбрать контрагента, который уже есть в истории (выпадающий список), ошибки нет. Но стоит нажать на «три точки» (Показать все) или начать вводить текст, как система «падает».

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

Проанализируем связь «Партнер — Контрагент»

В конфигурации «Управление торговлей 11» реализована сложная архитектура взаимодействия партнеров и контрагентов. Часто в формах для поля «Контрагент» установлены Связи параметров выбора по полю «Партнер».

Посмотрим, что происходит в коде, когда поле «Партнер» на форме отсутствует или не заполнено:

  1. Система пытается программно вычислить отбор для списка контрагентов.
  2. Механизмы БСП обращаются к функции ЗначенияРеквизитовОбъекта, чтобы получить дополнительные данные о партнере.
  3. Так как ссылка на партнера пустая или не определена, в функцию передается некорректный параметр.
  4. Результат — аварийное завершение работы.

Инструкция по диагностике через конфигуратор

Чтобы точно определить место «поломки», нам необходимо воспользоваться отладчиком. Выполним следующие шаги:

  1. Запустите базу в режиме Конфигуратор.
  2. Откройте меню Отладка — Остановка по ошибке.
  3. Убедитесь, что установлена галочка «Останавливаться по ошибке» и флаг «Игнорировать ошибки в модулях с признаком (Выполнять чтение конфигурации)».
  4. В режиме «Предприятие» воспроизведите ошибку (нажмите на выбор контрагента).
  5. Когда отладчик остановится, посмотрите на Стек вызовов. Скорее всего, вы увидите, что вызов пришел из общего модуля КонтрагентыКлиентСервер или ПартнерыИКонтрагенты.

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

Как исправить ошибку в коде и настройках

Рассмотрим основные способы решения проблемы в зависимости от её природы.

Способ 1: Исправление связей параметров выбора

Если вы работаете с управляемой формой, проверьте свойства реквизита на форме. Если для контрагента установлена связь по партнеру, попробуйте временно её отключить или убедитесь, что поле «Партнер» всегда заполнено перед началом выбора контрагента.

Способ 2: Программная очистка стандартной обработки

Если ошибка возникает в момент открытия формы выбора, мы можем перехватить это событие в модуле формы обработки. Рассмотрим пример кода:


&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Если мы хотим полностью контролировать выбор и избежать стандартных подписок
    СтандартнаяОбработка = Ложь;
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("Отбор", Новый Структура("ПометкаУдаления", Ложь));
    
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыВыбора, Элемент);
КонецПроцедуры

Установка СтандартнаяОбработка = Ложь предотвращает запуск глобальных механизмов БСП, которые могут работать некорректно в контексте внешней обработки.

Способ 3: Обновление и патчи

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

Особенности внешних обработок

Если ваша обработка внешняя, проанализируйте, использует ли она устаревшие вызовы БСП. В новых версиях для корректного выбора через «три точки» система может требовать наличия определенных параметров контекста, таких как АдресВоВременномХранилище. Без них стандартная подписка на событие «вылетает», так как не может инициализировать фоновый поиск данных.

Важный совет: Если вы создаете форму программно или используете динамические списки, всегда инициализируйте параметры выбора явно, чтобы система не пыталась «угадать» их, опираясь на пустые ссылки.

Подводя итог, можно сказать, что ошибка «Значение должно быть ссылкой...» — это симптом «недопонимания» между кодом вашей обработки и обновленными глобальными подписками конфигурации. Используя отладчик и блокировку стандартной обработки, вы сможете быстро вернуть работоспособность вашим инструментам.

← На главную