Быстрое создание наполненных коллекций

28.10.19

Разработка - Универсальные функции

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

 

- А что это такое?

Программист Артём заметил у программиста Васи такой код:

Для Каждого КоллекцияМетаданных Из СтрРазделить("Справочники,Документы", ",") Цикл

	//...

КонецЦикла;

 

Василий рассказал Артёму, что таким образом он быстро создал наполненный массив. Сделав код более коротким. Раньше было так:

КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить("Справочники");
КоллекцииМетаданных.Добавить("Документы");

Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл

	//...

КонецЦикла;

 

Артём понял задумку Василия. Ведь никто так хорошо не поймёт ленивого программиста, как другой ленивый программист. Но заметил, что он бы делал немного по-другому. 

Для Каждого КоллекцияМетаданных Из Новый Структура("Справочники,Документы") Цикл

	//...

КонецЦикла;

- Так оптимальнее - сказал программист Артём, рассказывая что-то про внутренние механизмы платформы...

- А вот и нет! - не согласился программист Вася, рассказывая что-то про оптимизацию метода СтрРазделить...

 

Так всё и началось.

 

Быстрое создание наполненных коллекций

 

Помните, как бывает в других языках программирования?

 

C#

 

string[] seasons = {"Winter", "Spring", "Summer", "Autumn"};

 

Java

 

String[] seasons = {"Winter", "Spring", "Summer", "Autumn"};

 

JavaScript

 

var seasons = ["Winter", "Spring", "Summer", "Autumn"];

 

Python

 

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']

Как же это бывает удобно - создать сразу наполненный значениями массив. Жаль, что в 1С такое не предусмотрено.

 

Но хорошо, что в нашем примере потребовались строковые массивы. Для этого в 1С есть способы:

 

 

СтрРазделить()

 

РезультатСоздания = СтрРазделить("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");

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

 
Управление торговлей 11.4.9.91 (спойлер):
ОбязательныеСтандартныеРеквизиты = СтрРазделить("Период,Регистратор,ВидДвижения,Активность", ",");
	
Для каждого РеквизитРегистра Из Коллекция.СтандартныеРеквизиты Цикл
НаборГруппДанныхСМаркировкой = СтрРазделить("ПоДокументу,ПоФакту,Бой,Брак,Излишки,Недостача", ",");
НаборГруппДанныхСПрослеживанием = СтрРазделить("ПоДокументу,ПоФакту,Бой,Брак,Излишки,Недостача", ",");

 

Бухгалтерия предприятия КОРП 3.0.72.70 (спойлер):
СвойстваНастроек = СтрРазделить("Использование, ВидСравнения, Значение", ", ", Ложь);
	Для Каждого СвойствоНастройки Из СвойстваНастроек Цикл 
Для каждого ВидПериода Из СтрРазделить("ДатаПроизводства,СрокГодности",",") Цикл

 

И тут можно вспомнить, что метод СтрРазделить() появился только в версии 8.3.6. Как же раньше программисты могли одной строчкой кода создать наполненный массив?

 

 

РазложитьСтрокуВМассивПодстрок()

 

Выглядит это так:

РезультатСоздания = РазложитьСтрокуВМассивПодстрок("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");

Да, ещё один парсинг. Только на основе БСПшной функции, которая существует в типовых испокон веков.

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

 
 
Бухгалтерия предприятия КОРП 3.0.72.70 (спойлер) :
Для Каждого ЭлтКлюч Из СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("_ДатаПрмЭ,_ДатаПрмБ,_ДатаДокОтв", ",") Цикл 
	СЗ.Добавить(ЭлтКлюч, Формат(Ответ[ЭлтКлюч], "ДФ=yyyyMMdd"));
КонецЦикла;
Для Каждого Элт Из СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("А%Б%В", "%") Цикл
 
Зарплата и управление персоналом 3.1.11.106 (спойлер) :
Для Каждого ЭлтКлюч Из СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("_ДатаПрмЭ,_ДатаПрмБ,_ДатаДокОтв", ",") Цикл
Для Каждого Элт Из СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("{{,{", ",") Цикл

 

 

Что лучше использовать в таком случае? Думаю, вопрос очевиден, учитывая, что платформенный метод, как заявляют разработчики, намного быстрее БСПшного. Так ли это? Проверим далее. Но не стоит забывать, что они не совсем идентичны. И об этом писалось в статье Чем расщепить или "СтрРазделить() VS РазложитьСтрокуВМассивПодстрок()" ?

 

 

Новый Структура()

 

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

И да, этот способ имеет ряд ограничений:

 

  • Результат будет структурой, а не массивом.

  • Все значения должны соответствовать правилам именования 1С.

  • Разделитель только запятая.

 

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

Ну и, как обычно, примеры из типовых:

 

Управление торговлей 11.4.9.91 (спойлер):
Для Каждого КлючИЗначение Из Новый Структура("Данные, Источники, Приемники, РасчетныеПартии") Цикл
ПоляРесурсов = "
	|Стоимость, СтоимостьБезНДС, ПостояннаяРазница, ВременнаяРазница,
	|СтоимостьРегл, ДопРасходы, ДопРасходыБезНДС,
	|СтоимостьЗабалансовая, Трудозатраты, ПостатейныеПостоянныеСНДС, ПостатейныеПеременныеСНДС,
	|ПостатейныеПостоянныеБезНДС, ПостатейныеПеременныеБезНДС,
	|СтоимостьЗабалансоваяРегл, ДопРасходыРегл, ТрудозатратыРегл, ПостатейныеПостоянныеРегл, ПостатейныеПеременныеРегл,
	|СтоимостьУпр, ДопРасходыУпр, ТрудозатратыУпр, ПостатейныеПостоянныеУпр, ПостатейныеПеременныеУпр";
	
Для Каждого КлючИЗначение Из Новый Структура(ПоляРесурсов) Цикл
	Запись[КлючИЗначение.Ключ] = - ДанныеДвижения[КлючИЗначение.Ключ];
КонецЦикла;
ВозвращаемыеСвойства = "НетЗаданий, ПерезапускОбновления, ПерезапускОбновленияСНачала, НаборПорций,
       |НовыйПоследнийОбновленныйЭлемент, НачальноеОбновлениеЗавершено, ТекстОшибкиЗавершения";

Для Каждого КлючИЗначение Из Новый Структура(ВозвращаемыеСвойства) Цикл

 

Бухгалтерия предприятия КОРП 3.0.72.70 (спойлер) :
КолонкиДоходов = "ЦенныеБумагиИтогоСуммаДоходов,ЦенныеБумагиСуммаДохода";
Для Каждого КолонкаДохода Из Новый Структура(КолонкиДоходов) Цикл
КолонкиРасходов = "ЦенныеБумагиИтогоСуммаРасходовКВычету,ЦенныеБумагиСуммаРасходовУменьшающаяДоходы,ЦенныеБумагиИтогоСуммаУбытка";
Для Каждого КолонкаРасхода Из Новый Структура(КолонкиРасходов) Цикл

 

И тут становится уже интереснее. А что быстрее: создать массив при помощи парсинга строки СтрРазделить() или же создать структуру стандартным конструктором Новый Структура() ? Чего гадать, когда можно проверить!

 

 

Разработка инструмента

 

Под этим спойлером подробная информация, как делался инструмент:

 

Для этого создаём простенький отчет.

В СКД указываем набор данных объект с колонками, которые нужны будут для анализа:

 

В параметрах указываем количество "подходов", количество созданий за один подход, ну и сами методы:

 

Накидываем ресурсы:

 

И делаем простой вывод диаграммы с детальными записями:

 

В ПриКомпоновкеРезультата() будем делать все манипуляции.

Для начала отключим стандартную обработку и очистим результат:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();
	
КонецПроцедуры

Получим параметры из настроек (добавим функцию):

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();
	
	ПараметрыВыполнения = ПараметрыВыполнения();
	
КонецПроцедуры

Функция ПараметрыВыполнения()
	
	ПараметрыВыполнения = Новый Структура;
	
	НастройкиКомпоновки	= КомпоновщикНастроек.ПолучитьНастройки();
	ПараметрыВыполнения.Вставить("НастройкиКомпоновки", НастройкиКомпоновки);
	
	Для Каждого ПараметрКомпоновщика Из НастройкиКомпоновки.ПараметрыДанных.Элементы Цикл
		Если ПараметрКомпоновщика.Использование Тогда
			ПараметрыВыполнения.Вставить(ПараметрКомпоновщика.Параметр, ПараметрКомпоновщика.Значение);
		КонецЕсли;
	КонецЦикла;
	
	Возврат ПараметрыВыполнения;

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

 

Подготовим функцию для замеров:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();
	
	ПараметрыВыполнения = ПараметрыВыполнения();

	ДанныеЗамеров = ДанныеЗамеров(ПараметрыВыполнения);
	
КонецПроцедуры

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений; //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	//Здесь будем замерять
	
	Возврат ДанныеЗамеров;
	
КонецФункции

И сразу же не забудем вывести результат в табличный документ.

Для удобства будем использовать процедуру, описанную в статье "Меньше копипаста!", или как Вася универсальную процедуру писал

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();
	
	ПараметрыВыполнения = ПараметрыВыполнения();
	
	ДанныеЗамеров = ДанныеЗамеров(ПараметрыВыполнения);
    
    ВнешниеНаборыДанных = Новый Структура("Результат", ДанныеЗамеров);
    
	СкомпоноватьРезультатОтчета(ДокументРезультат, СхемаКомпоновкиДанных, 
	ПараметрыВыполнения.НастройкиКомпоновки, ДанныеРасшифровки, ВнешниеНаборыДанных);
	
КонецПроцедуры

Всё, база готова. Уже сейчас отчёт может выводиться, хоть и без замеров. Пора заняться ими! 

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

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений;    //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	Для ТекущийПодход = 1 По ПараметрыВыполнения.КоличествоПодходов Цикл
		
		Для Каждого ТекущийМетод Из ПараметрыВыполнения.Методы Цикл
			
			
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ДанныеЗамеров;
	
КонецФункции

Добавим новую строчку замера и заполним текущими данными

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений;    //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	Для ТекущийПодход = 1 По ПараметрыВыполнения.КоличествоПодходов Цикл
		
		Для Каждого ТекущийМетод Из ПараметрыВыполнения.Методы Цикл
			
			ТекущиеДанные = ДанныеЗамеров.Добавить();
			ТекущиеДанные.Метод         = ТекущийМетод.Значение;
			ТекущиеДанные.ТекущийПодход = ТекущийПодход;
			ТекущиеДанные.КоличествоСозданий = ПараметрыВыполнения.КоличествоСозданий;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ДанныеЗамеров;
	
КонецФункции

Пока пропустим ненадолго момент с самими замерами. Представим, что они выполнены. Теперь нам нужно рассчитать количество созданий экземпляра коллекции за одну миллисекунду:

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений;    //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	Для ТекущийПодход = 1 По ПараметрыВыполнения.КоличествоПодходов Цикл
		
		Для Каждого ТекущийМетод Из ПараметрыВыполнения.Методы Цикл
			
			ТекущиеДанные = ДанныеЗамеров.Добавить();
			ТекущиеДанные.Метод         = ТекущийМетод.Значение;
			ТекущиеДанные.ТекущийПодход = ТекущийПодход;
			ТекущиеДанные.КоличествоСозданий = ПараметрыВыполнения.КоличествоСозданий;
			
			Если ТекущиеДанные.ОбщееВремяСозданий > 0 Тогда
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = Окр(ТекущиеДанные.КоличествоСозданий / ТекущиеДанные.ОбщееВремяСозданий, 2);
			Иначе
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = ТекущиеДанные.КоличествоСозданий;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ДанныеЗамеров;
	
КонецФункции

 

