Оптимизация хардкода

07.12.22

Разработка - Рефакторинг и качество кода

Очередной раз о наболевшем, или как использовать конфигуратор без программиста.

Скачать исходный код

Наименование Файл Версия Размер
Расширение постоянных значений
.cfe 10,40Kb
1
.cfe 10,40Kb 1 Скачать

В очередной раз увидев конструкции вида 

Если ТипЦен=Справочники.ТипыЦен.НайтиПоНаименованию("Розничные") 
     или ТипЦен=Справочники.ТипыЦен.НайтиПоНаименованию("Розничные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, специализированные отраслевые решения).

Расширение конфигурация хардкод оптимизация

См. также

Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    5415    artbear    77    

75

Ниндзя-код

Рефакторинг и качество кода Платформа 1С v8.3 Россия Бесплатно (free)

Предлагаю вашему вниманию советы мастеров древности. Программисты прошлого использовали их, чтобы заострить разум тех, кто после них будет поддерживать код. Гуру разработки при найме старательно ищут их применение в тестовых заданиях. Новички иногда используют их ещё лучше, чем матёрые ниндзя. Прочитайте их и решите, кто вы: ниндзя, новичок или, может быть, гуру? (Адаптация статьи "Ниндзя-код" из учебника JavaScript)

01.04.2024    2310    DrAku1a    15    

33

Практическое программирование: когда скорость важнее совершенства

Рефакторинг и качество кода Бесплатно (free)

В новом материале мы анализируем, как в программировании баланс между быстротой разработки и тщательной проработкой кода влияет на конечный продукт. Обсуждаем, почему иногда важнее сосредоточиться на скорости выполнения проекта, и когда можно позволить себе уступить в качестве ради достижения бизнес-целей.

01.04.2024    596    Prepod2003    6    

2

Когда понадобился новый оператор

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1352    ZhokhovM    4    

4

Когда разработчик платформы не добавил проверку препроцессоров

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда разработчик платформы решил пойти на кухню за кофе, а проверку препроцессоров не добавил, и вот тут-то и началось: "Что, опять все сломалось? Ну и кофе же я забыл сделать!".😅

18.03.2024    3004    ZhokhovM    4    

9

Реструктуризация - бесконечная история

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    2078    1CUnlimited    15    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6799 07.12.22 08:41 Сейчас в теме
Для частого получения одних и тех же настроек (например, при групповом проведении) лучше использовать повторное получение, делается через общий модуль, в него функцию получения настройки запихать. И при записи регистра обновлять значения.
Прикрепленные файлы:
kas1989; +1
3. shard 279 07.12.22 10:41 Сейчас в теме
(1), (2) Это уже оптимизация получения значений из РС, на Ваше усмотрение. Вариант с повторным получением этих настроек при групповом проведении - а не надо чтение из РС в цикле делать =)
+
4. glek 119 07.12.22 10:48 Сейчас в теме
(3) Не совсем: ПВХ позволяет типизировать получаемое/устанавливаемое значение.
sleemp; +1
6. shard 279 07.12.22 10:56 Сейчас в теме
(4) ПВХ потом искать по наименованию/коду? Или предопределенными делать? По типизации - вариант когда в постоянном значении сначала закладывается дата, но с 1 января должно стать строкой не встречался значит (эти заказчики такие затейники, хуже японцев с тентаклями).
+
8. glek 119 07.12.22 11:27 Сейчас в теме
(6) Зачем искать? делаем предопределенные.
В 1С с 95 года, так что заказчиков разных видел. Но таких затейников не встречал.
sleemp; +1
9. shard 279 07.12.22 12:04 Сейчас в теме
(8) Если у организации сложности с доступом в конфигуратор (контур прода отделен от тестового, изменения в прод вносятся через хранилище специально обученными людьми по специально оговоренному и согласованному расписанию), а захардкодить нужно что-либо в доп.обработке/ПФ, то с таким подходом могут быть задержки. Даже если продинамить - обязательно найдется какая-нибудь Мариванна, которая будет старательно отказываться от перезапуска 1с (или может даже соврет что перезапустила) и заявит "Ваша программа не работает!!!111". Хорошо если это окажется не руководитель департамента.
Про затейников - в п.5 описал одних таких... Они через неделю еще заявили что выполняемые алгоритмы должны не только от базы зависеть, но и от даты.
+
2. glek 119 07.12.22 09:26 Сейчас в теме
Всё равно считаю, что лучше использовать связку ПВХ+РС))))
sleemp; +1
5. kembrik 10 07.12.22 10:51 Сейчас в теме
У нас используется непериодический независимый РС с измерениями Программный идентификатор (строка) и Объект (тип ЛюбаяСсылка), в принципе этого хватает. А ну и в реквизиты вынесены Реквизит группировки и ЗначениеОбъекта (Булево, Строка, Дата, Число)

