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

Идея дня

Во всех примерах массивы формируются корректно (никаких "строка".Разделить(",") внутри конструктора).

Базовые приёмы Split/Join


// Разделить список артикулов по запятой
СтрокаSKU = "ABC-1, DEF-2, , GHI-3";
Токены = СтрРазделить(СтрокаSKU, ","); // → Массив строк (в т.ч. пустые/с пробелами)

// Очистка: убрать пробелы по краям и пустые элементы
Чистые = Новый Массив;
Для каждого Т Из Токены Цикл
    S = СTrim(A1sS.AsString(T)); // см. ниже STrim
    Если A1sO.NotEmpty(S) Тогда Чистые.Добавить(S); КонецЕсли;
КонецЦикла;

// Собрать обратно в строку с ";" как разделителем
Итог = СтрСоединить(Чистые, "; ");
Сообщить(Итог); // "ABC-1; DEF-2; GHI-3"
      

Вспомогательная обрезка пробелов


Функция STrim(Текст) Экспорт
    // Безопасно приводит к строке и обрезает пробелы по краям
    Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(A1sS.AsString(Текст), Символы.ПС, " "), Символы.ВК, " "), "  ", " ").СокрЛП().СокрП();
КонецФункции
      

Split по нескольким разделителям

Нормализуем адрес, где встречаются запятые, точки с запятой и переводы строк.


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

    // Сначала приводим все разделители к одной запятой
    Норм = СтрЗаменить(Текст, Символы.ПС, ",");
    Норм = СтрЗаменить(Норм, Символы.ВК, ",");
    Норм = СтрЗаменить(Норм, ";", ",");
    // Теперь обычный split
    Исх = СтрРазделить(Норм, ",");

    // Чистим пробелы и пустые
    Рез = Новый Массив;
    Для каждого S Из Исх Цикл
        T = STrim(S);
        Если A1sO.NotEmpty(T) Тогда Рез.Добавить(T); КонецЕсли;
    КонецЦикла;
    Возврат Рез;
КонецФункции

// Пример
АдресСтрока = "г. Москва; ул. Пушкина\nд. 10, корп. 2";
Части = SplitMulti(АдресСтрока); // ["г. Москва","ул. Пушкина","д. 10","корп. 2"]
      

Подготовка параметров из строки для запроса

Пользователь вводит «коды через запятую» — делаем массив и используем в запросе В (&Список).


Функция НомПоКодамСтрокой(СписокКодовСтрокой) Экспорт
    Коды = SplitMulti(СписокКодовСтрокой); // массив строк кодов
    Если A1sO.Empty(Коды) Тогда Возврат Новый ТаблицаЗначений; КонецЕсли;

    ТекстQ = "
    |ВЫБРАТЬ
    |    Ном.Ссылка       КАК ID,
    |    Ном.Наименование КАК Name,
    |    Ном.Код          КАК Code
    |ИЗ Справочник.Номенклатура КАК Ном
    |ГДЕ Ном.Код В (&Список)
    |УПОРЯДОЧИТЬ ПО Name
    ";
    Возврат A1sQ.Unload(ТекстQ, Коды); // порядок: &Список
КонецФункции
      

Помним: позиционные параметры в Unload(Текст, П1..П8).

CSV (простая сборка)

Для «чистого» CSV экранируем кавычки и оборачиваем поля в кавычки, затем соединяем запятыми.


Функция CsvEscape(Значение) Экспорт
    S = A1sS.AsString(Значение);
    S = СтрЗаменить(S, """", """"""); // удваиваем кавычки
    Возврат """" + S + """";
КонецФункции

Функция СтрокаCSV(МассивЗначений) Экспорт
    Если A1sO.Empty(МассивЗначений) Тогда Возврат ""; КонецЕсли;
    Линия = Новый Массив;
    Для каждого V Из МассивЗначений Цикл
        Линия.Добавить(CsvEscape(V));
    КонецЦикла;
    Возврат СтрСоединить(Линия, ",");
КонецФункции

// Пример: выгрузка имён в CSV
Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
|    Ном.Ссылка       КАК ID,
|    Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", 5);
Имена = Таб.ВыгрузитьКолонку("Name");
CSV = СтрокаCSV(Имена);
A1sLog.Info("Day19", "CSV имен:", CSV);
      

Join для красивых списков в UI


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

Буфер = Новый Массив;
Для каждого Стр Из Таб Цикл
    Буфер.Добавить( A1sS.AsString(Стр.Name) + " (" + A1sS.AsString(Стр.Code) + ")" );
КонецЦикла;

Лейбл = СтрСоединить(Буфер, " · ");
Сообщить(Лейбл);
      

Разбиение на строки и обратно

Поле «многострочный ввод»: храним как массив строк без пустых — обратно показываем через перевод строки.


Функция LinesToArray(Текст) Экспорт
    Если A1sO.Empty(Текст) Тогда Возврат Новый Массив; КонецЕсли;
    Н = СтрЗаменить(Текст, Символы.ВК, Символы.ПС);
    Исх = СтрРазделить(Н, Символы.ПС);
    Рез = Новый Массив;
    Для каждого S Из Исх Цикл
        T = STrim(S);
        Если A1sO.NotEmpty(T) Тогда Рез.Добавить(T); КонецЕсли;
    КонецЦикла;
    Возврат Рез;
КонецФункции

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

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

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

  1. Сделайте SplitMulti и очистите адреса из пользовательского ввода.
  2. Реализуйте поиск номенклатуры по кодам, введённым строкой через запятую.
  3. Соберите CSV-строку имён номенклатуры с корректным экранированием.
  4. Сконвертируйте многострочное поле «комментарий» в массив строк и обратно.

Что дальше

День 20: A1sS — Очистка текста (RegexReplace) — регулярные выражения для нормализации строк.