Языки конфигурации
Набор доступных для пользователей языков определяется объектами метаданных "Язык". Каждый язык помимо стандартных свойств "Имя", "Синоним" и "Комментарий" имеет свойство "Код языка". Это свойство представляет собой строку , которую рекомендуется определять в соответствии с международным стандартом двухбуквенных кодов языков ISO-639. Это требование не обязательное, однако исключительно важно, чтобы в пределах конфигурации данные коды были уникальны. Как мы увидим, в отличие от других объектов метаданных, именно код, а не имя является основным идентификатором языка.
Отображение строк на разных языках
В режиме Конфигуратора строки отображаются на языке редактирования конфигурации, который может быть изменен через выпадающее меню в правом нижнем углу основного окна Конфигуратора. В режиме 1С:Предприятие строки отображаются на языке, выбранном в настройках пользователя, доступных из списка пользователей меню администрирования. Если ни одного пользователя в информационной базе не заведено, используется основной язык конфигурации.
Хранение строк на разных языках и связь с языками конфигурации
Строка на разных языках представляет собой набор пар код-строка. То есть привязка к конкретному языку осуществляется именно по коду, а не по имени или внутреннему идентификатору (данное замечание касается именно строк, поскольку, например, свойство конфигурации "Основной язык" для привязки использует внутренний идентификатор, и редактирование имени и кода языка на него никак не влияет). Что же происходит со строками при изменении кода языка? Ничего. Автоматическая "перепривязка" строк не производится. Таким образом, все строки, привязанные к старому коду, будут недоступны.
Редактирование строк на разных языках
Для формирования строк на языках, отличных от языка редактирования конфигурации, можно использовать редактор в панели свойств. В случае если в конфигурации заведено более одного языка, в нем будет доступна кнопка открытия ("лупа"), нажатие на которую вызывает диалог, позволяющий редактировать содержимое на всех языках, заведенных в данный момент в конфигурации. Однако для решения описанной выше проблемы (потери строк при изменении кода языка) этот способ не подходит. Во-первых, строки со старым кодом в этот диалог просто не попадут, да и "разыскивание" всех строк по всей конфигурации задача утомительная. Для восстановления связи с утерянными строками следует воспользоваться механизмом редактирования текстов интерфейса, доступным из меню "Правка". Данный механизм производит сканирование всей конфигурации (или указанного подмножества объектов) и выводит список всех строк на разных языках. Важным отличием этого механизма от редактора в панели свойств, является то, что он выводит содержимое не только на всех языках (а на самом деле кодах языков), которые присутствуют в конфигурации в данный момент, но и всех, встречающихся в строках. Другим важным средством данного механизма является возможность копирования текстов из одного языка в другой. То есть мы можем указать копирование из старого кода языка в новый код, и связь строк с языком будет восстановлена. После чего можно воспользоваться еще одним средством и очистить строки со старым кодом.
Рассмотрим ситуации, когда данная проблема может возникнуть. Наиболее очевидна ситуация, когда у существующего языка (для которого уже определено много строк) меняется код. Однако возникновение ее маловероятно. Как уже указывалось, рекомендуется использовать стандартные значения кодов и в последствии их не менять. Однако есть еще одна, менее очевидная ситуация, связанная с внешними обработками. Внешняя обработка могла быть создана в среде совсем другой конфигурации, где набор языков (или их коды) отличается от набора, используемого в данной конфигурации. При открытии такой обработки все строки будут "утеряны". Описанный механизм позволит решить эту проблему, поскольку он позволяет искать и редактировать строки не только в конфигурации, но и во внешних обработках (как открытых в конфигураторе, так и находящихся в файлах на диске).
Программное формирование строк на разных языках
Если интерфейсную строку требуется сформировать программно, следует воспользоваться функцией НСтр(). Она описана в документации, однако следует указать на необходимость аккуратного соблюдения синтаксиса. Строки для каждого языка могут быть заключены как в одинарные так и в двойные кавычки. Сложности возникают, если эти символы содержаться в самих строках. Рассмотрим, например, строковую константу “Документ “””. Она содержит двойную кавычку. При переводе ее в параметр функции НСтр() рекомендуется использовать следующий вариант:
НСтр(“ru=’Документ “”’”);
То есть оформить ее в одинарных кавычках. Можно воспользоваться и двойными, но при этом все внутренние двойные кавычки следует удвоить:
НСтр(“ru=””Документ “””””””);
Разумеется, подобная константа не очень наглядна (хотя результат будет тот же, что и в предыдущем варианте). Если же "механически" обрамить строку в двойные кавычки:
НСтр(“ru=””Документ “”””);
то получится ошибочный шаблон. Причем, особенность реализации функции НСтр() состоит в том, что ни при синтаксической проверке модулей, ни при исполнении, никакой ошибки выдано не будет. Функция просто вернет пустую строку.
В целом, для редактирования сложных строк, заключенных в НСтр(), надежнее воспользоваться механизмом "Редактирование текстов интерфейса". Однако следует учитывать, что, по умолчанию, поиск НСтр() не производится, для его включения требуется включить соответствующий флажок в диалоге настройки редактирования текстов интерфейса.
Форматирование модулей, содержащих НСтр()
Следует обратить внимание еще на одну особенность работы с НСтр(). Если необходимо сформировать сложную строку как результат нескольких вызовов НСтр(), то рекомендуется располагать эти вызовы на разных строках модуля. Например вместо
НСтр("ru='Документ'") + " " + НСтр("ru='Накладная'");
следует использовать
НСтр("ru='Документ'") + " " + НСтр("ru='Накладная'");
Размещение в одной строке модуля нескольких вызовов НСтр может привести к ошибкам работы механизма редактирования текстов интерфейса. Это может выражаться в следующем. При первичном редактировании строк (ручном, или в результате какой-либо групповой операции, например копировании текстов из одного языка в другой) будут правильно обработаны все строки, но при последующем редактировании тексты, соответствующие НСтр(), расположенным не первыми в строке будут недоступны. Для решения этой проблемы достаточно заново произвести поиск интерфейсных текстов, но лучше не допускать возникновения подобной ситуации, и располагать вызовы НСтр() на разных строках.