1С свернуть массив
Часто новичкам в программирование 1с тяжело сходу выполнить простые действия, такие как например ‘свернуть массив данных’, ‘чем отличается структура от соответствия и т.д. Для этих целей и открывается новая рубрика ‘Джуниор 1с ‘ .
Так как же свернуть массив с данными? Рассмотрим несколько простых вариантов:
- Используя соответствие (структура тоже подойдет, но только если массив содержит строковые значения), получаем уникальный набор с данными, который мы затем обратно перегоняем в массив:
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 |
МассивКоманд = Новый Массив; МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Краснодар"); МассивКоманд.Добавить("Зенит"); МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("Динамо"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Томь"); МассивКоманд.Добавить("Томь"); СоответствиеКоманд = Новый Соответствие; Для Каждого ЭлементМассива Из МассивКоманд Цикл СоответствиеКоманд.Вставить(ЭлементМассива); КонецЦикла; МассивКоманд.Очистить(); Для Каждого ЭлементСоответствия Из СоответствиеКоманд Цикл МассивКоманд.Добавить(ЭлементСоответствия.Ключ); КонецЦикла; //Тест Для Каждого ЭлементМассива Из МассивКоманд Цикл Сообщить(ЭлементМассива); КонецЦикла; |
Пояснение: Если элемент с переданным значением ключа существует ‘МассивКоманд.Добавить(ЭлементСоответствия.Ключ)‘, то его значение заменяется, в противном случае добавляется новый элемент. Получаем уникальные значения.
- Используя общую функцию типовых конфигураций (к примеру из ‘Библиотека стандартных подсистем’) ‘УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь)’:
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 |
&НаКлиенте Процедура Команда1(Команда) МассивКоманд = Новый Массив; МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Краснодар"); МассивКоманд.Добавить("Зенит"); МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("Динамо"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Томь"); МассивКоманд.Добавить("Томь"); УдалитьПовторяющиесяЭлементыМассива(МассивКоманд); //Тест Для Каждого ЭлементМассива Из МассивКоманд Цикл Сообщить(ЭлементМассива); КонецЦикла; КонецПроцедуры Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт ОписаниеТиповСправочники = Справочники.ТипВсеСсылки(); ОписаниеТиповДокументы = Документы.ТипВсеСсылки(); ОписаниеТиповПВХ = ПланыВидовХарактеристик.ТипВсеСсылки(); ОписаниеТиповПланыСчетов = ПланыСчетов.ТипВсеСсылки(); ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки(); Если ТипЗнч(Массив) = Тип("Массив") Тогда УжеВМассиве = Новый Соответствие; БылоНеопределено = Ложь; КоличествоЭлементовВМассиве = Массив.Количество(); Для ОбратныйИндекс = 1 По КоличествоЭлементовВМассиве Цикл ЭлементМассива = Массив[КоличествоЭлементовВМассиве - ОбратныйИндекс]; ТипЭлемента = ТипЗнч(ЭлементМассива); Если ЭлементМассива = Неопределено Тогда Если БылоНеопределено ИЛИ НеИспользоватьНеопределено Тогда Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); Иначе БылоНеопределено = Истина; КонецЕсли; Продолжить; ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор()); Иначе ИДЭлемента = ЭлементМассива; КонецЕсли; Если УжеВМассиве[ИДЭлемента] = Истина Тогда Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); Иначе УжеВМассиве[ИДЭлемента] = Истина; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Массив; КонецФункции |
Или общую процедуру ‘Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь)’:
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 |
&НаКлиенте Процедура Команда1(Команда) МассивКоманд = Новый Массив; МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Краснодар"); МассивКоманд.Добавить("Зенит"); МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("Динамо"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Томь"); МассивКоманд.Добавить("Томь"); МассивБезДублей = Новый Массив; ДополнитьМассив(МассивБезДублей, МассивКоманд, Истина); //Тест Для Каждого ЭлементМассива Из МассивБезДублей Цикл Сообщить(ЭлементМассива); КонецЦикла; КонецПроцедуры Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт Если ТолькоУникальныеЗначения Тогда УникальныеЗначения = Новый Соответствие; Для Каждого Значение Из МассивПриемник Цикл УникальныеЗначения.Вставить(Значение, Истина); КонецЦикла; Для Каждого Значение Из МассивИсточник Цикл Если УникальныеЗначения[Значение] = Неопределено Тогда МассивПриемник.Добавить(Значение); УникальныеЗначения.Вставить(Значение, Истина); КонецЕсли; КонецЦикла; Иначе Для Каждого Значение Из МассивИсточник Цикл МассивПриемник.Добавить(Значение); КонецЦикла; КонецЕсли; КонецПроцедуры |
- Через новый массив и его метод ‘Найти(п_Значение)’:
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 |
МассивКоманд = Новый Массив; МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Краснодар"); МассивКоманд.Добавить("Зенит"); МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("Динамо"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Томь"); МассивКоманд.Добавить("Томь"); МассивБезДублей = Новый Массив; Для Каждого ЭлементМассива Из МассивКоманд Цикл Если МассивБезДублей.Найти(ЭлементМассива) = Неопределено Тогда МассивБезДублей.Добавить(ЭлементМассива); КонецЕсли; КонецЦикла; Для Каждого ЭлементМассива Из МассивБезДублей Цикл Сообщить(ЭлементМассива); КонецЦикла; |
Пояснение. Если элемент найден ‘МассивБезДублей.Найти(ЭлементМассива)‘, возвращается его индекс. Если элемент не найден, возвращается ‘Неопределено’.
- Через ‘ТаблицуЗначений’ и её методы ‘Свернуть’, ‘ВыгрузитьКолонку’:
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 |
&НаКлиенте Процедура Команда1(Команда) МассивКоманд = Новый Массив; МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Краснодар"); МассивКоманд.Добавить("Зенит"); МассивКоманд.Добавить("Спартак"); МассивКоманд.Добавить("Динамо"); МассивКоманд.Добавить("ЦСКА"); МассивКоманд.Добавить("Томь"); МассивКоманд.Добавить("Томь"); МассивБезДублей = СвернутьМассив(МассивКоманд); //Тест Для Каждого ЭлементМассива Из МассивБезДублей Цикл Сообщить(ЭлементМассива); КонецЦикла; КонецПроцедуры Функция СвернутьМассив(пМассив) Результат = Новый Массив; ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("ЗначенияМассива"); Для Индекс = 0 По пМассив.Количество()-1 Цикл ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(пМассив, "ЗначенияМассива"); ТЗ.Свернуть("ЗначенияМассива", ""); Результат = ТЗ.ВыгрузитьКолонку("ЗначенияМассива"); Возврат Результат; КонецФункции; |
- Так же есть еще способы, в которых при желании вы сможете разобраться и сами: запрос, список значений и т.д.
Надеюсь данная рубрика “Джуниор 1с” будет востребована. Всем удачи!