Код разработчика в зависимости от опыта работы

14.02.20

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

Пятничный пост! Как меняется код разработчика в зависимости от опыта работы.

(НЕ)много воды

Это пятничный пост, созданный шутки ради. В прошлый раз мы изучали "хардкод" про регистры бухгалтерии. Сегодня же будет простая тема. Вы не найдете здесь никакой полезной информации. Разве что ловкий ход при работе со SQL Server в конце статьи, но он вряд ли будет новостью для многих.

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

  • Начинающий (Junior)
  • Уже с опытом (Middle)
  • Ведущий разработчик (Senior)
  • Эксперт (Expert)
  • Огромный опыт (Oldschool)

Последний уровень особый и далее Вы узнаете почему.

Все что Вы увидите ниже будет в рамках кода встроенного языка платформы и немного SQL Server. Да, да! Мы чуть-чуть выйдем за рамки "желтой" экосистемы.

Задача

Вы же знаете, что за справочник "Номенклатура"? Не сомневаюсь! Он есть в большинстве прикладных решений на платформе 1С и содержит список номенклатурных позиций для ведения управленческого, регламентированного и любых других видов учета. В нем есть разнообразные настройки и большой объем связанного функционала (присоединение файлов, печатные формы и др.). Но мы, конечно же, обо всем этом говорить не будем.

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

Вот и решения

Пойдем от простого к сложному с неожиданной концовкой.

Начинающий (Junior)

Для начинающего разработчика такое решение может показаться простым и правильным.

Функция ПолучитьКоличествоНоменклатуры() Экспорт
	
	КоличествоЭлементов = 0;
	
	Выборка = Справочники.Номенклатура.Выбрать();
	Пока Выборка.Следующий() Цикл
		
		КоличествоЭлементов = КоличествоЭлементов + 1;
		
	КонецЦикла;
	
	Возврат КоличествоЭлементов;	
	
КонецФункции

Плюсы:

  • Простое и понятное решение

Минусы:

  • Низкая производительность
  • Сложность в доработке / адаптации под новые требования

А Вы когда-нибудь такое делали? Я да! :)

Уже с опытом (Middle)

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

// Количество элементов в справочнике "Номенклатура"
// 
// Возвращаемое значение:
//   - Число - количество найденных элементов. 
//
Функция ПолучитьКоличествоНоменклатуры() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(Номенклатура.Ссылка) КАК КоличествоЭлементов
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура";	
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	ВыборкаДетальныеЗаписи.Следующий();
	
	КоличествоЭлементов = ВыборкаДетальныеЗаписи.КоличествоЭлементов;
	
	Возврат КоличествоЭлементов;	
	
КонецФункции

Плюсы:

  • Эффективный подсчет количества записей запросом по сравнению с объектной моделью
  • Легкая доработка / адаптация под новые требования
  • Простое и понятное решение

Минусы:

  • Производительность намного лучше предыдущего варианта, но все же для подсчета количества записей выполняется сканирование кластерного индекса. Частое выполнение такого запроса отрицательно сказывается на работе информационной системы.

Решение выглядит не плохо. Можно ли его улучшить?

Ведущий разработчик (Senior)

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

#Область ПрограммныйИнтерфейс

// Количество элементов в справочнике "Номенклатура" из кэша
//	в базе данных.
// 
// Возвращаемое значение:
//   - Число - количество найденных элементов. 
//
Функция КоличествоНоменклатуры() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	КэшПоказателейДляОтчетности.КоличествоЭлементов КАК КоличествоЭлементов
		|ИЗ
		|	РегистрСведений.КэшПоказателейДляОтчетности.СрезПоследних(, ПоказательДляОтчетности = &ПоказательДляОтчетности) КАК КэшПоказателейДляОтчетности";	
	Запрос.УстановитьПараметр("ПоказательДляОтчетности", Справочники.ПоказателиДляОтчетности.КоличествоНоменклатуры);
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	КоличествоЭлементов = 0;
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда	
		КоличествоЭлементов = ВыборкаДетальныеЗаписи.КоличествоЭлементов;
	КонецЕсли;
	
	Возврат КоличествоЭлементов;	
	
КонецФункции

#КонецОбласти
 
 Остальной код общего модуля

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

Плюсы:

  • Максимальная производительность при получении количества записей
  • Расширенные возможности по хранению историчности значения

Минусы:

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

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

Эксперт (Expert)

Но что, если и это нас не устраивает и нам нужно еще оптимизировать получение количества записей. Нужно больше оптимизаций!

#Область ПрограммныйИнтерфейс

