Как программно изменить тип реквизита формы в 1С:Предприятие 8?

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

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

Понимание ограничений платформы

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

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

Решение №1: Реализация выбора из справочника в строковом реквизите

Чаще всего потребность в изменении типа возникает тогда, когда нужно, чтобы пользователь выбирал данные из справочника, а не вводил их вручную. Вместо того чтобы пытаться технически изменить тип реквизита Строка, мы можем просто настроить его поведение так, чтобы он выглядел как поле выбора. Этот метод является наиболее «чистым» с точки зрения обновляемости конфигурации.

Рассмотрим, как реализовать кнопку выбора в строковом поле:

  1. Откройте форму в режиме расширения конфигурации.
  2. В процедуре ПриСозданииНаСервере настройте свойства элемента формы.
  3. Подключите обработчик события НачалоВыбора.

Пример программной реализации:


&НаСервере
Процедура ДоработатьФормуПриСозданииНаСервере()
    Элементы.ПолеВрача.КнопкаВыбора = Истина;
    Элементы.ПолеВрача.УстановитьДействие("НачалоВыбора", "ПолеВрачаНачалоВыбора");
КонецПроцедуры

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

Таким образом, реквизит остается строковым (что не ломает типовой код записи объекта), но для пользователя он становится полноценным полем выбора из справочника.

Решение №2: Использование расширения для подмены элементов

Если функционала простого выбора недостаточно и вам жизненно необходимо оперировать ссылочными типами данных, воспользуйтесь методом «подмены» элемента на форме через расширение:

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

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

Заключение: что выбрать?

Анализируя ситуацию, мы видим, что прямое вмешательство в типы реквизитов — это путь к созданию проблем при обновлении. Мы рекомендуем:

Всегда помните: лучший способ кастомизации 1С — тот, который минимально затрагивает исходный код типового решения. Успехов в автоматизации!

← На главную