Идея дня
- В 1С нет «передачи функций» как значений, поэтому делаем читаемые утилиты для типовых операций над массивами.
- Сегодня: преобразования (map), фильтрация (filter), агрегирование (reduce), поиск/проверки, группировка.
- Завтра: управление элементами (вставка/удаление/срезы) — День 26; сортировка и уникальность — День 27.
Исходные данные: выгрузка из A1sQ
Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Ссылка КАК ID,
| Ном.Код КАК Code,
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", 10);
Имена = Таб.ВыгрузитьКолонку("Name"); // Массив строк
Коды = Таб.ВыгрузитьКолонку("Code"); // Массив строк
MAP — преобразования массивов
Строки → длины строк
Функция ArraysMapLength(МассивСтрок) Экспорт
Рез = Новый Массив;
Для каждого S Из МассивСтрок Цикл
Рез.Добавить(СтрДлина(A1sS.AsString(S)));
КонецЦикла;
Возврат Рез;
КонецФункции
Длины = ArraysMapLength(Имена);
Структурные элементы → выбрать поле
Когда массив состоит из структур (например, после собственной сборки).
Функция ArraysSelectField(МассивСтруктур, ИмяПоля) Экспорт
Рез = Новый Массив;
Для каждого Э Из МассивСтруктур Цикл
Если Э.Свойство(ИмяПоля) Тогда Рез.Добавить(Э[ИмяПоля]); КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Верхний регистр + обрезка пробелов
Функция ArraysMapToUpperTrim(МассивСтрок) Экспорт
Рез = Новый Массив;
Для каждого S Из МассивСтрок Цикл
X = A1sS.AsString(S).СокрЛП().СокрП();
Рез.Добавить(ВРег(X));
КонецЦикла;
Возврат Рез;
КонецФункции
Верх = ArraysMapToUpperTrim(Имена);
FILTER — отбор элементов
Фильтр по минимальной длине строки
Функция ArraysFilterMinLen(МассивСтрок, МинДлина) Экспорт
Рез = Новый Массив;
Для каждого S Из МассивСтрок Цикл
S1 = A1sS.AsString(S);
Если СтрДлина(S1) >= МинДлина Тогда Рез.Добавить(S1); КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
ДлинныеИмена = ArraysFilterMinLen(Имена, 5);
Фильтр по подстроке (без регистра)
Функция ArraysFilterContains(МассивСтрок, Подстрока) Экспорт
Рез = Новый Массив;
Ищем = ВРег(A1sS.AsString(Подстрока));
Для каждого S Из МассивСтрок Цикл
S1 = ВРег(A1sS.AsString(S));
Если СтрНайти(S1, Ищем) > 0 Тогда Рез.Добавить(S); КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
ИменаСКабелем = ArraysFilterContains(Имена, "кабель");
REDUCE — агрегирование
Сумма длин строк
Функция ArraysSumOfLengths(МассивСтрок) Экспорт
Итог = 0;
Для каждого S Из МассивСтрок Цикл
Итог = Итог + СтрДлина(A1sS.AsString(S));
КонецЦикла;
Возврат Итог;
КонецФункции
ВсегоСимволов = ArraysSumOfLengths(Имена);
Сумма по полю (числовому)
Функция ArraysSumBy(МассивСтруктур, ИмяЧисловогоПоля) Экспорт
Итог = 0;
Для каждого Э Из МассивСтруктур Цикл
Итог = Итог + A1sO.NumOrZero(Э.Получить(ИмяЧисловогоПоля));
КонецЦикла;
Возврат Итог;
КонецФункции
Итог по позициям: сумма Кол*Цена
Функция ArraysSumProduct(Позиции, ПолеКол = "Кол", ПолеЦена = "Цена") Экспорт
Итог = 0;
Для каждого П Из Позиции Цикл
Кол = A1sO.NumOrZero(П.Получить(ПолеКол));
Цена = A1sO.NumOrZero(П.Получить(ПолеЦена));
Итог = Итог + (Кол * Цена);
КонецЦикла;
Возврат A1sO.RoundNum(Итог, 2);
КонецФункции
// Пример:
Позиции = Новый Массив;
Позиции.Добавить(Новый Структура("Кол,Цена", 2, 199.9));
Позиции.Добавить(Новый Структура("Кол,Цена", 1, 350));
Сумма = ArraysSumProduct(Позиции); // 749,80
ПОИСК И ПРОВЕРКИ
Найти первый элемент по условию «начинается с…»
Функция ArraysFindStartsWith(МассивСтрок, Префикс) Экспорт
П = ВРег(A1sS.AsString(Префикс));
Для каждого S Из МассивСтрок Цикл
Если СтрНачинаетсяС(ВРег(A1sS.AsString(S)), П) Тогда Возврат S; КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
ПервоеНаК = ArraysFindStartsWith(Имена, "К");
Есть ли «пустые» элементы? Все ли непустые?
Функция ArraysAnyEmpty(МассивЗначений) Экспорт
Для каждого V Из МассивЗначений Цикл
Если A1sO.Empty(V) Тогда Возврат Истина; КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ArraysAllNotEmpty(МассивЗначений) Экспорт
Для каждого V Из МассивЗначений Цикл
Если A1sO.Empty(V) Тогда Возврат Ложь; КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
ГРУППИРОВКА И ПОДСЧЁТ
GroupBy по первой букве (регистр игнорируем)
Функция ArraysGroupByFirstLetter(МассивСтрок) Экспорт
Группы = Новый Соответствие; // Ключ = буква, Значение = Массив
Для каждого S Из МассивСтрок Цикл
T = A1sS.AsString(S);
Если A1sO.Empty(T) Тогда Продолжить; КонецЕсли;
Ключ = Лев(ВРег(T), 1);
Если НЕ Группы.СодержитКлюч(Ключ) Тогда
Группы.Вставить(Ключ, Новый Массив);
КонецЕсли;
Группы[Ключ].Добавить(T);
КонецЦикла;
Возврат Группы;
КонецФункции
ГруппыИмен = ArraysGroupByFirstLetter(Имена);
CountBy по первой букве
Функция ArraysCountByFirstLetter(МассивСтрок) Экспорт
Счет = Новый Соответствие; // Ключ = буква, Значение = число
Для каждого S Из МассивСтрок Цикл
T = A1sS.AsString(S);
Если A1sO.Empty(T) Тогда Продолжить; КонецЕсли;
Ключ = Лев(ВРег(T), 1);
Счет.Вставить(Ключ, A1sO.NumOrZero(Счет.Получить(Ключ)) + 1);
КонецЦикла;
Возврат Счет;
КонецФункции
Partition — разнести «подходит/не подходит»
Функция ArraysPartitionMinLen(МассивСтрок, МинДлина) Экспорт
Рез = Новый Структура;
Рез.Вставить("pass", Новый Массив);
Рез.Вставить("fail", Новый Массив);
Для каждого S Из МассивСтрок Цикл
S1 = A1sS.AsString(S);
Если СтрДлина(S1) >= МинДлина Тогда
Рез.pass.Добавить(S1);
Иначе
Рез.fail.Добавить(S1);
КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Парт = ArraysPartitionMinLen(Имена, 6);
// Парт.pass — длинные, Парт.fail — короткие
Небольшой конвейер: от имен к статистике
// 1) Выгружаем имена
Имена = Таб.ВыгрузитьКолонку("Name");
// 2) Чистим и приводим к верхнему регистру
ИменаНорм = ArraysMapToUpperTrim(Имена);
// 3) Фильтруем по подстроке
Отобранные = ArraysFilterContains(ИменаНорм, "Кабель");
// 4) Считаем суммарную длину и группируем по первой букве
ДлинаВсех = ArraysSumOfLengths(Отобранные);
Группы = ArraysGroupByFirstLetter(Отобранные);
// 5) Логируем
A1sLog.Info("Day25", "Итоги", Новый Структура("Count,Len", Отобранные.Количество(), ДлинаВсех));
Анти-паттерны
- Менять исходный массив «по месту» в общих утилитах — всегда возвращайте новый результат.
- Смешивать фильтрацию, сортировку и уникализацию в одном шаге — держите этапы раздельно (сорт/уникал — День 27).
- Забывать про
A1sS.AsStringи числовую нормализацию — приводите типы перед операциями.
Практика (15–30 минут)
- Сделайте
ArraysMapToUpperTrimи примените к колонкеNameизUnload. - Отфильтруйте имена по подстроке и минимальной длине.
- Соберите сумму длин строк и сгруппируйте имена по первой букве.
- Смоделируйте позиции (Кол/Цена) и посчитайте итог через
ArraysSumProduct.
Что дальше
День 26: A1sArrays — Управление элементами — вставки, удаления, срезы, обновления по условию.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.