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