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

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

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

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

Вариант 1. Использование фиктивного реквизита и свойства «Связь по типу»

Сформулируем суть этого метода: если необходимо жестко привязать выбор в колонке таблицы к конкретному типу без изменения типа самого исходного реквизита в базе данных, можно воспользоваться механизмом связи по типу на форме.

Проанализируем пошаговый алгоритм настройки:

  1. Добавим на форму (или в объект таблицы формы) вспомогательный (фиктивный) реквизит с типом, к которому нужно ограничить выбор, например СправочникСсылка.Контрагенты.
  2. В свойствах элемента формы ячейки исходной колонки находим свойство СвязьПоТипу (TypeLink).
  3. Указываем в качестве элемента связи наш добавленный фиктивный реквизит.

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

Вариант 2. Настройка свойств элемента «Ограничение типа» и «Выбирать тип»

Посмотрим на стандартные свойства элементов управляемой формы. В 1С для полей ввода предусмотрены настройки ограничения доступных типов данных:

  1. Для элемента формы колонки таблицы перейдем в панель свойств.
  2. Найдем свойство ОграничениеТипа (TypeRestriction) и установим в нем состав типов, разрешенных к выбору пользователю (например, оставим только СправочникСсылка.Контрагенты).
  3. Снимем флажок ВыбиратьТип (SelectType). Это отключит появление диалога выбора типа при нажатии кнопки выбора или клавиши F4.

Вариант 3. Перехват события «НачалоВыбора» в коде

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

Для этого используется обработчик события НачалоВыбора элемента формы ячейки:


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

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораКонтрагента(РезультатВыбора, ДополнительныеПараметры) Известие
    
    Если ЗначениеЗаполнено(РезультатВыбора) Тогда
        ТекущиеДанные = Элементы.ТаблицаФормы.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено Тогда
            ТекущиеДанные.Значение = РезультатВыбора;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Вариант 4. Обработка очистки ячейки и поддержание ссылочного типа

Выясним причину, почему при очистке ячейки кнопкой «Крестик» снова появляется кнопка выбора типа «Т». При нажатии кнопки очистки или комбинации Shift + F4 платформа 1С сбрасывает значение составного реквизита в Неопределено. Из-за этого поле теряет конкретный тип данных, и для ввода снова требуется выбор типа.

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


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

КонецПроцедуры

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

Вариант 5. Разделение отображения и редактирования

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

В такой архитектуре применяется следующий подход:

  1. Колонка таблицы настраивается для отображения исходных данных (например, в режиме поля надписи или только для чтения).
  2. На форму помещается отдельный реквизит с типом СправочникСсылка.Контрагенты.
  3. При активизации строки исходное значение приводится к ссылочному типу с помощью метода ОписаниеТипов.ПривестиЗначение().
  4. После редактирования полученная ссылка записывается обратно в ячейку таблицы.

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

← На главную