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

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    1160    ZhokhovM    2    

4

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

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

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

18.03.2024    2690    ZhokhovM    4    

9

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

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

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

29.09.2023    1910    1CUnlimited    15    

22

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

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

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

27.09.2023    6970    Lemmonbri    136    

36

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

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

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

19.09.2023    4350    Lemmonbri    16    

31

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

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

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

10.08.2023    9590    0    1c-izhtc    37    

21

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

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

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

11.07.2023    2214    magic1s    32    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. pm74 199 14.02.20 08:17 Сейчас в теме
Оо! про кодинг ! Сейчас станут набИгать.
Пошел за попкорном.
gigapevt; portwein; acanta; bulpi; json; PhoenixAOD; mrChOP93; YPermitin; +8 Ответить
2. пользователь 14.02.20 08:18
(1) на старт, внимание... !!! :)
portwein; bulpi; awk; PhoenixAOD; +4 Ответить
4. PhoenixAOD 62 14.02.20 08:25 Сейчас в теме
(2)
Прикрепленные файлы:
vakham; HAMAZ; user746566; bulpi; awk; wowik; YPermitin; +7 Ответить
6. akpaevj 202 14.02.20 08:52 Сейчас в теме
(2) Count(*) =)
json; DrAku1a; purgin; dvissarov5; bulpi; Jimbo; Painted; YPermitin; +8 Ответить
9. nvv1970 14.02.20 08:58 Сейчас в теме
(6) очень длительная операция на больших таблицах и плохие последствия после вымывания кэша. Статистика СУБД - не универсально, не точно, но рулит.
Решение зависит от контекста.
akpaevj; YPermitin; +2 Ответить
11. akpaevj 202 14.02.20 09:06 Сейчас в теме
(9) Безусловно, надо исходить из контекста задачи. Просто привёл пример общего, относительно быстрого способа получения количества строк. В ситуациях с колонками с разрешенным NULL Count(ColumnName) не даст ожидаемого результата, поэтому и написал Count(*). Первое - это подсчет значений, второе - подсчет строк.
bulpi; Jimbo; zqzq; YPermitin; +4 Ответить
50. FesenkoA 57 14.02.20 10:55 Сейчас в теме
А почему уровни роста только вверх начиная с самого простого? Мы с коллегами балуемся иногда, придумывая максимально неоптимальные решения проблемы:

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


Коллеги, продолжайте)
vakham; unknown181538; user783353; portwein; igee12; bulpi; wowik; sogesti; acanta; +9 Ответить
52. acanta 14.02.20 11:02 Сейчас в теме
(50) это не оптимально? Странно.. у меня работает.
YPermitin; +1 Ответить
56. FesenkoA 57 14.02.20 12:03 Сейчас в теме
(52) Можно отобрать записи из ЖР по добавлении справочника нового. Можно собрать статистику открытия форм и сгруппировать. Можно сделать перекодирование справочника (установить коды) и взять Число(ПоследнийКод)
const000; ipoloskov; bulpi; acanta; YPermitin; +5 Ответить
208. shard 279 21.02.20 11:36 Сейчас в теме
(56) если в состоянии собрать статистику открытия форм, то опыт уже есть, маловероятно что будет так реализовано. Про перенумерацию и максимальный номер уже ближе. Как вариант еще можно добавить реквизит "номер товара" в конфигурацию, заставить пользователя его заполнять, а для подсчета брать максимальный и вычеркивать неиспользуемые номера в цикле с обязательным применением найтиПоРеквизиту. Написал и самому страшно стало....
villyvonka; +1 Ответить
223. FesenkoA 57 27.02.20 17:33 Сейчас в теме
(208) Есть такая штука "негативный опыт". Это когда человек научился но "не тому" или неправильно. А статистика открытия форм реализуется проще простого: создаем документ "открытие формы" с регистром накопления "открытые формы", остаточным. при открытии формы - создается документ с событием "открытие, добавление" и проводится, а при правильном закритии - проводится еще раз чтобы зафиксировать время закрытия. Ну а в конце месяца создаем документ "закрытие открытия форм" который делает минусовые движения по регистру... всего то
villyvonka; acanta; +2 Ответить
210. DrAku1a 1679 24.02.20 14:47 Сейчас в теме
Это шедевр)) Но похоже на путь с 1 на 2 уровень.
211. Hatson 528 26.02.20 16:38 Сейчас в теме
(50)
Сумма(1) КАК КоличествоЭлементов