База готова. Теперь просто выполним замеры каждого метода.

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений;    //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	Для ТекущийПодход = 1 По ПараметрыВыполнения.КоличествоПодходов Цикл
		
		Для Каждого ТекущийМетод Из ПараметрыВыполнения.Методы Цикл
			
			ТекущиеДанные = ДанныеЗамеров.Добавить();
			ТекущиеДанные.Метод         = ТекущийМетод.Значение;
			ТекущиеДанные.ТекущийПодход = ТекущийПодход;
			ТекущиеДанные.КоличествоСозданий = ПараметрыВыполнения.КоличествоСозданий;
			
			Если ТекущиеДанные.Метод = "СтрРазделить" Тогда
				
				ЗамеритьМетодСтрРазделить(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "НовыйСтруктура" Тогда
				
				ЗамеритьМетодНовыйСтруктура(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "РазложитьСтрокуВМассивПодстрок" Тогда
				
				ЗамеритьМетодРазложитьСтрокуВМассивПодстрок(ТекущиеДанные);
				
			КонецЕсли;
			
			Если ТекущиеДанные.ОбщееВремяСозданий > 0 Тогда
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = Окр(ТекущиеДанные.КоличествоСозданий / ТекущиеДанные.ОбщееВремяСозданий, 2);
			Иначе
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = ТекущиеДанные.КоличествоСозданий;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ДанныеЗамеров;
	
КонецФункции

 

Ну и, собственно, сами методы:

Процедура ЗамеритьМетодСтрРазделить(ТекущиеДанные)
	
	НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Для ТекущееСоздание = 1 По ТекущиеДанные.КоличествоСозданий Цикл
		РезультатСоздания = СтрРазделить("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");
	КонецЦикла;
	
	ТекущиеДанные.ОбщееВремяСозданий = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
		
КонецПроцедуры

Процедура ЗамеритьМетодРазложитьСтрокуВМассивПодстрок(ТекущиеДанные)
	
	НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Для ТекущееСоздание = 1 По ТекущиеДанные.КоличествоСозданий Цикл
		РезультатСоздания = РазложитьСтрокуВМассивПодстрок("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");
	КонецЦикла;
	
	ТекущиеДанные.ОбщееВремяСозданий = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
		
КонецПроцедуры

Процедура ЗамеритьМетодНовыйСтруктура(ТекущиеДанные)
	
	НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Для ТекущееСоздание = 1 По ТекущиеДанные.КоличествоСозданий Цикл
		РезультатСоздания = Новый Структура("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье");
	КонецЦикла;
	
	ТекущиеДанные.ОбщееВремяСозданий = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
		
КонецПроцедуры

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

Ну всё. Инструмент готов! 

 

 

 

Сравнение

 

Пробуем запустить замеры на серверной базе. Для этого поочередно каждый метод в цикле создаёт по N раз одну и ту же коллекцию из заранее известных элементов. И так указанное количество «подходов».

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

Для начала установим:

  • Количество созданий в одном подходе: 10 000
  • Количество подходов: 10

И глянем, насколько по скорости отличаются СтрРазделить() и РазложитьСтрокуВМассивПодстрок().

 

Код создания:

РезультатСоздания = СтрРазделить("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");
РезультатСоздания = РазложитьСтрокуВМассивПодстрок("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье", ",");

Результат неудивителен. Количество создания коллекции за одну миллисекунду у СтрРазделить() значительно выше:

 

Было 10 подходов. В каждый подход коллекция создавалась по 10 000 раз. В каждый подход количество создаваемых элементов (10 000) делились на общее затраченное время на их создание.

График построен на результатах, выраженных в этой таблице:

 

Спойлер

Метод

Текущий подход

Количество созданий

Количество созданий за милисекунду

Общее время созданий

РазложитьСтрокуВМассивПодстрок()

1

10 000

11,85

844

СтрРазделить()

1

10 000

128,21

78

РазложитьСтрокуВМассивПодстрок()

2

10 000

13,33

750

СтрРазделить()

2

10 000

161,29

62

РазложитьСтрокуВМассивПодстрок()

3

10 000

12,30

813

СтрРазделить()

3

10 000

161,29

62

РазложитьСтрокуВМассивПодстрок()

4

10 000

10,66

938

СтрРазделить()

4

10 000

161,29

62

РазложитьСтрокуВМассивПодстрок()

5

10 000

12,79

782

СтрРазделить()

5

10 000

161,29

62

РазложитьСтрокуВМассивПодстрок()

6

10 000

13,33

750

СтрРазделить()

6

10 000

128,21

78

РазложитьСтрокуВМассивПодстрок()

7

10 000

13,33

750

СтрРазделить()

7

10 000

158,73

63

РазложитьСтрокуВМассивПодстрок()

8

10 000

12,80

781

СтрРазделить()

8

10 000

128,21

78

РазложитьСтрокуВМассивПодстрок()

9

10 000

11,43

875

СтрРазделить()

9

10 000

158,73

63

РазложитьСтрокуВМассивПодстрок()

10

10 000

12,80

781

СтрРазделить()

10

10 000

128,21

78

 

В принципе, не удивительно. Метод СтрРазделить() был специально оптимизирован так, чтобы заменить БСПшный РазложитьСтрокуВМассивПодстрок().

Ещё раз напомним, что методы не полностью идентичные и об этом писалось в статье Чем расщепить или "СтрРазделить() VS РазложитьСтрокуВМассивПодстрок()" ?

В рамках наших примеров, эти отличия не актуальны, однако ознакомится стоит.

 

Выходит, РазложитьСтрокуВМассивПодстрок() для подобного использовать не оптимально (интересно, почему в типовых до сих пор встречаются примеры). Но что покажет сравнение между СтрРазделить() и Новый Структура() ? Добавим в сравнение и этот метод:

РезультатСоздания = Новый Структура("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье");

 

Результаты замеров получились такие (спойлер)

Метод

Текущий подход

Количество созданий

Количество созданий за милисекунду

Общее время созданий

Новый Структура()

1

10 000

91,74

109

РазложитьСтрокуВМассивПодстрок()

1

10 000

13,33

750

СтрРазделить()

1

10 000

158,73

63

Новый Структура()

2

10 000

91,74

109

РазложитьСтрокуВМассивПодстрок()

2

10 000

13,33

750

СтрРазделить()

2

10 000

161,29

62

Новый Структура()

3

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

3

10 000

13,05

766

СтрРазделить()

3

10 000

161,29

62

Новый Структура()

4

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

4

10 000

12,80

781

СтрРазделить()

4

10 000

158,73

63

Новый Структура()

5

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

5

10 000

13,07

765

СтрРазделить()

5

10 000

158,73

63

Новый Структура()

6

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

6

10 000

13,33

750

СтрРазделить()

6

10 000

128,21

78

Новый Структура()

7

10 000

107,53

93

РазложитьСтрокуВМассивПодстрок()

7

10 000

13,33

750

СтрРазделить()

7

10 000

158,73

63

Новый Структура()

8

10 000

91,74

109

РазложитьСтрокуВМассивПодстрок()

8

10 000

13,33

750

СтрРазделить()

8

10 000

158,73

63

Новый Структура()

9

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

9

10 000

13,07

765

СтрРазделить()

9

10 000

158,73

63

Новый Структура()

10

10 000

106,38

94

РазложитьСтрокуВМассивПодстрок()

10

10 000

12,32

812

СтрРазделить()

10

10 000

158,73

63

 

Ну и, собственно, график (обожаю их):

 

И так, на графике видно, помимо того, что сервер периодически «проседает», и то, что СтрРазделить() лидирует в этом сравнении.

Даже в «худшие времена» СтрРазделить() срабатывает быстрее, чем Новый Структура() в лучшие.

 

Почему так?

Мы можем лишь предположить, что структура — это более затратная коллекция, чем массив. Насколько это верный вывод лучше уточнять у знатоков всея нутра платформы 1С.

 

И так, что имеем на данный момент? Вася, который утверждал, что для наших целей СтрРазделить() аки лучше, чем Новый Структура(), оказался прав. С точки зрения скорости этот метод будет работать быстрее. Естественно, что выигрыш в производительности на вряд ли позволит нам сказать, что пользователи будут прыгать от радости.

 

Вроде Вася уже собрался открывать бутылку шампанского, но тут подходит Он. Оптимальный Программист. Священник Восьми Платформ. Хранитель Желтых Талмудов и Свидетель Великого Ассемблера.

 

 - Костыли всё это. Никаких созданий наполненного массива быть не должно! Зачем дополнительно напрягать вычислительную машину?

 

Новый Массив()

 

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

	РезультатСоздания = Новый Массив;
	РезультатСоздания.Добавить("Понедельник");
	РезультатСоздания.Добавить("Вторник");
	РезультатСоздания.Добавить("Среда");
	РезультатСоздания.Добавить("Четверг");
	РезультатСоздания.Добавить("Пятница");
	РезультатСоздания.Добавить("Суббота");
	РезультатСоздания.Добавить("Воскресенье");

А что нам мешает сравнить?

 

Добавляем в наш отчёт и такой способ (спойлер)

 

Для этого в доработаем отчёт. 

Функция ДанныеЗамеров(ПараметрыВыполнения)
	
	ДанныеЗамеров = Новый ТаблицаЗначений;    //Просто заполним структуру таблицы из полей описанного нами набора схемы компоновки
	Для Каждого ТекущееПоле Из СхемаКомпоновкиДанных.НаборыДанных.Получить(0).Поля Цикл
		ДанныеЗамеров.Колонки.Добавить(ТекущееПоле.Поле, ТекущееПоле.ТипЗначения, ТекущееПоле.Заголовок);
	КонецЦикла;
	
	Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.Методы) Тогда
		Возврат ДанныеЗамеров;
	КонецЕсли;
	
	Для ТекущийПодход = 1 По ПараметрыВыполнения.КоличествоПодходов Цикл
		
		Для Каждого ТекущийМетод Из ПараметрыВыполнения.Методы Цикл
			
			ТекущиеДанные = ДанныеЗамеров.Добавить();
			ТекущиеДанные.Метод         = ТекущийМетод.Значение;
			ТекущиеДанные.ТекущийПодход = ТекущийПодход;
			ТекущиеДанные.КоличествоСозданий = ПараметрыВыполнения.КоличествоСозданий;
			
			Если ТекущиеДанные.Метод = "СтрРазделить" Тогда
				
				ЗамеритьМетодСтрРазделить(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "НовыйСтруктура" Тогда
				
				ЗамеритьМетодНовыйСтруктура(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "РазложитьСтрокуВМассивПодстрок" Тогда
				
				ЗамеритьМетодРазложитьСтрокуВМассивПодстрок(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "НовыйМассив" Тогда
				
				ЗамеритьМетодНовыйМассив(ТекущиеДанные);
				
			КонецЕсли;
			
			Если ТекущиеДанные.ОбщееВремяСозданий > 0 Тогда
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = Окр(ТекущиеДанные.КоличествоСозданий / ТекущиеДанные.ОбщееВремяСозданий, 2);
			Иначе
				ТекущиеДанные.КоличествоСозданийЗаМилисекунду = ТекущиеДанные.КоличествоСозданий;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ДанныеЗамеров;
	
КонецФункции
Процедура ЗамеритьМетодНовыйМассив(ТекущиеДанные)
	
	НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Для ТекущееСоздание = 1 По ТекущиеДанные.КоличествоСозданий Цикл
			
		РезультатСоздания = Новый Массив;
		РезультатСоздания.Добавить("Понедельник");
		РезультатСоздания.Добавить("Вторник");
		РезультатСоздания.Добавить("Среда");
		РезультатСоздания.Добавить("Четверг");
		РезультатСоздания.Добавить("Пятница");
		РезультатСоздания.Добавить("Суббота");
		РезультатСоздания.Добавить("Воскресенье");
	
	КонецЦикла;
	
	ТекущиеДанные.ОбщееВремяСозданий = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
	
		
КонецПроцедуры

 

И так. Принцип анализа тот же. Только теперь будем сравнивать четыре метода. Без особого желания, ведь победитель ясен. Создать и наполнить массив таки лучше, чем парсить строку и разбивать её на элементы...

 

 

Результат нас удивил.

Мы перепроверили. На разных серверах.

 

Под спойлером данные замеров
         

Метод

Текущий подход

Количество созданий

Количество созданий за милисекунду

Общее время созданий

Новый Массив()

1

10 000

80,00

125,00

Новый Структура()

1

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

1

10 000

12,79

782,00

СтрРазделить()

1

10 000

161,29

62,00

Новый Массив()

2

10 000

80,00

125,00

Новый Структура()

2

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

2

10 000

13,07

765,00

СтрРазделить()

2

10 000

158,73

63,00

Новый Массив()

3

10 000

80,00

125,00

Новый Структура()

3

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

3

10 000

13,07

765,00

СтрРазделить()

3

10 000

158,73

63,00

Новый Массив()

4

10 000

91,74

109,00

Новый Структура()

4

10 000

90,91

110,00

РазложитьСтрокуВМассивПодстрок()

4

10 000

9,28

1 078,00

СтрРазделить()

4

10 000

161,29

62,00

Новый Массив()

5

10 000

90,91

110,00

Новый Структура()

5

10 000

107,53

93,00

РазложитьСтрокуВМассивПодстрок()

5

10 000

13,05

766,00

СтрРазделить()

5

10 000

161,29

62,00

Новый Массив()

6

10 000

80,00

125,00

Новый Структура()

6

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

6

10 000

13,05

766,00

СтрРазделить()

6

10 000

161,29

62,00

Новый Массив()

7

10 000

90,91

110,00

Новый Структура()

7

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

7

10 000

13,07

765,00

СтрРазделить()

7

10 000

158,73

63,00

Новый Массив()

8

10 000

80,00

125,00

Новый Структура()

8

10 000

107,53

93,00

РазложитьСтрокуВМассивПодстрок()

8

10 000

12,55

797,00

СтрРазделить()

8

10 000

158,73

63,00

Новый Массив()

9

10 000

91,74

109,00

Новый Структура()

9

10 000

90,91

110,00

РазложитьСтрокуВМассивПодстрок()

9

10 000

13,33

750,00

СтрРазделить()

9

10 000

161,29

62,00

Новый Массив()

10

10 000

80,00

125,00

Новый Структура()

10

10 000

106,38

94,00

РазложитьСтрокуВМассивПодстрок()

10

10 000

13,07

765,00

СтрРазделить()

10

10 000

158,73

63,00

 

Оказывается, что СтрРазделить() быстрее, чем Новый Массив(). Более того, Новый Массив() ещё и борется за третье место с Новый Структура().

 

На создание и наполнение массива уходит больше времени, чем на парсинг строки при помощи СтрРазделить().

 

Пока мы удивлялись происходящему, к нам подплыл на волнах торсионных полей эзотерик от мира программирования Инокентий.

 

- Я знаю как вам помочь.

Продолжение следует...

 

В данной статье мы рассмотрели основные способы создания коллекции с заранее известными строковыми значениями. Примеры их использования есть и в типовых и, тем более, в всякого рода самописок и самодописок. По результатам замера вы сами можете сделать вывод. Разница есть, но не существенная. Какой подход использовать? Решать вам. Однако, на мой сугубо личный взляд, СтрРазделить выглядит более лаконично. Так что, если вы как-нибудь задумаетесь, мол, «этот массив из трех строк будет создаваться 100500 раз» , то не переживайте — написав его обычным созданием массива вы вряд ли предотвратите образование узкого места будущего кода.

В следующей статье разберем более «эзотерические» методы создания наполненного массива. И сравним их результаты. 

 

Понравилась статья?

Не будьте равнодушными! Поставьте лайк звездочку и переходите к другим работам автора:

 

 

Массив Структура Программирование Скорость Оптимизация Примеры Тестирование Практика

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2669    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4600    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8813    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

109
Отзывы
5. SeiOkami 3423 28.10.19 11:58 Сейчас в теме
Забыл добавить. Если у вас есть ещё идеи реализации нашего примера, то пишите в комментариях. В следующей статье мы рассмотрим более необычные и странные подходы. И добавим ваш пример, если вдруг ещё не рассматривали сами.
aleksey2; v.l.; user1304375; +3 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 28.10.19 10:26 Сейчас в теме
Делать выводы на основании куцей статистики (10к ни о чем) и без указания программно-аппаратного окружение - это просто пустая болтовня
17. DennyPhilord 65 28.10.19 16:52 Сейчас в теме
Информация не настолько полезна, чтобы читать эту простыню. На практике сложно представить, чтобы это знание вообще где-нибудь существенный выигрыш дало.
Минус, несмотря на интересен стиль оформления.
22. SeiOkami 3423 28.10.19 20:01 Сейчас в теме
(17) я так понимаю, вы ставите минус каждой статье, которая, на ваш взгляд, "не настолько полезна" ?)
Leon75; Deslime; v.l.; +3 Ответить
35. DennyPhilord 65 29.10.19 15:13 Сейчас в теме
Переход сделал по "рекомендациям" по этому и решил отписаться, чтобы сэкономить время другим с таким же мнением. Обижаются на обратную связь только неудачники
61. DennyPhilord 65 07.11.19 13:43 Сейчас в теме
(17) Всем спасибо за обратную связь для меня. Обнимаю
2. shalimski 6 28.10.19 11:37 Сейчас в теме
Нужен тест с РезультатСоздания = Новый Массив(7);
sasha777666; +1 Ответить
3. SeiOkami 3423 28.10.19 11:41 Сейчас в теме
(2) именно! Но об этом в следующей серии.
спойлер
4. user1166203 28.10.19 11:43 Сейчас в теме
А ФиксированныйМассив?
sasha777666; +1 Ответить
5. SeiOkami 3423 28.10.19 11:58 Сейчас в теме
Забыл добавить. Если у вас есть ещё идеи реализации нашего примера, то пишите в комментариях. В следующей статье мы рассмотрим более необычные и странные подходы. И добавим ваш пример, если вдруг ещё не рассматривали сами.
aleksey2; v.l.; user1304375; +3 Ответить
7. dock 44 28.10.19 13:39 Сейчас в теме
(5) Ну просто сразу же напрашивается создание через запрос! :)
9. Sashares 34 28.10.19 13:59 Сейчас в теме
(7)Для строковых значений это кажется уже слишком.
12. alexch8 28.10.19 14:53 Сейчас в теме
По идее следующий код должен быть самым быстрым.

РезультатСоздания = Новый Массив(7);
РезультатСоздания[0] = "Понедельник";
РезультатСоздания[1] = "Вторник";
РезультатСоздания[2] = "Среда";
РезультатСоздания[3] = "Четверг";
РезультатСоздания[4] = "Пятница";
РезультатСоздания[5] = "Суббота";
РезультатСоздания[6] = "Воскресенье";

Массив.Добавить() каждый раз пересоздает массив с большим количеством элементов. Отсюда и невысокая производительность.
13. Sashares 34 28.10.19 15:13 Сейчас в теме
(12)
Массив.Добавить() каждый раз пересоздает массив с большим количеством элементов.


Ну уж, с чего каждый раз то?

В (3) под спойлером посмотрите.
14. SeiOkami 3423 28.10.19 15:32 Сейчас в теме
(13) В зависимости от "мощности" сервера, разница между СтрРазделить() и Новый Массив() отличается. СтрРазделить() стабильно быстрее, чем обычный Новый Массив(), но вот насколько - зависит от сервера.

А вот Новый Массив(7) периодически вырывается вперёд. На самой мощной машине он одолел СтрРазделить() с неплохим отрывом. Но на более простых машинах он чуть быстрее Новый Массив, но всё же не дотягивает до СтрРазделить().

В следующей статье возьмём больше сравнений. И даже применим волшебный "цикл в одну строку".
alur; Sashares; +2 Ответить
19. Dream_kz 129 28.10.19 18:23 Сейчас в теме
(14)
И даже применим волшебный "цикл в одну строку".

Это же из за особенностей отладчика, 7 строк кода работают тупо дольше, чем 1. Но только в режиме отладки.
20. SeiOkami 3423 28.10.19 18:27 Сейчас в теме
(19) мерили именно этим методом. Под спойлером в статье специально выложена полная инфа по разработке инструмента для сравнения, чтобы любой мог попробовать замерить сам. Авось получим новую информацию.

А по поводу особенностей отладчика. Я тоже так думал. Но факты показывают, что независимо от подключенной отладки, скорость выполнения кода в одну строку действительно быстрее.
21. Dream_kz 129 28.10.19 18:31 Сейчас в теме
(20)
мерили именно этим методом

Да, я сначала ляпнул, потом глянул код, извиняюсь.

(20)
скорость выполнения кода в одну строку действительно быстрее.

Во всяком случае разработчики на партнерском форуме уверяли что разницы без отладки быть не должно.
26. Sashares 34 29.10.19 11:58 Сейчас в теме
(19)
Но только в режиме отладки.

Нет =)
29. Darklight 32 29.10.19 14:09 Сейчас в теме
(26)Может имеет значение - включена ли отладка на сервере (ключ -debug) - ну это если алгоритм на сервере выполняется. Для клиентского кода такой опции нет - и подключиться отладчиком можно почти в любой момент, поэтому тут байт кода должен генерировать по одинаковым правилам без зависимости от отладки, но в зависимости от того как расположены операторы (в одну ли строку) - ведь разница в байткоде - как раз в наличие отладочных опкодов.
15. SlavaKron 28.10.19 15:49 Сейчас в теме
(13) У меня Новый Массив(7) выиграл.
На Intel Core i3-6100 @ 3.70GHz, 1 млн. итераций:
Новый Массив(7) ~ 2200 мс
СтрРазделить() ~ 2900 мс
16. Sashares 34 28.10.19 15:52 Сейчас в теме
(15)Подозреваю, если значения строковые будут больше по длине и/или самих значений будет больше 7, то результат может быть совсем другим.
18. masterkio 334 28.10.19 17:10 Сейчас в теме
(5) Попробуйте для способа

РезультатСоздания = Новый Массив;
РезультатСоздания.Добавить("Понедельник");
РезультатСоздания.Добавить("Вторник");
РезультатСоздания.Добавить("Среда");
РезультатСоздания.Добавить("Четверг");
РезультатСоздания.Добавить("Пятница");
РезультатСоздания.Добавить("Суббота");
РезультатСоздания.Добавить("Воскресенье");

Убрать переносы строк, т.е. написать весь этот код в одну строку. На большом количестве итераций цикла это очень сильно может повлиять на результат.
52. v.l. 434 05.11.19 20:43 Сейчас в теме
(18) Прям семерочный лайфхак. Точно в восьмерке работает? То есть опять в модулях читать ВойнуИМирВырженнуюВОднойСтрокеАжДоГоризонтаИДальше?
53. SeiOkami 3423 06.11.19 06:05 Сейчас в теме
(52) это, действительно, работает. Однако, прирост минимальный и даёт хоть какой-то выигрыш только на сложных циклах
55. masterkio 334 06.11.19 14:05 Сейчас в теме
(53)
Сам был удивлен на сколько сильно это может влиять.
Для циклов с большим количеством итераций и простым действием внутри это может влиять очень существенно.
Так же как-то делал задачу, как раз по заполнению большого массива, прирост скорости за счет такой манипуляции может быть в несколько раз, т.е. он не минимальный, а огромный для такого рода задачи.
56. SeiOkami 3423 06.11.19 14:20 Сейчас в теме
(55) согласен, для ряда задач оптимизация может быть неплохой
кстати, встречал такой способ "оптимизации":

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

а рядом вставляют тот же самый код, но "одной строкой".

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

И рыбку съел и код отладил)
57. Sashares 34 06.11.19 14:34 Сейчас в теме
(56) А кто-то поправил код в одной строке и не поправил дублирующийся код выше.
Или наоборот поправил "нормальный код" и не перенес в одну строку.
И зачем оно такое надо? Мало ошибок?
59. SeiOkami 3423 06.11.19 14:56 Сейчас в теме
(57) на какие риски только не идут разработчики, чтобы ускорить свой продукт...
58. masterkio 334 06.11.19 14:42 Сейчас в теме
(56)
(57)
Понятно, что такие задачи очень редко встречаются, когда такое нужно использовать, поэтому я скорее ЗА нормальный код, который не исполняется, и рядом в одну строку. Тут достаточно рядом со "строкой" написать соответствующий комментарий, в противном случае ни прочитать нормально, ни доработать не получиться.
60. herfis 498 06.11.19 17:10 Сейчас в теме
(58) Одностроки и прочие извраты имеют практический смысл только в реализации алгоритмов прикладной математики на 1С. На типичных же одинэсных задачах, в которых львиную долю времени выполнения занимает работа с БД, это имеет отрицательный практический смысл.
54. herfis 498 06.11.19 11:29 Сейчас в теме
(52) В восьмерке арифметика и интерпретация не быстрее семерочной. Местами даже медленнее. Так что еще как работает. Как и все другие старые добрые лайфхаки типа ограничения разрядности вычислений.
Просто обычно это смысла не имеет, т.к. "числодробилки" на 1С - большая редкость.
47. AlexandrSmith 68 30.10.19 13:51 Сейчас в теме
(5) Довольно приятная статья. Хорошо все описано, добротно. С толком, с расстановкой.
6. dock 44 28.10.19 13:39 Сейчас в теме
Это всё прекрасно и замечательно, но вот вопрос: а что делать бедному программисту, если требуется коллекция с НЕ строковыми значениями :) ?
27. Darklight 32 29.10.19 12:25 Сейчас в теме
(6)Ну использовать Новый Структуру("з1, з2, з3", КакоетоЗначение1, КакоетоЗначение2, КакоетоЗначение3)

