Как реализовать отбор договоров по организации в управляемых формах 1С?

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

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

Метод 1. Использование свойств метаданных «Связи параметров выбора»

Платформа 1С:Предприятие 8 предоставляет мощный декларативный механизм для установки отборов без написания кода. Этот механизм настраивается непосредственно в дереве метаданных объекта. Разберем по шагам, как правильно его сконфигурировать.

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

  1. В колонке «Параметр выбора» выберем Отбор.Организация. Это указывает платформе, что мы хотим наложить фильтр на поле Организация справочника договоров.
  2. В колонке «Путь к данным» необходимо указать реквизит нашего документа, из которого будет браться значение для фильтра. Важный нюанс: если организация находится в шапке документа, путь должен выглядеть как Объект.Организация. Если указать просто Организация, система может не найти данные в контексте строки табличной части.

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

Метод 2. Программная установка отбора через событие «НачалоВыбора»

Если настройки в метаданных не дают нужного результата или требуется более сложная логика (например, отбор должен зависеть от нескольких условий одновременно), мы используем программный метод. Это самый гибкий и контролируемый способ.

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


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

Выясним причину, почему мы используем СтандартнаяОбработка = Ложь. Если оставить этот флаг в значении Истина, платформа попытается открыть форму самостоятельно, игнорируя наши программные надстройки. Установив ложь, мы берем управление на себя.

Особенности работы с владельцем в 1С:УПП

Как мы уже выяснили, договор жестко связан с владельцем (контрагентом). Если ваша задача — выбирать договор по организации, независимо от того, какой контрагент выбран в строке (или если он еще не выбран), программный метод позволяет обойти стандартное поведение платформы.

Однако стоит помнить о целостности данных: если вы выберете договор организации «А», принадлежащий контрагенту «Иванов», в то время как в строке документа выбран контрагент «Петров», это может привести к ошибкам проведения в типовых механизмах УПП. Поэтому рекомендуется всегда включать Владелец в структуру отбора, если контрагент уже указан в документе.

Дополнительные настройки в свойствах реквизита

Посмотрим на дополнительные свойства, которые могут влиять на поведение формы выбора договора:

  1. «Параметры выбора»: В отличие от «Связей параметров выбора», здесь задаются статические значения. Например, если вы хотите показывать только договоры в определенной валюте, это можно указать здесь.
  2. «Режим выбора из списка»: Если этот флаг включен, вместо формы выбора будет выпадать список. В этом случае программные отборы нужно настраивать через событие АвтоПодбор или заполнять список выбора при начале редактирования.
  3. «Выбор групп и элементов»: Убедитесь, что установлено значение Элементы. Если установлены Группы и элементы, пользователь может случайно выбрать папку в справочнике договоров, что недопустимо для реквизита типа «СправочникСсылка».

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

Резюме для реализации

Подводя итог, наиболее стабильный путь решения задачи в управляемых формах 1С:УПП выглядит так:

Во-первых, проверьте правильность путей в «Связях параметров выбора» в метаданных. Используйте префикс Объект. для реквизитов шапки.

Во-вторых, если автоматический механизм продолжает запрашивать контрагента перед договором, переходите к программной реализации в событии НачалоВыбора. Это позволит вам четко определить, какие именно договоры должен видеть пользователь, и избежать лишних диалоговых окон выбора владельца.

Используя предложенные методы, мы обеспечиваем удобство работы пользователя и гарантируем корректность заполнения аналитики «Организация - Договор» в системе.

← На главную