*Бздынь!*

Количество(1) КАК КоличествоЭлементов

Сумма(1) почему-то иногда вызывает переполнение чего-то там...
54. ImHunter 312 14.02.20 11:32 Сейчас в теме
Олдскульный товарищ, наверное, написал бы:
ВЫБРАТЬ КОЛИЧЕСТВО(1) ... 
silly; ivan811; e.kogan; Hatson; shard; ipoloskov; ice-net; vano-ekt; YPermitin; acanta; +10 Ответить
61. sikuda 673 14.02.20 12:27 Сейчас в теме
(1) Огромный опыт (Oldschool) - Последний вариант расположенный в модуле с опцией Повторного использования возвращаемых значений ;)
e.kogan; kuzyara; gubanoff; YPermitin; acanta; +5 Ответить
70. vano-ekt 123 14.02.20 12:55 Сейчас в теме
ВЫБРАТЬ
	КОЛИЧЕСТВО(0) КАК Элементов
ИЗ
	Справочник.Номенклатура


а лучше засунуть в экспортную функцию, куда передавать имя таблицы, чтоб код не повторять
и в привилегированном режиме, мало ли какие RLS'ы включены :-D
"ВЫБРАТЬ 	КОЛИЧЕСТВО(0) КАК Элементов ИЗ "+ИмяТаблицы
almierm; ipoloskov; acanta; +3 Ответить
209. DrAku1a 1679 24.02.20 14:43 Сейчас в теме
(70)
ВЫБРАТЬ
    КОЛИЧЕСТВО(*)
ИЗ
    Справочник.Номенклатура
ccapt; YPermitin; +2 Ответить
104. rabid_otter 134 14.02.20 17:29 Сейчас в теме
1) почему эксперт будет лезть в базу, в обход SQL, используя ADO? зачем?
в результате запроса на сервак всегда возвращается 1 число, а не целый список.
зачем? просто потому что можешь? в газенваген такого разработчика.
если Linux используется на сервере приложений 1С? я бы не стал использовать платформозависимые инструменты.

2) мля, кэш на список номенклатуры, вы поехавшие что-ли?
кэширование вызывает массу проблем - показатель надо вечно обновлять делая select count(1) from table.
и что опаснее - посмотреть 1 раз кол-во номенклатуры, или после каждой записи номенклатуры проверять ее количество?
по-моему такое делать надо тупо on request, то есть в отчете.

3) никто еще не сказал что

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();

КоличествоЭлементов = ВыборкаДетальныеЗаписи.КоличествоЭлементов;

если агрегационную функцию count сделать на пустом справочнике она вернет null, и что будет в количество элементов? null? тут просто без комментариев. 10-часовая версия видео про "лох-пидр"
taurus__; const000; bliver; veretennikoff; +4 Ответить
106. VmvLer 14.02.20 17:34 Сейчас в теме
(104) вам имеет смысл подготовить доклад на конференцию, тема
Чтобы понять конец, ты должен понять начало.
(с)о-з-д-р
107. rabid_otter 134 14.02.20 17:36 Сейчас в теме
(106)
онять начало.
(с)о-з-д-р

лол шта?
108. пользователь 14.02.20 17:37
(107) уважаемый Vmvler Вам говорит, что нужно делиться знаниями на конференциях и проявлять там свой профессионализм :)
109. rabid_otter 134 14.02.20 17:39 Сейчас в теме
(108) ха, эти вещи не требуют глубоких спец. знаний.
214. Hatson 528 26.02.20 16:57 Сейчас в теме
(104)
если агрегационную функцию count сделать на пустом справочнике она вернет null, и что будет в количество элементов? null? тут просто без комментариев. 10-часовая версия видео про "лох-пидр"