// Количество элементов в справочнике "Номенклатура" из собранной статистики СУБД.
// 
// Возвращаемое значение:
//   - Число - количество найденных элементов. 
//
Функция КоличествоНоменклатуры() Экспорт
	
	КоличествоЭлементов = Неопределено;
		
	МетаданныеТаблицы = Метаданные.Справочники.Номенклатура;
	МассивМетаданных = Новый Массив;
	МассивМетаданных.Добавить(МетаданныеТаблицы);
	ИнформацияОСтруктуреБазы = ПолучитьСтруктуруХраненияБазыДанных(МассивМетаданных, Истина);
	НайденныеТаблицы = ИнформацияОСтруктуреБазы.НайтиСтроки(Новый Структура("Назначение", "Основная"));
	Если НайденныеТаблицы.Количество() = 1 Тогда
		
		ИнформацияОТаблице = НайденныеТаблицы.Получить(0);
		ИмяТаблицыБазыДанных = ИнформацияОТаблице.ИмяТаблицыХранения;
		
		СтрокаПодключения = СтрокаПодключенияКБазеДанных();
		СоединениеСБазой = СоздатьСоединениеСБазой(СтрокаПодключения);

		Если НЕ СоединениеСБазой = Неопределено Тогда
			
			Попытка
				
				ТекстЗапроса = ТекстЗапросаКоличествоЗаписейНоменклатуры();
				ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "{TableName}", ИмяТаблицыБазыДанных);
				
				КомандаБД = Новый COMОбъект("ADODB.Command"); 
				КомандаБД.ActiveConnection = СоединениеСБазой; 
				КомандаБД.CommandText = ТекстЗапроса;
				КомандаБД.CommandTimeout = 60;
				
				РезультатБД = КомандаБД.Execute();
				
				Пока НЕ РезультатБД.eof() Цикл
					
					КоличествоЭлементов = РезультатБД.Fields.Item("rows").Value;
					
					РезультатБД.MoveNext();
					
				КонецЦикла;
				
			Исключение
				
				КоличествоЭлементов = Неопределено;
				
			КонецПопытки;
			
			КомандаБД = Неопределено;
			СоединениеСБазой = Неопределено;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если КоличествоЭлементов = Неопределено Тогда
		КоличествоЭлементов = КоличествоНоменклатурыСлужебный();	
	КонецЕсли;
		
	Возврат КоличествоЭлементов;	
	
КонецФункции

#КонецОбласти
 
 Остальной код общего модуля

На этот раз была применена радикальная оптимизация: для получения количества записей в таблице используется собранная статистика SQL Server, которую СУБД обновляет достаточно оперативно. Чтобы такой подход заработал, придется выполнять SQL-запрос напрямую к базе данных с помощью ADO. Подробнее о реализации смотрите в листинге выше.

Плюсы:

  • Максимальная производительность при получении количества записей таблицы.

Минусы:

  • Сложное решение в части разработки и сопровождения
  • Могут быть незначительные отклонения значения от фактического количества записей на короткий промежуток времени

Фактически, это самое сложное решение как в части разработки, так и в части сопровождения, но зато с максимальной эффективностью.

Огромный опыт (Oldschool)

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

Функция КоличествоНоменклатуры() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(Номенклатура.Ссылка) КАК КоличествоЭлементов
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура";	
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	ВыборкаДетальныеЗаписи.Следующий();
	
	КоличествоЭлементов = ВыборкаДетальныеЗаписи.КоличествоЭлементов;
	
	Возврат КоличествоЭлементов;	
	
КонецФункции

Правильно - самое эффективное с точки зрения простоты разработки и скорости работы. Ведь все мы знаем, что предварительные оптимизации - зло.

Весело?

С пятницей, коллеги (если Вы читаете это в пятницу)! И хорошего дня в любом случае.

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

Думаю, если проследите за изменением кода, то все встанет на свои места.

А как бы Вы решали подобную задачу?

Авторские разработки

опыт разработчик разработка карьера качество оптимизация

См. также

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

Рефакторинг и качество кода Платформа 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    9584    0    1c-izhtc    37    

21

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

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

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

11.07.2023    2214    magic1s    32    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
71. uno-c 234 14.02.20 12:56 Сейчас в теме
(69)Хотя бы без групп. Элемент справочника создается методом СоздатьЭлемент()
173. maxlab 76 17.02.20 14:51 Сейчас в теме
(63)
в web application стандартная задача. Отследить реальные посещения сайта в течении дня по идентификатору сессии и времени, чтобы исключить накрутки и повторные заходы.
64. TODD22 18 14.02.20 12:43 Сейчас в теме
Oldschool
это "старая школа" а не "большой опыт".
65. пользователь 14.02.20 12:44
(64) имелось ввиду, что со старой школы был приобретен большой опыт.

Ничего плохого не хотел сказать.
67. TODD22 18 14.02.20 12:46 Сейчас в теме
(65)
имелось ввиду, что со старой школы был приобретен большой опыт.

"Старая школа" употребляется в значении "другая школа" которой сейчас нет.
Ничего плохого не хотел сказать.

Да я так просто по занудствовать.
66. acanta 14.02.20 12:46 Сейчас в теме
Ситуация, когда студент спрашивает у преподавателя есть ли технико-экономическое обоснование постановки задачи..
72. pm74 199 14.02.20 13:01 Сейчас в теме
... зачем я первым пост написал
YPermitin; +1 Ответить
75. пользователь 14.02.20 13:07
(72) рукописи (комментарии) не горят :D
79. pm74 199 14.02.20 13:42 Сейчас в теме
(75) да нет
просто ответ на сообщение так на ИС настроен скобочка (номер поста ) скобочка

