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