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

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];
	КонецЕсли;
КонецФункции

 

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    6957    Abysswalker    11    

48

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    11966    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    64363    dimanich70    87    

177

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    8609    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    80689    atdonya    31    

75

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    12136    ke.92@mail.ru    18    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vandalsvq 1717 22.07.24 15:52 Сейчас в теме
Где-то тут пробегала БСП рядом)))))
Kyrales; ardn; ef42; ixijixi; +4 Ответить
2. uribur 232 22.07.24 16:56 Сейчас в теме
(1) ага, некоторые функции брал из БСП, чтобы не прикреплять БСП, так как его начинаешь тянуть и притягивается еще уйма всего ненужного.
3. ltfriend 22.07.24 21:15 Сейчас в теме
(2) "ненужного"? Ну, писать конфигурацию с нуля без БСП, такое себе.
Дмитрий74Чел; IgorS; Gantz; +3 1 Ответить
5. uribur 232 22.07.24 22:50 Сейчас в теме
(3) В виду отсутствия готовых модулей как этот, как в php,java и go (и во многих других).... конечно проблемно быстро писать с нуля.
4. milanse 41 22.07.24 22:17 Сейчас в теме
Если галка Клиент, откуда в модуле таблица значений ?
9. uribur 232 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 232 23.07.24 12:01 Сейчас в теме
(6) а что это и для чего? Описание бы)
10. Altez 258 24.07.24 18:12 Сейчас в теме
(6) инъекция заставляет себя ждать, потому что вы 100500й в очереди.
Грамотней без Выполнить, пусть даже придётся написать больше строк.
11. ixijixi 2159 25.07.24 09:10 Сейчас в теме
(6) К сожалению, такой код не пройдет аудит во фреш из-за Выполнить. И, кстати, подобный метод уже есть в БСП

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