Это сакральные знания! Потому что никто еще не видел пустых справочников "Номенклатура" в реальных компаниях )))
villyvonka; Andreeei; YPermitin; +3 Ответить
216. rabid_otter 134 26.02.20 19:11 Сейчас в теме
(214) все это про защиту от дурака. она должна быть в коде по умолчанию.
3. Msyrkin 14.02.20 08:24 Сейчас в теме
"От большого ума лишь тюрьма да сума"
xantif_2000; Drivingblind; YPermitin; +3 Ответить
5. sapervodichka 6697 14.02.20 08:46 Сейчас в теме
Ежедневно «стремясь к лучшему, мы часто портим хорошее» (У. Шекспир. "Король Лир"). Поэтому согласен с вами, надо ощущать состояние «вполне достаточно», и не стремиться совершенствовать код без необходимости. «Всегда недостаточно» - это уже горе от ума разработчика, с таким подходом во время не сдать работу.
Andreeei; xantif_2000; bulpi; zqzq; Drivingblind; davdykin; YPermitin; +7 Ответить
8. пользователь 14.02.20 08:57
(5)
с таким подходом во время не сдать работу.


Внутреннего перфекциониста не все могу похоронить ))))
sapervodichka; +1 Ответить
7. nvv1970 14.02.20 08:54 Сейчас в теме
Нужно было привилегированный добавить последнему, чтобы исключить лишение соединения.
А так - да. Простота - наше все.
igee12; sapervodichka; YPermitin; +3 Ответить
10. wowik 885 14.02.20 09:04 Сейчас в теме
Грамоты будут?) я все стадии в жизни делал, мне пожалуйста выпишите все грамоты)
sogesti; YPermitin; +2 Ответить
12. huxuxuya 366 14.02.20 09:24 Сейчас в теме
Ну вообще правильней тогда уж использовать модуль повторного использования.
И при удалении добавлении элементов справочника обнулять кэш повторно используемых.
YPermitin; +1 Ответить
14. пользователь 14.02.20 09:27
(12) ОбновитьПовторноИспользуемыеЗначения?

Но она очищает ВСЕ сохраненные значения. Нужно будет к ней пригородить немного костылей, чтобы очищать кэш точечно.
Но вообще да, можно и до рабочего варианта довести.
74. awk 741 14.02.20 13:05 Сейчас в теме
(12)Она обнуляет только кэш текущего сеанса, другие сеансы не сбросятся...
13. Hans 2 14.02.20 09:27 Сейчас в теме
Вариант писать в константу, или регистр сведений при удалении или создании нового элемента это какой уровень?
YanTsys; YPermitin; +2 Ответить
16. пользователь 14.02.20 09:31
(13) я бы отнес его к уровню между джуном и мидлом, потому что тогда такой тяжелый запрос для подсчета количества будет прям очень "нагибучим" в базе. Если, конечно, справочник достаточно большой.
15. brr 182 14.02.20 09:29 Сейчас в теме
После выпитой чашки кофе родилось такое решение:

Добавить 2 подписки на события, хранить количество номенклатуры в служебном регистре или константе, при добавлении элемента прибавлять количество, а при удалении уменьшать. Сделать отключаемым, при массовой загрузке отключать и количество пересчитывать самостоятельно.
slauter77; YPermitin; +2 Ответить
17. пользователь 14.02.20 09:33
(15) вариант хорош. Но почему в регистр сведений, а не в регистр накопления тогда? В регистре накопления можно сделать агрегат на весь период и обновлять его для более эффективного получения данных. Регистр оборотный, т.к. остатки по этому показателю никому не нужны :)