поэтому все "олдскульные" запросы валятся мне в сообщения
73. reset2 17 14.02.20 13:05 Сейчас в теме
Затестил. Вариант Junior и Middle по скорости одинаковые
-с одним сеансом
-70.000 элементов в справочнике
-Postgres
97. Jimbo 9 14.02.20 16:16 Сейчас в теме
(73) хотя бы от миллиона надо
76. awk 741 14.02.20 13:10 Сейчас в теме
Олд скул вообще отказался бы реализовывать, сославшись на инструменты разработчика в которых все уже есть...
VasDmi666; YPermitin; +2 Ответить
77. alex_4x 85 14.02.20 13:15 Сейчас в теме
Мне почему то сразу пришла мысль, что нужно по типу объекта метаданных определить, бывают ли у исследуемого справочника группы, и в зависимости от этого добавлять или не добавлять условие на отбор элементов, ведь вопрос поставлен о количестве элементов, а не записей.
78. starik-2005 3033 14.02.20 13:26 Сейчас в теме
Правильно, "SEL ECT COUNT(*) FR OM t WHERE NOT isGroup" - это просто и без всякой лишней шелухи. И засунуть это в модуль с повторным использованием, чтобы не дергать лишний раз...
80. awk 741 14.02.20 13:48 Сейчас в теме
(78) И как отвечать на вопрос: "Почему у сергея 1 элемент, а у меня два"?
81. пользователь 14.02.20 13:54
(80) отвечать: так вышло. :)
ipoloskov; +1 Ответить
96. starik-2005 3033 14.02.20 15:09 Сейчас в теме
(80) вчера у них три, а сегодня у меня пять - кто-то что-то добавил. Но количество элементов - это вряд ли то самое значение, которое нужно знать до двадцатой точки после запятой. Тут и приблизительного значения часто достаточно, ибо количество элементов в справочнике - постоянно изменяющееся значение. Если шеф спросил, сколько там у них товаров, то когда он прочитает почту с "идеальным" значением, реальное значение может даже не однажды поменяться...
82. JohnGalt 57 14.02.20 13:59 Сейчас в теме
Синьер даст задание джуну,

А эксперт запросит экспресс-обследование, или, например, докажет нецелесообразность получения этого результата, потому что нужно совсем другое.
86. awson 14.02.20 14:42 Сейчас в теме
Когда разработчик один в компании, и еще с небольшим опытом, то пишет как попало, главное что бы работало. Но когда он работает в команде разработчиков, то уже начинает обращать внимание на код более опытных коллег и начинает стараться писать красиво.
YPermitin; +1 Ответить
88. пользователь 14.02.20 14:44
(86) подписываюсь под каждым словом!
90. VmvLer 14.02.20 14:48 Сейчас в теме
(86) "красиво" - это не то слово, которое определяет рост опыта элемента команды.
если тело старается писать "красиво", значит оно деградирует.
а вот "рационально" другое дело.
если член команды не видит разницы, то это упырь.
87. brr 182 14.02.20 14:44 Сейчас в теме
На самом деле опыт/длительность работы так себе параметр оценки разработчика, можно всю жизнь рисовать кнопки и не понять зачем в нормальных других языках все носятся с гетерами и сетерами. Или не рисовать кнопки, а вполне себе в одно лицо разрабатывать мощную конфигурацию и опять не понять зачем нужны гетеры и сетеры. :)
YPermitin; +1 Ответить
89. пользователь 14.02.20 14:45
(87) +

Я в статье так и написал:
"Опыт работы - это не размер стажа в трудовой книжке, а совокупность навыков, приобретенных в процессе решения задач.".
92. brr 182 14.02.20 14:50 Сейчас в теме
(89)Прошу прощения, вынырнул из разработки и заново не перечитал статью.
93. awson 14.02.20 14:52 Сейчас в теме
94. VmvLer 14.02.20 14:58 Сейчас в теме
совокупность навыков - это "хромая кляча" которою за собой таскают и всем говорят, что это, мол,
ломовая лошадь, которая тянет все.

сейчас на практике нужна не старая лошадь, а умение быстро и надежно объездить молодого жеребца
или обломать рога горной лани. но когда клиент просит ковбоя это сделать, то он предлагает
свою клячу-медалистку и потом слышим лепет... не успели, отложили, закрыли.
95. acanta 14.02.20 15:04 Сейчас в теме
Мир конечно не совершенен, но он тоже... Оптимизируется....
101. maxlab 76 14.02.20 16:52 Сейчас в теме
Настоящий oldschool (т.е я :)) еще с оптимизировал бы код

&НаСервереБезКонтекста
Функция КолвоНоменклатуры()
Текст = "ВЫБРАТЬ
        |	Номенклатура.Код КАК Код
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура"
;
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Возврат  Запрос.Выполнить().Выгрузить().Количество();
КонецФункции
Показать
105. YanTsys 12 14.02.20 17:33 Сейчас в теме
(101) Судя по всему это Microsoft oldschool ... :)
ipoloskov; +1 Ответить
110. maxlab 76 14.02.20 17:39 Сейчас в теме
(105) Не-а.... EXPLAIN в руки

Текст = "ВЫБРАТЬ
        |	ВЫРАЗИТЬ(Номенклатура.Код КАК Строка(1)) КАК Код
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура";


