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