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

Идея дня

Сортировка строк (без регистра, с тримом)


Функция ArraySortedStrings(Исх, ИгнорРегистр = Истина, Трим = Истина, ПоУбыв = Ложь) Экспорт
    // Не мутируем исходный массив
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Key");
    ТЗ.Колонки.Добавить("Orig");

    Если A1sO.NotEmpty(Исх) Тогда
        Для каждого V Из Исх Цикл
            S = A1sS.AsString(V);
            Если Трим Тогда S = S.СокрЛП().СокрП(); КонецЕсли;
            Если ИгнорРегистр Тогда SKey = ВРег(S); Иначе SKey = S; КонецЕсли;
            СтрТЗ = ТЗ.Добавить();
            СтрТЗ.Key  = SKey;
            СтрТЗ.Orig = V;
        КонецЦикла;
    КонецЕсли;

    Напр = ?(ПоУбыв, "УБЫВ", "");
    ТЗ.Сортировать("Key " + Напр);

    Рез = Новый Массив;
    Для каждого Стр Из ТЗ Цикл Рез.Добавить(Стр.Orig); КонецЦикла;
    Возврат Рез;
КонецФункции

// Пример:
Теги = Новый Массив; Теги.Добавить("  Кабель"); Теги.Добавить("вилка"); Теги.Добавить("кабель ");
Отсорт = ArraySortedStrings(Теги); // ["  Кабель","кабель ","вилка"] (по ключу "КАБЕЛЬ","КАБЕЛЬ","ВИЛКА")
      

Сортировка чисел (безопасная конверсия)


Функция ArraySortedNumbers(Исх, ПоУбыв = Ложь) Экспорт
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Key", Новый ОписаниеТипов("Число"));
    ТЗ.Колонки.Добавить("Orig");
    Если A1sO.NotEmpty(Исх) Тогда
        Для каждого V Из Исх Цикл
            К = A1sO.NumOrZero(V); // День 13
            СтрТЗ = ТЗ.Добавить(); СтрТЗ.Key = К; СтрТЗ.Orig = V;
        КонецЦикла;
    КонецЕсли;
    Напр = ?(ПоУбыв, "УБЫВ", "");
    ТЗ.Сортировать("Key " + Напр);

    Рез = Новый Массив;
    Для каждого Стр Из ТЗ Цикл Рез.Добавить(Стр.Orig); КонецЦикла;
    Возврат Рез;
КонецФункции

// Пример:
Цены = Новый Массив; Цены.Добавить("199.90"); Цены.Добавить(15); Цены.Добавить(" 3 ");
ОтсортЧисла = ArraySortedNumbers(Цены); // по значению 3; 15; 199.90
      

Сортировка по полю структуры


Функция ArraysSortByField(МСтруктур, ИмяПоля, ТипКлюча = "string", ИгнорРегистр = Истина, ПоУбыв = Ложь) Экспорт
    // ТипКлюча: "string"|"number"|"date"
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Key");
    ТЗ.Колонки.Добавить("Orig");

    Если A1sO.Empty(МСтруктур) Тогда Возврат Новый Массив; КонецЕсли;

    Для каждого Э Из МСтруктур Цикл
        КлючЗн = Э.Получить(ИмяПоля);
        Если ТипКлюча = "number" Тогда
            Ключ = A1sO.NumOrZero(КлючЗн);
        ИначеЕсли ТипКлюча = "date" Тогда
            Ключ = A1sO.DateOrEmpty(КлючЗн);
        Иначе
            S = A1sS.AsString(КлючЗн);
            Если ИгнорРегистр Тогда Ключ = ВРег(S); Иначе Ключ = S; КонецЕсли;
        КонецЕсли;

        СтрТЗ = ТЗ.Добавить(); СтрТЗ.Key = Ключ; СтрТЗ.Orig = Э;
    КонецЦикла;

    Напр = ?(ПоУбыв, "УБЫВ", "");
    ТЗ.Сортировать("Key " + Напр);

    Рез = Новый Массив;
    Для каждого Стр Из ТЗ Цикл Рез.Добавить(Стр.Orig); КонецЦикла;
    Возврат Рез;
КонецФункции