Насколько я помню подобный функционал был в УТ 10 но время его не пощадило.

В принципе это позволяет реализовывать почти весь вышеперечисленный функционал (списки и универсальное хранение ссылок, историю изменений все таки храним по другому) и использовать данный функционал не только в параметрах запроса, но и в тексте, так как не используем Хранилище Значений.
+
7. shard 279 07.12.22 11:01 Сейчас в теме
(5) Встречал и такие варианты. Весело становилось когда идентификатор становился множественным значением... В одной конторе подрядчик (сурьезная контора между прочим) справочник с предопределенными как элементы идентификаторами наваял, с флажками "множественный выбор". Два общих модуля, пара справочников, РС, обучение как всем этим добром пользоваться, добавление нового идентификатора через конфигуратор...
зы: без хранилища в реквизит произвольный перечень не внести, придется со множественным выбором заморачиваться. Невозможность использования в запросах это конечно плохо, но можно обойтись предварительной сборкой нужного значения - главное не в цикле.
+
44. kembrik 10 19.12.22 16:34 Сейчас в теме
(7) Ну вот как раз для редких (в наших случаях) множественных значений и есть текстовый реквизит РС "РеквизитГруппировки". Обвязка в ММ типа ПолучитьМассивОбъектов, ПервыйОбъект в наличии, достаточно удобно. Ну а когда очень хочется и никто не видит - пишем ЗначениеВСтрокуВнутр в строковой реквизит. Но на истину не претендуем - любой читатель выберет подходящий для себя вариант
+
10. Alxby 1144 07.12.22 21:48 Сейчас в теме
Как Вы будете поддерживать контроль ссылочной целостности? Объект, ссылка на который будет в ХранилищеЗначений можно удалить и тогда в ХранилищеЗначений будет битая ссылка?
+
12. shard 279 08.12.22 09:30 Сейчас в теме
(10) Все на усмотрение разработчика. Ранее таких ситуаций не возникало, т.к. в 100% случаев удаление используемых объектов было невозможно при соблюдении контроля ссылочной целостности.
+
13. Alxby 1144 08.12.22 10:20 Сейчас в теме
(12)Об этом и речь. Контроль НЕ проверяет то, что находится в ХранилищеЗначений. Поэтому если там будет единственная ссылка на удаляемый объект, то он прекрасно удалится и ссылка останется битой.
+
14. SlavaKron 08.12.22 10:35 Сейчас в теме
(13) Мне кажется, это надуманная проблема. Этот регистр, по сути, только для программиста, чтобы параметризировать данные вместо хардкода. Он не участвует в бизнес-логике, поэтому ему не нужен контроль ссылочной целостности.
+
15. Alxby 1144 08.12.22 10:37 Сейчас в теме
(14)Речь идет не о контроле записей регистра, а о контроле тех справочников, на которые есть ссылки в "Данные"
+
16. SlavaKron 08.12.22 10:41 Сейчас в теме
(15) При чем тут справочники? Битая ссылка будет в регистре, контроль и ответственность за ее использование на программисте, не вижу проблемы.
+
18. Alxby 1144 08.12.22 10:54 Сейчас в теме
(16)Нет. программист никак не может проконтролировать, что то значение, которое он выбрал в качестве предопределенного, внезапно пропадет из базы. И система не только это допустит, но и никаких предупреждений не даст.
+
24. shard 279 08.12.22 11:09 Сейчас в теме
(18) Проверку на корректность полученных данных и при НайтиПоНаименованию обязательно делать надо.
+
26. Alxby 1144 08.12.22 11:12 Сейчас в теме
(24)Поэтому НайтиПоНаименованию и ваше РегистрСведений.ПЗ_ПостоянныеЗначения.ПолучитьЗначение() одинаково плохо (ну, или одинаково хорошо)
+
11. Alxby 1144 07.12.22 21:54 Сейчас в теме
Мы используем справочник с предопределенными значениями и реквизитом Значение составного типа. Тогда обращение в коде будет по предопределенному имени + получение значения этого реквизита. История при этом не поддерживается, списки тоже, но для списков можно сделать ТЧ в этом справочнике.
dhurricane; +1
17. Alxby 1144 08.12.22 10:43 Сейчас в теме
Простите мою откровенность, ваше решение, хотя и безусловно рабочее, минусов имеет больше, чем плюсов. С точки зрения архитектуры: вы меняете поиск по строковому наименованию на поиск по такому же строковому измерению, в чем профит? Только в том, что вы можете все эти значения собрать в одном месте? С точки зрения методологии: у вас использование нужных вам "предопределенных" значений - в коде конфигурации, а определение множества таких значений и их имен - в пользовательском режиме. Т.е. работоспособность кода зависит от данных, которые в вносятся в ИБ (а если не их не внесут? или будет ошибка в измерении Имя?).
Я бы вам порекомендовал следующее: если действительно нужны и списки, и история, то в вашем регистре измерение "Имя" сделать перечислением, тогда разработчик САМ определяет список нужных ему в коде "предопределенных значений". Ресурс "Данные" сделать ссылкой на вспомогательный справочник. Во вспомогательном справочнике будет один реквизит составного типа "Значение" и табличная часть для списков с одной колонкой "Значение". Создание и изменение элемента вспомогательного справочника должно быть прозрачно для пользователя. Необходимо также обеспечить наличие в регистре хотя бы одной записи по каждому значению "Имя" (с минимальной датой). В том числе, хотя бы по одной записи должно оставаться при записи произвольных наборов записей этого регистра (что само по себе непростая и интересная задача). При таком решении не будет проблем с контролем ссылочной целостности, можно использовать этот механизм в запросах, пользователь может просмотреть значения в динамическом списке.
+
19. shard 279 08.12.22 11:00 Сейчас в теме
Не претендую на идеальность решения, но присутствует один существенный плюс (имхо): добавить новое имя можно без использования конфигуратора. При использования перечислений или предопределенных элементов справочников без конфигуратора не обойтись - ранее описывал с какими вопросами можно при этом столкнуться. В любом случае рекомендую не усложнять(17)
+
20. Alxby 1144 08.12.22 11:04 Сейчас в теме
(19)Да, это плюс. А в каких случаях надо добавлять новое имя без конфигуратора? Если вы хотите обращаться к новому имени из кода, то код-то вы пишете в конфигураторе. А если вы хотите использовать код во внешних отчетах/обработках, то и нужное значение должно быть в реквизите этой самой обработки.
+
22. shard 279 08.12.22 11:07 Сейчас в теме
(20) см. комментарий (9) и описание п.5
+
28. Alxby 1144 08.12.22 11:17 Сейчас в теме
(22)в обоих случаях нельзя добавить нужный реквизит-параметр во внешнюю обработку и в каждой базе выбирать свое значение?
+
30. shard 279 08.12.22 11:26 Сейчас в теме
(28) Можно. Но в случае групповой печати (упоминали ее ранее в комментариях уже) - пользователи взвоют. В случае доп.обработки - можно выбранное один раз значение сохранять, но нет гарантии что пользователь актуализирует его завтра. В обоих случаях будет создан инцидент, который пойдет по всей линии техподдержки.
+
32. Alxby 1144 08.12.22 11:34 Сейчас в теме
(30)Наверное Вы правы, и в Вашем случае действительно плюсы этого решения перевешивают минусы. Я все-таки рассматриваю проблему с точки зрения универсального тиражного решения, а там свои требования к надежности. Представьте, что Вы поставили конфигурацию с этим расширением новому клиенту. Кто вспомнит какие записи надо добавить в регистр? У вас ведется список этих имен? Этот список постоянно поддерживается? Он входит в техническую документацию? К нему есть доступ у всех разработчиков, которые сидят на поддержке, в том числе у возможных внешних подрядчиков?
+
33. shard 279 08.12.22 11:41 Сейчас в теме
(32) Для тиражного решения - только предопределенные элементы, применяемый в публикации подход и тем более всякие "НайтиПо..." категорически недопустимы, имхо. Хотя и тут можно поспорить, если вспомнить алгоритмы заполнения показателей статистической отчетности в типовых конфигурациях (документации по ним кстати найти в приемлемые сроки не удалось).
+
36. Alxby 1144 08.12.22 11:46 Сейчас в теме
(33)Вот-вот, здесь наши мнения совпадают. И, поскольку мы находимся в рубрике "Качество кода", требования к качеству кода должны быть как для тиражных решений. Я ничего не имею против решения данной публикации, просто не следует ее принимать как универсальное, и в статье должны быть указаны границы применимости и минусы этого решения.
+
40. shard 279 08.12.22 11:56 Сейчас в теме
(36) Это как в инструкции микроволновки "не предназначена для сушки котов". А также собак, крыс, и т.п. Хомячков только можно: у них 2 цели в жизни - пожрать и эпично сдохнуть)))
+
41. Alxby 1144 08.12.22 11:59 Сейчас в теме
(40)Вы же знаете, что эта фраза появилась неспроста? А рядовые граждане, понимают в функционировании ПО гораздо меньше чем в последствиях работы микроволновки, поэтому "защита от дурака" должна быть строже.
+
42. shard 279 08.12.22 12:13 Сейчас в теме
(41) все необходимое указано в характеристиках публикации.
Вспоминать про качество кода как для тиражных решений, когда конфа пестрит дописками "НайтиПо..." от трех разных разработчиков-контор поздно.
К счастью, если рядовой пользователь интегрирует данное расширение в свою кошку базу - ничего не сломается.
Прикрепленные файлы:
+
43. Alxby 1144 08.12.22 12:30 Сейчас в теме
(42)Мы же не хотим уподобляться разработчикам "трех разных контор", верно? Кто, кроме нас, может обеспечить качество, эффективность и надежность нашего ПО? У каждого из нас есть свое личное кладбище множество г**кода и неудачных решений. В том и преимущество форума инфостарта, что мы можем обсудить разные варианты, их плюсы и минусы, обменяться кейсами и разными подходами к решению задач. И ваш вариант, и мой имеют право на существование, при решении проблемы в некоторых случаях плюсы вашего решения перевесят минусы, а в некоторых - нет, а чем я и писал в своих комментариях.
shard; +1
35. shard 279 08.12.22 11:44 Сейчас в теме
(34) Цитата из тридцать второго:
У вас ведется список этих имен? Этот список постоянно поддерживается? Он входит в техническую документацию? К нему есть доступ у всех разработчиков, которые сидят на поддержке, в том числе у возможных внешних подрядчиков?

