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

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

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

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

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

 

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

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

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

	//...

КонецЦикла;

 

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

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

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

	//...

КонецЦикла;

 

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

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

	//...

КонецЦикла;

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

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

 

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

 

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

 

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

 

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 раз» , то не переживайте — написав его обычным созданием массива вы вряд ли предотвратите образование узкого места будущего кода.

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

 

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

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

 

 

58

Специальные предложения

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

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

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


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

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

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

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

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

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

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

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

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

Нет =)
29. Darklight 19 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 18 28.10.19 15:52 Сейчас в теме
(15)Подозреваю, если значения строковые будут больше по длине и/или самих значений будет больше 7, то результат может быть совсем другим.
18. masterkio 207 28.10.19 17:10 Сейчас в теме
(5) Попробуйте для способа

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

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

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

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

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

И рыбку съел и код отладил)
57. Sashares 18 06.11.19 14:34 Сейчас в теме
(56) А кто-то поправил код в одной строке и не поправил дублирующийся код выше.
Или наоборот поправил "нормальный код" и не перенес в одну строку.
И зачем оно такое надо? Мало ошибок?
59. SeiOkami 1217 06.11.19 14:56 Сейчас в теме
(57) на какие риски только не идут разработчики, чтобы ускорить свой продукт...
58. masterkio 207 06.11.19 14:42 Сейчас в теме
(56)
(57)
Понятно, что такие задачи очень редко встречаются, когда такое нужно использовать, поэтому я скорее ЗА нормальный код, который не исполняется, и рядом в одну строку. Тут достаточно рядом со "строкой" написать соответствующий комментарий, в противном случае ни прочитать нормально, ни доработать не получиться.
60. herfis 284 06.11.19 17:10 Сейчас в теме
(58) Одностроки и прочие извраты имеют практический смысл только в реализации алгоритмов прикладной математики на 1С. На типичных же одинэсных задачах, в которых львиную долю времени выполнения занимает работа с БД, это имеет отрицательный практический смысл.
54. herfis 284 06.11.19 11:29 Сейчас в теме
(52) В восьмерке арифметика и интерпретация не быстрее семерочной. Местами даже медленнее. Так что еще как работает. Как и все другие старые добрые лайфхаки типа ограничения разрядности вычислений.
Просто обычно это смысла не имеет, т.к. "числодробилки" на 1С - большая редкость.
47. AlexandrSmith 46 30.10.19 13:51 Сейчас в теме
(5) Довольно приятная статья. Хорошо все описано, добротно. С толком, с расстановкой.
6. dock 35 28.10.19 13:39 Сейчас в теме
Это всё прекрасно и замечательно, но вот вопрос: а что делать бедному программисту, если требуется коллекция с НЕ строковыми значениями :) ?
27. Darklight 19 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 19 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 18 29.10.19 14:22 Сейчас в теме
(30) О мои глаза...
Что за говнокод...

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

И да, как я уже написал выше, истоки данного подхода растут из другой задачи, где первопроходцем была функция создающая... хе-хе... Структуру. Но структуру - для применения в модулях повторного использования - т.е. временно-константную при повторном создании. Но это уже другая история.
37. Sashares 18 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 19 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 18 29.10.19 17:01 Сейчас в теме
(38) Создание структуры с заполненными параметрами выполняется быстро, значительно быстрее, чем создать пустую и вставлять значения.
Обращение к структуре по ключу тоже быстро.

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

Количество строк меняться не будет вне зависимости от количество переменных.
45. Darklight 19 30.10.19 12:54 Сейчас в теме
(39)Ну, я не сравнивал производительность (хотя добавление к строке числа в цикле меня немного смущает). Ваш вариант тоже вполне имеет право на существование, тем более, задачи, в которых возникает потребность в подобных функциях, почти 100% не критичны к производительности (по крайней мере в тех объёмах данных и частоте вызова, которые падают на плечи таких функций). Тут главное, чтобы было удобно и надёжно. Кому что нравится, пусть то и использует. Я вообще, написал тут функцию просто ради примера, а не как эталон
42. SeiOkami 1217 30.10.19 07:28 Сейчас в теме
(30)
помню, я раньше писал подобную функцию. Однако упёрся в ограничения платформы - если метод имеет больше N (не помню) параметров, то начинаются какая-то квантовая неопределенность с их значениями. Вы пробовали использовать метод с указанием, например, 50-ти значений?
46. Darklight 19 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 19 30.10.19 17:05 Сейчас в теме
(48)Это не объект - это функция - и она описана выше
50. VmvLer 30.10.19 17:13 Сейчас в теме
(49) В общем и целом обсуждение...
я же привел аргумент для понимания
8. herfis 284 28.10.19 13:48 Сейчас в теме
У кого-то дофига свободного времени. Это не упрек. Исключительно зависть.
zShamaNz; izidakg; +2 Ответить
10. MSK_Step 19 28.10.19 14:43 Сейчас в теме
(0) Попробуйте использовать в разделителе такие знаки";" в новой функции СтрРазделить, он криво обрабатывает, строку не делил на платформе 8.3.12.1714, поэтому старый добрый БСП РазложитьСтрокуВМассив еще долго будет использоваться.
11. SeiOkami 1217 28.10.19 14:49 Сейчас в теме
(10)
старый добрый БСП РазложитьСтрокуВМассив еще долго будет использоваться

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

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