А у меня ещё вот такая функция есть


//Функция СОЗДАЁТ новый массив по переданным параметрам значений (до 100 элементов)
//Параметры:
//	Размер - число - количество переданных значений в аргументах з1..з100
//	з1		- проивзольный - з1,...,з100 - 100 параметров, которые определяетют ключ и знчаения массива
//                 Значение по умолчанию = null, значения неопределено необходимо передавать явно
//			- Если размер не указан, то он вычисляется автоматически до первого null элемента
//Возвращаемое значение:
//	Созданый Массив
//	
функция Массив(Размер=неопределено, з1=null,з2=null,з3=null,з4=null,з5=null,з6=null,з7=null,з8=null,з9=null,з10=null,з11=null,з12=null,з13=null,з14=null,з15=null,з16=null,з17=null,з18=null,з19=null,з20=null,з21=null,з22=null,з23=null,з24=null,з25=null,з26=null,з27=null,з28=null,з29=null,з30=null,з31=null,з32=null,з33=null,з34=null,з35=null,з36=null,з37=null,з38=null,з39=null,з40=null,з41=null,з42=null,з43=null,з44=null,з45=null,з46=null,з47=null,з48=null,з49=null,з50=null,з51=null,з52=null,з53=null,з54=null,з55=null,з56=null,з57=null,з58=null,з59=null,з60=null,з61=null,з62=null,з63=null,з64=null,з65=null,з66=null,з67=null,з68=null,з69=null,з70=null,з71=null,з72=null,з73=null,з74=null,з75=null,з76=null,з77=null,з78=null,з79=null,з80=null,з81=null,з82=null,з83=null,з84=null,з85=null,з86=null,з87=null,з88=null,з89=null,з90=null,з91=null,з92=null,з93=null,з94=null,з95=null,з96=null,з97=null,з98=null,з99=null,з100=null) экспорт
	Если Размер <> неопределено Тогда
		М = Новый Массив(Размер);
		
		М[0] = з1; Если 1=Размер Тогда Возврат М КонецЕсли;
		М[1] = з2; Если 2=Размер Тогда Возврат М КонецЕсли;
		М[2] = з3; Если 3=Размер Тогда Возврат М КонецЕсли;
		М[3] = з4; Если 4=Размер Тогда Возврат М КонецЕсли;
		М[4] = з5; Если 5=Размер Тогда Возврат М КонецЕсли;
		М[5] = з6; Если 6=Размер Тогда Возврат М КонецЕсли;
		М[6] = з7; Если 7=Размер Тогда Возврат М КонецЕсли;
		М[7] = з8; Если 8=Размер Тогда Возврат М КонецЕсли;
		М[8] = з9; Если 9=Размер Тогда Возврат М КонецЕсли;
		М[9] = з10; Если 10=Размер Тогда Возврат М КонецЕсли;
		М[10] = з11; Если 11=Размер Тогда Возврат М КонецЕсли;
		М[11] = з12; Если 12=Размер Тогда Возврат М КонецЕсли;
		М[12] = з13; Если 13=Размер Тогда Возврат М КонецЕсли;
		М[13] = з14; Если 14=Размер Тогда Возврат М КонецЕсли;
		М[14] = з15; Если 15=Размер Тогда Возврат М КонецЕсли;
		М[15] = з16; Если 16=Размер Тогда Возврат М КонецЕсли;
		М[16] = з17; Если 17=Размер Тогда Возврат М КонецЕсли;
		М[17] = з18; Если 18=Размер Тогда Возврат М КонецЕсли;
		М[18] = з19; Если 19=Размер Тогда Возврат М КонецЕсли;
		М[19] = з20; Если 20=Размер Тогда Возврат М КонецЕсли;
		М[20] = з21; Если 21=Размер Тогда Возврат М КонецЕсли;
		М[21] = з22; Если 22=Размер Тогда Возврат М КонецЕсли;
		М[22] = з23; Если 23=Размер Тогда Возврат М КонецЕсли;
		М[23] = з24; Если 24=Размер Тогда Возврат М КонецЕсли;
		М[24] = з25; Если 25=Размер Тогда Возврат М КонецЕсли;
		М[25] = з26; Если 26=Размер Тогда Возврат М КонецЕсли;
		М[26] = з27; Если 27=Размер Тогда Возврат М КонецЕсли;
		М[27] = з28; Если 28=Размер Тогда Возврат М КонецЕсли;
		М[28] = з29; Если 29=Размер Тогда Возврат М КонецЕсли;
		М[29] = з30; Если 30=Размер Тогда Возврат М КонецЕсли;
		М[30] = з31; Если 31=Размер Тогда Возврат М КонецЕсли;
		М[31] = з32; Если 32=Размер Тогда Возврат М КонецЕсли;
		М[32] = з33; Если 33=Размер Тогда Возврат М КонецЕсли;
		М[33] = з34; Если 34=Размер Тогда Возврат М КонецЕсли;
		М[34] = з35; Если 35=Размер Тогда Возврат М КонецЕсли;
		М[35] = з36; Если 36=Размер Тогда Возврат М КонецЕсли;
		М[36] = з37; Если 37=Размер Тогда Возврат М КонецЕсли;
		М[37] = з38; Если 38=Размер Тогда Возврат М КонецЕсли;
		М[38] = з39; Если 39=Размер Тогда Возврат М КонецЕсли;
		М[39] = з40; Если 40=Размер Тогда Возврат М КонецЕсли;
		М[40] = з41; Если 41=Размер Тогда Возврат М КонецЕсли;
		М[41] = з42; Если 42=Размер Тогда Возврат М КонецЕсли;
		М[42] = з43; Если 43=Размер Тогда Возврат М КонецЕсли;
		М[43] = з44; Если 44=Размер Тогда Возврат М КонецЕсли;
		М[44] = з45; Если 45=Размер Тогда Возврат М КонецЕсли;
		М[45] = з46; Если 46=Размер Тогда Возврат М КонецЕсли;
		М[46] = з47; Если 47=Размер Тогда Возврат М КонецЕсли;
		М[47] = з48; Если 48=Размер Тогда Возврат М КонецЕсли;
		М[48] = з49; Если 49=Размер Тогда Возврат М КонецЕсли;
		М[49] = з50; Если 50=Размер Тогда Возврат М КонецЕсли;
		М[50] = з51; Если 51=Размер Тогда Возврат М КонецЕсли;
		М[51] = з52; Если 52=Размер Тогда Возврат М КонецЕсли;
		М[52] = з53; Если 53=Размер Тогда Возврат М КонецЕсли;
		М[53] = з54; Если 54=Размер Тогда Возврат М КонецЕсли;
		М[54] = з55; Если 55=Размер Тогда Возврат М КонецЕсли;
		М[55] = з56; Если 56=Размер Тогда Возврат М КонецЕсли;
		М[56] = з57; Если 57=Размер Тогда Возврат М КонецЕсли;
		М[57] = з58; Если 58=Размер Тогда Возврат М КонецЕсли;
		М[58] = з59; Если 59=Размер Тогда Возврат М КонецЕсли;
		М[59] = з60; Если 60=Размер Тогда Возврат М КонецЕсли;
		М[60] = з61; Если 61=Размер Тогда Возврат М КонецЕсли;
		М[61] = з62; Если 62=Размер Тогда Возврат М КонецЕсли;
		М[62] = з63; Если 63=Размер Тогда Возврат М КонецЕсли;
		М[63] = з64; Если 64=Размер Тогда Возврат М КонецЕсли;
		М[64] = з65; Если 65=Размер Тогда Возврат М КонецЕсли;
		М[65] = з66; Если 66=Размер Тогда Возврат М КонецЕсли;
		М[66] = з67; Если 67=Размер Тогда Возврат М КонецЕсли;
		М[67] = з68; Если 68=Размер Тогда Возврат М КонецЕсли;
		М[68] = з69; Если 69=Размер Тогда Возврат М КонецЕсли;
		М[69] = з70; Если 70=Размер Тогда Возврат М КонецЕсли;
		М[70] = з71; Если 71=Размер Тогда Возврат М КонецЕсли;
		М[71] = з72; Если 72=Размер Тогда Возврат М КонецЕсли;
		М[72] = з73; Если 73=Размер Тогда Возврат М КонецЕсли;
		М[73] = з74; Если 74=Размер Тогда Возврат М КонецЕсли;
		М[74] = з75; Если 75=Размер Тогда Возврат М КонецЕсли;
		М[75] = з76; Если 76=Размер Тогда Возврат М КонецЕсли;
		М[76] = з77; Если 77=Размер Тогда Возврат М КонецЕсли;
		М[77] = з78; Если 78=Размер Тогда Возврат М КонецЕсли;
		М[78] = з79; Если 79=Размер Тогда Возврат М КонецЕсли;
		М[79] = з80; Если 80=Размер Тогда Возврат М КонецЕсли;
		М[80] = з81; Если 81=Размер Тогда Возврат М КонецЕсли;
		М[81] = з82; Если 82=Размер Тогда Возврат М КонецЕсли;
		М[82] = з83; Если 83=Размер Тогда Возврат М КонецЕсли;
		М[83] = з84; Если 84=Размер Тогда Возврат М КонецЕсли;
		М[84] = з85; Если 85=Размер Тогда Возврат М КонецЕсли;
		М[85] = з86; Если 86=Размер Тогда Возврат М КонецЕсли;
		М[86] = з87; Если 87=Размер Тогда Возврат М КонецЕсли;
		М[87] = з88; Если 88=Размер Тогда Возврат М КонецЕсли;
		М[88] = з89; Если 89=Размер Тогда Возврат М КонецЕсли;
		М[89] = з90; Если 90=Размер Тогда Возврат М КонецЕсли;
		М[90] = з91; Если 91=Размер Тогда Возврат М КонецЕсли;
		М[91] = з92; Если 92=Размер Тогда Возврат М КонецЕсли;
		М[92] = з93; Если 93=Размер Тогда Возврат М КонецЕсли;
		М[93] = з94; Если 94=Размер Тогда Возврат М КонецЕсли;
		М[94] = з95; Если 95=Размер Тогда Возврат М КонецЕсли;
		М[95] = з96; Если 96=Размер Тогда Возврат М КонецЕсли;
		М[96] = з97; Если 97=Размер Тогда Возврат М КонецЕсли;
		М[97] = з98; Если 98=Размер Тогда Возврат М КонецЕсли;
		М[98] = з99; Если 99=Размер Тогда Возврат М КонецЕсли;
		М[99] = з100; Если 100=Размер Тогда Возврат М КонецЕсли;
				
	Иначе
		М = Новый Массив();
		
		Если з1 <> null Тогда М.Добавить(з1) КонецЕсли;
		Если з2 <> null Тогда М.Добавить(з2) КонецЕсли;
		Если з3 <> null Тогда М.Добавить(з3) КонецЕсли;
		Если з4 <> null Тогда М.Добавить(з4) КонецЕсли;
		Если з5 <> null Тогда М.Добавить(з5) КонецЕсли;
		Если з6 <> null Тогда М.Добавить(з6) КонецЕсли;
		Если з7 <> null Тогда М.Добавить(з7) КонецЕсли;
		Если з8 <> null Тогда М.Добавить(з8) КонецЕсли;
		Если з9 <> null Тогда М.Добавить(з9) КонецЕсли;
		Если з10 <> null Тогда М.Добавить(з10) КонецЕсли;
		Если з11 <> null Тогда М.Добавить(з11) КонецЕсли;
		Если з12 <> null Тогда М.Добавить(з12) КонецЕсли;
		Если з13 <> null Тогда М.Добавить(з13) КонецЕсли;
		Если з14 <> null Тогда М.Добавить(з14) КонецЕсли;
		Если з15 <> null Тогда М.Добавить(з15) КонецЕсли;
		Если з16 <> null Тогда М.Добавить(з16) КонецЕсли;
		Если з17 <> null Тогда М.Добавить(з17) КонецЕсли;
		Если з18 <> null Тогда М.Добавить(з18) КонецЕсли;
		Если з19 <> null Тогда М.Добавить(з19) КонецЕсли;
		Если з20 <> null Тогда М.Добавить(з20) КонецЕсли;
		Если з21 <> null Тогда М.Добавить(з21) КонецЕсли;
		Если з22 <> null Тогда М.Добавить(з22) КонецЕсли;
		Если з23 <> null Тогда М.Добавить(з23) КонецЕсли;
		Если з24 <> null Тогда М.Добавить(з24) КонецЕсли;
		Если з25 <> null Тогда М.Добавить(з25) КонецЕсли;
		Если з26 <> null Тогда М.Добавить(з26) КонецЕсли;
		Если з27 <> null Тогда М.Добавить(з27) КонецЕсли;
		Если з28 <> null Тогда М.Добавить(з28) КонецЕсли;
		Если з29 <> null Тогда М.Добавить(з29) КонецЕсли;
		Если з30 <> null Тогда М.Добавить(з30) КонецЕсли;
		Если з31 <> null Тогда М.Добавить(з31) КонецЕсли;
		Если з32 <> null Тогда М.Добавить(з32) КонецЕсли;
		Если з33 <> null Тогда М.Добавить(з33) КонецЕсли;
		Если з34 <> null Тогда М.Добавить(з34) КонецЕсли;
		Если з35 <> null Тогда М.Добавить(з35) КонецЕсли;
		Если з36 <> null Тогда М.Добавить(з36) КонецЕсли;
		Если з37 <> null Тогда М.Добавить(з37) КонецЕсли;
		Если з38 <> null Тогда М.Добавить(з38) КонецЕсли;
		Если з39 <> null Тогда М.Добавить(з39) КонецЕсли;
		Если з40 <> null Тогда М.Добавить(з40) КонецЕсли;
		Если з41 <> null Тогда М.Добавить(з41) КонецЕсли;
		Если з42 <> null Тогда М.Добавить(з42) КонецЕсли;
		Если з43 <> null Тогда М.Добавить(з43) КонецЕсли;
		Если з44 <> null Тогда М.Добавить(з44) КонецЕсли;
		Если з45 <> null Тогда М.Добавить(з45) КонецЕсли;
		Если з46 <> null Тогда М.Добавить(з46) КонецЕсли;
		Если з47 <> null Тогда М.Добавить(з47) КонецЕсли;
		Если з48 <> null Тогда М.Добавить(з48) КонецЕсли;
		Если з49 <> null Тогда М.Добавить(з49) КонецЕсли;
		Если з50 <> null Тогда М.Добавить(з50) КонецЕсли;
		Если з51 <> null Тогда М.Добавить(з51) КонецЕсли;
		Если з52 <> null Тогда М.Добавить(з52) КонецЕсли;
		Если з53 <> null Тогда М.Добавить(з53) КонецЕсли;
		Если з54 <> null Тогда М.Добавить(з54) КонецЕсли;
		Если з55 <> null Тогда М.Добавить(з55) КонецЕсли;
		Если з56 <> null Тогда М.Добавить(з56) КонецЕсли;
		Если з57 <> null Тогда М.Добавить(з57) КонецЕсли;
		Если з58 <> null Тогда М.Добавить(з58) КонецЕсли;
		Если з59 <> null Тогда М.Добавить(з59) КонецЕсли;
		Если з60 <> null Тогда М.Добавить(з60) КонецЕсли;
		Если з61 <> null Тогда М.Добавить(з61) КонецЕсли;
		Если з62 <> null Тогда М.Добавить(з62) КонецЕсли;
		Если з63 <> null Тогда М.Добавить(з63) КонецЕсли;
		Если з64 <> null Тогда М.Добавить(з64) КонецЕсли;
		Если з65 <> null Тогда М.Добавить(з65) КонецЕсли;
		Если з66 <> null Тогда М.Добавить(з66) КонецЕсли;
		Если з67 <> null Тогда М.Добавить(з67) КонецЕсли;
		Если з68 <> null Тогда М.Добавить(з68) КонецЕсли;
		Если з69 <> null Тогда М.Добавить(з69) КонецЕсли;
		Если з70 <> null Тогда М.Добавить(з70) КонецЕсли;
		Если з71 <> null Тогда М.Добавить(з71) КонецЕсли;
		Если з72 <> null Тогда М.Добавить(з72) КонецЕсли;
		Если з73 <> null Тогда М.Добавить(з73) КонецЕсли;
		Если з74 <> null Тогда М.Добавить(з74) КонецЕсли;
		Если з75 <> null Тогда М.Добавить(з75) КонецЕсли;
		Если з76 <> null Тогда М.Добавить(з76) КонецЕсли;
		Если з77 <> null Тогда М.Добавить(з77) КонецЕсли;
		Если з78 <> null Тогда М.Добавить(з78) КонецЕсли;
		Если з79 <> null Тогда М.Добавить(з79) КонецЕсли;
		Если з80 <> null Тогда М.Добавить(з80) КонецЕсли;
		Если з81 <> null Тогда М.Добавить(з81) КонецЕсли;
		Если з82 <> null Тогда М.Добавить(з82) КонецЕсли;
		Если з83 <> null Тогда М.Добавить(з83) КонецЕсли;
		Если з84 <> null Тогда М.Добавить(з84) КонецЕсли;
		Если з85 <> null Тогда М.Добавить(з85) КонецЕсли;
		Если з86 <> null Тогда М.Добавить(з86) КонецЕсли;
		Если з87 <> null Тогда М.Добавить(з87) КонецЕсли;
		Если з88 <> null Тогда М.Добавить(з88) КонецЕсли;
		Если з89 <> null Тогда М.Добавить(з89) КонецЕсли;
		Если з90 <> null Тогда М.Добавить(з90) КонецЕсли;
		Если з91 <> null Тогда М.Добавить(з91) КонецЕсли;
		Если з92 <> null Тогда М.Добавить(з92) КонецЕсли;
		Если з93 <> null Тогда М.Добавить(з93) КонецЕсли;
		Если з94 <> null Тогда М.Добавить(з94) КонецЕсли;
		Если з95 <> null Тогда М.Добавить(з95) КонецЕсли;
		Если з96 <> null Тогда М.Добавить(з96) КонецЕсли;
		Если з97 <> null Тогда М.Добавить(з97) КонецЕсли;
		Если з98 <> null Тогда М.Добавить(з98) КонецЕсли;
		Если з99 <> null Тогда М.Добавить(з99) КонецЕсли;
		Если з100 <> null Тогда М.Добавить(з100) КонецЕсли;
		
		Возврат М;
	КонецЕсли;
