Большой провал маленькой функции 1С
Когда 1С задумалась о порабощении покорении мира, она добавила в платформу некоторые инструменты для работы с различными языками. Шаг был в верном направлении, но, к сожалению, была сделана серьезная ошибка, которая превратила простой инструмент по использованию фраз на разных языках в кошмар.
Рассказываю.
В новых релизах 1С появилась функция НСтр, вот пример ее использования:
НСтр("ru = ""Здравстуйте""; en = ""Hello""");
Она позволяет пользователям, использующие разные языки, показывать сообщения на родном языке.
В нормальных программах все фразы сосредоточены в файле ресурсов или другой подобной библиотеке, где их можно массово обработать и проверить переводчику. Но в 1С фразы рассыпаны по всему коду.
Поэтому 1С пришлось создавать инструменты для поиска таких фраз и массового редактирования.
Но, увы, сама 1С не сделала переводы всех фраз типовых конфигурация на все языки. Поэтому внедренец, если хочет сделать перевод на условно международный английский, вынужден снимать конфигурацию с поддержки, т.е. разрешать менять типовой код.
Было бы неплохим решением, если бы функцию НСтр можно было заменить своей функцией МоёНСтр, тогда в одном месте можно было бы сделать все переводы. Но увы, платформа 1С нам такую возможность не предоставляет. Можно конечно заменить все вызовы НСтр на МоёНСтр, но в этом случае приходится снимать все модули, где встречаются вызовы этой функции, с поддержки.
И все же это решение более удобное, потому что я видел, как решают проблему некоторые разработчики.
Они добавляют целиком код процедуры, где встречается НСтр в расширение и там вносят правки. Хорошо, если разработчики обучены культуре использования ИзменениеИКонтроль, но я встречал и разработчиков которые всё пихают в директиву Вместо.
Для тех кто не особо разбирается в 1С, поясню на примере.
Исходный код:
Процедура Тест() А = 1; С = НСтр("ru = ""Здравстуйте""") + А; Сообщить(С); КонецПроцедуры
Доработанный код добавляется в расширение, нужно скопировать весь код процедуры и отметить где происходит вставка, а код процедуры может быть очень длинным и если он изменится в новом релизе, придется поправить и процедуру в расширении:
Процедура Тест() А = 1; #Удаление С = НСтр("ru = ""Здравстуйте""") + А; #КонецУдаления #Вставка С = НСтр("ru = ""Здравстуйте""; en = ""Hello""") + А; #КонецВставки Сообщить(С); КонецПроцедуры
По сути, одно неправильное решение по размещению фраз на разных языках привело к огромному количеству правок кода.
На мой взгляд, чтобы решить эту проблему, не меняя существенно платформу, нужно позволить сделать замену функции НСтр на свою или глобальное событие ПриВызовеНСтр.
Но думаю, фирма 1С имеет своё мнение на этот счет и из-за этого ослиного упрямства международный рынок будет всё так же ей недоступен, как и ранее.
Думаю, не последним будет и мнение — как же так, если будет одна функция НСтр, туда же будут приходить все фразы, это будет работать мееееееееееедленно. Хотя скорость перебора даже 1000 фраз там будет занимать доли секунды. Но перфекционизм, как известно губителен.
Там еще нет аналогов для синонимов в видпх субконто например… В общем как обычно 1с стайл — для галочки сделано, но работать это не может полноценно
не знаю как это сказать культурно, но де-факто «на отъебись» сделано. 😉