Как ограничить выбор типа в составном поле табличной части 1С при выполнении определенных условий

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

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

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

Метод 1. Использование события «ПриАктивизацииСтроки»

Этот метод основан на динамическом изменении свойств элемента формы. Когда пользователь перемещается по строкам таблицы, мы анализируем данные текущей строки и устанавливаем свойство ОграничениеТипа для всей колонки. Для исследования и интерактивной настройки свойств элементов управляемой формы в пользовательском режиме можно использовать редактор форм в режиме предприятия.

Рассмотрим ситуацию, когда у нас есть табличная часть Мероприятия, в которой есть колонка Ответственный (составной тип) и флаг ОтветственностьИсполнителя. Проанализируем программный код:


&НаКлиенте
Процедура МероприятияПриАктивизацииСтроки(Элемент)
    ТекущаяСтрока = Элементы.Мероприятия.ТекущиеДанные;
    
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Формируем описание типов в зависимости от значения флага в строке
    Если ТекущаяСтрока.ОтветственностьИсполнителя Тогда
        НужныйТип = Новый ОписаниеТипов("СправочникСсылка.Пользователи");
    Иначе
        НужныйТип = Новый ОписаниеТипов("СправочникСсылка.КонтактныеЛицаКонтрагентов");
    КонецЕсли;

    // Устанавливаем ограничение на всю колонку (поле формы)
    Элементы.МероприятияОтветственный.ОграничениеТипа = НужныйТип;
КонецПроцедуры

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

Метод 2. Перехват события «НачалоВыбора» (Рекомендуемый способ)

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

Выясним алгоритм действий:

  1. Отключаем стандартную обработку выбора.
  2. Проверяем условие в текущей строке.
  3. Программно открываем нужную форму выбора и передаем туда параметры (например, отборы).

Рассмотрим пример реализации:


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

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

Метод 3. Свойство «Выбирать тип» и программная подмена ссылки

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

Как это работает? Если у поля снят флаг ВыбиратьТип, 1С не показывает окно со списком справочников, если в поле уже находится «пустая ссылка» конкретного типа. Наша задача — обеспечить наличие этой пустой ссылки при изменении условий в строке.

Разберем, как реализовать это через событие ПриИзменении флажка условия:


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

Преимущество метода: после того как мы записали в Ответственный пустую ссылку справочника Пользователи, платформа при нажатии кнопки выбора (три точки) автоматически поймет, что нужно открывать именно этот справочник.

Анализ дополнительных нюансов

При работе с табличными частями важно помнить о производительности. Использование ПриАктивизацииСтроки создает дополнительную нагрузку на клиентское приложение, так как код выполняется при каждом перемещении курсора. В высоконагруженных системах лучше отдавать предпочтение событию НачалоВыбора.

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

В случае работы на мобильном клиенте, программное открытие форм через ОткрытьФорму требует особого внимания к асинхронности. В современных версиях платформы (8.3.15 и выше) рекомендуется использовать описание оповещения, чтобы корректно обработать возврат выбранного значения в мобильном интерфейсе.

Подведем итог

Для реализации жесткого условия выбора в табличной части мы рассмотрели три основных пути:

  1. Динамическое ограничение типа через ОграничениеТипа — подходит для простых форм, но может влиять на отображение всей колонки.
  2. Программное открытие формы через НачалоВыбора — самый гибкий и надежный вариант, позволяющий полностью контролировать процесс.
  3. Управление типами через пустые ссылки — лаконичное решение, использующее встроенные механизмы платформы при отключении свойства Выбирать тип.

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

← На главную