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

07.12.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение постоянных значений
.cfe 10,40Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

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

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

Расширяемый форматтер структуры модулей 1С. Умеет автоматически расставлять стандартные области и раскидывать по ним процедуры и функции модуля, оформлять стандартные комментарии к методам с помощью ИИ. Также умеет анализировать модуль - извлекать структуру вызовов, используемые поля и т.д. Реализован в виде расширения (.cfe). Можно использовать как платформу для обработки кода в своих задачах автоматизации разработки.

12.02.2025    5299    356    wonderboy    39    

112

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

В третьей статье по докладу Александра Кириллова, с которым он выступил на конференции INFOSTART TECH EVENT 2024, обсудим подходы к рефакторингу платформеннозависимого кода

11.02.2025    798    it-expertise    0    

2

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

Во второй статье по докладу Александра Кириллова, с которым он выступил на конференции INFOSTART TECH EVENT 2024, поговорим об особенностях анализа конфигурации 1С на наличие платформеннозависимого кода.

31.01.2025    1464    it-expertise    1    

7

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

В практике нашей специальной команды по проектам сложных обновлений 1С прошел один из самых объёмных проектов: необходимо было обновить «1С: Бухгалтерия предприятия КОРП 3.0 + БИТ.ФИНАНС». Конфигурация содержала доработки практически по всем типам объектов метаданных. Длительность проекта составила 1 год и 2 месяца и обеспечила полной загрузкой 4 разработчиков на 6 месяцев.

31.01.2025    972    1c-izh    3    

5

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

В последнее время термин «чистый код» стал очень популярным. Появились даже курсы по данной тематике. Так что же это такое?

16.09.2024    16954    markbraer    66    

43

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

В статье рассматривается отказ от использования процедур и унификация формата ответа функций. Способ описывается на примере развития абстрактной информационной системы, работающей с PDF файлами.

10.09.2024    1331    acces969    4    

6

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

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

28.08.2024    1837    Chernazem    3    

6

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

SOLID – принципы проектирования программных структур (модулей). Акроним S.O.L.I.D. образован из первой буквы пяти принципов. Эти принципы делают код более гибким, упрощают разработку. Принято считать, что принципы SOLID применимы только в объектно-ориентированном программировании. Но их можно успешно использовать и в 1С. Расскажем о том, как разобраться в принципах SOLID и начать применять их при работе в 1С.

22.08.2024    12241    alex_sayan    41    

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

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

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

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

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