КонецФункции


М = Массив(,1,2,3);

Для каждого з из М Цикл
	сообщить(з); //выведет 3 элемента
КонецЦикла;

М = Массив(2,Новый УникальныйИдентификатор,Новый УникальныйИдентификатор,Новый УникальныйИдентификатор);

Для каждого з из М Цикл
	сообщить(з); //выедет только 2 элемента
КонецЦикла;

Показать


Очень удобно (ну, функция у меня, конечно, посложнее (эту я сейчас отдельно тут написал кодогенерировал, так что лично эту реализацию функции не тестировал в "боевых условиях") - там много чего ещё накручено - в т.ч., ради чего затевалось, есть ещё и кеширование в т.ч. поддержка повторного возвращения массива из кеша при тех же аргументах - что очень круто; ну и для структур/соответствий тоже свои функции есть - как-нибудь напишу статью про эту мою библиотеку функций)

Скорость выполнения такой функции тут, конечно, не является достоинством - эта функция для для других целей создавалась! Но, кое-какую оптимизацию тут сделать можно - но нужно ли.... мне нет ;-)
30. Darklight 32 29.10.19 14:15 Сейчас в теме
(27)Чутка оптимизировал функцию:
//Функция СОЗДАЁТ новый массив по переданным параметрам значений (до 100 элементов)
//Параметры:
//	Размер - число - количество переданных значений в аргументах з1..з100
//	з1		- проивзольный - з1,...,з100 - 100 параметров, которые определяетют ключ и знчаения массива
//                 Значение по умолчанию = null, значения неопределено необходимо передавать явно
//			- Если размер не указан, то он вычисляется автоматически до первого null элемента
//Возвращаемое значение:
//	Созданый Массив
//	
функция Массив(Размер=неопределено, з1=null,з2=null,з3=null,з4=null,з5=null,з6=null,з7=null,з8=null,з9=null,з10=null,з11=null,з12=null,з13=null,з14=null,з15=null,з16=null,з17=null,з18=null,з19=null,з20=null,з21=null,з22=null,з23=null,з24=null,з25=null,з26=null,з27=null,з28=null,з29=null,з30=null,з31=null,з32=null,з33=null,з34=null,з35=null,з36=null,з37=null,з38=null,з39=null,з40=null,з41=null,з42=null,з43=null,з44=null,з45=null,з46=null,з47=null,з48=null,з49=null,з50=null,з51=null,з52=null,з53=null,з54=null,з55=null,з56=null,з57=null,з58=null,з59=null,з60=null,з61=null,з62=null,з63=null,з64=null,з65=null,з66=null,з67=null,з68=null,з69=null,з70=null,з71=null,з72=null,з73=null,з74=null,з75=null,з76=null,з77=null,з78=null,з79=null,з80=null,з81=null,з82=null,з83=null,з84=null,з85=null,з86=null,з87=null,з88=null,з89=null,з90=null,з91=null,з92=null,з93=null,з94=null,з95=null,з96=null,з97=null,з98=null,з99=null,з100=null) экспорт
	Если Размер <> неопределено Тогда
		М = Новый Массив(Размер);
		
		Если Размер<=0 Тогда Возврат М КонецЕсли;
		М[0] = з1; Если Размер=1 Тогда Возврат М КонецЕсли;
		М[1] = з2; Если Размер=2 Тогда Возврат М КонецЕсли;
		М[2] = з3; Если Размер=3 Тогда Возврат М КонецЕсли;
		М[3] = з4; Если Размер=4 Тогда Возврат М КонецЕсли;
		М[4] = з5; Если Размер=5 Тогда Возврат М КонецЕсли;
		М[5] = з6; Если Размер=6 Тогда Возврат М КонецЕсли;
		М[6] = з7; Если Размер=7 Тогда Возврат М КонецЕсли;
		М[7] = з8; Если Размер=8 Тогда Возврат М КонецЕсли;
		М[8] = з9; Если Размер=9 Тогда Возврат М КонецЕсли;
		М[9] = з10; Если Размер=10 Тогда Возврат М КонецЕсли;
		М[10] = з11; Если Размер=11 Тогда Возврат М КонецЕсли;
		М[11] = з12; Если Размер=12 Тогда Возврат М КонецЕсли;
		М[12] = з13; Если Размер=13 Тогда Возврат М КонецЕсли;
		М[13] = з14; Если Размер=14 Тогда Возврат М КонецЕсли;
		М[14] = з15; Если Размер=15 Тогда Возврат М КонецЕсли;
		М[15] = з16; Если Размер=16 Тогда Возврат М КонецЕсли;
		М[16] = з17; Если Размер=17 Тогда Возврат М КонецЕсли;
		М[17] = з18; Если Размер=18 Тогда Возврат М КонецЕсли;
		М[18] = з19; Если Размер=19 Тогда Возврат М КонецЕсли;
		М[19] = з20; Если Размер=20 Тогда Возврат М КонецЕсли;
		М[20] = з21; Если Размер=21 Тогда Возврат М КонецЕсли;
		М[21] = з22; Если Размер=22 Тогда Возврат М КонецЕсли;
		М[22] = з23; Если Размер=23 Тогда Возврат М КонецЕсли;
		М[23] = з24; Если Размер=24 Тогда Возврат М КонецЕсли;
		М[24] = з25; Если Размер=25 Тогда Возврат М КонецЕсли;
		М[25] = з26; Если Размер=26 Тогда Возврат М КонецЕсли;
		М[26] = з27; Если Размер=27 Тогда Возврат М КонецЕсли;
		М[27] = з28; Если Размер=28 Тогда Возврат М КонецЕсли;
		М[28] = з29; Если Размер=29 Тогда Возврат М КонецЕсли;
		М[29] = з30; Если Размер=30 Тогда Возврат М КонецЕсли;
		М[30] = з31; Если Размер=31 Тогда Возврат М КонецЕсли;
		М[31] = з32; Если Размер=32 Тогда Возврат М КонецЕсли;
		М[32] = з33; Если Размер=33 Тогда Возврат М КонецЕсли;
		М[33] = з34; Если Размер=34 Тогда Возврат М КонецЕсли;
		М[34] = з35; Если Размер=35 Тогда Возврат М КонецЕсли;
		М[35] = з36; Если Размер=36 Тогда Возврат М КонецЕсли;
		М[36] = з37; Если Размер=37 Тогда Возврат М КонецЕсли;
		М[37] = з38; Если Размер=38 Тогда Возврат М КонецЕсли;
		М[38] = з39; Если Размер=39 Тогда Возврат М КонецЕсли;
		М[39] = з40; Если Размер=40 Тогда Возврат М КонецЕсли;
		М[40] = з41; Если Размер=41 Тогда Возврат М КонецЕсли;
		М[41] = з42; Если Размер=42 Тогда Возврат М КонецЕсли;
		М[42] = з43; Если Размер=43 Тогда Возврат М КонецЕсли;
		М[43] = з44; Если Размер=44 Тогда Возврат М КонецЕсли;
		М[44] = з45; Если Размер=45 Тогда Возврат М КонецЕсли;
		М[45] = з46; Если Размер=46 Тогда Возврат М КонецЕсли;
		М[46] = з47; Если Размер=47 Тогда Возврат М КонецЕсли;
		М[47] = з48; Если Размер=48 Тогда Возврат М КонецЕсли;
		М[48] = з49; Если Размер=49 Тогда Возврат М КонецЕсли;
		М[49] = з50; Если Размер=50 Тогда Возврат М КонецЕсли;
		М[50] = з51; Если Размер=51 Тогда Возврат М КонецЕсли;
		М[51] = з52; Если Размер=52 Тогда Возврат М КонецЕсли;
		М[52] = з53; Если Размер=53 Тогда Возврат М КонецЕсли;
		М[53] = з54; Если Размер=54 Тогда Возврат М КонецЕсли;
		М[54] = з55; Если Размер=55 Тогда Возврат М КонецЕсли;
		М[55] = з56; Если Размер=56 Тогда Возврат М КонецЕсли;
		М[56] = з57; Если Размер=57 Тогда Возврат М КонецЕсли;
		М[57] = з58; Если Размер=58 Тогда Возврат М КонецЕсли;
		М[58] = з59; Если Размер=59 Тогда Возврат М КонецЕсли;
		М[59] = з60; Если Размер=60 Тогда Возврат М КонецЕсли;
		М[60] = з61; Если Размер=61 Тогда Возврат М КонецЕсли;
		М[61] = з62; Если Размер=62 Тогда Возврат М КонецЕсли;
		М[62] = з63; Если Размер=63 Тогда Возврат М КонецЕсли;
		М[63] = з64; Если Размер=64 Тогда Возврат М КонецЕсли;
		М[64] = з65; Если Размер=65 Тогда Возврат М КонецЕсли;
		М[65] = з66; Если Размер=66 Тогда Возврат М КонецЕсли;
		М[66] = з67; Если Размер=67 Тогда Возврат М КонецЕсли;
		М[67] = з68; Если Размер=68 Тогда Возврат М КонецЕсли;
		М[68] = з69; Если Размер=69 Тогда Возврат М КонецЕсли;
		М[69] = з70; Если Размер=70 Тогда Возврат М КонецЕсли;
		М[70] = з71; Если Размер=71 Тогда Возврат М КонецЕсли;
		М[71] = з72; Если Размер=72 Тогда Возврат М КонецЕсли;
		М[72] = з73; Если Размер=73 Тогда Возврат М КонецЕсли;
		М[73] = з74; Если Размер=74 Тогда Возврат М КонецЕсли;
		М[74] = з75; Если Размер=75 Тогда Возврат М КонецЕсли;
		М[75] = з76; Если Размер=76 Тогда Возврат М КонецЕсли;
		М[76] = з77; Если Размер=77 Тогда Возврат М КонецЕсли;
		М[77] = з78; Если Размер=78 Тогда Возврат М КонецЕсли;
		М[78] = з79; Если Размер=79 Тогда Возврат М КонецЕсли;
		М[79] = з80; Если Размер=80 Тогда Возврат М КонецЕсли;
		М[80] = з81; Если Размер=81 Тогда Возврат М КонецЕсли;
		М[81] = з82; Если Размер=82 Тогда Возврат М КонецЕсли;
		М[82] = з83; Если Размер=83 Тогда Возврат М КонецЕсли;
		М[83] = з84; Если Размер=84 Тогда Возврат М КонецЕсли;
		М[84] = з85; Если Размер=85 Тогда Возврат М КонецЕсли;
		М[85] = з86; Если Размер=86 Тогда Возврат М КонецЕсли;
		М[86] = з87; Если Размер=87 Тогда Возврат М КонецЕсли;
		М[87] = з88; Если Размер=88 Тогда Возврат М КонецЕсли;
		М[88] = з89; Если Размер=89 Тогда Возврат М КонецЕсли;
		М[89] = з90; Если Размер=90 Тогда Возврат М КонецЕсли;
		М[90] = з91; Если Размер=91 Тогда Возврат М КонецЕсли;
		М[91] = з92; Если Размер=92 Тогда Возврат М КонецЕсли;
		М[92] = з93; Если Размер=93 Тогда Возврат М КонецЕсли;
		М[93] = з94; Если Размер=94 Тогда Возврат М КонецЕсли;
		М[94] = з95; Если Размер=95 Тогда Возврат М КонецЕсли;
		М[95] = з96; Если Размер=96 Тогда Возврат М КонецЕсли;
		М[96] = з97; Если Размер=97 Тогда Возврат М КонецЕсли;
		М[97] = з98; Если Размер=98 Тогда Возврат М КонецЕсли;
		М[98] = з99; Если Размер=99 Тогда Возврат М КонецЕсли;
		М[99] = з100; Если Размер=100 Тогда Возврат М КонецЕсли;
				
	Иначе
		М = Новый Массив();
		
		Если з1 <> null Тогда М.Добавить(з1) Иначе возврат М КонецЕсли;
		Если з2 <> null Тогда М.Добавить(з2) Иначе возврат М КонецЕсли;
		Если з3 <> null Тогда М.Добавить(з3) Иначе возврат М КонецЕсли;
		Если з4 <> null Тогда М.Добавить(з4) Иначе возврат М КонецЕсли;
		Если з5 <> null Тогда М.Добавить(з5) Иначе возврат М КонецЕсли;
		Если з6 <> null Тогда М.Добавить(з6) Иначе возврат М КонецЕсли;
		Если з7 <> null Тогда М.Добавить(з7) Иначе возврат М КонецЕсли;
		Если з8 <> null Тогда М.Добавить(з8) Иначе возврат М КонецЕсли;
		Если з9 <> null Тогда М.Добавить(з9) Иначе возврат М КонецЕсли;
		Если з10 <> null Тогда М.Добавить(з10) Иначе возврат М КонецЕсли;
		Если з11 <> null Тогда М.Добавить(з11) Иначе возврат М КонецЕсли;
		Если з12 <> null Тогда М.Добавить(з12) Иначе возврат М КонецЕсли;
		Если з13 <> null Тогда М.Добавить(з13) Иначе возврат М КонецЕсли;
		Если з14 <> null Тогда М.Добавить(з14) Иначе возврат М КонецЕсли;
		Если з15 <> null Тогда М.Добавить(з15) Иначе возврат М КонецЕсли;
		Если з16 <> null Тогда М.Добавить(з16) Иначе возврат М КонецЕсли;
		Если з17 <> null Тогда М.Добавить(з17) Иначе возврат М КонецЕсли;
		Если з18 <> null Тогда М.Добавить(з18) Иначе возврат М КонецЕсли;
		Если з19 <> null Тогда М.Добавить(з19) Иначе возврат М КонецЕсли;
		Если з20 <> null Тогда М.Добавить(з20) Иначе возврат М КонецЕсли;
		Если з21 <> null Тогда М.Добавить(з21) Иначе возврат М КонецЕсли;
		Если з22 <> null Тогда М.Добавить(з22) Иначе возврат М КонецЕсли;
		Если з23 <> null Тогда М.Добавить(з23) Иначе возврат М КонецЕсли;
		Если з24 <> null Тогда М.Добавить(з24) Иначе возврат М КонецЕсли;
		Если з25 <> null Тогда М.Добавить(з25) Иначе возврат М КонецЕсли;
		Если з26 <> null Тогда М.Добавить(з26) Иначе возврат М КонецЕсли;
		Если з27 <> null Тогда М.Добавить(з27) Иначе возврат М КонецЕсли;
		Если з28 <> null Тогда М.Добавить(з28) Иначе возврат М КонецЕсли;
		Если з29 <> null Тогда М.Добавить(з29) Иначе возврат М КонецЕсли;
		Если з30 <> null Тогда М.Добавить(з30) Иначе возврат М КонецЕсли;
		Если з31 <> null Тогда М.Добавить(з31) Иначе возврат М КонецЕсли;
		Если з32 <> null Тогда М.Добавить(з32) Иначе возврат М КонецЕсли;
		Если з33 <> null Тогда М.Добавить(з33) Иначе возврат М КонецЕсли;
		Если з34 <> null Тогда М.Добавить(з34) Иначе возврат М КонецЕсли;
		Если з35 <> null Тогда М.Добавить(з35) Иначе возврат М КонецЕсли;
		Если з36 <> null Тогда М.Добавить(з36) Иначе возврат М КонецЕсли;
		Если з37 <> null Тогда М.Добавить(з37) Иначе возврат М КонецЕсли;
		Если з38 <> null Тогда М.Добавить(з38) Иначе возврат М КонецЕсли;
		Если з39 <> null Тогда М.Добавить(з39) Иначе возврат М КонецЕсли;
		Если з40 <> null Тогда М.Добавить(з40) Иначе возврат М КонецЕсли;
		Если з41 <> null Тогда М.Добавить(з41) Иначе возврат М КонецЕсли;
		Если з42 <> null Тогда М.Добавить(з42) Иначе возврат М КонецЕсли;
		Если з43 <> null Тогда М.Добавить(з43) Иначе возврат М КонецЕсли;
		Если з44 <> null Тогда М.Добавить(з44) Иначе возврат М КонецЕсли;
		Если з45 <> null Тогда М.Добавить(з45) Иначе возврат М КонецЕсли;
		Если з46 <> null Тогда М.Добавить(з46) Иначе возврат М КонецЕсли;
		Если з47 <> null Тогда М.Добавить(з47) Иначе возврат М КонецЕсли;
		Если з48 <> null Тогда М.Добавить(з48) Иначе возврат М КонецЕсли;
		Если з49 <> null Тогда М.Добавить(з49) Иначе возврат М КонецЕсли;
		Если з50 <> null Тогда М.Добавить(з50) Иначе возврат М КонецЕсли;
		Если з51 <> null Тогда М.Добавить(з51) Иначе возврат М КонецЕсли;
		Если з52 <> null Тогда М.Добавить(з52) Иначе возврат М КонецЕсли;
		Если з53 <> null Тогда М.Добавить(з53) Иначе возврат М КонецЕсли;
		Если з54 <> null Тогда М.Добавить(з54) Иначе возврат М КонецЕсли;
		Если з55 <> null Тогда М.Добавить(з55) Иначе возврат М КонецЕсли;
		Если з56 <> null Тогда М.Добавить(з56) Иначе возврат М КонецЕсли;
		Если з57 <> null Тогда М.Добавить(з57) Иначе возврат М КонецЕсли;
		Если з58 <> null Тогда М.Добавить(з58) Иначе возврат М КонецЕсли;
		Если з59 <> null Тогда М.Добавить(з59) Иначе возврат М КонецЕсли;
		Если з60 <> null Тогда М.Добавить(з60) Иначе возврат М КонецЕсли;
		Если з61 <> null Тогда М.Добавить(з61) Иначе возврат М КонецЕсли;
		Если з62 <> null Тогда М.Добавить(з62) Иначе возврат М КонецЕсли;
		Если з63 <> null Тогда М.Добавить(з63) Иначе возврат М КонецЕсли;
		Если з64 <> null Тогда М.Добавить(з64) Иначе возврат М КонецЕсли;
		Если з65 <> null Тогда М.Добавить(з65) Иначе возврат М КонецЕсли;
		Если з66 <> null Тогда М.Добавить(з66) Иначе возврат М КонецЕсли;
		Если з67 <> null Тогда М.Добавить(з67) Иначе возврат М КонецЕсли;
		Если з68 <> null Тогда М.Добавить(з68) Иначе возврат М КонецЕсли;
		Если з69 <> null Тогда М.Добавить(з69) Иначе возврат М КонецЕсли;
		Если з70 <> null Тогда М.Добавить(з70) Иначе возврат М КонецЕсли;
		Если з71 <> null Тогда М.Добавить(з71) Иначе возврат М КонецЕсли;
		Если з72 <> null Тогда М.Добавить(з72) Иначе возврат М КонецЕсли;
		Если з73 <> null Тогда М.Добавить(з73) Иначе возврат М КонецЕсли;
		Если з74 <> null Тогда М.Добавить(з74) Иначе возврат М КонецЕсли;
		Если з75 <> null Тогда М.Добавить(з75) Иначе возврат М КонецЕсли;
		Если з76 <> null Тогда М.Добавить(з76) Иначе возврат М КонецЕсли;
		Если з77 <> null Тогда М.Добавить(з77) Иначе возврат М КонецЕсли;
		Если з78 <> null Тогда М.Добавить(з78) Иначе возврат М КонецЕсли;
		Если з79 <> null Тогда М.Добавить(з79) Иначе возврат М КонецЕсли;
		Если з80 <> null Тогда М.Добавить(з80) Иначе возврат М КонецЕсли;
		Если з81 <> null Тогда М.Добавить(з81) Иначе возврат М КонецЕсли;
		Если з82 <> null Тогда М.Добавить(з82) Иначе возврат М КонецЕсли;
		Если з83 <> null Тогда М.Добавить(з83) Иначе возврат М КонецЕсли;
		Если з84 <> null Тогда М.Добавить(з84) Иначе возврат М КонецЕсли;
		Если з85 <> null Тогда М.Добавить(з85) Иначе возврат М КонецЕсли;
		Если з86 <> null Тогда М.Добавить(з86) Иначе возврат М КонецЕсли;
		Если з87 <> null Тогда М.Добавить(з87) Иначе возврат М КонецЕсли;
		Если з88 <> null Тогда М.Добавить(з88) Иначе возврат М КонецЕсли;
		Если з89 <> null Тогда М.Добавить(з89) Иначе возврат М КонецЕсли;
		Если з90 <> null Тогда М.Добавить(з90) Иначе возврат М КонецЕсли;
		Если з91 <> null Тогда М.Добавить(з91) Иначе возврат М КонецЕсли;
		Если з92 <> null Тогда М.Добавить(з92) Иначе возврат М КонецЕсли;
		Если з93 <> null Тогда М.Добавить(з93) Иначе возврат М КонецЕсли;
		Если з94 <> null Тогда М.Добавить(з94) Иначе возврат М КонецЕсли;
		Если з95 <> null Тогда М.Добавить(з95) Иначе возврат М КонецЕсли;
		Если з96 <> null Тогда М.Добавить(з96) Иначе возврат М КонецЕсли;
		Если з97 <> null Тогда М.Добавить(з97) Иначе возврат М КонецЕсли;
		Если з98 <> null Тогда М.Добавить(з98) Иначе возврат М КонецЕсли;
		Если з99 <> null Тогда М.Добавить(з99) Иначе возврат М КонецЕсли;
		Если з100 <> null Тогда М.Добавить(з100) Иначе возврат М КонецЕсли;
		
		Возврат М;
	КонецЕсли;