те же самые вопросы применимы и к вашему продукту.
+
38. Alxby 1144 08.12.22 11:49 Сейчас в теме
(35)у нас список этих имен определен в конфигурации (как предопределенные элементы справочников или значения перечисления). После установки новой конфигурации пользователь видит в списке все эти значения, и понимает, что он должен заполнить. Острой необходимости в отдельной документации нет, хотя в руководство администратора описание этих параметров должно входить.
+
37. shard 279 08.12.22 11:49 Сейчас в теме
(17)скрин из типовой конфигурации, форма доп.реквизита. Обращаю внимание что ни перечислений, ни предопределенных элементов справочников не применяется.
Прикрепленные файлы:
+
39. Alxby 1144 08.12.22 11:55 Сейчас в теме
(37)На мой взгляд, это неудачное решение, но лучшее в данном случае придумать сложно. Интересно, в нем есть проверка уникальности? Но по крайней мере, оно автоматически заполняется.
+
21. Alxby 1144 08.12.22 11:06 Сейчас в теме
Еще предложение по усовершенствованию: сделать возможность получать значение на клиенте. Это бывает нужно довольно часто.
+
23. shard 279 08.12.22 11:08 Сейчас в теме
(21) Добавить процедуру НаСервереБезКонтекста?
+
25. Alxby 1144 08.12.22 11:10 Сейчас в теме
(23)В ваше расширение добавить модуль "...ВызовСервера", с функцией, в которой будет РегистрСведений.ПЗ_ПостоянныеЗначения.ПолучитьЗначение(
+
27. shard 279 08.12.22 11:15 Сейчас в теме
(25) а для вызова ОбщегоНазначения.ЗначениеРеквизитаОбъекта тоже модуль добавлять? ;)
+
29. Alxby 1144 08.12.22 11:19 Сейчас в теме
(27)Да, в наших конфигурациях так и сделано. Вспомните, ведь в платформе есть и серверное Справочники.<Имя справочника>.<Имя предопределенного>, и клиентское ПредопределенноеЗначение("Справочник.<Имя справочника>.<Имя предопределенного>")
+
31. shard 279 08.12.22 11:30 Сейчас в теме
(29)
Да, в наших конфигурациях так и сделано.

Спорное решение. Не думаю что разработчики массово изучают состав конфы и расширений на предмет оптимизаций БСП предшественниками.
+
34. Alxby 1144 08.12.22 11:41 Сейчас в теме
(31)В чем спорность? Мы продуктовые разработчики, а не разработчики на поддержке. Мы используем БСП, но и пишем свои модули, поэтому все наши разработчики знают "состав конфы")))). Если нам на клиенте нужно узнать реквизит ссылки, то мы так или иначе должны запросить сервер, для чего и сделана функция в общем модуле.
+
Оставьте свое сообщение