Как программно установить связи параметров выбора в 1С 8.3

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

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

Суть проблемы: почему возникает ошибка Недопустимое значение

Рассмотрим ситуацию, с которой сталкиваются многие разработчики. При попытке напрямую изменить свойство СвязиПараметровВыбора у элемента формы, система часто выдает ошибку "Недопустимое значение". Проанализируем причину. Свойство СвязиПараметровВыбора имеет тип ФиксированныйМассив, который состоит из объектов типа СвязьПараметраВыбора. Главная особенность фиксированного массива заключается в том, что его нельзя изменять после создания — в нем отсутствуют методы Добавить, Удалить или Очистить.

Для корректной установки связей необходимо выполнить следующую последовательность действий:

  1. Создать обычный массив (объект типа Массив).
  2. Наполнить его новыми объектами СвязьПараметраВыбора.
  3. Преобразовать обычный массив в ФиксированныйМассив и присвоить его свойству элемента формы.

Базовый пример программной установки связи

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


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

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

Универсальный метод замены или добавления связей

Для более удобной работы проанализируем вспомогательную процедуру, которая позволяет заменять конкретную связь по имени, не затрагивая остальные настройки элемента формы. Это особенно полезно в тиражных решениях и крупных конфигурациях, таких как ERP или БП 3.0.


Процедура ЗаменитьСвязьПараметровВыбора(ЭлементФормы, ИмяСвязи, НоваяСвязьОбъект) Экспорт
    
    МассивСвязей = Новый Массив;
    
    // Перебираем текущие связи элемента и копируем те, которые не планируем менять
    Для Каждого ТекущаяСвязь Из ЭлементФормы.СвязиПараметровВыбора Цикл
        Если ВРег(ТекущаяСвязь.Имя) <> ВРег(ИмяСвязи) Тогда
            МассивСвязей.Добавить(ТекущаяСвязь);
        КонецЕсли;
    КонецЦикла;
    
    // Добавляем нашу новую связь в общий список
    МассивСвязей.Добавить(НоваяСвязьОбъект);
    
    // Применяем настройки обратно к элементу
    ЭлементФормы.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
    
КонецПроцедуры

Вызов этой процедуры может выглядеть так:


НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Номенклатура");
ЗаменитьСвязьПараметровВыбора(Элементы.Характеристика, "Отбор.Владелец", НоваяСвязь);

Особенности путей данных в табличных частях

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

Правильный синтаксис для табличных частей подразумевает использование конструкции ТекущиеДанные. Выясним, как это выглядит на практике:

Вместо Объект.НоменклатураЗаказаПереработчика (если это ТЧ), следует использовать полный путь через коллекцию элементов формы:

Элементы.НоменклатураЗаказаПереработчика.ТекущиеДанные.ВидНоменклатуры

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

Сложные случаи: отборы по реквизитам реквизитов

Иногда требуется установить связь не по владельцу, а по какому-то свойству объекта. Например, при выборе Характеристики номенклатуры нам нужно передать ВидНоменклатуры, который хранится внутри самой Номенклатуры. В некоторых типовых решениях (например, ERP) это реализовано через специальные механизмы в формах выбора.

Если прямое использование Отбор.Владелец не работает из-за сложной иерархии (когда характеристики могут быть общими для вида номенклатуры), рекомендуется передавать параметр с уникальным именем, например, Номенклатура, а уже в самой форме выбора (в процедуре ПриСозданииНаСервере) обрабатывать этот параметр и устанавливать программный отбор в списке.

Рассмотрим, как можно перехватить такие параметры в форме выбора справочника, применяя методы доработки динамических списков:


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

Альтернатива: Использование события НачалоВыбора

Если программная установка через СвязиПараметровВыбора кажется слишком жесткой или громоздкой, разберем альтернативный вариант — использование события НачалоВыбора. Этот метод дает максимальную гибкость — для этого подойдёт обработка контроля заполнения и подстановки реквизитов.

Алгоритм действий следующий:

  1. Установить у элемента формы свойство РежимВыбораИзСписка = Ложь.
  2. Создать обработчик события НачалоВыбора.
  3. Внутри обработчика сформировать структуру параметров и открыть форму выбора вручную.

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

Этот способ позволяет не только устанавливать связи, но и накладывать любые сложные фильтры, которые невозможно описать через простые СвязиПараметровВыбора (как и выбор картинки из библиотеки), например, фильтрацию по остаткам на конкретном складе или по правам доступа текущего пользователя.

Резюме и рекомендации

Подведем итог нашему анализу. При программной работе со связями параметров выбора важно помнить:

Проанализировав все способы, мы видим, что программное управление связями — это мощный инструмент, который делает интерфейс приложения более отзывчивым и интеллектуальным, помогая пользователю быстрее вводить корректные данные — в этом поможет расширение для ускорения подбора и ввода данных.

← На главную