Идея дня
- Перед сортировкой/уникализацией всегда нормализуем ключ (строки — регистр/пробелы; числа/даты — безопасные конверсии).
- Сортировку делаем через вспомогательную ТаблицаЗначений с колонками
Key/Orig, затем обратно в массив — читаемо и быстро. - Уникализацию проводим стабильно: сохраняем порядок первых вхождений.
Сортировка строк (без регистра, с тримом)
Функция 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 минут)
- Соберите
ArraySortedStringsи отсортируйте теги из формы (без регистра, с тримом). - Отсортируйте цены через
ArraySortedNumbersпо убыванию. - Отсортируйте позиции по полю
Имя, затем уберите дубли поКод. - Соберите конвейер: Unload → ВygрузитьКолонку → Unique → Sorted → Join для быстрого UI-лейбла.
Что дальше
День 28: A1sLocks — Блокировки данных — шаблоны безопасной работы с блокировками при записи/обновлении.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.