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