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

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Почему 1С запрашивает тип данных?

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

Многие пытаются решить задачу через свойство элемента управления ВыбиратьТип = Ложь. Однако, если значение в ячейке еще не типизировано, установка этого свойства часто приводит к тому, что кнопка выбора («...») просто перестает реагировать на нажатия. Это происходит потому, что система блокирует выбор типа, но всё еще не знает, какой справочник открыть.

Решение №1: Принудительная типизация при начале редактирования

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

Разберем алгоритм действий по шагам:

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

Посмотрим на пример кода:


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

Решение №2: Использование события НачалоВыбора

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

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


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

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

Тонкая настройка свойств элемента управления

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

Резюме для разработчика

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

  1. Никогда не оставляйте значение в ячейке равным Неопределено, если хотите избежать диалога выбора типа. Сразу записывайте туда ПустаяСсылка() нужного типа.
  2. Используйте событие ПриНачалеРедактирования для динамической настройки ограничений типа (ОграничениеТипа).
  3. Если логика выбора сложная (зависит от многих параметров строки), используйте НачалоВыбора с параметром СтандартнаяОбработка = Ложь.
  4. Помните, что ЭлементУправления колонки в табличном поле — это общий объект для всех строк. Поэтому настройки (такие как ОграничениеТипа) нужно обновлять каждый раз при переходе пользователя от одной строки к другой или при начале редактирования.

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

← На главную