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