Как в управляемой форме документа 1С настроить правильный заголовок?

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

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

Способ 1. Настройка свойств метаданных (без программирования)

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

Разберем свойства документа в конфигураторе:

  1. Откроем палитру свойств самого объекта документа (не формы).
  2. Найдем группу свойств Представление.
  3. Нас интересуют поля Представление объекта и Расширенное представление объекта.

Как это работает:

Если мы заполним Расширенное представление объекта, платформа автоматически подставит это значение в заголовок формы. Однако, этот способ статичен. Если нам нужно динамически формировать заголовок (например, "Заказ клиента №1 от 01.01.2023"), нам понадобятся программные методы.

Способ 2. Использование модуля менеджера (Рекомендуемый)

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

Для этого используются два предопределенных обработчика событий в модуле менеджера документа: ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления.

Рассмотрим пример кода. Сначала определим поля, которые нам понадобятся:


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

Теперь опишем само формирование строки представления:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    // Формируем нужную строку. Например: "Реализация №001 от 01.01.2023"
    // Обратите внимание: Данные - это структура с полями, запрошенными выше
    
    // Получаем синоним документа (можно получить через метаданные ссылки или написать жестко, если это модуль конкретного документа)
    ИмяДокумента = Данные.Ссылка.Метаданные().Синоним; 
    
    Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        "%1 №%2 от %3", 
        ИмяДокумента, 
        Данные.Номер, 
        Format(Данные.Дата, "ДЛФ=D")
    );
    
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Если у вас нет внедренной БСП (Библиотеки Стандартных Подсистем) и функции СтроковыеФункцииКлиентСервер, можно использовать обычную конкатенацию строк:


Представление = Данные.Ссылка.Метаданные().Синоним + " №" + Строка(Данные.Номер) + " от " + Формат(Данные.Дата, "ДФ=dd.MM.yyyy");

Важное примечание: Чтобы этот механизм сработал именно для заголовка формы, в свойствах самой формы (уже в редакторе форм) должно быть установлено свойство Автозаголовок = Истина. Платформа сначала сформирует представление через модуль менеджера, а затем поместит его в заголовок.

Способ 3. Программная установка в модуле формы (Принудительный)

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

Рассмотрим алгоритм действий в модуле формы документа:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Вызываем процедуру установки заголовка
    УстановитьЗаголовокФормы();
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Обновляем заголовок после записи, так как мог появиться номер
    УстановитьЗаголовокФормы();
КонецПроцедуры

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

    // Формируем строку заголовка
    // Можно получить синоним с сервера, если он не доступен на клиенте, 
    // но обычно проще сделать серверный вызов или использовать ПредопределенноеЗначение, если знаем вид документа
    
    ЗаголовокОкна = ПолучитьЗаголовокНаСервере();
    
    // Присваиваем заголовок форме
    ЭтаФорма.Заголовок = ЗаголовокОкна;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьЗаголовокНаСервере()
    
    СинонимВида = Метаданные.НайтиПоТипу(ТипЗнч(Объект.Ссылка)).Синоним;
    ДатаСтрокой = Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
    
    Возврат СинонимВида + " №" + Объект.Номер + " от " + ДатаСтрокой;
    
КонецФункция

Обратите внимание, что при таком подходе свойство Автозаголовок в свойствах формы лучше отключить (снять галочку), чтобы платформа не пыталась переопределить ваше значение.

Особенности работы с расширениями и кэшем

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

  1. Кэш метаданных: Если вы внесли изменения в модуль менеджера или свойства объекта в расширении, а заголовок не меняется, попробуйте очистить кэш платформы. Для этого можно запустить 1С с параметром /ClearCache.
  2. Странное поведение в расширениях: Бывает, что старые объекты, добавленные в расширение, "глючат" и не подхватывают новые обработчики. В таких случаях иногда помогает пересоздание заимствованной формы или создание документа заново.
  3. Приоритеты: Помните о приоритетах формирования заголовка:
    • Высший приоритет: Явное присвоение ЭтаФорма.Заголовок в коде формы.
    • Средний приоритет: Расширенное представление объекта в метаданных.
    • Низкий приоритет (базовый): ОбработкаПолученияПредставления при включенном автозаголовке.

Мы проанализировали основные методы. Для большинства задач достаточно корректно описать процедуры в модуле менеджера — это современный стандарт разработки в 1С.

← На главную