При проектировании архитектуры крупных систем иногда возникает идея хранить идентичные по структуре данные в нескольких информационных базах (например, для разных языковых локалей) и поддерживать между ними жесткую синхронизацию в режиме «онлайн» — записывать изменения сразу во все базы в рамках одной транзакции. Рассмотрим подробно, почему данный подход является ошибкой на уровне платформы 1С:Предприятие, к каким последствиям он приводит и какие альтернативные решения существуют для задачи мультиязычности данных.
Попытка реализовать распределенную онлайн-транзакцию для 10 баз 1С (через COM-соединения, SOAP или HTTP-сервисы) сталкивается с несколькими фундаментальными ограничениями:
Если главной целью разделения на 10 баз является поддержка нескольких языков для данных (например, когда наименования номенклатуры, контрагентов или текстовые описания должны быть на разных языках), задачу следует решать внутри одной информационной базы. Проанализируем основные методы реализации.
Наиболее надежный и производительный подход, применяемый в типовых конфигурациях (1С:ERP, 1С:Комплексная автоматизация). Основные реквизиты объекта хранятся на базовом языке, а все переводы выносятся в отдельный регистр сведений.
Создадим независимый регистр сведений ЗначенияМультиязычныхРеквизитов со следующей структурой:
Объект (Тип: ЛюбаяСсылка) — ссылка на элемент справочника или документ.ИмяРеквизита (Тип: Строка) — имя переводимого реквизита (например, "Наименование").Язык (Тип: СправочникСсылка.Языки) — целевой язык.Значение (Тип: Строка) — переведенный текст.Чтобы платформа автоматически подставляла нужный перевод в интерфейсе и формах, используем обработчики событий в модуле менеджера объекта. Разберем пример использования процедуры ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления:
// Модуль менеджера справочника Номенклатура
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Ссылка");
Поля.Добавить("Наименование");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
ТекущийЯзык = ПараметрыСеанса.ТекущийЯзыкПользователя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияМультиязычныхРеквизитов.Значение КАК Перевод
|ИЗ
| РегистрСведений.ЗначенияМультиязычныхРеквизитов КАК ЗначенияМультиязычныхРеквизитов
|ГДЕ
| ЗначенияМультиязычныхРеквизитов.Объект = &Ссылка
| И ЗначенияМультиязычныхРеквизитов.ИмяРеквизита = ""Наименование""
| И ЗначенияМультиязычныхРеквизитов.Язык = &Язык";
Запрос.УстановитьПараметр("Ссылка", Данные.Ссылка);
Запрос.УстановитьПараметр("Язык", ТекущийЯзык);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И НЕ ПустаяСтрока(Выборка.Перевод) Тогда
Представление = Выборка.Перевод;
Иначе
Представление = Данные.Наименование; // Базовое наименование
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Для корректной работы ввода по строке и автоподбора в полях ввода дополнительно переопределяется обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера объекта, где формируется запрос к регистру сведений переводов.
Платформа 1С:Предприятие поддерживает механизм разделения данных. Разберем, как его использовать для изоляции объектов по языкам:
ЯзыкДанных с типом СправочникСсылка.Языки. Разделение включается в режим ИспользоватьРазделение.При использовании этого метода объект с одним и тем же уникальным идентификатором (UUID) в разных областях данных будет иметь собственные значения реквизитов. Однако у метода есть особенности: при копировании объектов потребуется программно управлять параметрами сеанса и заполнять свойства через ЗаполнитьЗначенияСвойств(), а выгрузка таких данных через стандартные механизмы обмена требует индивидуальной настройки планов обмена.
Если бизнес-логика действительно требует наличия отдельных информационных баз (например, филиалы в разных странах с независимыми серверами), жесткую транзакционную синхронизацию необходимо заменить на асинхронный обмен сообщениями:
ПланОбмена без использования режима РИБ. В состав плана обмена включаются только необходимые объекты.Таким образом, отказ от распределенных транзакций в пользу консолидации баз или асинхронной событийно-ориентированной архитектуры гарантирует высокую скорость работы и стабильность системы.