Вот это костыли я описал!
18. brr 182 14.02.20 09:36 Сейчас в теме
(17) У нас уже есть рассчитанный итог. Хотя, вариант с оборотным регистром, да еще в режиме разделенных итогов, будет лучше себя чувствовать при параллельной работе пользователей.
YPermitin; +1 Ответить
19. brr 182 14.02.20 09:39 Сейчас в теме
(18) Нет, оборотный регистр тоже плохо, нужен регистратор, всё усложняется.
YPermitin; +1 Ответить
21. пользователь 14.02.20 09:40
(19) да, так оно. Один костыль на другой :)
55. YanTsys 12 14.02.20 11:55 Сейчас в теме
(21) Хммм... вроде речь про экспертов шла...
Идея о переносе затратного по времени процесса на отдельные операции идея правильная, но
есть варианты когда контрагенты могут появиться/исчезнуть в базе мимо вызова вашего кода который будет вести подсчет.
Поэтому мне больше всего нравится вариант с константой которая будет меняться в транзакции, или пусть даже ваш вариант с регистром, но при этом дополнительно должно вызываться регламентное задание по расписанию которое будет заполнять константу по запросу.
YPermitin; +1 Ответить
98. brr 182 14.02.20 16:29 Сейчас в теме
102. YanTsys 12 14.02.20 16:52 Сейчас в теме
(98) Например при восстановлении битых ссылок при тестировании и исправлении базы подписки сработают?
148. brr 182 17.02.20 09:11 Сейчас в теме
(102)Нет, не сработают, такие случаи нужно обрабатывать отдельно
150. YanTsys 12 17.02.20 10:25 Сейчас в теме
(148) Про это я и написал в (55)
20. &rew 49 14.02.20 09:40 Сейчас в теме
Уровень "Просветление". Вывести список и отнять 1)))
Alxesp; const000; xantif_2000; nixen88; bulpi; SlavaKron; Painted; wowik; YPermitin; +9 Ответить
22. пользователь 14.02.20 09:43
(20) эта магия достойна отдельного выступления на Infostart Event в категории Highload!
silly; ccapt; &rew; +3 Ответить
83. Painted 49 14.02.20 14:12 Сейчас в теме
(20) У большого справочника список можно выводить целый день. За это время новые элементы появятся.
84. пользователь 14.02.20 14:14
(83) &rew как-раз успеем подготовить доклад и выступить.
23. qwinter 671 14.02.20 09:50 Сейчас в теме
Для Oldschool логичнее выбирать пометку удаления, чем ссылку)))
24. пользователь 14.02.20 09:52
91. qwinter 671 14.02.20 14:49 Сейчас в теме
(24) Ссылка 16 байт, Пометка удаления 1 байт. Я конечно понимаю, что это всего лишь 1 мегабайт на миллионный справочник, но современную тенденцию к наплевательскому отношению к оперативной памяти не поддерживаю.
100. akpaevj 202 14.02.20 16:48 Сейчас в теме
(91) При подобных запросах dbengine будет читать данные с диска экстентами (если кеш пуст), так что разницы вообще никакой нет. А на клиент у вас и так всего одна запись вернется. Да и при не подобных запросах разницы не будет. Читаться будут либо страницы, либо сразу экстенты.
28. akpaevj 202 14.02.20 10:07 Сейчас в теме
(23) Для oldschool сразу надо обратить внимание на архитектуру, в ней явно что-то не так. Для ТОЧНОГО подсчета строк, (ничего другого в голову не приходит) можно использовать дополнительный, инкрементный bigint столбец с блокирующим чтением (для точного подсчета, вероятно, всегда придется жертвовать параллельностью). А вообще, я бы обратил внимание на архитектуру.
YPermitin; +1 Ответить
25. Synoecium 778 14.02.20 09:55 Сейчас в теме
Что-то не понял, зачем сеньор бы городил регламентные задания с регистрами сведений. Решается легко по аналогии с параметрами сеанса. Заводим справочник с кэшированными значениями и признаком актуальности кэша (2 поля: Значение - произвольный тип и Актуальность - булево), на каждый показатель заводим предопределенное значение. Далее в общем модуле делаем функцию получения значения (в нашем примере количество строк в справочнике), если значение актуально, то выдаем его, если неактуально, то пересчитываем (тут будет задержка при первом расчете, зато никаких регл. заданий). Ну и осталось снимать флаг актуальности на значениии, просто вешаем обработку на события удаления и добавления, которое снимает флаг.
Все.
Krio2; YPermitin; +2 Ответить
26. пользователь 14.02.20 09:58
(25) тут надо смотреть на контекст. Но если номенклатура добавляется / удаляется часто, то смысла в таком кэшировании будет мало, потому что оно часто будет неактуальным. Не будет стабильности в скорости получения данных. То оно быстро, то медленно. А если пересчет запущен параллельно от нескольких пользователей и так далее.

