Мультиязычность данных в конфигурации



Использование разделения данных для работы с данными на нескольких языках.

Мультиязычность данных в некоторых случаях может быть востребована. Например, есть конфигурация, в которой работают сотрудники из разных стран, не знающие несколько языков.

Для реализации идеи используется механизма разделения данных, подробнее http://v8.1c.ru/overview/Term_000000788.htm и http://howknow1c.ru/programmirovanie-1c/razdelenie-dannyh-1s.html. При этом по общему реквизиту идет разделение данных в режиме использования разделяемых данных — независимо. При этом у нас появляется возможность хранить в базе объекты для разных языков с общей ссылкой. Эту ссылку можно использовать для остальной конфигурации, даже если остальная часть конфигурации не будет разделена по этому общему реквизиту, и данные будут отображены на определенном языке в зависимости от параметра сеанса.

В статье и тестовой конфигурации не будет рассмотрен механизмы локализации прикладных решений через объект конфигурации «Язык», подробнее http://v8.1c.ru/overview/Term_000000293.htm

Идею разработки можно применить к типовым конфигурациям с минимальными изменениями типовых объектов.

1. Создаем справочник «ЯзыкиДанных». В нем для удобства сразу создадим предопределенные элементы — русский и английский.

2. Создаем общий реквизит «ЯзыкДанных». Устанавливаем свойства: Тип данных — СправочникСсылка.ЯзыкиДанных; Разделение данных — Разделять; автоматически создаем параметры сеанса для свойств Значение разделения данных — ЯзыкДанныхЗначение, Использования разделения данных — ЯзыкДанныхИспользование. В составе указываем объекты конфигурации для разделения, в примере добавлены справочник Номенклатура и документ Поступление.

3. Создаем общий модуль для создания процедуры подписки на событие и подписку на событие ПриЗаписи для объектов, данные которых необходимо разделить по языкам заполнения.

4. В общем модуле сеанса прописываем заполнение параметров сеанса для разделения данных по общему реквизиту ЯзыкДанных

Дополнительно в тестовой конфигурации были созданы объекты справочник Номенклатура, документ Поступление с движением по регистру накопления Остатки номенклатуры. В примере показано ведение номенклатуры на разных языках, также для демонстрации (отчасти  для проверки высказываний, что создаются несколько записей движения документа, если документ разделен и создается его копия на другом языке). В справочнике «Номенклатура» различные языки используются для реквизита «Наименование», в документе «Поступление» для реквизита «Комментарий».

Основной идея заключается в обработке события ПриЗаписи объектов, данные которых необходимо разделить по языкам.


Процедура ИзменениеОбъектовНаДругихЯзыкахПриЗаписи(Источник, Отказ) Экспорт

// проверка обработки события
Если Источник.ДополнительныеСвойства.Свойство("ЗаписьЯзыковойКопии") Тогда
Возврат;
КонецЕсли;

ПользователиИнформационнойБазы.ТекущийПользователь().Язык = ТекущийЯзык();

// сохраняем текущий язык данных
ТекущийЯзыкДанных = ПараметрыСеанса.ЯзыкДанныхЗначение;

ВыборкаЯзыковДанных = Справочники.ЯзыкиДанных.Выбрать();

Пока ВыборкаЯзыковДанных.Следующий() Цикл

Если ВыборкаЯзыковДанных.Ссылка = ТекущийЯзыкДанных Тогда
Продолжить;
КонецЕсли;

ТипИсточника = ТипЗнч(Источник);

// временно изменяем параметр сеанса
ПараметрыСеанса.ЯзыкДанныхЗначение = ВыборкаЯзыковДанных.Ссылка;

ЯзыковаяКопия = Источник.Ссылка.ПолучитьОбъект();
НовыйОбъект = ЯзыковаяКопия = Неопределено;

// обновляем языковую копию объекта
Если ТипИсточника = Тип("СправочникОбъект.Номенклатура") Тогда

// реквизит Наименование будет на разных языках
Если НовыйОбъект Тогда
ЯзыковаяКопия = Справочники.Номенклатура.СоздатьЭлемент();
ЯзыковаяКопия.УстановитьСсылкуНового(Источник.Ссылка);

СписокПолей = "Код, Наименование";
Иначе
СписокПолей = "Код";
КонецЕсли;

