При разработке конфигураций на платформе 1С:Предприятие часто возникает задача изменить стандартный заголовок формы документа. По умолчанию платформа формирует заголовок по шаблону "Номер + Дата", но для удобства пользователей часто требуется выводить синоним (название вида документа) или более сложную конструкцию. Рассмотрим подробно все способы решения этой задачи, от настройки свойств до программирования.
Самый простой и правильный с архитектурной точки зрения способ — использование стандартных свойств объекта конфигурации. Платформа предоставляет механизмы для задания того, как объект будет представлен пользователю.
Разберем свойства документа в конфигураторе:
Представление объекта и Расширенное представление объекта.Как это работает:
Представление объекта — используется в полях ввода, ссылках и сообщениях.Расширенное представление объекта — используется именно в заголовках форм списка и форм объекта.Если мы заполним Расширенное представление объекта, платформа автоматически подставит это значение в заголовок формы. Однако, этот способ статичен. Если нам нужно динамически формировать заголовок (например, "Заказ клиента №1 от 01.01.2023"), нам понадобятся программные методы.
В современных конфигурациях (особенно построенных на БСП) и в платформе 1С 8.3 принят стандарт формирования представлений через модуль менеджера объекта. Это позволяет централизованно описать, как документ должен выглядеть во всей системе (в ссылках, в заголовках, в полях ввода).
Для этого используются два предопределенных обработчика событий в модуле менеджера документа: ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления.
Рассмотрим пример кода. Сначала определим поля, которые нам понадобятся:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Отключаем стандартную обработку, чтобы платформа не делала лишней работы
СтандартнаяОбработка = Ложь;
// Добавляем поля, которые нужны для формирования строки
Поля.Добавить("Номер");
Поля.Добавить("Дата");
Поля.Добавить("Ссылка");
КонецПроцедуры
Теперь опишем само формирование строки представления:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Формируем нужную строку. Например: "Реализация №001 от 01.01.2023"
// Обратите внимание: Данные - это структура с полями, запрошенными выше
// Получаем синоним документа (можно получить через метаданные ссылки или написать жестко, если это модуль конкретного документа)
ИмяДокумента = Данные.Ссылка.Метаданные().Синоним;
Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
"%1 №%2 от %3",
ИмяДокумента,
Данные.Номер,
Format(Данные.Дата, "ДЛФ=D")
);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Если у вас нет внедренной БСП (Библиотеки Стандартных Подсистем) и функции СтроковыеФункцииКлиентСервер, можно использовать обычную конкатенацию строк:
Представление = Данные.Ссылка.Метаданные().Синоним + " №" + Строка(Данные.Номер) + " от " + Формат(Данные.Дата, "ДФ=dd.MM.yyyy");
Важное примечание: Чтобы этот механизм сработал именно для заголовка формы, в свойствах самой формы (уже в редакторе форм) должно быть установлено свойство Автозаголовок = Истина. Платформа сначала сформирует представление через модуль менеджера, а затем поместит его в заголовок.
Иногда (как в случае с расширениями или сложными сценариями, описанными в обсуждении) стандартные механизмы могут не срабатывать или кэшироваться. В этом случае мы можем явно задать заголовок при открытии формы.
Рассмотрим алгоритм действий в модуле формы документа:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Вызываем процедуру установки заголовка
УстановитьЗаголовокФормы();
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Обновляем заголовок после записи, так как мог появиться номер
УстановитьЗаголовокФормы();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьЗаголовокФормы()
// Если объект новый, номер еще не присвоен
Если Объект.Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;
// Формируем строку заголовка
// Можно получить синоним с сервера, если он не доступен на клиенте,
// но обычно проще сделать серверный вызов или использовать ПредопределенноеЗначение, если знаем вид документа
ЗаголовокОкна = ПолучитьЗаголовокНаСервере();
// Присваиваем заголовок форме
ЭтаФорма.Заголовок = ЗаголовокОкна;
КонецПроцедуры
&НаСервере
Функция ПолучитьЗаголовокНаСервере()
СинонимВида = Метаданные.НайтиПоТипу(ТипЗнч(Объект.Ссылка)).Синоним;
ДатаСтрокой = Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
Возврат СинонимВида + " №" + Объект.Номер + " от " + ДатаСтрокой;
КонецФункция
Обратите внимание, что при таком подходе свойство Автозаголовок в свойствах формы лучше отключить (снять галочку), чтобы платформа не пыталась переопределить ваше значение.
В ходе обсуждения выяснилось, что при работе с расширениями конфигурации могут возникать специфические проблемы.
/ClearCache.ЭтаФорма.Заголовок в коде формы.Расширенное представление объекта в метаданных.ОбработкаПолученияПредставления при включенном автозаголовке.Мы проанализировали основные методы. Для большинства задач достаточно корректно описать процедуры в модуле менеджера — это современный стандарт разработки в 1С.