Мультиязычность данных в некоторых случаях может быть востребована. Например, есть конфигурация, в которой работают сотрудники из разных стран, не знающие несколько языков.
Для реализации идеи используется механизма разделения данных, подробнее 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)