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

Программирование - Инструментарий

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

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

Для реализации идеи используется механизма разделения данных, подробнее 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: Изменил логотип, почитав про авторские права.

Скачать файлы

Наименование Файл Версия Размер
Файл конфигурации версия 1.0.2
.cf 40,75Kb
29.12.16
4
.cf 1.0.2 40,75Kb 4 Скачать

См. также

Комментарии
1. Евгения Карук (ekaruk) 3185 29.12.16 01:05 Сейчас в теме
Т.е. получается, что в одной базе хранятся несколько ее копий с небольшими измененими.
А кто занимается переводом и синхронизацией данных, раз уж мы говорим про многоязычность?
2. Сергей К (yghmd) 10 29.12.16 07:10 Сейчас в теме
По факту будут копии только нужных справочников (справочники не должны меняться часто), даже если вдруг надо будет копии документов, то движения будут общие. Это одна из идей для хранения этой многоязычности с использованием механизма разделения данных. В конкретных задачах надо рассматривать и производительность и прочие факты, эта идея мне просто показалась элегантной.
Переводом кто-то должен заниматься, тут можно организовать какой то регистр сведений для записи изменений по важным полям.
Если глубже посмотреть, то можно и гугл переводчик прикрутить.
3. Юрий Былинкин (ardn) 76 29.12.16 08:18 Сейчас в теме
Перевод требуется только для текстовых полей. Мне кажется, использование разделения данных избыточно и даже вредно. Можно же хранить тексты в том же регистре сведений.
4. Сергей К (yghmd) 10 29.12.16 08:23 Сейчас в теме
(3) имеете право на свое мнение, я не готов провести анализ избыточно это или нет.
но при хранении в регистре сведений переводов полей, необходимо придумать механизм их отображения, у Вас есть идея ее реализации?
5. Игорь Steelvan (Steelvan) 31 29.12.16 10:00 Сейчас в теме
Минус за то, что в списке флагов нет России, Украины или других нам близких, зато есть американский.
6. Сергей К (yghmd) 10 29.12.16 10:14 Сейчас в теме
(5) серьезно? :) глянул мельком ваши публикации, там вообще нету флага России :)
7. Игорь Steelvan (Steelvan) 31 29.12.16 11:50 Сейчас в теме
И вражеских флагов тоже :)
Оставьте свое сообщение