Совершенный коТ (Cat complete)

0. 2067 03.06.19 09:00 Сейчас в теме
Стандарты программирования в картинках. Самоирония прилагается.

Перейти к публикации

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
88. bulpi 180 03.06.19 16:15 Сейчас в теме
(77)
Извините за мой французский, но типовая УТ - говно. Без отношения к вопросу объектных чтений.
1С_Мастер; DoReMi; +2 3 Ответить
78. CyberCerber 771 03.06.19 15:00 Сейчас в теме
(75) Люди, у которых "время-деньги", должны понимать других людей, что у них тоже "время-деньги", и не писать заведомо медленный и неправильный код.
Тем более, что в БСП это тоже делается одной строчкой, хоть и более длинной. А если конфа без БСП, стоит подумать хотя бы о переносе модуля ОбщегоНазначения. Там вообще много хороших функций.
SlavaKron; +1 Ответить
84. ManyakRus 415 03.06.19 15:13 Сейчас в теме
(78) 1С "тормозит" только из-за выполнения запросов и операций записи.
Остальной код ускорять бесполезно,
а замусоривать код тем более не надо.
86. dhurricane 03.06.19 15:14 Сейчас в теме
(84)
только из-за выполнения запросов
А разве в данной ветке обсуждается не запрос?
90. ManyakRus 415 03.06.19 16:25 Сейчас в теме
(86) только из-за выполнения СЛОЖНЫХ запросов...
одно слово забыл написать, думал итак понятно
101. dhurricane 03.06.19 18:49 Сейчас в теме
(90) Строго говоря это неправда, потому и не "итак понятно". Банальный пример: простой запрос в цикле зачастую оказывается гораздо более ресурсоемкой операцией, нежели выполнение одного сложного запроса. И чем больше активных пользователей, работающих в базе, чем больше таких "мелочей" оказывается разбросанными в модулях конфигурации, тем более вероятно они складываются в одни общие "тормоза".
132. user1095163 05.06.19 15:45 Сейчас в теме
(101) это как надо приучить себя к говнокодингу чтобы писать запрос в цикле. Вот я хоть и знатный говнокодер, но запрос в цикле для меня это уже перебор...))
133. dhurricane 05.06.19 15:49 Сейчас в теме
(132) Да легко :)
- не читайте литературы;
- исключите ревью кода.
- тестируйте на своей файловой базе с двумя-тремя объектами.

По моему опыту это примерно так происходит.
135. SlavaKron 06.06.19 09:31 Сейчас в теме
(132) Вывод в печ. форму Ссылки вместо наименования - тот же запрос в цикле. Обращение к реквизиту через точку цикле - тот же запрос в цикле. Возможно, вы просто этого не замечаете.
Rustig; jif; pm74; +3 Ответить
143. Rustig 1699 09.06.19 00:24 Сейчас в теме
142. Rustig 1699 09.06.19 00:22 Сейчас в теме
(132) вот здесь почитайте https://infostart.ru/public/1043307/
иногда запрос в цикле - единственный способ решить задачу
не будьте так категоричны в высказываниях!
87. CyberCerber 771 03.06.19 15:15 Сейчас в теме
(84) Простите, но раз вы такое говорите, мне сложно будет вам что-то доказать. Прочитайте ссылки выше, которые давали в обсуждении объектного чтения. Также была недавно исследовательская статья на эту тему здесь на ИС.
134. Поручик 4485 06.06.19 09:22 Сейчас в теме
(78)
ОбщегоНазначения

ОбщегоНазначения тянет за собой ОбщегоНазначенияПовтИсп, ОбщегоНазначенияКлиентСерверный, а они в свою очередь кучу других. Это ещё полбеды, главное, мало кто изучает эти модули. Проще набыдлокодить.
144. Rustig 1699 09.06.19 00:25 Сейчас в теме
82. TODD22 18 03.06.19 15:07 Сейчас в теме
(75)Это можно сделать с помощью конструктора в 3 клика мышкой.
89. amd1986 03.06.19 16:25 Сейчас в теме
За исключением некоторых примеров - спорно. Читаемость кода ухудшается, что усложняет поддержку. Скорость разработки также ухудшается. Если смотреть со стороны франчей, то все так и должно быть. Сделать как можно сложнее, чтобы не слезли с крючка, а потом доить..

