Набор полезных процедур, связанных с массивами

22.07.24

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

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

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

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

1. ДополнитьМассив - дополняем массив другими значениями

2. ДополнитьТаблицуИзМассива - добавим строки в коллекцию значений по значениям в массиве.

3. РазбитьМассивНаНесколькоМассивов - разбиваем большой массив на несколько более меньших массивов

4. ВыгрузитьКолонку - выгружаем массив из коллекции значений (взят из БСП ОбщегоНазначения.ВыгрузитьКолонку)
5. УдалитьДублиИзМассива - пересобираем массив без дублей.

6 .ЗначениеВМассив = преобразуем значение в массив

7. ПервоеЗначениеИзМассива - получаем первое значение из массива

Подключение: 

Добавляем общий модуль, даем ему название и ставим галки Клиент и Сервер.

 

 

Далее пользуемся на клиенте и на сервер

МодульМассив.РазбитьМассивНаНесколькоМассивов(.....

 

Код модуля ниже, копировать и вставить.

Работал код на платформе 1С:Предприятие 8.3 (8.3.23.1912)

------------------------------------------------------------------------------------

 
 Текст модуля

 

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

// Дополняет таблицу значений Таблица значениями из массива Массив.
//
// Параметры:
//  Таблица - ТаблицаЗначений - таблица, которую необходимо заполнить значениями из массива;
//  Массив  - Массив - массив значений для заполнения таблицы;
//  ИмяПоля - Строка - имя поля таблицы значений, в которое необходимо загрузить значения из массива.
// 
Процедура ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) Экспорт

	Для каждого Значение Из Массив Цикл
		
		Таблица.Добавить()[ИмяПоля] = Значение;
		
	КонецЦикла;
	
КонецПроцедуры                    

 // Разбивае массив на несколько массивов с заданным количеством элементов.         
 // (заполнят массивый поочередно из основного)
//
// Параметры:
//  Массив  - Массив - массив значений для заполнения таблицы;
//  КоличествоПодмассивов - Число - Количество подмассивов которые нужно создать;
//  УдалятьПустые - Булево - Признак что нужно возвращать только заполненные массивы. 
Функция РазбитьМассивНаНесколькоМассивов(ИсходныйМассив,КоличествоПодмассивов,УдалятьПустые = Истина) Экспорт
	МассивМассивов = Новый массив;
	
	// готовим массивы
	Для НомерМассива = 1 По КоличествоПодмассивов Цикл
		МассивМассивов.Добавить(Новый массив);
	КонецЦикла;
	
	/// переносим массивы
	ТекНомерМассива = 0; // индексы, не забываем
	Для каждого ТекЭл Из ИсходныйМассив Цикл		
		МассивМассивов[ТекНомерМассива].Добавить(ТекЭл);		
		// говорим в какой поток дальше вставлять данные.
		ТекНомерМассива = ?(ТекНомерМассива=(КоличествоПодмассивов-1),0,ТекНомерМассива+1);		
	КонецЦикла;	
	
	//удаляем пустые
	Если УдалятьПустые Тогда
		мУдаляемых = Новый массив;
		Для каждого ТекМассив Из МассивМассивов Цикл
			Если ТекМассив.Количество() = 0 Тогда
				 мУдаляемых.Добавить(ТекМассив);
			КонецЕсли;
		КонецЦикла;
		
		Для каждого ТекУдМассив Из мУдаляемых Цикл
			Инд = МассивМассивов.Найти(ТекУдМассив);
			МассивМассивов.Удалить(Инд);
		КонецЦикла;
	КонецЕсли;
	
	Возврат МассивМассивов;
КонецФункции


// из БСП общегоназначения
// Создает массив и копирует в него значения, содержащиеся в колонке объекта, для
// которого доступен обход посредством оператора Для каждого … Из.
//
// Параметры:
//  КоллекцияСтрок           - ТаблицаЗначений
//                           - ДеревоЗначений
//                           - СписокЗначений
//                           - ТабличнаяЧасть
//                           - Соответствие
//                           - Структура - коллекция, колонку которой нужно выгрузить в массив.
//                                         А так же другие объекты, для которых доступен обход
//                                         посредством оператора Для каждого … Из … Цикл.
//  ИмяКолонки               - Строка - имя поля коллекции, значения которого нужно выгрузить.
//  ТолькоУникальныеЗначения - Булево - если Истина, то в массив будут включены
//                                      только различающиеся значения.
//
// Возвращаемое значение:
//  Массив - значения колонки.
//
Функция ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) Экспорт

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



// пересобирает массив без дублей значений         
//
// Параметры:
//  Массив  - Массив - массив значений для заполнения таблицы;
Функция УдалитьДублиИзМассива(Массив) Экспорт
	ВозвращаемыйМассив = Новый массив;	
	ДополнитьМассив(ВозвращаемыйМассив,Массив,Истина);
	Возврат Массив;	
КонецФункции