Но еще раз напоминаю, что тут нет контекста. Это шуточная статья ))))
27. Dach 372 14.02.20 10:05 Сейчас в теме
"God 'mode"

Идем в БД. Городим у таблицы справочника собственный primary key, который будет равен guid + № п/п. Пишем триггер и хранимку, которая обеспечит его заполнение. Запрещаем удалять из справочника элементы, разрешаем только добавлять и помечать на удаление. Далее селект 1 сорт бай пр. кей аск.

Тоже самое можно будет и на 1С, через подписку и отдельный индексируемый реквизит № п/п

Наслаждайтесь
slauter77; bulpi; wowik; user675801_ev1999; YPermitin; +5 Ответить
29. пользователь 14.02.20 10:07
(27) добавлю.

Чтобы собственный первичный ключ не слетал при реструктуризации сделаем триггер, который при изменении платформенного ключа / его пересоздании - пересоздавал его с нашими настройками.

P.S. Вот это GOD MODE так GOD MODE.
31. Dach 372 14.02.20 10:15 Сейчас в теме
(29) да, это прям пушка)) короч полет фантазии ничем не ограничен, кроме бюджета )))
user811769; Drivingblind; YPermitin; +3 Ответить
32. пользователь 14.02.20 10:16
(31) да. Бюджета и забористой травой :) (шутка)
103. YanTsys 12 14.02.20 17:21 Сейчас в теме
(27) Это скорее "Frick mode" :) особенно насчет " Запрещаем удалять из справочника элементы" кроме того если я правильно помню редактирование SQL базы напрямую это нарушение лицензии 1с...
30. psplehanov 14.02.20 10:13 Сейчас в теме
Уважаемый автор, вы забыли еще один распространенный уровень:
Не смог выполнить задачу!
shard; bulpi; EVKash; wowik; sogesti; +5 Ответить
35. пользователь 14.02.20 10:16
(30) да, это мое фиаско :)

Что-то я не подумал, что так может быть.
46. psplehanov 14.02.20 10:34 Сейчас в теме
(35) Кроличья нора еще глубже.

Вспомнил еще уровень

Функция КоличествоНоменклатуры() Экспорт

Возврат 42;

КонецФункции
ipoloskov; nixen88; user811769; bulpi; wowik; uno-c; sogesti; +7 Ответить
47. пользователь 14.02.20 10:38
(46) после такого хочется сразу включать это видео.

https://www.youtube.com/watch?v=1KPbAIjZXHE

Опять)
146. bpc222 2015 17.02.20 08:36 Сейчас в теме
(46)

:))))))))

Не, так это норм еще...
Более продвинутый уровень:

Функция КоличествоНоменклатуры() Экспорт

      Возврат ПолучитьСорокДва();

КонецФункции

Функция ПолучитьСорокДва()

      Возврат 42;

