Перевод отчетов на иностранный язык

23.12.13

Разработка - Универсальные функции

Как с минимальными доработками получить отчетность на иностранном языке в любой конфигурации 1С.

Иногда бывает необходимо быстро "перевести" ряд отчетов системы на иностранный язык.
Например, для клиентов или для сотрудников-экспатов.

Классический пример - перевод ОСВ или отчета о финансовых результатах.

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

Далеко не все специалисты 1С знают, что если для конфигурации указано несколько языков, то макеты можно делать мультиязычными, выбирая текст и формат ячейки для каждого языка - свой. При формировании отчета достаточно указать код языка для выводимой области - и отчет сформируется на нужном языке. 

В 8.3 можно переопределить представление справочников и документов, этим тоже можно пользоваться.

Я предлагаю еще один простой метод - перевод готовых табличных документов с использованием словаря.

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

В моем примере предполагается, что в один из справочников НСИ (Контрагенты) все-таки  добавили реквизит НаименованиеИностранное, остальной перевод идет по Словарю.  Можно доработать процедуру для рекурсивного или циклического перевода сложных строк, пока проверка выполняется один раз. Для каждой строки из областей табличного документа в словаре ищется подходящая подстрока максимальной длины и осуществляется замена.

Пример написан для толстого клиента. В нем вызывается форма индикатора из конфигурации (замените на свою, если необходимо). Код написан неоптимально, но думаю, понятно.

Вот код:

// Транслирует табличный документ на другой язык при помощи словаря