// Преобразуем значение в массив с одним значеним
//
// Параметры:
//  Значение - любое Значение - значение на основе которого будет создан массив;
Функция ЗначениеВМассив(Значение) Экспорт
  	ВозвращаемыйМассив = Новый массив;
	ВозвращаемыйМассив.Добавить(Значение);
	Возврат ВозвращаемыйМассив ;
КонецФункции

// Возвращает первое значение из массив
//
// Параметры:
//  Массив  - Массив - массив значений;
Функция ПервоеЗначениеИзМассива(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда
		Возврат Неопределено;
	Иначе
		Возврат Массив[0];
	КонецЕсли;
КонецФункции

 

общий модуль общиймодуль массив массивы функции

См. также

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

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

21.05.2024    14974    dimanich70    81    

133

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

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

1 стартмани

18.03.2024    3661    3    John_d    11    

57

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

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

12.02.2024    11664    atdonya    22    

55

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

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

30.11.2023    5090    ke.92@mail.ru    16    

65

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

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

28.08.2023    12823    YA_418728146    7    

163

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

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

2 стартмани

22.08.2023    3109    48    progmaster    8    

4

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

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

1 стартмани

13.10.2022    17758    158    sapervodichka    112    

134
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vandalsvq 1582 22.07.24 15:52 Сейчас в теме
Где-то тут пробегала БСП рядом)))))
Kyrales; ardn; Созинов; ixijixi; +4 Ответить
2. uribur 156 22.07.24 16:56 Сейчас в теме
(1) ага, некоторые функции брал из БСП, чтобы не прикреплять БСП, так как его начинаешь тянуть и притягивается еще уйма всего ненужного.
3. ltfriend 973 22.07.24 21:15 Сейчас в теме
(2) "ненужного"? Ну, писать конфигурацию с нуля без БСП, такое себе.
IgorS; Gantz; +2 1 Ответить
5. uribur 156 22.07.24 22:50 Сейчас в теме
(3) В виду отсутствия готовых модулей как этот, как в php,java и go (и во многих других).... конечно проблемно быстро писать с нуля.
4. milanse 38 22.07.24 22:17 Сейчас в теме
Если галка Клиент, откуда в модуле таблица значений ?
9. uribur 156 23.07.24 14:04 Сейчас в теме
(4) Смотрим внимательнее. Таблицы значений в коде нет, есть только в описании, так как пользовалась в основном с сервера. Но замечание да, хорошее, поправлю, описание на коллекцию значений..
Спасибо.
6. zqzq 25 23.07.24 10:18 Сейчас в теме
Добавлю свой велосипед:

Функция НовыйМассив(  П1 = Неопределено,  П2 = Неопределено,  П3 = Неопределено
					, П4 = Неопределено,  П5 = Неопределено,  П6 = Неопределено
					, П7 = Неопределено,  П8 = Неопределено,  П9 = Неопределено
					, П10 = Неопределено, П11 = Неопределено, П12 = Неопределено
					, П13 = Неопределено, П14 = Неопределено, П15 = Неопределено					
) Экспорт 
		
	ВСЕГО_АРГУМЕНТОВ = 15;
	
	Рез = Новый Массив;
	Для Инд = 1 По ВСЕГО_АРГУМЕНТОВ Цикл
		Выполнить("
		|Если П" + Инд + " <> Неопределено Тогда
		|	Рез.Добавить(П" + Инд + ");
		|КонецЕсли;
		|");
	КонецЦикла; 
		
	Возврат Рез;
		
КонецФункции
Показать
user707242_Gold_karas; +1 Ответить
7. uribur 156 23.07.24 12:01 Сейчас в теме
(6) а что это и для чего? Описание бы)
10. Altez 258 24.07.24 18:12 Сейчас в теме
(6) инъекция заставляет себя ждать, потому что вы 100500й в очереди.
Грамотней без Выполнить, пусть даже придётся написать больше строк.
11. ixijixi 1896 25.07.24 09:10 Сейчас в теме
(6) К сожалению, такой код не пройдет аудит во фреш из-за Выполнить. И, кстати, подобный метод уже есть в БСП

// Формирует небольшой массив размером от 2 до 5 элементов по их значениям.
// Для создания массива из единственного элемента см. ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве. 
// 
// Параметры:
// 	Элемент<n> - элементы массива. 
// 
// Возвращаемое значение:
// 	Массив из Элемент<n>.
//
ОбщегоНазначенияБЗККлиентСервер.ЗначенияВМассиве()
Показать
12. kalyaka 1098 26.07.24 10:10 Сейчас в теме
(11) а Вычислить пройдет аудит фреш?
13. ixijixi 1896 26.07.24 10:18 Сейчас в теме
8. uribur 156 23.07.24 13:47 Сейчас в теме
Коллеги, кто ставит "-", оставляйте свой комментарий, важно ваше мнение.
Простой минус без обоснованного мнения не засчитывается )
Оставьте свое сообщение