Довольно часто в практике программиста 1С возникает задача преобразования плоских текстовых строк в структурированные данные. Разберем интересную головоломку, которая часто ставит в тупик начинающих разработчиков. Представим ситуацию: у нас есть обычная текстовая строка, содержащая список фамилий, разделенных запятыми. Наша цель — быстро и технически грамотно перенести эти данные в объект ТаблицаЗначений.
Рассмотрим исходные данные. У нас есть строка:
Фамилии = "Иванов,Сидоров,Ушаков,Самолов";
Если мы просто создадим пустую таблицу значений и попытаемся вставить в нее данные напрямую, система выдаст ошибку. Нам необходим промежуточный механизм парсинга (разбора) текста. Проанализируем несколько способов решения этой задачи, начиная от самого популярного и заканчивая изящными приемами без использования циклов.
Самый понятный и легко читаемый способ — это разбить строку на массив подстрок, а затем обойти этот массив в цикле, добавляя новые строки в таблицу. Разберем по шагам, как это реализовать.
ТаблицаЗначений и добавляем в нее нужную колонку с указанием типа данных.СтрРазделить, которая превращает строку с запятыми в готовый массив.Посмотрим на пример готового кода:
// 1. Подготавливаем таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка"));
ИсходнаяСтрока = "Иванов, Сидоров, Ушаков, Самолов";
// 2. Получаем массив строк, отбрасывая пустые значения (передаем Ложь третьим параметром)
МассивФамилий = СтрРазделить(ИсходнаяСтрока, ",", Ложь);
// 3. Заполняем таблицу в цикле
Для Каждого ТекФамилия Из МассивФамилий Цикл
НоваяСтрока = ТЗ.Добавить();
// Функция СокрЛП убирает лишние пробелы, которые могли быть после запятой
НоваяСтрока.Фамилия = СокрЛП(ТекФамилия);
КонецЦикла;
Важный нюанс: Обратите внимание на использование функции СокрЛП. В реальных бизнес-задачах пользователи или внешние системы часто ставят пробел после запятой. Если не использовать СокрЛП, в нашу таблицу попадут значения с ведущим пробелом, например " Сидоров", что в дальнейшем вызовет проблемы при поиске или сортировке.
Часто на собеседованиях или профессиональных форумах задают вопрос: «А как сделать то же самое, но без явного цикла с методом Добавить()?». Выясним, как платформа 1С позволяет обойтись без прямого перебора. Для этого мы задействуем вспомогательный объект — СписокЗначений.
Дело в том, что СписокЗначений умеет мгновенно загружать в себя данные из массива, а затем так же мгновенно выгружать их в ТаблицаЗначений. Проанализируем этот подход:
Фамилии = "Иванов,Сидоров,Ушаков,Самолов";
// 1. Разбиваем строку на массив (цикл здесь скрыт внутри функции платформы)
МассивФамилий = СтрРазделить(Фамилии, ",");
// 2. Создаем Список Значений и загружаем в него наш массив
СЗ = Новый СписокЗначений;
СЗ.ЗагрузитьЗначения(МассивФамилий);
// 3. Магическим образом выгружаем список сразу в Таблицу Значений
ТЗ = СЗ.Выгрузить();
// 4. По умолчанию единственная колонка будет называться "Значение". Переименуем её:
ТЗ.Колонки[0].Имя = "Фамилия";
Это лаконичный и красивый код, который избавляет разработчика от необходимости писать обход коллекции руками. Он работает быстро и выглядит очень профессионально.
Рассмотрим еще один метод, который часто предлагают разработчики — это метод ЗагрузитьКолонку объекта ТаблицаЗначений. Казалось бы, если у нас есть массив данных от СтрРазделить, можно просто загрузить его в колонку таблицы.
Здесь кроется опасная ловушка. Метод ЗагрузитьКолонку не умеет создавать новые строки в таблице. Он берет массив и поочередно записывает его элементы в уже существующие строки таблицы. Если ваша ТаблицаЗначений изначально была пустой (в ней 0 строк), то выполнение метода ТЗ.ЗагрузитьКолонку(МассивФамилий, "Фамилия") пройдет без ошибок, но таблица так и останется пустой.
Чтобы этот метод сработал, вам все равно придется предварительно создать в таблице пустые строки в количестве, равном размеру массива, что возвращает нас к необходимости писать цикл.
Иногда программисты в шутку (а иногда и всерьез) предлагают решать задачу путем превращения текстовой строки в валидный XML. Разберем этот нестандартный метод для расширения кругозора.
Идея заключается в том, чтобы с помощью функции СтрЗаменить заменить все запятые на закрывающиеся и открывающиеся теги XML, формируя структуру, которую сериализатор 1С воспримет как готовую таблицу или структуру данных.
// Пример генерации фрагмента XML из обычной строки
Фамилии = "Иванов,Сидоров,Ушаков";
ТекстXML = "<Value>" + СтрЗаменить(Фамилии, ",", "</Value></row><row><Value>") + "</Value>";
// Далее этот текст оборачивается в корневые узлы и читается через СериализаторXDTO
Важное предупреждение: Несмотря на то что этот трюк формально избавляет нас от использования цикла в коде, применять его в рабочих конфигурациях настоятельно не рекомендуется. Он делает код абсолютно нечитаемым, сильно зависит от точного совпадения пространств имен 1С, работает медленнее из-за тяжеловесного парсера XML и гарантированно приведет к снижению оценки на сертификационных экзаменах вроде «1С:Специалист».
Мы подробно проанализировали задачу трансформации строки в таблицу значений. Выбор конкретного метода всегда зависит от ваших предпочтений и стандартов разработки в команде:
СтрРазделить и классического цикла.СписокЗначений с последующей выгрузкой в таблицу.ЗагрузитьКолонку для пустых таблиц и не увлекайтесь сложными хаками с заменой текста на XML-теги в простых задачах.Применяйте эти знания на практике, и работа с текстовыми данными в 1С перестанет быть для вас головоломкой!