A1sCode библиотека 1С

Идея дня

Исходные данные: выгрузка из 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", Отобранные.Количество(), ДлинаВсех));
      

Анти-паттерны

Практика (15–30 минут)

  1. Сделайте ArraysMapToUpperTrim и примените к колонке Name из Unload.
  2. Отфильтруйте имена по подстроке и минимальной длине.
  3. Соберите сумму длин строк и сгруппируйте имена по первой букве.
  4. Смоделируйте позиции (Кол/Цена) и посчитайте итог через ArraysSumProduct.

Что дальше

День 26: A1sArrays — Управление элементами — вставки, удаления, срезы, обновления по условию.

Примечание

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