КонецФункции
Показать
31. Sashares 34 29.10.19 14:22 Сейчас в теме
(30) О мои глаза...
Что за говнокод...

Хотите из переменных массив создавать, так хоть нормально напишите.
Создайте структуру, в нее присвойте значения переменных.
Обойдите в цикле структуру и присвойте значения в массив.
32. Darklight 32 29.10.19 14:40 Сейчас в теме
(31)Чует моя задница, что предложенное Вами решение по говнянности не уступет моему (если будет повторять тот же функционал)
34. Sashares 34 29.10.19 15:12 Сейчас в теме
(32)Но оно хотя бы будет не на 200 с лишним строк, а пара циклов))
36. Darklight 32 29.10.19 15:19 Сейчас в теме
(34)Эта функция создана "на скорую руку", и не для того, чтобы любоваться её внутренностями. А чтобы было ей удобно пользоваться при минимуме кода вызова, чтобы работала на всех клиентах и платформах, чтобы она не была узким местом производительности при многократном циклическом вызове (с допущением на универсальность), и чтобы была легко понятна.
В предлагаемом (описанном Вами лишь в общих чертах) способе - я сомневаюсь что будет хоть какое-то преимущество, кроме сокращения строк кода - которое, в общем-то, не несёт никакой практической полезности.

