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