Собственно получил задачу: перевести типовую УТ на КИТАЙСКИЙ (английский). Собственно - результат работы - то что получилось ниже. В файлах ничего выкладывать не буду - если кому интересно перевести конфу на английский - дочитает до конца.
Коротко - алгоритм такой: ПриОткрытии() - перебирать все реквизиты Формы и подставлять значения ПЕРЕВЕДЁННЫЕ.
Еще что стоит отметить - не пинайте сильно - таки первая публикация.
Итак: Общий модуль ПереводАнгл:
Функция УстановитьНадписиФормыАнгл(ДокументОбъект="", ФормаДокумента) Экспорт
Если ПараметрыСеанса.ТекущийПользователь.Язык =0 тогда // естественно флаг язык - в спр.пользователи
Возврат Истина
КонецЕсли;
Попытка
ФормаДокумента.Заголовок=ПереводАнгл.ПереводимЭлемент(ФормаДокумента.Заголовок);
Исключение
КонецПопытки;
Попытка
Для каждого элемент из ФормаДокумента.ЭлементыФормы цикл
Если СокрЛП(Элемент)="Надпись" тогда
Элемент.Заголовок=ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
Если СокрЛП(Элемент)="РамкаГруппы" тогда
Элемент.Заголовок=ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
Если СокрЛП(Элемент)="Кнопка" тогда
ЧтоПолучилось = Элемент.Заголовок;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
Элемент.Заголовок = ЧтоПолучилось;
КонецЕсли;
Если СокрЛП(Элемент)="КоманднаяПанель" тогда
Для Каждого Кнопка из Элемент.Кнопки Цикл
ЧтоПолучилось = Кнопка.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Кнопка.Текст);
Кнопка.Подсказка = ЧтоПолучилось;
Кнопка.Пояснение = ЧтоПолучилось;
Кнопка.Текст = ЧтоПолучилось;
Для Каждого Кнопа из Кнопка.Кнопки Цикл
ЧтоПолучилось = Кнопа.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Кнопа.Текст);
Кнопа.Подсказка = ЧтоПолучилось;
Кнопа.Пояснение = ЧтоПолучилось;
Кнопа.Текст = ЧтоПолучилось;
КонецЦИкла;
КонецЦикла;
КонецЕсли;
Если СокрЛП(Элемент)="Панель" тогда
Для Каждого страница из Элемент.Страницы Цикл
страница.Заголовок = ПереводАнгл.ПереводимЭлемент(страница.Заголовок);
КонецЦикла;
ИначеЕсли СокрЛП(Элемент)="ТабличноеПоле" тогда
Для каждого колонка из Элемент.Колонки цикл
Колонка.ТекстШапки = ПереводАнгл.ПереводимЭлемент(Колонка.ТекстШапки);
КонецЦикла;
ИначеЕсли СОкрЛП(Элемент)="Флажок" тогда
Элемент.Заголовок = ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для Каждого КолонкаСправочника из ФормаДокумента.ЭлементыФормы.СправочникСписок.Колонки Цикл
КолонкаСправочника.ТекстШапки = ПереводАнгл.ПереводимЭлемент(КолонкаСправочника.ТекстШапки);
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для Каждого панель из ФормаДокумента.ЭлементыФормы.ПанельФормы.Страницы Цикл
панель.Заголовок = ПереводАнгл.ПереводимЭлемент(панель.Заголовок);
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого кнопка из ФормаДокумента.ЭлементыФормы.ДействияФормы.Кнопки Цикл
кнопка.Текст=ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
Если Лев(кнопка.Имя,8)="Действие" тогда
ЧтоПолучилось=кнопка.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
кнопка.Текст=ЧтоПолучилось;
кнопка.Пояснение=ЧтоПолучилось;
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого кнопка из ФормаДокумента.ЭлементыФормы.ОсновныеДействияФормы.Кнопки Цикл
Если Лев(кнопка.Имя,8)="Действие" тогда
кнопка.Текст=ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого колонка из ФормаДокумента.ЭлементыФормы.ДокументСписок.Колонки Цикл
Колонка.ТекстШапки = ПереводАнгл.ПереводимЭлемент(Колонка.ТекстШапки);
КонецЦИкла;
Исключение
КонецПопытки;
Возврат истина;
КонецФункции
//В СИСТЕМЕ ДОЛЖЕН БЫТЬ СПРАВОЧНИК ПЕРЕВОД, ГДЕ НАИМЕНОВАНИЕ - ЧТО НУЖНО ПЕРЕВЕСТИ,
//А СТРОКОВЫЙ РЕКВИЗИТ АнглПеревод В НЕМ - ПЕРЕВОД.
Функция ПереводимЭлемент(Объект) Экспорт
Результат = Объект;
Если Объект="" тогда
Иначе
ССылкаЗаголовка=(Справочники.Перевод.НайтиПоНаименованию(Лев(СОкрЛП(Объект),100))) ;
Если ССылкаЗаголовка = Справочники.Перевод.ПустаяСсылка() тогда
Если (ПараметрыСеанса.ТекущийПользователь.ВводитПеревод =1) и //ФЛАГ ЧТО ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ - ПЕРЕВОДЧИК
((Число(КодСимвола(Объект))>100)) тогда//ПОПЫТКА ВЫКИНУТЬ АНГЛИЙСКИЕ НАДПИСИ (И СПЕЦСИМВОЛЫ)
//ДАБЫ ИХ НЕ ПЕРЕВОДИТЬ
Сообщить(СОкрЛП(Объект)); //ДЛЯ СПИСКА ЧТО НУЖНО ПЕРЕВОДИТЬ.
КонецЕсли;
Иначе
Результат = ССылкаЗаголовка.АнглПеревод;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
//ПОПЫТКА ЧЕРЕЗ СПРАВОЧНИК ПЕРЕВОД - ПЕРЕВЕСТИ ИНТЕРАКТИВНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Функция АнглВопрос(перем1="",перем2="",перем3="",перем4="",перем5="",перем6="") Экспорт
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем3=""тогда
результат = Вопрос(перем1,перем2)
ИначеЕсли перем4 = "" тогда
результат = Вопрос(перем1,перем2,перем3);
ИначеЕсли перем5 = "" тогда
результат = Вопрос(перем1,перем2,перем3,перем4);
ИначеЕсли перем6 = "" тогда
результат = Вопрос(перем1,перем2,перем3,перем4,перем5);
Иначе
результат = Вопрос(перем1,перем2,перем3,перем4,перем5,перем6);
КонецЕсли;
Иначе
ТекстВОпроса=ПереводАнгл.ПереводимЭлемент(перем1);
Если перем3="" тогда
результат = Вопрос(ТекстВОпроса,перем2)
ИначеЕсли перем4 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3);
ИначеЕсли перем5 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4);
ИначеЕсли перем6 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4,перем5);
Иначе
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4,перем5,перем6);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции
Функция АнглСообщить(перем1="",перем2="") Экспорт результат="";
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем2="" тогда
Сообщить(Перем1);
Иначе
Сообщить(Перем1,Перем2);
КонецЕсли;
Иначе
ТекстСообщения=ПереводАнгл.ПереводимЭлемент(Перем1);
Если перем2=""тогда
Сообщить(ТекстСообщения);
Иначе
Сообщить(ТекстСообщения,Перем2);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции
Функция АнглПредупреждение(перем1="",перем2="",перем3="") Экспорт
результат="";
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем2=""тогда
Предупреждение(Перем1);
ИначеЕсли перем3="" тогда
Предупреждение(Перем1,Перем2);
Иначе
Предупреждение(Перем1,Перем2,Перем3);
КонецЕсли;
Иначе
ТекстСообщения=ПереводАнгл.ПереводимЭлемент(Перем1);
Если перем2="" тогда
Предупреждение(ТекстСообщения);
ИначеЕсли перем3="" тогда
Предупреждение(ТекстСообщения,Перем2);
Иначе
Предупреждение(ТекстСообщения,Перем2,Перем3);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции
И собственно самое интересное:
ДЛЯ ПЕРЕВОДА ФОРМЫ (ЛЮБОЙ):
В ПриОткрытии() необходимых для перевода форм дописать:
ПереводАнгл.УстановитьНадписиФормыАнгл(, ЭтаФорма);
ДЛЯ ПЕРЕВОДА СООБЩЕНИЙ, ПРЕДУПРЕЖДЕНИЙ, ВОПРОСОВ:
НУЖНО ПО КОНФИГУРАЦИИ СДЕЛАТЬ ГЛОБАЛЬНУЮ ЗАМЕНУ:
Сообщить(" на ПереводАнгл.АнглСообщить("
Вопрос(" на ПереводАнгл.АнглВопрос("
Предупреждение(" на ПереводАнгл.АнглПредупреждение("
По факту в одной из конфигураций пришлось допилить функцию ЧтототамВОПРОС() по факту замены.
А далее - вручаем ключи от перевода (флаги Язык и ВводитПеревод)- пользователю 1С и кратко инструктируем.
Собственно все.
Не нужно писать про ОбновлениеОтображения() - Действительно не вписывается в "перевести в конфигурацию за пол часа." Вообще типовые это что-то.
Если кто дочитал до конца, и есть мысли по поводу - есть пара вопросов.
1. Хочу научить конфу не английскому, а китайскому. Подскажите что нить по вопросу кодировок. (хочу в диалоговую форму
вставить иероглиф).
2. Решить вопрос со связанной информацией (кнопочка перейти) - вообще подобным методом возможно?