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