Процедура ПеревестиТабличныйДокумент(ТД) Экспорт

	
	кс=ТД.ВысотаТаблицы;
	кк=ТД.ШиринаТаблицы;
	
	/// вызовем индикатор
	ФИ=ПолучитьОбщуюФорму("ФормаИндикатора");
	ФИ.МаксимальноеЗначение=кс*кк;
	ФИ.НадписьСостоянияИндикатораОбщая="Перевод отчета на английский язык";
	Фи.Открыть();

	ФИ.НадписьСостоянияИндикатораТекущая="Выбираю иностранные наименования контрагентов...";
	ЗапросИностранныхНаименований=Новый Запрос("ВЫБРАТЬ
	                                           |	Контрагенты.Наименование КАК Наименование,
	                                           |	0 КАК ДлинаТекста,
	                                           |	Контрагенты.НаименованиеИностранное,
	                                           |	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
	                                           |ПОМЕСТИТЬ ИностранныеНаименования
	                                           |ИЗ
	                                           |	Справочник.Контрагенты КАК Контрагенты
	                                           |ГДЕ
	                                           |	Контрагенты.НаименованиеИностранное ПОДОБНО ""%[0-z]%""
	                                           |
	                                           |ИНДЕКСИРОВАТЬ ПО
	                                           |	Наименование,
	                                           |	НаименованиеПолное");
											   
    	МВТ=Новый МенеджерВременныхТаблиц;
	ЗапросИностранныхНаименований.МенеджерВременныхТаблиц=МВТ;
	ЗапросИностранныхНаименований.Выполнить();										   
	
	Запрос=Новый Запрос("ВЫБРАТЬ
	                    |	Словарь.Перевод,
	                    |	Словарь.Термин КАК Термин
	                    |ПОМЕСТИТЬ ВесьСловарь
	                    |ИЗ
	                    |	РегистрСведений.Словарь КАК Словарь
	                    |
	                    |ИНДЕКСИРОВАТЬ ПО
	                    |	Термин");
	Запрос.МенеджерВременныхТаблиц=МВТ;					
	Запрос.Выполнить();
	
	Запрос.Текст="ВЫБРАТЬ
	                    |	Словарь.Перевод,
	                    |	0 КАК ДлинаТекста,
	                    |	Словарь.Термин
	                    |ИЗ
	                    |	ВесьСловарь КАК Словарь
	                    |ГДЕ
	                    |	&Термин ПОДОБНО ""%"" + Словарь.Термин + ""%""";
						
	
						
	ЗапросСинонима=Новый Запрос("
						|ВЫБРАТЬ
	                    |	Словарь.НаименованиеИностранное как Перевод,
	                    |	0 КАК ДлинаТекста,
	                    |	Словарь.НаименованиеПолное как Термин
	                    |ИЗ
	                    |	ИностранныеНаименования КАК Словарь
	                    |ГДЕ
	                    |	&Термин ПОДОБНО ""%"" + Словарь.НаименованиеПолное + ""%""
			    |   И Словарь.НаименованиеПолное ПОДОБНО ""%[0-я]%""
	   		    |ОБЪЕДИНИТЬ ВСЕ
			    |ВЫБРАТЬ
	                    |	Словарь.НаименованиеИностранное как Перевод,
	                    |	0 КАК ДлинаТекста,
	                    |	Словарь.Наименование как Термин
	                    |ИЗ
	                    |	ИностранныеНаименования КАК Словарь
	                    |ГДЕ
	                    |	&Термин ПОДОБНО ""%"" + Словарь.Наименование + ""%""");
						
	ЗапросСинонима.МенеджерВременныхТаблиц=МВТ;					
						
	ФИ.НадписьСостоянияИндикатораТекущая="";				
	Для ы=1 По кс Цикл
		Для к=1 По кк Цикл
			
		//проверим на объединение
		Область = ТД.Область(ы, к);
		Если Область.Право > Область.Лево ИЛИ Область.Низ > Область.Верх Тогда
			Обл=ТД.Область(ы,к,Область.Низ,Область.Право);			
		Иначе	
			Обл=ТД.Область(ы,к,ы,к);
		КонецЕсли;	
		
		Термин=СокрЛП(Обл.Текст);
		мСодержитсяЗначение=Ложь;
		
		Если Обл.СодержитЗначение И ТипЗнч(Обл.Значение)=Тип("Строка")
			И ЗначениеЗаполнено(Обл.Значение) Тогда
			
			мСодержитсяЗначение=Истина;
			Термин= СокрЛП(Обл.Значение) ;
		КонецЕсли;	
		
		Если НЕ ЗначениеЗаполнено(Термин) ИЛИ (Обл.СодержитЗначение И НЕ мСодержитсяЗначение) Тогда
			Продолжить;
		КонецЕсли;	
		
		ФИ.ЗначениеИндикатора=((ы-1)*кк)+к;		
		
		Если ЗначениеЗаполнено(Термин) Тогда
			// пример замены отчетной даты в отчетности РСБУ:
			  Если Найти(Термин,"На ")>0 ИЛИ Найти(Термин,"на ")>0 Тогда
			     Для ю=-25 По 12 Цикл
			      ОтчетнаяДата=КонецМесяца(ДобавитьМесяц(НачалоГода(ТекущаяДата()),ю)); 
			      СтрокаОтчетнойДаты=Формат(ОтчетнаяДата,"ДЛФ=DD");
			      СтрокаОтчетнойДаты=СтрЗаменить(СтрокаОтчетнойДаты,Символы.НПП," "); 
			      Если Найти(Термин2,СтрокаОтчетнойДаты )>0 Тогда
			       Если НЕ мСодержитсяЗначение Тогда
				     Обл.Текст=СтрЗаменить(Термин2, "На ", "As at "); 
				     Обл.Текст=СтрЗаменить(Обл.Текст, "на ", "as at ");
				     Обл.Текст=СтрЗаменить(Обл.Текст, СтрокаОтчетнойДаты ,Формат(ОтчетнаяДата,"Л=en; ДЛФ=DD"));       Иначе        Обл.Значение=СтрЗаменить(Термин2, "На ", "As at ");        Обл.Значение=СтрЗаменить(Обл.Значение, "на ", "as at ");        Обл.Значение=СтрЗаменить(Обл.Значение, СтрокаОтчетнойДаты,Формат(ОтчетнаяДата,"Л=en; ДЛФ=DD"));              
				КонецЕсли;
			       Прервать; 
			     КонецЕсли;
		  	    КонецЦикла;
	            	КонецЕсли;  
			
			// Проверим по таблице иностранных наименований
			ЗапросСинонима.УстановитьПараметр("Термин",Термин);
			Результаты=ЗапросСинонима.Выполнить().Выгрузить();
			Для Каждого р ИЗ Результаты Цикл
				р.ДлинаТекста=СтрДлина(СокрЛП(р.Перевод));
			КонецЦикла;	
			Результаты.Сортировать("ДлинаТекста Убыв");
			
			Если Результаты.Количество()>0 Тогда
				Перевод=СокрЛП(Результаты[0].Перевод);
				ФИ.НадписьСостоянияИндикатораТекущая=Термин+"->"+Перевод;
				
				Если НЕ мСодержитсяЗначение Тогда
					Обл.Текст=СтрЗаменить(Обл.Текст,Результаты[0].Термин,Перевод);
				Иначе
					Обл.Значение=СтрЗаменить(Обл.Значение,Результаты[0].Термин,Перевод);
				КонецЕсли;	
			КонецЕсли;	
			Термин=СокрЛП(Обл.Текст);
			
			// Проверим по СЛОВАРЮ
			Запрос.УстановитьПараметр("Термин",Термин);
			Результаты=Запрос.Выполнить().Выгрузить();
			Для Каждого р ИЗ Результаты Цикл
				р.ДлинаТекста=СтрДлина(СокрЛП(р.Перевод));
			КонецЦикла;	
			Результаты.Сортировать("ДлинаТекста Убыв");
			
			Если Результаты.Количество()>0 Тогда
				Перевод=СокрЛП(Результаты[0].Перевод);
				ФИ.НадписьСостоянияИндикатораТекущая=Термин+"->"+Перевод;
				Если НЕ мСодержитсяЗначение Тогда
					Обл.Текст=СтрЗаменить(Обл.Текст,Результаты[0].Термин,Перевод);
				Иначе
					Обл.Значение=СтрЗаменить(Обл.Значение,Результаты[0].Термин,Перевод);
				КонецЕсли;	
			КонецЕсли;	
			
			
        КонецЕсли;

		Фи.Обновить();
		КонецЦикла;
	КонецЦикла;	
    ФИ.Закрыть();
	МВТ.Закрыть();	

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

Перевод английский english иностранный

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2669    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4604    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8816    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Vladimir Litvinenko 2869 28.11.13 07:40 Сейчас в теме
Интересное решение для простых случаев перевода, когда перевод фразы не зависит от контекста. Ну а если будет зависеть, то достаточно добавить в регистр "Словарь" еще одно измерение - "Контекст". Постобработка табличных документов часто позволяет делать интересные вещи проще, чем другие методы.
2. vtolga 84 04.12.13 09:51 Сейчас в теме
делали что-то подобное, но словарь лежал просто в exel файле (конфигурация типовая)
3. poyson 04.12.13 10:54 Сейчас в теме
Известная проблема. В данном контексте отличное решение.
4. Rad90210 13 05.12.13 12:10 Сейчас в теме
В догонку: http://infostart.ru/public/150952/
Ребят, есть реально кто-нить который в 1С вставлял иероглифы?
5. Rad90210 13 05.12.13 12:12 Сейчас в теме
Кста - дорабатывал конфу чтобы первичное заполнение перевода в 1С сразу тянулось с Яндекса (или Гугла). Экономит время :)
Эх... Где же подписка на событие при открытии ...
6. mzelensky 53 25.12.13 08:35 Сейчас в теме
Я делал чуть более продвинутый вариант (в плане использования словарей).

В результате вот пример документа заполненного автоматически на 3 языках (Русский, Английский, Персидский)
Прикрепленные файлы:
7. DAnry 8 26.12.13 23:06 Сейчас в теме
Интересное решение достаточно актуальной проблемы. У нас в Украине еще много типовых конфигураций только с одним русским языком интерфейса. Пора наводить порядок.
8. oleg212 03.01.14 00:37 Сейчас в теме
Интересное решение, спасибо за код
Оставьте свое сообщение