Идея дня
- Создаём массивы из литералов, строк, таблиц значений, структур.
- Объединяем массивы в новый без побочных эффектов на исходники.
- Чётко разделяем задачи: сегодня — создание/объединение; управление элементами (вставки/удаления) — День 26; сортировка и уникальность — День 27.
Важно: не используем конструкцию вида Новый Массив("строка".Разделить(",")). В
1С сначала получаем массив через СтрРазделить, затем наполняем/используем.
Создание массивов
1) Из литералов
Артикулы = Новый Массив;
Артикулы.Добавить("ABC-1");
Артикулы.Добавить("DEF-2");
Артикулы.Добавить("GHI-3");
2) Из строки (split + очистка)
Функция STrim(Текст) Экспорт
Возврат A1sS.AsString(Текст).СокрЛП().СокрП();
КонецФункции
Функция TokensFromString(Строка, Разделитель = ",") Экспорт
Если A1sO.Empty(Строка) Тогда Возврат Новый Массив; КонецЕсли;
Исх = СтрРазделить(Строка, Разделитель);
Рез = Новый Массив;
Для каждого Т Из Исх Цикл
S = STrim(Т);
Если A1sO.NotEmpty(S) Тогда Рез.Добавить(S); КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Коды = TokensFromString("A1, B2, , C3");
3) Из ТаблицаЗначений (колонка → массив)
Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", 5);
Имена = Таб.ВыгрузитьКолонку("Name"); // Массив строк
4) Из структуры (только ключи / только значения / пары)
Функция StructKeys(Стр) Экспорт
Рез = Новый Массив;
Для каждого П Из Стр Цикл Рез.Добавить(П.Ключ); КонецЦикла;
Возврат Рез;
КонецФункции
Функция StructValues(Стр) Экспорт
Рез = Новый Массив;
Для каждого П Из Стр Цикл Рез.Добавить(П.Значение); КонецЦикла;
Возврат Рез;
КонецФункции
Функция StructEntries(Стр) Экспорт // массив структур {key, value}
Рез = Новый Массив;
Для каждого П Из Стр Цикл
Рез.Добавить(Новый Структура("key,value", П.Ключ, П.Значение));
КонецЦикла;
Возврат Рез;
КонецФункции
Объединение массивов (конкатенация)
Concat двух массивов
Функция ArraysConcat(A, B) Экспорт
Рез = Новый Массив;
Если A1sO.NotEmpty(A) Тогда Для каждого V Из A Цикл Рез.Добавить(V); КонецЦикла; КонецЕсли;
Если A1sO.NotEmpty(B) Тогда Для каждого V Из B Цикл Рез.Добавить(V); КонецЦикла; КонецЕсли;
Возврат Рез;
КонецФункции
A = TokensFromString("A1,A2,A3");
B = TokensFromString("B1,B2");
AB = ArraysConcat(A, B); // ["A1","A2","A3","B1","B2"]
Concat произвольного числа массивов
Функция ArraysConcatMany(МассивМассивов) Экспорт
Рез = Новый Массив;
Если A1sO.Empty(МассивМассивов) Тогда Возврат Рез; КонецЕсли;
Для каждого Arr Из МассивМассивов Цикл
Если A1sO.Empty(Arr) Тогда Продолжить; КонецЕсли;
Для каждого V Из Arr Цикл Рез.Добавить(V); КонецЦикла;
КонецЦикла;
Возврат Рез;
КонецФункции
Список = Новый Массив; Список.Добавить(A); Список.Добавить(B); Список.Добавить(Имена);
Все = ArraysConcatMany(Список);
Объединение без изменения исходных
Важно: мы всегда складываем в новый массив Рез, чтобы не изменять
источники по ссылке. Это особенно критично, когда массивы «переиспользуются» в разных
местах логики.
Типичные конвейеры с массивами
Список кодов → поиск элементов → массив имён
Функция ИменаПоКодам(СтрокаКодов) Экспорт
Коды = TokensFromString(СтрокаКодов);
Если A1sO.Empty(Коды) Тогда Возврат Новый Массив; КонецЕсли;
ТекстQ = "
|ВЫБРАТЬ
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|ГДЕ Ном.Код В (&Список)
|УПОРЯДОЧИТЬ ПО Name
";
Таб = A1sQ.Unload(ТекстQ, Коды); // позиционный параметр: &Список
Возврат Таб.ВыгрузитьКолонку("Name");
КонецФункции
Соединить два набора результатов
Имена1 = ИменаПоКодам("A1,A2");
Имена2 = ИменаПоКодам("B1,B2,B3");
ВсеИмена = ArraysConcat(Имена1, Имена2);
// День 27: удалим дубли и отсортируем при необходимости
Подготовка данных для UI и экспорта
Собирать подписи через join (строка из массива)
Функция Join(МассивСтрок, Разделитель = ", ") Экспорт
Если A1sO.Empty(МассивСтрок) Тогда Возврат ""; КонецЕсли;
Возврат СтрСоединить(МассивСтрок, Разделитель);
КонецФункции
Подпись = Join(ВсеИмена, " · ");
Сообщить(Подпись);
Конкатенация нескольких источников в линейный список
Функция СобратьСписокДляЭкспорта() Экспорт
Вручную = Новый Массив; Вручную.Добавить("MAN-1"); Вручную.Добавить("MAN-2");
ИзФормы = TokensFromString("UI1; UI2; UI3", ";");
ИзСправ = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Код КАК Code
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Code
", 3).ВыгрузитьКолонку("Code");
Результат = ArraysConcatMany(Новый Массив(Вручную, ИзФормы, ИзСправ)); // собрали линейно
Возврат Результат;
КонецФункции
На заметку: если в вашей сборке A1sArrays уже есть готовые обёртки
Concat/ConcatMany/FromString/FromTable — используйте их. Приведённые
функции — безопасные «эталоны» для собственного слоя утилит.
Анти-паттерны
- Мутировать исходные массивы при объединении — всегда собирайте новый результат.
- Собирать массивы через «строка в конструкторе» — корректно используйте
СтрРазделитьи затем наполняйте массив. - Смешивать в одном шаге «объединение» и «уникализацию/сортировку» — держите этапы раздельно (см. Дни 26–27).
Практика (15–30 минут)
- Реализуйте
TokensFromStringи соберите массив кодов из пользовательского ввода. - Сделайте
ArraysConcat/ArraysConcatManyи объедините 3 источника данных. - Вытащите колонку
NameизUnloadи объедините с вручную заданными значениями. - Соберите строку для UI через
Join, оставив уникальность и сортировку «на потом» (День 27).
Что дальше
День 25: A1sArrays — Множественные операции — map/filter/reduce-шаблоны и их безопасные варианты.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.