Так еще оптмальней :)

Не знаю как у мелкософта , но на postgresql конструкция типа sel ect count(*) fr om ... тяжело работает. Проще к статистике обратиться Плюс-минус лапоть узнаешь количество записей в таблице
111. YanTsys 12 14.02.20 17:43 Сейчас в теме
(110) В смысле вы ищете способ максимально эффектно впустую растратить ресурсы? Причем тут oldschool? Это иначе называется...
112. maxlab 76 14.02.20 17:47 Сейчас в теме
(111) За все платить надо. Вопрос - чем жертвовать. Временем ожидания выполнения запроса или засира... оперативной памяти
113. YanTsys 12 14.02.20 17:49 Сейчас в теме
(110)
Не знаю как у мелкософта , но на postgresql конструкция типа sel ect count(*) fr om ... тяжело работает. Проще к статистике обратиться Плюс-минус лапоть узнаешь количество записей в таблице


вы серьезно думаете что перебросить миллионы записей на клиента, загрузить их в таблицу значений, после чего посчитать быстрее чем sel ect count(*) fr om на сервере??? Вы так шутить изволите?
114. maxlab 76 14.02.20 17:54 Сейчас в теме
(110) Ну так... пятница же :)
А если серьезно, можете попробовать. Иногда говнокод работает лучше чем методики от Гуру :)
115. YanTsys 12 14.02.20 17:57 Сейчас в теме
(114) Провокатор :)
Я активно пользуюсь
Запрос.Выполнить().Выгрузить()

но надо же понимать пределы допустимого безобразия :)
119. Newcomer 6 14.02.20 22:50 Сейчас в теме
(101)
Умещать логику в одну строку, мысль правильная, но "Возврат Запрос.Выполнить().Выгрузить().Количество();" - это лютый быдлокод)
Далеко еще до олда, вот так правильно: "Возврат Запрос.Выполнить().Выгрузить()[0].КоличествоЭлементов" (не меняя изначального запроса и игноря пустоту)
В 2000 разовом цикле 8 секунд против 6 минут на 70 000 элементах)
143. buganov 200 17.02.20 05:37 Сейчас в теме
(101) о господи, это не оптимизация! Это хрень полная! Зачем всасывать в хост весь объем данных, если у ВыборкаИзРезультатаЗапроса есть метод количество, который гораздо лучше отработает. От Вашего олдскула у меня свело скулы. Без обид, но я бы такой код не показывал никому.
152. maxlab 76 17.02.20 11:41 Сейчас в теме
(143)
Прозевал Вашу реплику... Отвечу так. Истинный ТРУ Олдскул знает о чем Вы говорите. Но Метод Вами предложенный конечно дает выигрыш по времени извлечения результат (1690 ms), но гораздо затратней по ресурсам. И в хост ничего не сосется :) На клиент возвращается примитивное значение. А что творится в рамках кластера, олдскульного 1С-нига не должно интересовать. Бикоз, если одноэсниг начнет разбираться а что же там на самом деле происходит, он быстро соскочит на ДОТ.НЕТ например.
153. buganov 200 17.02.20 11:47 Сейчас в теме
(152) То есть Вы и правда считаете, что метод Выгрузить не засасывает в хост результат полностью?
154. maxlab 76 17.02.20 11:50 Сейчас в теме
(153)
А мы в какой парадигме дискуссию ведем? И что Вы подразумеваете под хостом?
156. buganov 200 17.02.20 11:50 Сейчас в теме
157. maxlab 76 17.02.20 11:54 Сейчас в теме
(156)
Ну конечно, rphost получит выборку. Это же очевидно! Не очевидно почему загрузка процессора в этот момент прыгает под 80%. Сам удивился.
155. buganov 200 17.02.20 11:50 Сейчас в теме
(152)Допустим, Вы подняли условные 50Гб данных. Скуль считал часть страниц и передал их серверу 1С. Сервер 1С бережно сложилэти данные во временный файл и так, пока не закончится передача от СУБД. Потом метод Выбрать считывает порциями результат и постепенно его подгружает. Метод Выгрузить сразу размещает в памяти хоста весь результат. Именно поэтому Вы можете увидеть любую строку выгруженного результата, а выбранного только последовательным чтением
158. maxlab 76 17.02.20 12:08 Сейчас в теме
(155)
Выше ответил. Но все равно интересный результат.
При
Возврат Запрос.Выполнить().Выгрузить().Количество();
имеем
2464ms 15% 47%
при
Возврат Запрос.Выполнить().Выбрать().Количество();
1700ms 90% 45%
Время, rphost,pgsql
159. buganov 200 17.02.20 12:18 Сейчас в теме
(158)как Вы меряете процессор? База изолирована? Нагрузка на сервере SQL или 1С?
161. maxlab 76 17.02.20 12:22 Сейчас в теме
(159)
Чисто визуально, в момент отработки запроса. Для контроля монитор ресурсов и утилита top. Постгри и сервер 1С на одном железе.
164. buganov 200 17.02.20 12:43 Сейчас в теме
(161)хм, вот чисто из поиска истины попробую дома повторить тест. Странно, что процессор нагружается, там же по сути считывание одного и того же файла с диска. И даже число логически не может быть сильно разного рещультата по процессору
165. maxlab 76 17.02.20 12:48 Сейчас в теме
(164)
О сколько нам открытий чудных
Готовит просвещенья дух