КонецФункции
Показать
kser87; ipoloskov; +2 Ответить
60. uno-c 234 14.02.20 12:23 Сейчас в теме
(35)Вы скромничаете? )
В статье это между строк: ни один вариант не решает поставленной задачи в большинстве прикладных решений на платформе 1С
YPermitin; +1 Ответить
36. acanta 14.02.20 10:17 Сейчас в теме
(30) это следующий после олдскульного?
Merkalov; +1 Ответить
33. Климов Сергей 14.02.20 10:16 Сейчас в теме
Фух, дочитал до конца и меня попустило. Таки я олдскул а не миддл! :)
xantif_2000; dinopopyys; zqzq; +3 Ответить
37. пользователь 14.02.20 10:18
(33) это достойный уровень!
85. Painted 49 14.02.20 14:19 Сейчас в теме
(33)
Таки я олдскул а не миддл!
Хммм! А какая разница? Код одинаковый. ))
99. Климов Сергей 14.02.20 16:30 Сейчас в теме
(85) Разница принципиальная! Путь достижения цели может быть важнее цели :)
Движение — всё, цель — ничто! (с)
34. vadver 39 14.02.20 10:16 Сейчас в теме
А вот нифига не олдскульный код :)
Настоящий олдскул написал бы так:
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
	
	        Возврат ВыборкаДетальныеЗаписи.КоличествоЭлементов;
        КонецЕсли;
	
	Возврат 0;

А то мало ли что... :)
e.kogan; rabid_otter; babys; veretennikoff; bulpi; memb3r; user1025849; wowik; uno-c; Merkalov; acanta; YPermitin; +12 Ответить
38. пользователь 14.02.20 10:18
40. dhurricane 14.02.20 10:23 Сейчас в теме
(34) (38) А вот и нет. Выборка из результата запроса всегда будет иметь ровно одну запись при любом наполнении справочника.
ccapt; uno-c; Климов Сергей; +3 Ответить
41. vadver 39 14.02.20 10:25 Сейчас в теме
(40) Даже комментировать не буду
43. пользователь 14.02.20 10:26
(40) так это ж шутейка была)
44. dhurricane 14.02.20 10:28 Сейчас в теме
(43) Блин, прошу прощения, детектор шуток барахлит.
uno-c; YPermitin; +2 Ответить
45. vadver 39 14.02.20 10:30 Сейчас в теме
(43) Некоторое время назад мне пришлось возиться с сильно замусоренным справочником номенклатуры в ERP (около 200 тыс. элементов), в котором еще при внедрении сильно ошиблись с единицами измерения, да еще их и дорабатывали потом...
Так что кому-как, а мне очень-таки жизненный пример ;)
48. Merkalov 8 14.02.20 10:45 Сейчас в теме
(40)
(34) (38) А вот и нет. Выборка из результата запроса всегда будет иметь ровно одну запись при любом наполнении справочника.

*пятница*
Для не очень быстрых как я поясню - выборка в ДАННОМ случае, при ТАКОМ запросе вернет всегда 1 строку, а не любая выборка из любого запроса...
ccapt; babys; pm74; YPermitin; acanta; +5 Ответить
212. Hatson 528 26.02.20 16:47 Сейчас в теме
(34) покоробило )) А тем временем "скан тэйбл" уже случился и уже как бы пофиг на курсоры.

наилучший вариант был

Функция КоличествоСтрокВТаблице() Экспорт
Возврат 42;
КонецФункции
39. Dach 372 14.02.20 10:20 Сейчас в теме
С утра в пятницу под кофеек запрограммировать сферического коня в вакууме, ммм, что может быть лучше)) Спасибо за отличный пятничнопост, Юрий! Ну а теперь за рутину - ревьюить код джунов и разгребать авгиевы конюшни ошибок в нетленке
YPermitin; +1 Ответить
42. пользователь 14.02.20 10:26
49. KapasMordorov 428 14.02.20 10:55 Сейчас в теме
Вспомнилась вот эта тема:
Задача с экзамена 1С Эксперт. (частично обсуждение было тут (форум Гилева))

Текст задачи:
"В базе работают 1000 пользователей. Есть регистр сведений в нем 100 млн записей. запрос select count выполняется t= 60 сек. Необходимо сделать так, чтобы данные были получены за t = 1c."

Можете ли Вы подсказать, пожалуйста, в каком направлении мыслить/искать? Преподаватель говорит, есть порядка 12 способов решить задачу.