// Пример:
Позиции = Новый Массив;
Э1 = Новый Структура; Э1.Вставить("Код","A1"); Э1.Вставить("Имя","Кабель ПВС"); Э1.Вставить("Цена",199.9); Позиции.Добавить(Э1);
Э2 = Новый Структура; Э2.Вставить("Код","B2"); Э2.Вставить("Имя","Вилка");      Э2.Вставить("Цена",150);   Позиции.Добавить(Э2);
Э3 = Новый Структура; Э3.Вставить("Код","C3"); Э3.Вставить("Имя","кабель ВВГ"); Э3.Вставить("Цена",210);   Позиции.Добавить(Э3);

ПоИмени  = ArraysSortByField(Позиции, "Имя",  "string", Истина, Ложь); // A..Я
ПоЦенеUB = ArraysSortByField(Позиции, "Цена", "number", Истина, Истина); // по убыванию цены
      

Уникальность строк (стабильно, без регистра)


Функция ArraysUniqueStrings(Исх, ИгнорРегистр = Истина, Трим = Истина) Экспорт
    Если A1sO.Empty(Исх) Тогда Возврат Новый Массив; КонецЕсли;

    Видел = Новый Соответствие; // ключ → Истина
    Рез = Новый Массив;

    Для каждого V Из Исх Цикл
        S = A1sS.AsString(V);
        Если Трим Тогда S = S.СокрЛП().СокрП(); КонецЕсли;
        K = ?(ИгнорРегистр, ВРег(S), S);
        Если НЕ Видел.СодержитКлюч(K) Тогда
            Видел.Вставить(K, Истина);
            Рез.Добавить(V); // сохраняем исходный вид первого вхождения
        КонецЕсли;
    КонецЦикла;

    Возврат Рез;
КонецФункции

// Пример:
Теги = Новый Массив; Теги.Добавить("Кабель"); Теги.Добавить("кабель "); Теги.Добавить("Вилка");
Уник = ArraysUniqueStrings(Теги); // ["Кабель","Вилка"]
      

Уникальность по полю структуры


Функция ArraysUniqueByField(МСтруктур, ИмяПоля, ИгнорРегистр = Истина) Экспорт
    Если A1sO.Empty(МСтруктур) Тогда Возврат Новый Массив; КонецЕсли;

    Видел = Новый Соответствие;
    Рез = Новый Массив;

    Для каждого Э Из МСтруктур Цикл
        V = Э.Получить(ИмяПоля);
        Если ТипЗнч(V) = Тип("Строка") Тогда
            K = ?(ИгнорРегистр, ВРег(V), V);
        ИначеЕсли ТипЗнч(V) = Тип("Число") Тогда
            K = A1sO.NumOrZero(V);
        ИначеЕсли ТипЗнч(V) = Тип("Дата") Тогда
            K = A1sO.DateOrEmpty(V);
        Иначе
            K = A1sS.AsString(V);
        КонецЕсли;

        Если НЕ Видел.СодержитКлюч(K) Тогда
            Видел.Вставить(K, Истина);
            Рез.Добавить(Э);
        КонецЕсли;
    КонецЦикла;

    Возврат Рез;
КонецФункции

// Пример:
УникКоды = ArraysUniqueByField(Позиции, "Код");
      

Комбо: уникальные + отсортированные имена из A1sQ


Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
|    Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", 20);

// Берём колонку, убираем дубли (без регистра), сортируем по алфавиту
Имена = Таб.ВыгрузитьКолонку("Name");

ИменаУник = ArraysUniqueStrings(Имена, Истина, Истина);
ИменаСорт = ArraySortedStrings(ИменаУник, Истина, Истина, Ложь);

// Для UI можно собрать подпись (см. День 24)
Лейбл = СтрСоединить(ИменаСорт, " · ");
A1sLog.Info("Day27", "Первых имен: " + A1sS.AsString(ИменаСорт.Количество()));
      

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

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

  1. Соберите ArraySortedStrings и отсортируйте теги из формы (без регистра, с тримом).
  2. Отсортируйте цены через ArraySortedNumbers по убыванию.
  3. Отсортируйте позиции по полю Имя, затем уберите дубли по Код.
  4. Соберите конвейер: Unload → ВygрузитьКолонку → Unique → Sorted → Join для быстрого UI-лейбла.

Что дальше

День 28: A1sLocks — Блокировки данных — шаблоны безопасной работы с блокировками при записи/обновлении.

Примечание

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