В очередной раз увидев конструкции вида
Если ТипЦен=Справочники.ТипыЦен.НайтиПоНаименованию("Розничные")
или ТипЦен=Справочники.ТипыЦен.НайтиПоНаименованию("РозничныеEUR")
или ТипЦен=Справочники.ТипыЦен.НайтиПоНаименованию("РозничныеUSD") Тогда
решил опубликовать очень простую и широко применяемую в узких кругах идею замены махрового хардкода менее махровым, местами применяющемся даже в типовых конфигурациях.
Суть в следующем: добавить расширением периодический регистр сведений ПЗ_ПостоянныеЗначения, хранящий по определенному строковому имени (измерение Имя, тип строка) некий набор данных (ресурс Данные, тип ХранилищеЗначений).
Это позволит:
1) хранить в данных ссылки на элементы (собственно замена методов НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту)
2) хранить в данных списки элементов (что-то подобное сегментированию, но работает с произвольными типами)
3) хранить историю изменений данных по имени (например, можно в печатных формах использовать, или в истории набора неких продуктов конторы)
4) изменять коды, наименования и все остальные доступные пользователям реквизиты искомых объектов (без переписывания текстов модулей)
5) хранить варианты исполняемого кода для различных баз данных, подключенных к одному хранилищу конфигураций (встречал и такое требование... "сделайте нам единую конфигурацию, но чтобы работала в разных базах по-разному, в каких - мы не знаем". Тьфу.)
Регистр имеет единственную экспортную функцию, применяемую в коде:
Функция ПолучитьЗначение(Имя,Дата=Неопределено,ПреобразовыватьЕдинственноеЗначение=Истина) Экспорт
возвращает данные по имени и дате. Если дата не указана, то будет возвращено значение на текущую дату. Если ПреобразовыватьЕдинственноеЗначение=Истина и в списке данных единственное значение, то оно будет возвращено как значение, а не как список. Если в списке единственное строковое многострочное значение (случай 5, описанный выше), то перед выполнением команды дополнительно заменить Символ(182) на Символы.ПС.
Пример использования:
ЗначениеПеречняДляХардкода = РегистрСведений.ПЗ_ПостоянныеЗначения.ПолучитьЗначение("ПеременнаяТест",НачалоМесяца(ТекущаяДата()));
Расширение универсально, проверялось на платформе 1С:Предприятие 8.3 (8.3.20.1710) и на различных конфигурациях (УТ 11.5.9.125, КА 2.5.9.125, УХ 3.0.10.1, ДО 2.0, специализированные отраслевые решения).