При разработке и адаптации конфигураций 1С часто возникает задача хранения текстовых данных (наименований, описаний товаров, параметров и характеристик) на нескольких языках — например, для выгрузки в интернет-магазины, работы с зарубежными контрагентами или передачи в сторонние сервисы по API. Разберем, какие подходы существуют в платформе 1С:Предприятие 8.3, чем отличается перевод интерфейса от перевода данных и как правильно организовать структуру хранения.
Важно четко разделять две принципиально разные задачи платформы:
Языки, многоязычные синонимы объектов и функция НСтр() в коде предназначены исключительно для перевода элементов управления, заголовков форм, отчетов и системных сообщений. Данный механизм не предназначен для хранения пользовательских данных в таблицах базы.Проанализируем наиболее универсальный подход, который идеально подходит для сценариев, когда количество языков заранее неизвестно, может расширяться пользователями или когда переводы требуются не только для номенклатуры, но и для характеристик, категорий и дополнительных свойств.
Создадим непериодический независимый регистр сведений со следующей структурой:
Объект: составной тип (например, СправочникСсылка.Номенклатура, СправочникСсылка.ХарактеристикиНоменклатуры, ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения).ИмяРеквизита: тип Строка (длина 50–100) либо ПеречислениеСсылка со списком переводимых полей (например: Наименование, НаименованиеПолное, ОписаниеДляСайта).КодЯзыка: тип Строка (длина 10) или ссылка на справочник языков. Рекомендуется использовать стандартные коды стандарта ISO-639-1 (ru, en, de), что существенно упростит сериализацию данных при выгрузке в XML или JSON.Значение: тип Строка (длина неограниченная или максимальная требуемая).Преимущества подхода:
Ограничения подхода: выборка большого массива данных в отчетах или динамических списках потребует соединений с таблицей регистра сведений, что при миллионных объемах записей может создавать нагрузку на СУБД. Также полнотекстовый поиск платформы по справочнику номенклатуры по умолчанию не видит строки из отдельного регистра.
Если список дополнительных языков фиксирован (например, только английский и немецкий) и расширение не планируется, целесообразно рассмотреть вариант создания выделенных реквизитов непосредственно в справочнике или через механизм ОбщиеРеквизиты:
НаименованиеЯзык1 (EN), НаименованиеЯзык2 (DE);ОписаниеЯзык1 (EN), ОписаниеЯзык2 (DE).Такой подход обеспечивает максимальную скорость выборки данных без соединений таблиц, корректно индексируется СУБД и напрямую отдается через стандартный протокол OData без написания дополнительных запросов.
Рассмотрим пример формирования данных для выгрузки номенклатуры вместе с ее языковыми версиями из регистра сведений. Чтобы избежать выполнения запросов в цикле, получим данные одним пакетным запросом с группировкой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК НаименованиеRU,
| Переводы.ИмяРеквизита КАК ИмяРеквизита,
| Переводы.КодЯзыка КАК КодЯзыка,
| Переводы.Значение КАК Значение
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МультиязычныеЗначения КАК Переводы
| ПО (Переводы.Объект = Номенклатура.Ссылка)
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
|ИТОГИ ПО
| Ссылка";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаОбъектов = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаОбъектов.Следующий() Цикл
// Заполняем структуру товара
ТоварСтруктура = Новый Структура;
ТоварСтруктура.Вставить("Идентификатор", Строка(ВыборкаОбъектов.Ссылка.УникальныйИдентификатор()));
// Инициализируем коллекцию имен для экспорта
СписокИмен = Новый Структура;
СписокИмен.Вставить("ru", ВыборкаОбъектов.НаименованиеRU);
ВыборкаДетали = ВыборкаОбъектов.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
Если ВыборкаДетали.ИмяРеквизита = "Наименование" И ЗначениеЗаполнено(ВыборкаДетали.КодЯзыка) Тогда
СписокИмен.Вставить(ВыборкаДетали.КодЯзыка, ВыборкаДетали.Значение);
КонецЕсли;
КонецЦикла;
ТоварСтруктура.Вставить("Наименования", СписокИмен);
// Дальнейшая сериализация в XML или JSON
КонецЦикла;
Если в дальнейшем потребуется, чтобы пользователи в интерфейсе 1С видели наименования на выбранном языке сеанса или могли осуществлять ввод по строке на иностранном языке, разберем переопределение обработчиков в модуле менеджера справочника:
ОбработкаПолученияПолейПредставления — позволяет включить дополнительные языковые реквизиты в список полей, считываемых платформой при формировании стандартного представления ссылки.ОбработкаПолученияПредставления — подменяет итоговую отображаемую строку в зависимости от текущих настроек пользователя или переданных параметров.ОбработкаПолученияДанныхВыбора — позволяет реализовать поиск и автоподбор элементов по строке с учетом иноязычных переводов.