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

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, специализированные отраслевые решения).

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

См. также

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

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

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

18.03.2024    1149    ZhokhovM    2    

4

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

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

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

18.03.2024    2675    ZhokhovM    4    

8

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

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

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

29.09.2023    1909    1CUnlimited    15    

22

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2

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

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

27.09.2023    6968    Lemmonbri    136    

36

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 1

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

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

19.09.2023    4346    Lemmonbri    16    

31

5 подходов при доработке конфигурации 1С, чтобы в будущем не было мучительно больно её обновлять

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

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

10.08.2023    9586    0    1c-izhtc    37    

21

Задача на ошибки и неоптимальности при проведении приходной накладной

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

Задачу эту дают на собеседованиях, видимо, те франчи, которые не в состоянии оценить человека по резюме и в ходе беседы. По идее задачи, подобные этой, должны давать начинающим студентам. Но дают всем подряд. Итак: мои 5 копеек. Критика приветствуется.

11.07.2023    2214    magic1s    32    

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

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

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