Почему при выборе контрагента в УТ 11.5 автоматически устанавливается отбор по пустому партнеру?

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

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

Механизм «Связи параметров выбора» в метаданных

Первым делом проанализируем настройки реквизитов на уровне метаданных. В типовых решениях на платформе «1С:Предприятие 8.3» связь между объектами часто задается через свойство СвязиПараметровВыбора (ChoiceParameterLinks). Для реквизита Контрагент в документах обычно прописана связь с реквизитом Партнер.

Когда мы открываем форму выбора, платформа автоматически считывает текущее значение связанного поля. Если Партнер не заполнен, в параметры формы выбора передается пустая ссылка этого типа. Динамический список в форме выбора, получая этот параметр, накладывает условие: «показать только тех контрагентов, у которых владелец (партнер) соответствует переданному значению». Поскольку значение пустое, система ищет контрагентов с пустым партнером.

Программное изменение связей в форме документа

Иногда при проверке свойств реквизита в конфигураторе мы видим, что поле Связи параметров выбора пустое. Однако отбор всё равно появляется. Это происходит потому, что связи могут устанавливаться программно. Рассмотрим, где именно в УТ 11.5 это реализовано.

В модуле формы документа, в процедуре ПриСозданииНаСервере, часто вызываются переопределяемые модули БСП или отраслевые подсистемы. Проанализируем следующий пример кода, который может быть вызван в форме заказа:


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

КонецПроцедуры

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


// Результат в табло:
Элементы.Контрагент.СвязиПараметровВыбора.Количество() // Возвращает 1

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

Фиксированные настройки динамического списка

Если анализ связей параметров выбора не дал результата, нам следует обратить внимание на ФиксированныеНастройки динамического списка в самой форме выбора справочника «Контрагенты». Фиксированные настройки отличаются от обычных тем, что пользователь не может их изменить или увидеть через стандартное окно «Настроить список» (кнопка «Ещё»).

Разберем ситуацию: отбор появляется не в момент открытия формы, а уже внутри неё. Проанализируем процедуру ПриСозданииНаСервере в форме выбора контрагентов. Там может находиться код, который анализирует переданную структуру Параметры.


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

КонецПроцедуры

Однако коварство заключается в том, что если код написан без проверки ЗначениеЗаполнено(), то отбор по пустой ссылке будет установлен принудительно, как только параметр Партнер (даже пустой) будет передан из формы-владельца.

Роль функциональных опций и общих модулей

В конфигурации УТ 11.5 поведение связки «Партнер-Контрагент» жестко регулируется функциональной опцией «Независимо вести партнеров и контрагентов». Проанализируем, как это влияет на программный код:

  1. Если опция выключена: система считает, что партнер и контрагент — это по сути одна сущность. В этом случае отборы накладываются более жестко, так как выбор «другого» контрагента для партнера не имеет смысла.
  2. Если опция включена: логика становится более гибкой, и типовые модули (такие как ПартнерыИКонтрагентыВызовСервера или ПартнерыИКонтрагентыКлиентСервер) начинают использовать более сложные условия фильтрации.

Выясним причину автоматического отбора, проверив вызовы в общих модулях. Часто за фильтрацию отвечают механизмы подсистемы «Контактная информация» и общие формы подбора БСП, которые анализируют структуру документа и накладывают фильтры «владелец — подчиненный» автоматически, исходя из логики бизнес-процесса.

Как диагностировать и исправить ситуацию по шагам

Рассмотрим алгоритм действий для разработчика, столкнувшегося с этой проблемой:

  1. Проверка в конфигураторе: Откройте форму документа и проверьте свойства элемента формы Контрагент. Загляните в раздел «Использование» — Связи параметров выбора. Если там указана связь с партнером, удалите её или добавьте условие очистки.
  2. Точка останова в форме выбора: Откройте модуль формы выбора справочника Контрагенты. Поставьте точку останова в самом начале процедуры ПриСозданииНаСервере. Посмотрите содержимое переменной Параметры.Отбор. Если отбор уже там — значит, он передан платформой на основе связей параметров.
  3. Проверка переопределяемых модулей: Если в метаданных связей нет, ищите в форме документа-владельца (откуда вызывается выбор) вызовы процедур из модулей с суффиксом Переопределяемый. Именно там (например, в КоммерческиеПредложенияДокументыПереопределяемый) может программно заполняться массив СвязиПараметровВыбора.
  4. Изучение Компоновщика настроек: Проверьте Список.КомпоновщикНастроек.Настройки.Отбор и Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор непосредственно перед выводом формы пользователю.

Если ваша задача — разрешить выбор любого контрагента при пустом партнере, вам может потребоваться программно очистить связи параметров перед открытием формы выбора или изменить логику в ОбработкаПолученияДанныхВыбора в модуле менеджера справочника Контрагенты. Помните, что в типовых решениях УТ 11.5 прямое изменение таких механизмов может повлиять на целостность данных, поэтому всегда проверяйте, не приведет ли это к возможности выбора контрагента, не принадлежащего выбранному партнеру, когда партнер в документе всё же указан.

← На главную