Как установить тип значения по умолчанию в поле ввода с составным типом данных в 1С?

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

При разработке интерфейсов в 1С:Предприятие 8.3 часто возникает ситуация, когда реквизит имеет составной тип данных. Например, поле может принимать значения справочников Контрагенты и Партнеры. По умолчанию, если поле пустое, платформа при нажатии на кнопку выбора сначала предлагает пользователю диалоговое окно «Выбор типа данных». Это создает лишний клик и замедляет работу пользователя, особенно если в 90% случаев выбирается именно «Контрагент».

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

Способ 1. Инициализация типа при создании формы

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

Разберем, как реализовать это в модуле управляемой формы. Нам понадобится обработчик события ПриСозданииНаСервере. Проанализируем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, что это создание нового объекта, а не открытие существующего
    Если Объект.Ссылка.Пустая() Тогда
        // Устанавливаем тип по умолчанию для реквизита
        Объект.КонтрагентПартнер = Справочники.Контрагенты.ПустаяСсылка();
    КонецЕсли;
    
КонецПроцедуры

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

Способ 2. Перехват события «При начале выбора»

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

Рассмотрим алгоритм реализации этого метода:

  1. Устанавливаем стандартную обработку в значение Ложь, чтобы подавить системное окно выбора типа.
  2. Проверяем текущее значение в поле.
  3. Если поле не заполнено, вызываем открытие формы нужного нам справочника программно.

Посмотрим на пример кода в модуле формы:


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

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

Способ 3. Использование свойств элемента формы (Ограничение типа)

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

Мы можем использовать свойство элемента формы ОграничениеТипа. Это особенно полезно, когда реквизит в базе данных должен оставаться составным (для универсальности), но в конкретном интерфейсе мы хотим жестко задать один тип. Проанализируем пример настройки в ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем массив с допустимыми типами (в нашем случае только один)
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
    
    // Формируем ОписаниеТипов
    ДопустимыеТипы = Новый ОписаниеТипов(МассивТипов);
    
    // Устанавливаем ограничение для элемента формы
    Элементы.КонтрагентПартнер.ОграничениеТипа = ДопустимыеТипы;
    
КонецПроцедуры

После применения такого кода кнопка выбора типа исчезнет вовсе, так как система поймет, что доступен только один вариант — Контрагенты.

Дополнительные рекомендации по юзабилити

Для того чтобы работа пользователя была максимально эффективной, разберем еще несколько настроек, связанных с полями ввода:

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

← На главную