Интересно будет взглянуть на Ваши замеры
168. buganov 200 17.02.20 13:00 Сейчас в теме
(165)постараюсь сделать как можно больше данных, чтобы сравнить
175. buganov 200 17.02.20 18:06 Сейчас в теме
(165) что я могу сказать, Вы были правы насчет потребления процессора. В то же время память оч

Текст запроса


Сюда положил счетчики оборудования, если кому интересно. Смотреть %Загруженности процессора и байт исключительного пользования rphost1800
Интересная статистика получилась, никогда не мог бы подумать, что экономя память приходится жертвовать процессором. Может кто из экспертов подскажет.

17.02.2020 21:58:20 Выгрузить().
17.02.2020 21:58:34 Выбрать()
https://dropmefiles.com/gNPgv

П.С. Виртуалка не настроена и используется как временная песочница и дал я ей только 3 ядра, чтобы на оставшемся смотреть котиков в интернете.
176. maxlab 76 17.02.20 19:39 Сейчас в теме
(175)
Спасибо за проделанную работу!
В заключение пятничного флейма... Не могу согласится с мнением коллег, что длина стажа не имеет значения. Когда 20 лет помедитируешь на творение 1С , аж с самого основания, такие нюансы начинаешь спинным мозгом чувствовать, без всяких рекомендаций от 1С. Даже если и отстаешь от модных фишек платформы. И не всегда, ТО, чему учат в УЦ, нужно слепо применять на проектах в виде гуд практикс
e.kogan; YPermitin; +2 Ответить
185. buganov 200 18.02.20 05:53 Сейчас в теме
(176) Кстати, обратил внимание, что всплеск нагрузки на процессор составляет порядка 1-2 секунд из 11, которых выполнялась выборка и подсчет. При этом пик находится как раз в момент освобождения памяти.
160. buganov 200 17.02.20 12:20 Сейчас в теме
(158) И можно про нагрузку на rphost, что конкретно имеется ввиду? Хост нагрузил ядро на 90%, все ядра на 90%?
162. maxlab 76 17.02.20 12:24 Сейчас в теме
(160)
Судя по кривым в мониторе, грузится одно ядро на 90%
120. maxlab 76 14.02.20 22:59 Сейчас в теме
(119)
Сейчас проверим :) у кого длиннее олдскульней :) У меня уже 975000 позиций нарандомлено в номенклатуре
121. maxlab 76 15.02.20 00:52 Сейчас в теме
Итак, результаты измерений при 1072000 записей в спр Номенклатура
Железо I7-2600 4 физических ядра, память 16 гектар, сервер 1С и Постгрес 9,2 #изкаропки. Ничего не тюнил. ОС Центос - 7
Запрос ВремяИсполнения Загрузка rpHost Загрузка PostgreSQL
#1 485ms 10% 96%
#2 2464ms 15% 47%
#3 2393ms 34% 48%

Где Запрос #1 - олдскульный от автора
Запросы #2 и #3 - ТРУ олдскульные... можно даже сказать ЛАМПОВЫЕ от меня ... сейчас объясню почему.
Не смотря на то что результат запроса #2 был получен за 2464мс (5раз медленней чем #1), были сэкономлены ресурсы сервера для других
,более важных операций. Экстаполируйте такие ситуации на продакшен эксплуатацию системы. Когда Вы побежите за новым железом ? :)
Замеры средние, каждая выборка по 10 раз. Расход оперативы 25% во всех случаях. Даже не шелохнулось.

Вывод - хоть и пятничная тема, но следует задуматься за счет чего делается оптимизация и нужна ли она повсеместно. За все приходится платить. Или временем или деньгами на гонку вооружений.
123. logarifm 1117 15.02.20 13:26 Сейчас в теме
Не успел ((( к сожалению прочесть в пятницу но думаю сегодня засчитается.
На самом деле информативненько было посомтреть особенно, что относилось к АДО. Ну я с Вами могу поспорить конечно. Вы забыли о главном это какой же реально объем у справочника номенклатуры и какой у него прирост. Поэтому эффективность запроса у мидла вполне адекватная. Во-вторых я сомневаюсь, что эксперт такое бы городил огород с АДО! А с регистром кэшей тоже не так все сладко - его ведь надо еще и записать тем же самым раставить блокировки. Ну да конечно можно записывать в нерабочее время и бла-бла... Не ну однозначно я не говорю, что я эксперт но однозначно запрос 1с будет выигрывать не только в быстроте но и простоте своей значимости. Более того раз уж так хочется его можно разместить в кеш вызова повторного использования. Все зависит от прироста справоника. Это есть над чем поговорить - простая тема, а у дельных спецов я думаю вызовет массу споров. Вот меня заинтриговала Ваша позиция...

З.Ы. Забыл уточнить еще время соединения очень интригующая штука и тут вы с АДО можете проиграть! Выыгриш может и будет только надо понять на каком количестве позиций, а это зависит от многих факторов. Железа , загрузка системы, состояне и актуальнсть статистики . много факторов и каждый раз может же меняться. Так что я Уважаю я Вас как профессионала своего дела но все же как мне кажется это притянуто за уши. Извените если бросил камень в Ваш огород.
acanta; YPermitin; +2 Ответить
124. пользователь 15.02.20 13:36
(123) хайп улёгся, можно спокойно ответить :)))