и даже так

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


Нормально всё делится
23. Darklight 19 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 1217 30.10.19 07:40 Сейчас в теме
(23)

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


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

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


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

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

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

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

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

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

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

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

Спасибо за комментарий
28. swenzik 29.10.19 12:47 Сейчас в теме
вероятно Инокентий предложит брать массив из строк макета
33. qbdp 29.10.19 14:40 Сейчас в теме
В общем "СтрРазделить" - наглядный пример того, насколько важно уменьшать количество аллокаций памяти, и насколько быстрее может быть любой нативный код, в сравнении со встроенным языком 1С. (Капитан Очевидность передаёт привет)
40. PerlAmutor 46 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 1217 30.10.19 07:43 Сейчас в теме
(41)
Именно такой вывод в конце статьи и делаем. Чтобы разработчики, посмотрев, не заморачивались и писали так, как будет удобно в данный момент. Потому что есть ряд программистов, которые думают, что если они опишут массив классическим созданием, то код будет выполняться заметно быстрее.
51. Darklight 19 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 19 07.11.19 16:40 Сейчас в теме
Кстати, вот ещё Вам тема для исследований, что быстрее при сравнени строки

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


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

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


Ведь не зря же её добавили?
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста 140

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

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

07.10.2019    8950    HostHost    23       

Агрегатные функции СКД, о которых мало кто знает 342

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    13019    ids79    44       

Три костыля. Сказ про фокусы в коде 123

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    9207    YPermitin    68       

Отслеживание выполнения фонового задания 141

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

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

17.08.2019    10435    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 253

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    14091    ids79    30       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 131

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

26.07.2019    12679    ids79    6       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 146

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    11182    ids79    27       

Регистры сведений. За кулисами 129

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    8726    YPermitin    12       

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

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    7887    SeiOkami    49       

Создание отчетов с помощью СКД - основные понятия и элементы 208

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    20990    ids79    17       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    12710    dmurk    134       

Не провоцируйте СКД, или пример "как не надо" 52

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Пример того, что не нужно использовать в запросах, чтобы не провоцировать СКД.

10.06.2019    7865    SeiOkami    91       

Чем расщепить или "СтрРазделить() VS РазложитьСтрокуВМассивПодстрок()" ? 59

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Сравнение методов по "расщеплению" строк Какой и когда использовать? Платформенный или БСП? Приходим к выводу - и тот и другой.

06.06.2019    5063    SeiOkami    34       

Регистры накопления. Структура хранения в базе данных 176

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    18964    YPermitin    27       

Выполнение внешней обработки в фоновом задании 149

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    11249    Eret1k    23       

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

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

25.04.2019    6029    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    8653    m-rv    16       

О расширениях замолвите слово... 193

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    17837    ellavs    122       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

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

28.03.2019    13920    ellavs    83       

Трюки с внешними источниками данных 166

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    14216    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 166

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    17316    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 127

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    13768    ids79    27       

Новый подход к обмену данными EnterpriseData 207

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    23140    ids79    72       

Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке 485

Статья Программист Нет файла v8 v8::СПР ЗКГУ3.0 ЗУП3.x БУ Зарплата Управление персоналом (HRM) Бесплатно (free) Универсальные функции

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

14.11.2018    35473    GeterX    93       

Программное заполнение пользовательских параметров и отборов СКД 136

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

13.11.2018    22146    Unk92    19       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 127

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    22251    ids79    40       

Вспомогательные инструкции в коде 1С 105

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

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    21512    tormozit    100       

Произвольный код в фоновом режиме 165

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

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

03.09.2018    15722    nikita0832    42       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 147

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

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

23.08.2018    22874    Rain88    42       

Повышаем эффективность разработки правил обмена 124

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    20207    olegtymko    47       

Введение в механизм представлений в ЗУП ред. 3 156

Статья Программист Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Практика программирования

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    25596    xrrg    82       

Как сделать запрос на изменение данных 75

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    22127    m-rv    21       

Строим графы средствами 1С (без GraphViz) 43

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    17914    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    12026    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 129

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

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

24.04.2018    26493    avfed@rambler.ru    19       

Минимализмы 3 355

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Универсальные функции

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    37097    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 109

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

11.12.2017    26538    milkers    23       

Метод формирования движений в типовых регистрах нетиповыми регистраторами 31

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

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

05.12.2017    21969    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 737

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    142791    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    23700    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 67

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

30.10.2017    22017    unichkin    18       

Разбираемся с настройками компоновки данных 161

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    25101    json    9       

Работа с Excel 298

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    27098    arakelyan    39