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