Моя позиция проста: решение должно быть рабочим и не усложнять жизнь сопровождению и разработке. Так что все эти решения имеют право на жизнь. Я бы поспорил только с решением джуна :)

Я человек простой - решаю задачи в зависимости от условий, архитектуры. А спорить о реализации - это холивар. Не ко мне :) Коллеги выше много наобсуждали, это к ним. Я бы выбрал простое решение.

Выше отвечал, продублирую здесь:

Честно сказать, я не ожидал такой бурной реакции. Я хотел показать, что часто при росте от джуна до сеньора разработчики используют фичи которые им интересны, но без которых можно было бы решить задачу проще и быстрее. Но интерес делает свое дело и решения в угоду творчеству и экспериментов значительно усложняется. Это не плохо, даже хорошо, но в меру.

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

Всем добра, кто прочитает этот комментарий :)
Чем меньше токсичности в ИТ, тем лучше! )))
SirYozha; +1 Ответить
125. acanta 15.02.20 13:40 Сейчас в теме
Насчет роста справочников это к внедренцам. При необходимости можно и каждую поставку приходовать отдельной позицией номенклатуры и на каждую продажу заводить нового клиента. Реально такие генераторы справочников были и не раз. Статистика в таких случаях не очень нужна, а вот адо хорошо помогло бы в отчетах за несколько лет.
В принципе партии-серии-договора-соглашения так и работают.
126. logarifm 1117 15.02.20 13:42 Сейчас в теме
Я бы точно сделал запросом и забил на все!
127. lunjio 66 15.02.20 13:52 Сейчас в теме
Не совсем корректный заголовок, автор скорее всего рассматривает частный случай и заголовок должен звучать - Как может … а не утверждающе. Надеюсь это просто фантазии, а не случай из жизни, ибо получать статистику из кэша или напрямую из БД, уже пребор. Все очень относительно, кто-то сразу может понимать, что запросом на количество получать нужно исключая группы и т.п, кто-то за все время работы так и будет пользоваться что-то типа выборкой. Вывод - не надо подводить всех под какую-то градацию и т.п, можно превратиться в Белокаменцева )
128. пользователь 15.02.20 13:56
(127) см. мой комментарий выше.
130. lunjio 66 15.02.20 14:13 Сейчас в теме
(128)
Вы можете своей статьей вводить новичков в заблуждение ) которые будут стремиться к усложнению и заморочкам, вместо простоты и чистоты. Комментарии не все читаю, просто на мой взгляд заголовок статьи и преподносимое содержимое, должно звучать по другому - как может меняться и далее в этом духе. В конце же, сделать заключение, что-то типа не стоит стремиться к вариантам типа кэширования и получения через статистику, поэтому и поэтому. Это мое мнение. Белокаменцева никто не оскорблял, вы так решили)
131. пользователь 15.02.20 14:15
(130) Надо читать статью, а не только заголовок. Тут не желтая пресса.

Ничего не понял, но ладно.

Удачи :) и хорошего дня)
133. lunjio 66 15.02.20 14:39 Сейчас в теме
(131)
Я статью прочитал, пытаюсь объяснить вам свою точку зрения, попытаюсь еще раз:
Ваша градация по количеству опыту и принимаемому решению, это чисто ваша фантазия/видение, на деле, все может различаться, причем кардинально. некоторые программисты могут сразу понимать что к чему, кто-то так и писать такие задачи на уровне выборке. Варианты с кэшом и получением из БД, извиняюсь, чистая фантазия, очень удивлюсь, если встречу такие решения в жизни, должны быть весомые обоснования. Тоесть в вашем видении с опытом у человека меняется стиль кодирования, на каком-то уровне он заморачивается, а потом становится Буддой 1С, к сожалению это не так. Как-то пришлось проводить собеседование одного товарища, 10 лет опыта, дал задание на запрос, где участвовали перечисления, он обращался в перечислениях не по ЗНАЧЕНИЕ() а по Индексу или как там это поле в запросе. Все очень относительно, поэтому на мой взгляд, не стоит проводить такую градацию.
logarifm; YPermitin; +2 Ответить
134. пользователь 15.02.20 14:58
(133) Все понял, вопрос нет :)
135. lunjio 66 15.02.20 15:01 Сейчас в теме
(134)
Все понял, вопрос нет :)

Надеюсь идею поняли, почему я считаю статья должна говорить о возможном изменении стиля кода, а не утверждать именно такую эволюцию программиста.
Спасибо, вам тоже хорошего и удачного дня )
136. пользователь 15.02.20 15:07
(135) Проблема в том, что статья была в виде шутки и с так и преподносилась. Но все пропустили это мимо и начали серьезное обсуждение.
В том числе и Вы.

Пятница выдалась веселой.

