Идея дня
- СтрРазделить(Текст, Разделитель) → Массив строк (может содержать пустые элементы — чистим).
- СтрСоединить(Массив, Разделитель) → строка из элементов массива.
- Комбинируем с
A1sS.AsString(День 18) иA1sO.Empty/NotEmpty(День 10) для безопасной обработки.
Во всех примерах массивы формируются корректно (никаких "строка".Разделить(",")
внутри конструктора).
Базовые приёмы 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(МассивСтрок) Тогда Возврат ""; КонецЕсли;
Возврат СтрСоединить(МассивСтрок, Символы.ПС);
КонецФункции
Анти-паттерны
- Доверять пользовательскому вводу без очистки — всегда обрезайте пробелы и убирайте пустые токены.
- Строить массив из «строка.Разделить» внутри конструктора — корректно используйте
СтрРазделитьи затем наполняйте массив. - Join без экранирования для CSV — экранируйте кавычки (см.
CsvEscape).
Практика (15–30 минут)
- Сделайте
SplitMultiи очистите адреса из пользовательского ввода. - Реализуйте поиск номенклатуры по кодам, введённым строкой через запятую.
- Соберите CSV-строку имён номенклатуры с корректным экранированием.
- Сконвертируйте многострочное поле «комментарий» в массив строк и обратно.
Что дальше
День 20: A1sS — Очистка текста (RegexReplace) — регулярные выражения для нормализации строк.