И да, как я уже написал выше, истоки данного подхода растут из другой задачи, где первопроходцем была функция создающая... хе-хе... Структуру. Но структуру - для применения в модулях повторного использования - т.е. временно-константную при повторном создании. Но это уже другая история.
37. Sashares 34 29.10.19 16:02 Сейчас в теме
(36) Пример со структурой:

Функция СоздатьМассив(Значение1,Значение2=NULL,Значение3=NULL,Значение4=NULL)
	
	СтруктураЗначений = Новый Структура("Значение1,Значение2,Значение3,Значение4",
		Значение1,Значение2,Значение3,Значение4);
		
	МойМассив = Новый Массив;
	
	Для Инд = 1 По 4 Цикл
		ТекЗначение = СтруктураЗначений["Значение"+Инд]; 
		Если ТекЗначение=NULL Тогда
			Прервать;
		КонецЕсли;
		МойМассив.Добавить(ТекЗначение);		
	КонецЦикла;
	
	Возврат МойМассив;
КонецФункции
Показать
38. Darklight 32 29.10.19 16:57 Сейчас в теме
(37) Для 4-х значений у Вас слишком много кода. Ну а для поддержки 100 (ЛИШЬ ПОТЕНЦИАЛЬНЫХ значений, которых могут передать и 40 и 10 и 1) - длинна кода может и не шибко изменится - но, вот, насколько просядет производительность - это ещё не известно, вот эти строчки очень настораживают если число элементов будет большим или функция будет вызываться очень часто в цикле:

 СтруктураЗначений = Новый Структура("Значение1,Значение2,Значение3,Значение4",
        Значение1,Значение2,Значение3,Значение4);


