При разработке расширений для системы 1С:Предприятие программисты часто сталкиваются с задачей кастомизации интерфейса под специфические требования заказчика. Одной из таких задач является переименование существующих объектов метаданных — документов, журналов или реквизитов. Казалось бы, достаточно изменить свойство Синоним в расширении, и задача решена. Однако на практике, особенно при использовании режима совместимости 8.3.14 и ниже, разработчики замечают, что в системных сообщениях (например, при проверке заполнения) по-прежнему выводится старое название. В этой статье мы подробно разберем, почему это происходит и как правильно решить данную проблему.
Для начала проанализируем ситуацию и разберем два принципиально разных понятия в платформе 1С. Когда мы работаем с формой, у каждого элемента (поля ввода, кнопки, группы) есть свойство Заголовок. Если изменить его в расширении, пользователь увидит новое название непосредственно на экране. Это «визуальное» решение, которое удовлетворяет эстетические требования заказчика. Для проверки и быстрой корректировки таких свойств прямо в интерфейсе подойдёт обработка для редактирования свойств открытых форм в режиме предприятия.
Однако системные механизмы платформы, такие как автоматическая проверка заполнения (свойство ПроверкаЗаполнения установлено в значение ВыдаватьОшибку), обращаются не к заголовку элемента формы, а к свойству Синоним самого реквизита в метаданных. В режиме совместимости 8.3.14 возможности расширения по перекрытию метаданных ограничены: платформа часто отдает приоритет основной конфигурации при формировании текстов стандартных предупреждений.
Выясним причину, по которой простое изменение синонима в расширении не всегда работает. В версиях платформы до 8.3.15 механизм расширений был ориентирован в первую очередь на добавление нового функционала и изменение логики форм. Полноценное переопределение свойств заимствованных объектов метаданных (таких как синоним для использования в системных сообщениях и стандартных отчетах) работает нестабильно или игнорируется ядром платформы при генерации автоматических отказов.
Если ваша конфигурация работает в режиме совместимости 8.3.14, изменение синонима в расширении может повлиять на заголовок окна или название в меню, но сообщение «Поле 'СтароеНазвание' не заполнено» останется неизменным. Рассмотрим способы обхода этого ограничения.
Наиболее надежный метод для версии 8.3.14 — это использование обработчиков событий в расширении модуля объекта. Мы можем перехватить стандартную проверку и заменить системное сообщение на свое собственное, содержащее нужное заказчику наименование.
Рассмотрим пример кода, который необходимо разместить в расширении модуля документа. Предположим, у нас есть реквизит Контрагент, который заказчик просит называть «Клиент».
&После("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проанализируем список реквизитов, которые платформа собирается проверить
Индекс = ПроверяемыеРеквизиты.Найти("Контрагент");
Если Индекс <> Неопределено Тогда
// Удаляем реквизит из стандартной проверки, чтобы платформа не выдала старое имя
ПроверяемыеРеквизиты.Удалить(Индекс);
// Выполняем проверку самостоятельно
Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Контрагент) Тогда
Сообщение = Новый СообщениеПользователю;
// Используем новое название "Клиент", как того требует заказчик
Сообщение.Текст = "Поле 'Клиент' не заполнено!";
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует, что пользователь увидит именно тот текст, который был согласован, независимо от ограничений платформы по работе с синонимами метаданных.
Помимо синонима, у объектов метаданных (например, у Журналов документов) есть свойства Представление объекта и Представление списка. Проанализируем их влияние: в ряде случаев платформа использует именно их для заголовков окон и списков. Если вы меняете синоним Журнала документов, обязательно попробуйте изменить и эти поля в расширении. В некоторых версиях 8.3.14 это позволяет «протолкнуть» нужное название в интерфейс более эффективно, чем через один лишь синоним.
Если проблема касается только отображения на форме, а системные сообщения не критичны, или если вы хотите централизованно управлять заголовками, можно использовать программный обход элементов формы. Это полезно, когда один и тот же реквизит (например, Сумма) в разных контекстах должен называться по-разному. Для таких задач можно использовать общий модуль для программного изменения элементов форм.
Разберем, как это реализовать в процедуре ПриСозданииНаСервере:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Пройдемся по элементам формы и найдем нужные поля
ЭлементКонтрагент = Элементы.Найти("Контрагент");
Если ЭлементКонтрагент <> Неопределено Тогда
ЭлементКонтрагент.Заголовок = "Заказчик";
КонецЕсли;
// Для журналов документов часто требуется изменить заголовок всей формы
Если ЭтотОбъект.Метаданные().Имя = "ЖурналДокументовПродажи" Тогда
ЭтаФорма.Заголовок = "Реестр клиентских операций";
КонецЕсли;
КонецПроцедуры
Журналы документов в 1С стоят особняком. Если вам нужно поменять название журнала в панели разделов или в меню «Функции для технического специалиста», изменение синонима в расширении должно сработать даже в 8.3.14. Однако помните, что если журнал заимствован, его состав (входящие документы) также должен быть правильно настроен в расширении, иначе платформа может использовать определение из основной конфигурации.
Стоит отметить, что начиная с версии платформы 8.3.15, работа с метаданными в расширениях была существенно доработана. В более новых версиях (и соответствующих режимах совместимости) свойство Синоним, измененное в расширении, корректно подхватывается системными механизмами формирования сообщений об ошибках. Если у вас есть возможность поднять режим совместимости конфигурации, это будет самым правильным и «чистым» решением задачи без написания дополнительного кода.
Подводя итог, выделим основные шаги при работе с синонимами в расширениях на версии 8.3.14:
Заголовок в свойствах элемента формы в расширении.ОбработкаПроверкиЗаполнения, если стандартная ошибка выводит старый синоним.Представление объекта и Представление списка в свойствах метаданных расширения.Использование этих методов в комплексе позволит вам полностью адаптировать интерфейс программы под требования заказчика, сохранив при этом корректность выводимых системой сообщений.