Как по мне, код нужно писать на идеально, а оптимально. Для разных задач может использоваться разный подход написания.
И да, не нужно слепо следовать стандартам 1С.
Rustig; Chai Nic; serge_focus; +3 Ответить
137. OerlandHue 06.06.19 09:54 Сейчас в теме
(89)


Как по мне, код нужно писать на идеально, а оптимально. Для разных задач может использоваться разный подход написания.
И да, не нужно слепо следовать стандартам 1С.


Эти оптимизации помогают на приличных базах сократить сотни секунд серверных вызовов. Вы недооцениваете эти рекомендации.
141. amd1986 06.06.19 11:45 Сейчас в теме
(137) Я же написал. Для разных задач - разный подход. Сколько процентов от всех баз 1С - приличные базы? Не имеет смысла для малых баз писать идеальный код. Это лишние трудозатраты. Только если для узких мест.
145. Rustig 1699 09.06.19 00:28 Сейчас в теме
(137) верно !
но команды разработчиков сами договариваются о принципах кодинга!
...бывают проекты, когда по приоритетам внедрить как можно скорее важнее, чем оптимизация кода... разным целям - разные подходы
146. OerlandHue 11.06.19 06:27 Сейчас в теме
(145)
ются о принципах кодинга!
...бывают проекты, когда по приоритетам внедрить как

Я не очень понимаю, почему вы считаете, что тут дело в стандартах кода. Не использовать запрос в цикле при печати массива документов это не стандарт кода, это элементарно квалификация, во всех типовых так применяется. Да и код не усложняется, по крайней мере, если написал так хотя бы два три раза. Писать ПолучитьЗначениеРеквизита не вопрос стандарта, это вопрос того, как будет ваше приложение медленно работать.
Да, некоторые не знают, что запрос в цикле нужно избегать, но это не вопрос к их стандартам, это вопрос к квалификации. Кто хоть раз делал замеры по производительности, на любой базе, тот всегда будет писать один запрос для всех объектов.
147. Rustig 1699 11.06.19 11:41 Сейчас в теме
(146) я не спорю. вы все правильно пишите.

(146)
Я не очень понимаю, почему вы считаете, что тут дело в стандартах кода


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

Запрос в цикле - это плохо, я знаю. Но в моем случае скорость разработки намного важнее, чем скорость обработки данных.

давайте закроем тему.
OerlandHue; +1 Ответить
91. vanoono 03.06.19 16:34 Сейчас в теме
Хочу немного раскритиковать данную статью по некоторым параметрам.

1. Для подобного рода синтаксического контроля есть SonarQube (возможно есть еще что-то...), причем правил по написанию кода не 3 а, 233. Вплоть до отчетов по качеству когда и созданного технологического долга.
Выискивать код который написан "Не стандартно", по всей конфигурации, самостоятельно, сверяясь со всеми "стандартами" о которых было миллион раз написано на инфостарте, методолгами на сайте 1С и т.д не рационально и ОЧЕНЬ спорно и трудозатратно.

2. Дело не в "клиповом" мышлении, а дело в том, что 1 содержательная картинка, лучше чем 100 (или больше) слов. Именно по этому бизнес аналитики пользуются различными нотациями при описании бизнес-процессов, по этому инструкции для пользователей нарезаются из скриншотов, именно по этому вы подключаетесь к клиенту по удаленному доступу и смотрите в его экран, это удобно и информативнее. Именно по этому я дочитал эту статью до конца.

3. Тема с разыменованием полей не до конца раскрыта.
3.1 Когда вы пишете запрос следующего вида:
        |ВЫБРАТЬ
	|СУММА(Документ.Ссылка.ЕщеЧтоТо.Контрагент.ИНН) КАК Сумма
        

т.е. где больше одного разыменования поля, следует все таблицы дополнительные присоединять через левое соединение. "ЕщеЧтоТо" должно быть отдельным левым соединением. В противном случае весь смысл использования запроса теряется.
3.2 Например получилась такая ситуация и я вынужден использовать "НайтиПоКоду" имею полное право, есть такая функциональность, почему и нет. То в данном случае место цифр кода, я должен передавать переменную, в которой будет код и выглядеть это должно следующим образом:

КодВалютыРубля = "000000001";
Рубль = Справочники.Валюты.НайтиПоКоду(КодВалютыРубля);



При таком написании не важно где вы используете этот стандарт например:
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);

... получаем код возврата