ТекЗначение = СтруктураЗначений["Значение"+Инд]; 


Я, конечно, согласен с тем, что 100 значений так передавать в массив это бред - и если кто-то хочет передать более 10-20 значений, то это уже явная архитектурная ошибка такого горе-программиста. Но, создав поддержку 100 значений я лишь хотел создать "видимость" поддержки неограниченного списка аргументов (что 1С поддерживает для своих объектов, но не поддерживает в пользовательских функциях и ВК)
39. Sashares 34 29.10.19 17:01 Сейчас в теме
(38) Создание структуры с заполненными параметрами выполняется быстро, значительно быстрее, чем создать пустую и вставлять значения.
Обращение к структуре по ключу тоже быстро.

Проседания производительности в этих пунктах не будет.

Количество строк меняться не будет вне зависимости от количество переменных.
45. Darklight 32 30.10.19 12:54 Сейчас в теме
(39)Ну, я не сравнивал производительность (хотя добавление к строке числа в цикле меня немного смущает). Ваш вариант тоже вполне имеет право на существование, тем более, задачи, в которых возникает потребность в подобных функциях, почти 100% не критичны к производительности (по крайней мере в тех объёмах данных и частоте вызова, которые падают на плечи таких функций). Тут главное, чтобы было удобно и надёжно. Кому что нравится, пусть то и использует. Я вообще, написал тут функцию просто ради примера, а не как эталон
42. SeiOkami 3423 30.10.19 07:28 Сейчас в теме
(30)
помню, я раньше писал подобную функцию. Однако упёрся в ограничения платформы - если метод имеет больше N (не помню) параметров, то начинаются какая-то квантовая неопределенность с их значениями. Вы пробовали использовать метод с указанием, например, 50-ти значений?
46. Darklight 32 30.10.19 13:13 Сейчас в теме
(42)Честно, не пробовал - ибо, считаю что это уже бред! 100 параметров тут просто для вида - что их как бы неограниченно много (раз 1С: Предприятие не позволяет определять аргумент-список параметров, как в других языках есть - и даже в само 1С: Предприятие 8 такие использует в своих встроенных функциях). В оригинальной функции из моей библиотеки для передачи большого числа значений всё-таки есть поддержка передачи коллекций - но это там всё больше для галочки - ибо на практике такая функция принимает у меня не более десятка параметров-значений. Всё-таки в других случаях коллекцию нужно заполнять либо через Массив.Добавить() (а лучше через создание нужного размера и присвоения по индексу), либо откуда-то циклически загружать (ну из макета, например). Как я писал выше - цель у оригинальной функции была в другом - применять при кешировании через модули повторного использования - а там нужны "константные" аргументы функции.

Но ради любопытство попробовал запихнуть туда все 100 значений - проблем не наблюдаю

М = Массив(99, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100);

Для каждого з из М Цикл
	сообщить(з); //Последовательно выводит числа от 1 до 99 (т.к. ограничил 99 элементами в первом аргументе функции при создании массива)
КонецЦикла;

М = Массив(, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор, Новый УникальныйИдентификатор);

Для каждого з из М Цикл
	сообщить(з); //Выводит 100 строк уникальных идентификаторов
КонецЦикла;
Показать


Проверено на версии 1С: Предприятие 8.3.13.1513 в клиентском контексте обычного приложения
48. VmvLer 30.10.19 16:09 Сейчас в теме
(46)
Массив(99, 1, 2, 3, 4, ..N) - это вроде создание N-мерного массива, а не массива из N - элементов.
бессмысленная N-мерность - это бессмысленные затраты ОП.

В общем и целом обсуждение как и статья это какой-то парад чуши.
49. Darklight 32 30.10.19 17:05 Сейчас в теме
(48)Это не объект - это функция - и она описана выше
50. VmvLer 30.10.19 17:13 Сейчас в теме
(49) В общем и целом обсуждение...
я же привел аргумент для понимания
8. herfis 498 28.10.19 13:48 Сейчас в теме
У кого-то дофига свободного времени. Это не упрек. Исключительно зависть.
DennyPhilord; izidakg; +2 Ответить
10. Vasvas05 22 28.10.19 14:43 Сейчас в теме
(0) Попробуйте использовать в разделителе такие знаки";" в новой функции СтрРазделить, он криво обрабатывает, строку не делил на платформе 8.3.12.1714, поэтому старый добрый БСП РазложитьСтрокуВМассив еще долго будет использоваться.
11. SeiOkami 3423 28.10.19 14:49 Сейчас в теме
(10)
старый добрый БСП РазложитьСтрокуВМассив еще долго будет использоваться

Багов с ";" не встречал, всё нормально отрабатывает. А вот отличия у методов есть, описывал их здесь: Чем расщепить или "СтрРазделить() VS РазложитьСтрокуВМассивПодстрок()" ?

Однако, в контексте указанных в статье примеров нет в этом смысла, ведь входную строку пишет сам разработчик. Он может указать хоть ";" хоть ","
25. Vasvas05 22 29.10.19 11:41 Сейчас в теме
(11)платформа 8.3.12.1714 ? я же не просто так пишу, если вы не встречали, это еще не говорит о том, что этого нет. Я поделился своим наблюдением
24. Darklight 32 29.10.19 11:31 Сейчас в теме
(10)Я даже так делил
СтрРазделить(Строка, Символы.ПС)


и даже так

СтрРазделить(Строка, ","+Символы.ПС+Символы.Таб)