Поэтому у меня и нет вопросов.
129. пользователь 15.02.20 13:57
(127) а Белокаменцева то за что оскорбили?
149. logarifm 1117 17.02.20 10:14 Сейчас в теме
(129)Пургу пишет - ищет хайп. Вначале народ читал эту публицистику в итоге понял, что это ересь какая-то!
132. acanta 15.02.20 14:26 Сейчас в теме
Однажды слышала фразу о том, что база при внедрении была организована так, что теперь из нее невозможно получить никакую осмысленную информацию и требуется другое внедрение. Это не просто плохой код или junior, это провал.
Это конечно, другая сфера, к статье относящаяся слабо, по разному оцениваются последствия. Дешевле или правильнее или интереснее или привычнее сделать другую базу той же УТ 11, где будет по характеристикам и с партнерами. Или обработками перекроить? Или новые приходы-расходы по другому вводить?
И после нескольких таких изменений могут попросить сформировать отчет за несколько лет.
АДО для таких случаев вполне адекватный выбор инструмента.
Это тоже уровни, но уже консультантов.
YPermitin; +1 Ответить
137. pm74 199 15.02.20 15:19 Сейчас в теме
(0) вижу правильно наванговал

понабежали
acanta; YPermitin; +2 Ответить
138. пользователь 15.02.20 15:22
(137) я бы даже попросил прогноз курса валют и акций у Вас и доверился бы ему :D
139. pm74 199 15.02.20 15:26 Сейчас в теме
(138)
попросил прогноз курса валют и акций

могу
зы. напоследок выскажусь по сабжу
пофиг какой код абсолютно, важнее идея которую он реализует
140. user633166 12 16.02.20 20:26 Сейчас в теме
(139) я бы всё-таки уточнил :) решает-ли он поставленную задачу
145. pm74 199 17.02.20 08:35 Сейчас в теме
(140)

ну должен решать - само собой

вот на фига вообще номенклатуру считать ?
141. MainUser1C 1 16.02.20 20:35 Сейчас в теме
Я чет не увидел самого ленивого варианта.
Почему бы не отдать все считать серверу SQL как самому производительному в нашей цепочке, при этом код остается доступным и понятным для поддерживания даже джунами.
&НаКлиенте
Процедура Посчитать(Команда)
    ПосчитатьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПосчитатьНаСервере()
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   КОЛИЧЕСТВО(Номенклатура.Ссылка) КАК Количество
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        Сообщить(ВыборкаДетальныеЗаписи.Количество);
    КонецЦикла;
    
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецПроцедуры
Показать
maxlab; acanta; +2 Ответить
142. maxlab 76 17.02.20 00:20 Сейчас в теме
(141)
Плохо смотрели... Я не поленился и все "олдскульные" способы проверил на 1005000 записей. По скорости извлечения результата победил Автор! Но на моей тестовой площадке PostgreSQL кратковременно уперся рогами в землю. Поэтому в выигрыше экспермент #2! Так как, не смотря на потерю скорости в 5 раз, были сэкономлены ресурсы сервера для других, не менее важных параллельных! запросов/транзакций :) Только истинные мастера думают о high_load. Но! Судя по Вашему кодингу - Вы настоящий ТРУ Олдскул... круче чем я, даже! Вы единственный, кто догадался заюзать конструктор запросов с обработкой результата.
Хорошего настроения до следующей пятницы. Может еще кто сможет нас развеселить :)
acanta; buganov; +2 Ответить
144. buganov 200 17.02.20 05:43 Сейчас в теме
Пять плюсцов этом господину за
(142)
Вы единственный, кто догадался заюзать конструктор запросов с обработкой результата.
180. MainUser1C 1 17.02.20 23:26 Сейчас в теме
(142)
странно, будет под рукой сервер протестирую на скорость вариант 2 и мой.
Что же касательно конструктора, то тут пример, как написав одну строчку кода в кратчайшие сроки можно получить результат понятный и доступный для всех. Вот уж олдскулом тут пахнет мало))))))))))
182. maxlab 76 17.02.20 23:33 Сейчас в теме
(180)
Есть другая идея. Взять реальную задачу из ОУ и выполнить ее в самых жестких, с точки зрения оборудования, условиях. И критерием настоящего олдскульного решения будет минимальное время проведения на списание товара, при минимальном потреблении ресурсов процессора. На одном физическом ядре с оперативой в 4 gb. Тактовая частота процессора не имеет значения, потом апроксимируем на время при наличии нескольких решений. в качестве sql сервера - постгрес. Вот это будет веселуха! Могу подкинуть задачку из 1С-Специалист, доведенную до реальных боевых условий
183. MainUser1C 1 17.02.20 23:43 Сейчас в теме
(182)
Не ну если говорить о самых жестких условиях - то это файловая база)))))
И это, мне как то за всю деятельность ни разу не приходилось писать ОУ специалиста на реальных задачах. Зачастую проще предложить шо нить базовое и доработать.
184. maxlab 76 17.02.20 23:47 Сейчас в теме
(183)
Файловая не пойдет. Не те масштабы. Только PostgreSql - только хардкор ;) Не забываем что мы думаем о highload на зачуханном железе 10 летней давности. Обычно у подавляющего большинства клиентов такое стоит
147. user604727 17.02.20 08:54 Сейчас в теме
Только собрался писать ироничный, полный сарказма и едких сравнений ответ про программиста №3 и №4, но вовремя увидел код №5. Поздравляю себя и всех, кто рассуждал также, готовясь быть забаненным. Мы - программисты с огромным опытом.
151. SlavaKron 17.02.20 10:51 Сейчас в теме
(147) Я б почитал
ироничный, полный сарказма и едких сравнений ответ
163. Skopoxod 17.02.20 12:30 Сейчас в теме
А где вариант "не придумал как загуглить задачу и посчитал элементы вручную"?
166. maxlab 76 17.02.20 12:52 Сейчас в теме
(163)
А это ваабще высший пилотаж с точки зрения highload. Прикидываете, миллион пользователей посчитали вручную без взаимных блокировок и прочей мути. А олдскул сэкономил свое время на девочек и 10000$ на новый 32 ядерный проц
167. Indgo 338 17.02.20 12:54 Сейчас в теме
Мамонты пишут - выполнить().выгрузить(). Так как мамонты не верят рекомендациям фирмы 1С
Так же Папонты - всегда используют isnull(..).
169. maxlab 76 17.02.20 13:11 Сейчас в теме
(167)
Не важно как пишут мамонты и папонты. Важно под что заточен человек который называет себя 1С девом. In my opinion, одноэсник должен эффективно решать задачи предметной области используя инструмент под названием платформа 1С. А все что связано с оптимизацией, индексами и прочей ерундой пусть занимается команда Нуралиева, если хочет устоять на рынке. Еще раз повторюсь, если одноэсник начнет разбираться со всеми потрохами что происходят "позади сцены" - он быстро придет к выводу что пора валить.
170. Indgo 338 17.02.20 13:13 Сейчас в теме
(169)
А все что связано с оптимизацией, индексами и прочей ерундой пусть занимается команда Нуралиева, если хочет устоять на рынке.

