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

Публикация № 1195044

Разработка - Практика программирования

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

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

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

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

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


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


*Бздынь!*

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

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


а лучше засунуть в экспортную функцию, куда передавать имя таблицы, чтоб код не повторять
и в привилегированном режиме, мало ли какие RLS'ы включены :-D
"ВЫБРАТЬ 	КОЛИЧЕСТВО(0) КАК Элементов ИЗ "+ИмяТаблицы
almierm; ipoloskov; acanta; +3 Ответить
209. DrAku1a 1314 24.02.20 14:43 Сейчас в теме
(70)
ВЫБРАТЬ
    КОЛИЧЕСТВО(*)
ИЗ
    Справочник.Номенклатура
ccapt; YPermitin; +2 Ответить
104. oleganatolievich 145 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. oleganatolievich 145 14.02.20 17:36 Сейчас в теме
(106)
онять начало.
(с)о-з-д-р

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


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


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

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

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

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

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

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

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

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

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

P.S. Вот это GOD MODE так GOD MODE.
31. Dach 295 14.02.20 10:15 Сейчас в теме
(29) да, это прям пушка)) короч полет фантазии ничем не ограничен, кроме бюджета )))
user811769; Drivingblind; YPermitin; +3 Ответить
32. YPermitin 8563 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. YPermitin 8563 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. YPermitin 8563 14.02.20 10:38 Сейчас в теме
(46) после такого хочется сразу включать это видео.

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

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

:))))))))

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

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

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

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

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

      Возврат 42;

КонецФункции
Показать
ipoloskov; +1 Ответить
60. uno-c 144 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. YPermitin 8563 14.02.20 10:18 Сейчас в теме
(33) это достойный уровень!
85. Painted 32 14.02.20 14:19 Сейчас в теме
(33)
Таки я олдскул а не миддл!
Хммм! А какая разница? Код одинаковый. ))
99. Климов Сергей 14.02.20 16:30 Сейчас в теме
(85) Разница принципиальная! Путь достижения цели может быть важнее цели :)
Движение — всё, цель — ничто! (с)
34. vadver 38 14.02.20 10:16 Сейчас в теме
А вот нифига не олдскульный код :)
Настоящий олдскул написал бы так:
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
	
	        Возврат ВыборкаДетальныеЗаписи.КоличествоЭлементов;
        КонецЕсли;
	
	Возврат 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

14.02.2015    100931    97    daMaster    90    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    3817    4    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    4369    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

Обработка позволяет генерировать новые номенклатурные позиции на основе данных из файла Excel с последующей генерацией штрихкодов (ШК). Может быть полезна при больших поступлениях товаров на склад, где ручное создание и присваивание штрихкода  (ШК) может занимать много времени.

1 стартмани

24.03.2017    7708    7    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

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

26.08.2013    263593    0    Evil Beaver    266    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v7.7 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    28414    3    CheBurator    62