НеверныйЗапрос = 400; //HTTP 400 Bad Request
Если Результат.КодСостояния = НеверныйЗапрос Тогда
         //что-то делаем
КонецЕсли;


И вот это правильно.

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

Можно написать миллион статей и комментариев про то "как надо" и это не будет выполняться в следствии понятных всем причин. Как минимум можно все эти "надо" оспорить в одностороннем порядке и не делать, просто потому что я считаю что вы не правы, кто-то не прочитает статью, кто-то забудет, не заметит, пропустит, отвлечется в момент того когда надо будет проконтролировать качество написания когда и все, создан технологический долг, который точно не возможно будет исправлен.

p.s. пока пиал комментарий, попытался перейти на ИТС и прочитать Соглашения при написании кода 1С, на что мне вернулась ошибка 404. В моем случае я даже не смог его прочитать, а не просто забыл использовать его в работе :)
Rustig; brr; +2 Ответить
92. TODD22 18 03.06.19 16:41 Сейчас в теме
(91)
Выискивать код который написан "Не стандартно", по всей конфигурации, самостоятельно, сверяясь со всеми "стандартами" о которых было миллион раз написано на инфостарте, методолгами на сайте 1С и т.д не рационально и ОЧЕНЬ спорно и трудозатратно.

Можно писать код по стандартам сразу.
94. vanoono 03.06.19 16:50 Сейчас в теме
(92) Я как-то сидел, и думал, чем бы мне заняться и решил что буду программировать на 1С, сегодня решил, а на следующий день сразу запрограммировал, и сразу по стандартам 1С. Всему нужно учиться, и ко всему нужно привыкать это долгий и требующий усилий процесс. Сразу ничего не бывает.
93. TODD22 18 03.06.19 16:41 Сейчас в теме
(91)
Для подобного рода синтаксического контроля есть SonarQube

На сколько знаю продукт платный?
95. vanoono 03.06.19 16:52 Сейчас в теме
(93) Это продукт, который должен использоваться в промышленной разработке ПО, естественно такие инструменты платные.
96. TODD22 18 03.06.19 17:01 Сейчас в теме
(95)
А должно быть бесплатно ?

Так про то и речь. Сонары это прекрасно, но это сторонний и платный продукт. Конфигурировать придерживаясь стандартов это относительно бесплатно.
Сразу ничего не бывает.

Да "сразу" ничего не бывает. Инструкцию обычно читают или когда не получается или когда сломал.
97. vanoono 03.06.19 17:55 Сейчас в теме
(96) Я хочу сказать что самому контролировать это тяжело. Различных правил для модулей, процедур, функций мне кажется больше 200 можно собрать. Даже после долгой практики, всё равно умудряешься ошибаться. Человеческий фактор будет всегда присутствовать. Я за автоматизированные средства.
98. TODD22 18 03.06.19 17:58 Сейчас в теме +0.4 $m
(97)
Я за автоматизированные средства.

Я то же.
Но не имея автоматизированных всё же надо стараться придерживаться правил самому.
99. zeegin 92 03.06.19 18:35 Сейчас в теме
(93) Есть открытый плагин для сонара https://github.com/1c-syntax/sonar-bsl-plugin-community подключающий открытую реализацию LSP для BSL https://github.com/1c-syntax/bsl-language-server со своими реализациями проверок.
В него же можно загружать через generic issue результаты статанализа EDT https://github.com/oscript-library/edt-export-bugs и АПК https://github.com/otymko/acc-export тоже все открыто и бесплатно.
Alien_job; serge_focus; kuzyara; TODD22; +4 Ответить
100. YFred 12 03.06.19 18:37 Сейчас в теме
А в чем собственно вопрос?
103. PerlAmutor 124 03.06.19 20:13 Сейчас в теме +0.2 $m

Это спорная рекомендация. Строка есть строка, убирать отступ из текста запроса эквивалентно такой записи:

ИмяПеременной =
"https://its.1c.ru/db/content/v8std/src/200/200/i8100655.htm?_=1557240531";

Что не кажется правильным...


* Что делать с частью выражения, переносимой на следующую строку
* Не выравнивайте правые части выражений присваивания (Как видите, актуально)
* Размещение каждого оператора на отдельной строке

Первая строка из этой цитаты - рекомендация, утверждение, ошибка форматирования?
Вторая строка запрещает делать так?

