Трудности перевода

Трудности международных конфигураций.

В международных компаниях, нужен не только интерфейс на нескольких языках, но и перевод справочников. И этот перевод должен показываться в отчетах, у каждого на своем языке. Тут недостаточно договорится о использовании о внутикорпоративного эсперанто , даже если это английский .

Возьмем справочник единиц измерений. Для российских пользователей счет фактур единицы измерения должны показываться на русском (для проверяющих), а для иностранцев на их языке в отчетах.  Тоже с товарной номенклатурой.

У 1С есть в новых БСП подсистема «Мультиязычность»

Глава 3. Настройка и использование подсистем при разработке конфигурации :: Библиотека стандартных подсистем 3.1.10. Документация. Тестовая версия (1c.ru)

По сути хранение двух дополнительных языков там организовано в двух общих реквизитах

(КомментарийЯзык1, НаименованиеЯзык1, КомментарийЯзык2, НаименованиеЯзык2)

а вывод представления в разных отчетах на разных языках через предопределенные процедуры


#Область ОбработчикиСобытий
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    МультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка);
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
КонецПроцедуры
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    МультиязычностьСервер.ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка, <Метаданные.ПланыВидовХарактеристик.ОбъектыАдресацииЗадач>);
КонецПроцедуры
#КонецОбласти

Эти предопределенные процедуры вызываются на каждую строку отчета или формы. Но код в них с моей точки зрения достаточно сложен. В более старых БСП ниже 3й версии этой подсистемы нет.

Простой способ возведения вавилонской башни.

Если стоит задача хранить переводы для представлений на разных языках, есть более простой выход.

1)      Создаете для нужных справочников реквизит АльтернативноеПредставление (не общий, у каждого справочника)

2)      Храните там строку , которая является аргументом для функции НСтр

3)      И создайте наиболее простые варианты процедур ОбработкаПолученияПредставления ()

Во всех формах и отчетах появится представление, соответствующее языку интерфейса пользователя. Кстати, если стоит вопрос о переводе реквизитов справочников, эта задача посложнее, но ее можно тоже решить через НСтр

Вот как все выглядит

898f29e7850361d1aea02825a9f23478.jpg

Главное в этих предопределенных процедурах использовать самые простые конструкции на уровне (процессор — память) без сложных обращений к СУБД. Ведь этот код будет вызываться на каждую строку в форме или отчете. Когда данные процедуры находятся в модуле менеджера, они вызываются автоматом для каждого отчета или формы, поэтому модификации отчетов и форм не требуется.

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)

	СУУ_Представления.ОбработкаПолученияПредставленияСправочника(Данные, Представление, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) 

    СУУ_Представления.ОбработкаПолученияПолейПредставленияСправочника(Поля, СтандартнаяОбработка);

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

Функция СформироватьАльтернативноеПредставлениеДокумента(Данные, Представление, СтандартнаяОбработка) Экспорт
	
	Попытка
		//Выводим представление если оно есть              
		Если ПустаяСтрока(Данные.СУУ_АльтернативноеПредставление) Тогда        
			Возврат Ложь;
		Иначе 	
			Представление = Данные.СУУ_АльтернативноеПредставление;
			СтандартнаяОбработка = Ложь; 
			Возврат Истина;
		КонецЕсли;
	Исключение 
		ЗаписьЖурналаРегистрации("Error", УровеньЖурналаРегистрации.Ошибка, , Данные.Ссылка, "There is an error "+ ОписаниеОшибки() +" during creating alternative representation for " + Представление);
		Возврат Ложь;
	КонецПопытки;
	
КонецФункции       

Процедура ОбработкаПолученияПредставленияСправочника(Данные, Представление, СтандартнаяОбработка) Экспорт   
	
	Если ЗначениеЗаполнено(Данные.СУУ_АльтернативноеПредставление) Тогда  
		СтандартнаяОбработка = Ложь;
		Попытка
			Представление = НСтр(Данные.СУУ_АльтернативноеПредставление);
		Исключение
			Представление = Данные.СУУ_АльтернативноеПредставление;
		КонецПопытки;
	КонецЕсли;
		
КонецПроцедуры

Возможно кто-то предложить еще более красивое решение, пишите

на нашем канале t.me/Chat1CUnlimited . Лето будет жарким.

© Habrahabr.ru