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