https://forum.infostart.ru/forum9/topic172403/
62. пользователь 14.02.20 12:35
(49) не читал, спасибо. Надо глянуть)
116. user633166 12 14.02.20 19:29 Сейчас в теме
Рабочая пятница закончилась и иссякла река серьёзного обсуждения :) поста, созданного ради шутки. Спасибо автору - очень интересно наблюдать за такого рода дискуссией... В надежде, что в понедельник увижу продолжение и будет решение, вспомнившейся (49), из постановки которой непонятно, что под 12 способами понимал автор того вопроса, то ли просто получить решение (то, что собственно и в этой публикации является целью и где-то около того вариаций уже прозвучало) или 12 :), способных за секунду добиться желаемого результата? Во втором случае стоит найти его и "заставить" это сакральное знание распространить... Со своей стороны
могу предложить поискать решение по следующему алгоритму: разделить размер таблицы на размер записи.
YPermitin; +1 Ответить
117. пользователь 14.02.20 19:31
(116) отличная идея. Конечно, точное количество записей мы не получим, но приближенное значение можно. Нужно только учесть BLOB'ы и др.

+. Это идея для статьи! :)
122. user633166 12 15.02.20 09:54 Сейчас в теме
(117) Если ставить "серьёзные" цели, пытаться найти "общее" решение :), то конечно требуется полный разбор, какая там структура записи. Но как мне кажется, что если есть "реальная" такая задача, то для оптимизации имеет смысл "упростить" структуру и все BLOB'ы и др. исключить (переместить в другую таблицу).
118. пользователь 14.02.20 19:34
(116) и спасибо на добром слове.

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

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

Всем добра, кто прочитает этот комментарий :)
Чем меньше токсичности в ИТ, тем лучше! )))
DrBlack; e.kogan; +2 Ответить
224. ccapt 13.03.20 22:56 Сейчас в теме
если подойти к заданию пунктуально, количество записей известно уже в постановке задачи. другой вопрос, как добиться задержки в одну секунду.
DrBlack; e.kogan; +2 Ответить
225. e.kogan 1892 17.03.20 15:16 Сейчас в теме
(224) Сразу видно опытного человека )
DrBlack; ccapt; +2 Ответить
226. ccapt 18.03.20 12:50 Сейчас в теме
и это не говоря о том, что нет никаких ограничений на то, что такое данные
51. DoctorRoza 14.02.20 11:00 Сейчас в теме
Судя по статье, я или Мидл или ОлдСкул!
wowik; YPermitin; +2 Ответить
58. buganov 200 14.02.20 12:09 Сейчас в теме
53. VmvLer 14.02.20 11:28 Сейчас в теме
думаю, скоро можно будет писать код с бодуна.

КолВоТвары = Даша.ОтветНаВопрос("Але гараж, скока у нас номклатур - быра посчитай");

и это будет самое оптимальное решение и не важно как она там посчитает.
user612295_death4321; bulpi; user605780_L.Alexander8; YPermitin; +4 Ответить
57. buganov 200 14.02.20 12:09 Сейчас в теме
Морозова не удовлетворит решение эксперта)) Так что это скорее претендент :D
59. uno-c 234 14.02.20 12:13 Сейчас в теме
Больше похоже на пятничный тест "кто первый заметит, что нет ни одного правильного решения".
YPermitin; +1 Ответить
63. пользователь 14.02.20 12:39
(59) нет, нет. В статье ничего такого.

Вообще, все решения рабочие в тои или иной степень.
Но если бы мне такую задачу дали в реальности, то я бы спросил "А зачем?"
68. uno-c 234 14.02.20 12:52 Сейчас в теме
(63)Задача вполне себе практичная: посчитать количество SKU, с которым имела дело контора в своей практике. Например, чтобы в презентацию конторы вставить - чем больше SKU, тем лучше, главное что это правда. Но чтобы не соврать - решать надо именно поставленную задачу.
подсчитать количество элементов справочника "Номенклатура" в информационной базе
69. acanta 14.02.20 12:54 Сейчас в теме
С характеристиками или без?
(68)
Оставьте свое сообщение