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

Публикация № 1770246 07.12.22

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Расширение постоянных значений

.cfe 10,40Kb
1
.cfe 10,40Kb 1 Скачать

Специальные предложения

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

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

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

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

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

См. также

Автоформатирование кода Промо

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

Как часто приходится работать в режиме аврала, когда на оформление кода не хватает времени? И как лениво порой бывает, возвращаться к уже рабочему коду, что бы отформатировать его и привести в порядок. Данная обработка позволяет автоматически форматировать текст кода, в соответствии с настройками пользователя. Это позволит привести ваш код, как уже написанный так и будущий к единому оформлению.

1 стартмани

19.12.2012    48461    187    Sibars    57    

Проверка программного кода посредством BSL LS

Рефакторинг и качество кода Инструментарий разработчика Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Абонемент ($m) Абонемент ($m)

Во время разработки необходимо следить за качеством кода и соответствием его стандартам. Да, есть SonarQube, но его использование не всегда удобно. Проверка будет происходить только после того, как код пушится в git и делается пул реквест, что увеличивает время обнаружения ошибок Для решения таких проблем и была создана эта обработка. Она позволяет проверять код практически на лету. Достаточно скопировать текст модуля и вставить его в соответствующее поле обработки, задать параметры проверки (при необходимости) и запустить проверку.

1 стартмани

30.05.2022    1963    5    burlakov    3    

Где баланс между производительностью и возможностями программы ? Исправление автоподбора контрагента в УНФ

Рефакторинг и качество кода HighLoad оптимизация Адаптация типовых решений Платформа 1С v8.3 Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 1.6 Россия Россия Управленческий учет Управленческий учет Абонемент ($m) Абонемент ($m)

Как и у многих ко мне стали поступать обращения от менеджеров о медленной работе 1с (эта ваша один с не дает нормально работать), и чтоб быть объективным, и не основываться на человеческом, субъективном восприятии решил вооружиться цифрами, а именно произвести анализ медленных запросов, и проблема была найдена, где я ее не ожидал.

1 стартмани

27.08.2021    5353    0    con-men    0    

Эмуляция ООП в 1С стандартными средствами

Рефакторинг и качество кода Платформа 1С v8.3 Платформа 1С v8.3 Управляемые формы Управляемые формы Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Абонемент ($m) Абонемент ($m)

Работа механизма ООП проверена на версиях платформы: 8.2.19.83, 8.3.15.1700. Приведенные ниже идеи механизма, возможно, не претендуют на оригинальность, но все, что реализовано - реализовано самостоятельно, без заимствования чьего-либо кода. Как интегрировать данный механизм в целевую конфигурацию, изложено в разделе «Установка механизма ООП». Все, что реализовано в рамках этого «проекта», - всего лишь эксперимент, который, возможно, мной будет, а может, и не будет использован в дальнейшем.

1 стартмани

27.04.2020    4263    2    user706545_kseg1971    20    

Принципы ООП в 1С (pattern Iterator)

Рефакторинг и качество кода Платформа 1С v8.3 Платформа 1С v8.3 Абонемент ($m) Абонемент ($m)

Iterator или курсор, один из паттернов который реально применяю в повседневной жизни.

1 стартмани

12.07.2018    11800    4    lazarenko    35    

Функциональное программирование на 1С - миф или реальность?

Рефакторинг и качество кода Платформа 1С v8.3 Платформа 1С v8.3 Абонемент ($m) Абонемент ($m)

Небольшая конфигурация с демонстрацией возможности писать код в _функциональном_стиле_ в среде 1С, - без использования каких бы то ни было внешних компонент или инструментов.. только 1С. Демонстрация проводится в консоли кода на общей форме, которая открывается при старте.. Кроме того - внутренний код конфигурация показывает, как на мой взгляд можно кодировать в парадигме ООП, используя в качестве классов модули Обработок и не используя наследования. В общем - заинтересовавшихся, прошу под кат..

25.02.2017    20861    0    kote    127    

Эмуляция ООП в 1С8

Рефакторинг и качество кода Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Абонемент ($m) Абонемент ($m)

Скорее экспериментально-теоретическое, чем практическое руководство по использованию ООП В 1С8.

1 стартмани

14.03.2012    19915    8    fixin    16