Нормально всё делится
23. Darklight 32 29.10.19 11:15 Сейчас в теме
Во-первых, если уж говорить о чистоте эксперимента то так писать "некошерно"
Если ТекущиеДанные.Метод = "СтрРазделить" Тогда
				
				ЗамеритьМетодСтрРазделить(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "НовыйСтруктура" Тогда
				
				ЗамеритьМетодНовыйСтруктура(ТекущиеДанные);
				
			ИначеЕсли ТекущиеДанные.Метод = "РазложитьСтрокуВМассивПодстрок" Тогда
				
				ЗамеритьМетодРазложитьСтрокуВМассивПодстрок(ТекущиеДанные);
				
			КонецЕсли;
Показать


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

Во, вторых - 7 значений для коллекции - это очень мало для сравнения - слишком уж быстро происходит такое создание - массива - тут начинают играть существенную роль всякие иные накладные расходы и процессы сервера и платформы . Опять таки, это важно для чистоты эксперимента. Тут, лучше было бы с числом подходов увеличивать количество элементов в строке (наборы все должны быть подготовлены заранее, сложнее всего тут с добавлением элементов напрямую в массив - но тут тоже нужны готовы наборы) - условно в геометрической прогрессии (на 10 шаге - были бы сотни миллионов - ну или округлить до миллиарда элементов - хм... интересно 1С справится с созданием такой коллекции; ну - я был ограничился хотя бы миллионом, ну или 8-ю подходами - около 5-10 миллионов элементов, смотря как наращивать). Ну а число итераций на подход нужно так же каждый раз на порядок сокращать (тогда начинать нужно как минимум с миллиарда итераций). Конечно, это всё только для чистоты эксперимента, а не демонстрации для практических примеров.

В-третьих, как уже сказали выше, для массива - очень важно создавать его с заданным количеством. Хотя, для 7 элементов, возможно, это не принципиально - (я конечно не знаю как там в недрах платформы 1С) т.к. в современных управляемых языках программирования (C#, Java...) коллекции по умолчанию создаются не с нулевой ёмкостью - а с некоторым заранее уже выделенным числом ячеек памяти (около 30 - но это не постоянная величина для версий и видов платформ) - и если в коллекцию будут добавлять элементы менее выделенной ёмкости - то это тоже самое что просто присваивать значения в этих ячейках - не будет затрат на выделение памяти при каждом дабавлении, ну а при исчерпании ёмкости обычно память выделяется так же - некоторыми порциями ячеек. Хотя, конечно, для указанных выше сценариев применения вряд ли так будут наполнять массив более чем с сотней элементов. Но для чистоты эксперимента важно и такое сравнение.

В-четвёртых, интересно было бы ещё сравнить - скорость - когда массив создаётся (заданной ёмкости заранее) - и в цикле только перезаполняется. Конечно, для указанных выше сценариев это почти не применимо, но для чистоты эксперимента - очень познавательно. И полезно для общего развития и применения в других сценариях

В-пятых, у 1С Предприятие 8 вообще всё очень плохо с оптимизацией кода (сдаётся её там вообще нет - поэтому для чистоты эксперимента код нужно писать как можно более линейным без циклов, вветвлений и вызовов функций - т.е. применить кодогенерацию), но даже это не поможет с отсутствием оптимизации у компилятора платформы. Хотя это и будет далеко от практических сценариев применения

В-шестых, получать готовый массив ещё можно так:
ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{7, {""S"",""Понедельник""}, {""S"",""Вторник""}, {""S"",""Среда""}, {""S"",""Четверг""}, {""S"",""Пятница""}, {""S"",""Суббота""}, {""S"",""Воскресенье""}}}")

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

В-седьмых, аналогичо можно попробовать и другие десериализации из XML и JSON (писать мне тут код лень)

В-восьмых, а что никто не вспомнил ещё более древний классический подход к разделению строки:

Строка = "Понедельник
		 |Вторник
		 |Среда
		 |Четверг
		 |Пятница
		 |Суббота
		 |Воскресенье";
								 	 
Для л=1 по СтрЧислоСтрок(Строка) Цикл
	Стр = СтрПолучитьСтроку(Строка, л);
	сообщить(Стр);						 
КонецЦикла;
Показать

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


В-девятых, а "прикола ради" (ну или для чистоты эксперимента) - было бы неплохо рассмотреть сравнение ещё и сериализацией аналогичных стратегий при выполнении на OneScript написанном на C# интерпретаторе языка 1С и ещё круче - на "Перфолента" - 1С подобном языке (со схожей библиотекой простых типов, в т.ч. коллекций), компилируемом в байткод платформы .NET и далее выполняемом с JIT компиляцией в машинных кодах (естественно JIT-компиляцию лучше не включать в замер). Чисто для сравнения производительности. Ну и уж совсем для чистоты - показать эталон скорости выполнения на чистом Си (ну или C++)


Конечно - всё выше сказанное мной - это только для чистоты эксперимента - на практике и СтрРазделить сойдёт очень даже хорошо, хотя....

В-десятых- Если писать код, который в будущем может дорабатываться другими программиста с сохранением поддержки обновления поставщиком (ну я про тиражируемые решения намекаю) - то писать лучше писать кода, так, чтобы в него легко можно было в доработках добавлять новые элементы (или удалять) - тут писать список в одну строку очень плохо - лучше всего каждый элемент располагать на отдельной строке - и тут использование Массив.Добавить() выглядит предпочтительнее - хотя для всех вышеописанных случаев и строку тоже можно разместить на разных строчках кода - но это просто будет сделать очень лениво и мало кто так будет делать:


								 
Для каждого Строка из 
Новый Структура ("	Понедельник,
				 |	Вторник,
				 |	Среда,
				 |	Четверг,
				 |	Пятница,
				 |	Суббота,
				 |	Воскресенье"
				 )	
Цикл
	сообщить(Строка.Ключ);						 
КонецЦикла;
Показать


И уж тем более так
Строка = "Понедельник,
		 |Вторник,
		 |Среда,
		 |Четверг,
		 |Пятница,
		 |Суббота,
		 |Воскресенье";
								 
								 
РезультатСоздания  = СтрРазделить(Строка, ","+Символы.ПС);
								 
Для каждого Строка из РезультатСоздания Цикл
	сообщить(Строка);						 
КонецЦикла;
Показать
artbear; muwa_; +2 Ответить
43. SeiOkami 3423 30.10.19 07:40 Сейчас в теме
(23)

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


Заметьте, замеры происходят внутри условий, а не снаружи. Об этом даже упоминалось в статье. Поэтому в данном моменте всё корректно)

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


Именно такое небольшое число и важно для чистоты эксперимента. Об этом тоже упоминал в статье. Дело в том, что мы здесь сравниваем именно такие ситуации, как указаны в примерах из типовых. Когда у разработчика должен быть заранее известный и чаще всего небольшой (!) массив. Например, если он хочет перебрать коллекции свойств метаданных "СтандартныеРеквизиты,Реквизиты,Измерения,Ресурсы,ТабличныеЧасти"

А вот сравнение самих методов парсинга "именно для парсинга" можно сделать отдельно. Там больше нюансов, чем в ситуациях из данной статьи.

В-третьих, как уже сказали выше, для массива - очень важно создавать его с заданным количеством.

Да, об этому будет в следующей статье. Почему в следующей? Потому что в данной мы рассмотрели самые частые способы создания наполненной коллекции. А вот создание массива с указанием количества элементов - это уже не так часто практикуется. Хотя зря!

В-шестых, получать готовый массив ещё можно так:

Этот эзотерический способ тожде будет в продолжении. Вряд ли кто будет его всерьёз использовать на проде, но ради интереса мы его приведём)

Ну и уж совсем для чистоты - показать эталон скорости выполнения на чистом Си (ну или C++)

А вот это интересно попробовать.

Спасибо за комментарий
63. alexqc 150 29.11.19 23:34 Сейчас в теме
(23)
СтрЧислоСтрок / СтрПолучитьСтроку 99.99% будет самым медленным, т.к СтрПолучитьСтроку каждый раз будет с начала строки считать.

Сравнение с чистым C/C++ смысла не имеет, т.к там массив создастся на этапе компиляции, а при выполнении максимум лишь скопируется куда надо. Если же массив будет что-то типа const static (или компилятор определит что он по факту таковым и является) -- то даже без копирования обойдется. С JIT-компиляцией почти то же самое будет. Так что если не учитывать сам JIT - ему дается серьезная фора.
64. Darklight 32 02.12.19 13:35 Сейчас в теме
(63)Говоря о сравнении с C++ речь шла о просто сравнении с эталоном - т.е. чтобы оценить - насколько "всё плохо" в 1С8.

А по поводу создания на этапе компиляции - тут уже писали - что с массивами в 1С нужно работать аналогично - сначала создавать пустой массив заданного размера (в конструкторе) - а потом просто наполнять его значениями, обращаясь по индексу (если нужна производительность).

Да, и говоря про С++ я, всё-таки, имел в виду сравнение с не с общепринятыми массивами 0 коих там по сути и нет - т.к. это просто указатели на область памяти статически заданного размера ячеек. Я, всё-таки имел в виду коллекции, хотя бы типа std:vector или std:list без статической инициализации - т.к. с ней сравнение уж точно не корректно (ибо в 1С8 её нет для объектных типов).

Упоминание же "СтрПолучитьСтроку" тоже нужно только для сравнения - чтобы было видно - насколько другие способы лучше (есть ли существенное преимущество у других способов) для коротких строк (про длинные, конечно, и говорить нечего). Ведь, как уже было сказано - СтрРазделить не доступна для конфигураций, без совместимости с 1С 8.3
28. swenzik 29.10.19 12:47 Сейчас в теме
вероятно Инокентий предложит брать массив из строк макета
33. qbdp 29.10.19 14:40 Сейчас в теме
В общем "СтрРазделить" - наглядный пример того, насколько важно уменьшать количество аллокаций памяти, и насколько быстрее может быть любой нативный код, в сравнении со встроенным языком 1С. (Капитан Очевидность передаёт привет)
40. PerlAmutor 129 29.10.19 21:35 Сейчас в теме
Может эти публикации еще натолкнут на какие-нибудь идеи:
https://infostart.ru/public/1116103/
https://infostart.ru/public/71130/#Pro_bystrye_massivy
sapervodichka; +1 Ответить
41. par_62 30.10.19 07:15 Сейчас в теме
Вернемся на землю. Рассуждения в статье интересны,если бы не одно но... Если бы мы писали драйверы устройств на языках мреднего и низкого уровня,тогда бы мы это обсуждали. А мы работаем в сфере бизнес логики,где гораздо важнее работа с базой данных. Тупое обращение в запросах или " умелый " поиск по таблице значений нивелмруют наши изощрения о СтрРазделить
44. SeiOkami 3423 30.10.19 07:43 Сейчас в теме
(41)
Именно такой вывод в конце статьи и делаем. Чтобы разработчики, посмотрев, не заморачивались и писали так, как будет удобно в данный момент. Потому что есть ряд программистов, которые думают, что если они опишут массив классическим созданием, то код будет выполняться заметно быстрее.
51. Darklight 32 05.11.19 13:32 Сейчас в теме
Про СтрРазделить нужно ещё упомянуть - что эта функция, относительно, не так давно появилась во встроенной библиотеке функций 1С Предприятие 8 (где-то в версии 8.3.7 - точный релиз не помню). Если конфигурация находится в режиме совместимости 8.2 (или ранее) - например "1С ЗУП 2.5 КОРП" или "1С: УПП" - то этой функции там не будет :-( правда для 1С УПП уж точно умеет смысл ВРУЧНУЮ перейти на режим совместимости 8.3.12 хотя бы - чтобы задействовать механизм снапшотов SQL Server (и много другой оптимизации платформы) и получить поддержку расширений. Хотя.... 1С УПП ведь уже не жилец (снимается с поддержки) - но лет 10 всё-таки она, наверняка, ещё будет актуальна в компаниях....

Но и помимо УПП есть ещё на 8.2: 1С Бух 2.0, 1С Управление торговлей 10 - и как минимуму УТ10 - ещё, видимо долго будет актуальна - и для неё тоже имеет смысл перевести вручную режим совместимости на 8.3, а без этого функция СтрРазделить там не будет доступна - и придётся использовать другой метод - например через Структуру
62. Darklight 32 07.11.19 16:40 Сейчас в теме
Кстати, вот ещё Вам тема для исследований, что быстрее при сравнени строки

Если Строка1  = Строка2 Тогда


или типовая функция из последних типовых конфигураций 1С

Функция СтрСравнить(Строка1, Строка2) Экспорт
		
	#Если ТолстыйКлиентОбычноеПриложение Тогда
	СравнениеСтрок = Новый СравнениеЗначений;
	
	Возврат СравнениеСтрок.Сравнить(Строка1, Строка2);
	
	#Иначе
		Возврат Неопределено;
	#КонецЕсли
	
КонецФункции
Показать


Ведь не зря же её добавили?
65. Devi 32 03.04.20 05:25 Сейчас в теме
Да уж РазложитьСтрокуВМассивПодстрок() типа победила??? И автора не смутило что процедура в одном из глобальных модулей??? И ни кого тут это тоже не смутило??? Ну дык пора кое кому удивится...

Ладно сам проверю - статья задела за что респект автору.
66. SeiOkami 3423 03.04.20 05:58 Сейчас в теме
(65) вы как-то не так статью читали)
РазложитьСтрокуВМассивПодстрок() не победила, а проиграла
67. AnryMc 849 27.09.21 13:58 Сейчас в теме
(66) Это при "Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье"
А если взять БСЭ (Большую советскую энциклопедию - по объему каждой подстроки) то тогда наверно вообще...
68. SeiOkami 3423 27.09.21 14:01 Сейчас в теме
(67) здесь речь про быстрое создание небольших коллекций с заранее известными значениями, а не просто разбор строк)

Хотя и с БСЭ должен победить СтрРазделить(). Всё таки на уровне платформы работает, а не прикладным кодом БСП.
69. МихаилМ 22.10.21 13:14 Сейчас в теме
проверьте ЗначениеИзСтрокиВнутненней ().
как правило - заметно быстрее.
а большие коллекции - из хз на 20% быстрее ЗначениеИзСтрокиВнутненней .
Оставьте свое сообщение