// Неправильно?
Переменная              = Новый Структура;
ПеременнаПодлиннее      = Новый ТаблицаЗначений;
СовсемДлиннаяПеременная = Новый Запрос;

// Правильно?
Переменная = Новый Структура;
ПеременнаПодлиннее = Новый ТаблицаЗначений;
СовсемДлиннаяПеременная = Новый Запрос;
Показать


Без выравнивания правых значений код становится трудно читаемым и противоречит рекомендациям 1С - https://its.1c.ru/db/v8std#content:441:hdoc.
starik-2005; ManyakRus; +2 Ответить
104. vasilev2015 2067 03.06.19 21:12 Сейчас в теме
(103)
Здравствуйте !

* Что делать с частью выражения, переносимой на следующую строку
* Не выравнивайте правые части выражений присваивания (Как видите, актуально)
* Размещение каждого оператора на отдельной строке


Это тезисы из "Совершенный код". Первая строка - открытый вопрос, вторая - рекомендация. На сайте ИТС написано "допускается", а не "рекомендуется". На мой взгляд, это свидетельствует, что выравнивание вправо не является предпочитаемым методом.
105. PerlAmutor 124 03.06.19 21:48 Сейчас в теме
(104)
На мой взгляд, это свидетельствует, что выравнивание вправо не является предпочитаемым методом.

Уже 3 года работаю с конфигурацией ERP и постоянно вижу, что такое выравнивание употребляется довольно часто. Вот из БСП.
Прикрепленные файлы:
106. vasilev2015 2067 03.06.19 22:33 Сейчас в теме
(105) Может быть. Понаблюдаю еще пару лет ))
130. Darklight 27 05.06.19 15:29 Сейчас в теме
(105)Мне тоже очень нравится выравнивание. А для работы в 1С предпочитаю использовать ультраширокоформатные мониторы - и сразу ограничение в 120 символов длинны строки кажется неоправдоно жёстким.
108. rinat_alp2 52 04.06.19 09:25 Сейчас в теме
Интересно про SELECT…Version в технологическом журнале, спасибо.
109. vasilev2015 2067 04.06.19 09:31 Сейчас в теме
(108) Здравствуйте !

Мои коллеги, которые занимаются вопросами производительности, тоже в восторге.
111. Dorosh 156 04.06.19 17:11 Сейчас в теме
К вопросу объектное чтение vs чтение запросом.
1) Придирка. Утверждать что объектное чтение медленнее, поскольку вместе с нужным реквизитом тянется весь объект (если не учитывать кэш), а запрос читает только то что заказали немного некорректно. СУБД оперирует страницами. Для нашего любимого MS SQL по умолчанию 8 кб. При выполнении запроса на чтение скуль прочитает в память минимум 1 страницу. Что (скорее всего) с запасом перекроет разницу. Поэтому объявлять крестовый поход против объектного чтения все же не стоит. Код усложнится, а будет ли заметная выгода еще не факт.

2) Не отмечено важное отличие 2 техник. Возможность читать запросом только РАЗРЕШЕННЫЕ данные. Есть ли на сайте люди, не наступившие ни разу на эти грабли? Когда разрабатываем - все хорошо, передаем изменения бесправным юзерам - пошли баги.
112. TODD22 18 04.06.19 17:18 Сейчас в теме
(111)
1) Придирка. Утверждать что объектное чтение медленнее, поскольку вместе с нужным реквизитом тянется весь объект (если не учитывать кэш), а запрос читает только то что заказали немного некорректно. СУБД оперирует страницами. Для нашего любимого MS SQL по умолчанию 8 кб. При выполнении запроса на чтение скуль прочитает в память минимум 1 страницу. Что (скорее всего) с запасом перекроет разницу. Поэтому объявлять крестовый поход против объектного чтения все же не стоит. Код усложнится, а будет ли заметная выгода еще не факт.

Так и в первом и во втором случае SQL прочитает страницу. Объектный режим чтения это тот же запрос к БД.
Только в случае объектной модели платформа прочитает весь объект, создаст его структуру и тд. При чтении запросом мы получим только значение указанных нами реквизитов.
Или нет?
114. Dorosh 156 04.06.19 17:45 Сейчас в теме
(112) Мы при обоих техниках чтения получим одинаковую дисковую операцию - чтение 1 страницы с диска в память сервера. Для небольших объектов ессно. Поэтому для тривиальных случаев, типа примеров в статье, получить заметную разницу в производительности не выйдет.
115. TODD22 18 04.06.19 18:12 Сейчас в теме
(114)
Поэтому для тривиальных случаев, типа примеров в статье, получить заметную разницу в производительности не выйдет.

Так обсуждается не конкретный пример, а подход в целом.

И сколько страниц будет прочитано SQL сервером при объектной модели если объект будет содержать несколько табличных частей?
А нам например нужны только значения реквизитов документа.
119. Dorosh 156 04.06.19 18:35 Сейчас в теме
(115) Подход в целом - использовать запросы вместо объектного чтения не оспаривается. Учение Ленина истинно, потому что верно! Предлагается в применении подхода не доходить до фанатизма. Время, потребное на искоренение всех обращений через точку, можно потратить более продуктивно. Например на профилирование и оптимизацию "горячего" кода
120. TODD22 18 04.06.19 18:40 Сейчас в теме
(119)
Время, потребное на искоренение всех обращений через точку, можно потратить более продуктивно. Например на профилирование и оптимизацию "горячего" кода

Так можно сразу писать "не через точку", без всякого фанатизма, тогда ничего искоренять и исправлять не придётся и можно спокойно заниматься оптимизацией и профилированием "горячего" кода.
CyberCerber; +1 Ответить
121. Dorosh 156 04.06.19 18:47 Сейчас в теме
(120)
Так можно сразу писать "не через точку", без всякого фанатизма, тогда ничего искоренять и исправлять не придётся и можно спокойно заниматься оптимизацией и профилированием "горячего" кода.


Конечно лучше. Еще лучше сразу писать код не нуждающийся в тестировании и отладке. Недавно тут пробегал такой материал, как правильно прогов нанимать, там такое проповедовалось. Жаль что не всегда получается.
122. TODD22 18 04.06.19 18:49 Сейчас в теме
(121)
Еще лучше сразу писать код не нуждающийся в тестировании и отладке.

Любую ситуацию можно довести до абсурда.
Но в данном случае есть рекомендация и если ей придерживаться то вроде как исправлять потом не придётся.
117. Dach 306 04.06.19 18:21 Сейчас в теме
(114)

очень даже выйдет


ВремяНачала = ТекущаяДата();

СтрокаРезультата = мРезультатЗапроса.Выбрать();

Пока СтрокаРезультата.Следующий() Цикл

	Сообщить(СтрокаРезультата.Контрагент.Инн);
	//Сообщить(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаРезультата.Контрагент, "ИНН"));
	
КонецЦикла;	

ВремяВыполнения = ТекущаяДата() - ВремяНачала;
Сообщить(ВремяВыполнения);

Показать


3500 строк в выборке

36 секунд в первом варианте и 27 во втором.

Справочник "Контрагенты", как Вы изволили выразиться - "небольшой объект"
118. Dorosh 156 04.06.19 18:31 Сейчас в теме
(117) Привет Рома. Выше холиварили про объектное чтение vs запрос на разовой операции чтения. Непонятно, что ты хотел сказать своим примером? Зачем гонять цикл по СправочникВыборка вместо ВЫБРАТЬ Контрагент.ИНН ИЗ Справочник.Контрагенты?
123. Dach 306 05.06.19 09:38 Сейчас в теме +0.2 $m
(118)

на разовой разницы нет, это да. Но ты пишешь процедуру-функцию, в ней вот такой код. Завтра твоя процедура очень кому-то понравится и он будет ее в цикле гонять... Поэтому лучше сразу писать через БСП-шные функции. Рисков меньше

90 процентов всех "ускорений" решается убиранием объектного чтения
124. Dorosh 156 05.06.19 10:27 Сейчас в теме
(123) Давай не будем до абсурда доводить. Исходный тезис был, если ты забыл, что чтение запросом в примере из статьи не дает выигрыша в производительности. Что ты и показал в тесте, время на операцию < 0,01 сек Я еще не сошел с ума и не предлагаю запросы переписывать на объектное чтение.

Завтра твоя процедура очень кому-то понравится и он будет ее в цикле гонять...


А за такое надо бить по рукам не зависимо от стиля чтения в процедуре. Запрос в цикле это бяка в любом случае. Даже БСП-шный.
138. mishinas1987 26 06.06.19 10:03 Сейчас в теме
Оставьте свое сообщение
Вопросы с вознаграждением