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