Ниче не понял, но звучит как то не айс.
Вообще команда Нуралиева - это лишь вершина айсберга. Каждый разраб 1С - есть ячейка судна общества Нуралиева, который непрерывно борется с косяками 1С - чтобы судно не затонуло
171. VmvLer 17.02.20 13:23 Сейчас в теме
(170) внутри айсберга замороженные динозавры в анабиозе и если айсберг отнесет в теплые воды - они выйдут утолит свой голод?
172. maxlab 76 17.02.20 13:38 Сейчас в теме
(170)
Каждый разраб 1С - есть ячейка судна общества Нуралиева, который непрерывно борется с косяками 1С - чтобы судно не затонуло


Вот это и есть главная проблема.

Вспоминается капитан Врунгель. Как вы яхту назовете, так она и поплывет
174. paramedic2 17.02.20 17:18 Сейчас в теме
Простите, но у меня глупый вопрос: а разве на *nix есть COM объекты?
177. пользователь 17.02.20 21:00
(174) нет, нету. Там нужно использовать альтернативные пути. Все от задачи зависит.
178. paramedic2 17.02.20 22:09 Сейчас в теме
(177) Ну тогда гнать надо эксперта поганой метлой за жесткую привязку к винде.
Давно уже 1с слезла с этой иглы и в 2020 году решать задачи методами 2001-2003 годов для эксперта - верх безграмотности.
179. пользователь 17.02.20 22:11
(178)
Прикрепленные файлы:
user774630; +1 Ответить
181. Tarlich 115 17.02.20 23:29 Сейчас в теме
а что, код такой уже не работает
нн=0;
Пока выборка следующий() цикл
нн=нн+1 ;
-))
186. Tavalik 3350 18.02.20 07:38 Сейчас в теме
Ого! Я олдскул! :)

Так через все "велосипедные" методы уже проходил.

Спасибо за статью, повеселили!
YPermitin; +1 Ответить
187. пользователь 18.02.20 08:11
(186) спасибо :)

Хорошо, что коллеги с юмором еще есть на просторах сообщества :) А то ведь выше люди очень серьезные в комментариях )))
188. maxlab 76 18.02.20 10:50 Сейчас в теме
(187)
Требую продолжение банкета! :))

Предлагаю Вам поддержать инициативу пенсионера в IT следующего содержания;

- Взять реальную задачу из ОУ и выполнить ее в самых жестких, с точки зрения оборудования, условиях. И критерием настоящего олдскульного решения будет минимальное время проведения на списание товара, при минимальном потреблении ресурсов процессора,памяти и т.д. На одном физическом ядре с оперативой в 4 gb. Тактовая частота процессора не имеет значения, потом апроксимируем на время при наличии нескольких решений.
В качестве sql сервера - постгрес. Вот это будет веселуха!
Могу подкинуть задачку из 1С-Специалист, доведенную до реальных боевых условий.
Файловая система не пойдет. Не те масштабы. Только PostgreSql - только хардкор ;)
Не забываем что мы думаем о highload на зачуханном железе 10 летней давности. Обычно, у подавляющего большинства клиентов такое стоит.
YPermitin; +1 Ответить
Оставьте свое сообщение