ЗаполнитьЗначенияСвойств(ЯзыковаяКопия, Источник, СписокПолей);
ЯзыковаяКопия.ОбменДанными.Загрузка = Истина;
ЯзыковаяКопия.ДополнительныеСвойства.Вставить("ЗаписьЯзыковойКопии");
ЯзыковаяКопия.Записать();

КонецЕсли;

Если ТипИсточника = Тип("ДокументОбъект.Поступление") Тогда

// реквизит Комментарий будет на разных языках
Если НовыйОбъект Тогда
ЯзыковаяКопия = Документы.Поступление.СоздатьДокумент();
ЯзыковаяКопия.УстановитьСсылкуНового(Источник.Ссылка);

СписокПолей = "Номер, Дата, Номенклатура, Количество, Проведен, ПометкаУдаления, Комментарий";
Иначе
СписокПолей = "Номер, Дата, Номенклатура, Количество, Проведен, ПометкаУдаления";
КонецЕсли;

ЗаполнитьЗначенияСвойств(ЯзыковаяКопия, Источник, СписокПолей);
ЯзыковаяКопия.ОбменДанными.Загрузка = Истина;
ЯзыковаяКопия.ДополнительныеСвойства.Вставить("ЗаписьЯзыковойКопии");
ЯзыковаяКопия.Записать();

КонецЕсли;

КонецЦикла;

ПараметрыСеанса.ЯзыкДанныхЗначение = ТекущийЯзыкДанных;

КонецПроцедуры

В данной процедуре уже после записи основного объекта создаются и обновляются копии объекта на других языках по определенным правилам. Правила создания и обновления копий объектов можно автоматизировать различными способами, далее насколько хватит Вашей фантазии.

Пример конфигурации разработан на платформе 1С:Предприятие 8.3 (8.3.6.1999)

Update: Изменил логотип, почитав про авторские права.

9 Comments

  1. ekaruk

    Т.е. получается, что в одной базе хранятся несколько ее копий с небольшими измененими.

    А кто занимается переводом и синхронизацией данных, раз уж мы говорим про многоязычность?

    Reply
  2. yghmd

    По факту будут копии только нужных справочников (справочники не должны меняться часто), даже если вдруг надо будет копии документов, то движения будут общие. Это одна из идей для хранения этой многоязычности с использованием механизма разделения данных. В конкретных задачах надо рассматривать и производительность и прочие факты, эта идея мне просто показалась элегантной.

    Переводом кто-то должен заниматься, тут можно организовать какой то регистр сведений для записи изменений по важным полям.

    Если глубже посмотреть, то можно и гугл переводчик прикрутить.

    Reply
  3. ardn

    Перевод требуется только для текстовых полей. Мне кажется, использование разделения данных избыточно и даже вредно. Можно же хранить тексты в том же регистре сведений.

    Reply
  4. yghmd

    (3) имеете право на свое мнение, я не готов провести анализ избыточно это или нет.

    но при хранении в регистре сведений переводов полей, необходимо придумать механизм их отображения, у Вас есть идея ее реализации?

    Reply
  5. yghmd

    (5) серьезно? 🙂 глянул мельком ваши публикации, там вообще нету флага России 🙂

    Reply
  6. Steelvan

    И вражеских флагов тоже 🙂

    Reply
  7. vpaoli

    в вашей конфигурации есть обработка СменаЯзыкаДанных. Каким образом пользователь должен ее использовать ?

    Reply
  8. vpaoli

    При разделении данных в ранее загруженном справочнике все его элементы (за исключением предопределенных) удаляются. Остаются битые ссылки. Поэтому, внедрение данного решения в уже работающей БД невозможно. Вы не рассматривали. какие существуют выходы из данной ситуации ?

    Reply
  9. vpaoli

    Вы пишете «Например, есть конфигурация, в которой работают сотрудники из разных стран, не знающие несколько языков». Тогда совершенно не понятно как эти разные сотрудники будут работать с вашей конфигурацией, которая выложена для загрузки. Я попытался добавить код , который вы предлагаете в свою рабочую БД при разделении значений только одного справочника. В результате пользователь, у которого выставлен русский язык и пользователь , у которого выставлен немецкий язык, видят одни и те же элементы справочника и как работает разделение по языкам не понятно.

    Думаю никто из пользователей инфостарта вашу конфигурацию «не кровырял» иначе бы были вопросы. Считаю вашу публикацию сырой и содержащей больше вопросов, чем ответов. Если я ошибаюсь , то поправьте и расскажите как реально все это применять.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *