Как создать таблицу значений из текстовой строки с разделителями в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Довольно часто в практике программиста 1С возникает задача преобразования плоских текстовых строк в структурированные данные. Разберем интересную головоломку, которая часто ставит в тупик начинающих разработчиков. Представим ситуацию: у нас есть обычная текстовая строка, содержащая список фамилий, разделенных запятыми. Наша цель — быстро и технически грамотно перенести эти данные в объект ТаблицаЗначений.

Рассмотрим исходные данные. У нас есть строка:

Фамилии = "Иванов,Сидоров,Ушаков,Самолов";

Если мы просто создадим пустую таблицу значений и попытаемся вставить в нее данные напрямую, система выдаст ошибку. Нам необходим промежуточный механизм парсинга (разбора) текста. Проанализируем несколько способов решения этой задачи, начиная от самого популярного и заканчивая изящными приемами без использования циклов.

Способ 1. Классическое решение с использованием цикла

Самый понятный и легко читаемый способ — это разбить строку на массив подстрок, а затем обойти этот массив в цикле, добавляя новые строки в таблицу. Разберем по шагам, как это реализовать.

  1. Сначала мы создаем саму ТаблицаЗначений и добавляем в нее нужную колонку с указанием типа данных.
  2. Затем используем платформенную функцию СтрРазделить, которая превращает строку с запятыми в готовый массив.
  3. В цикле обходим элементы массива, добавляем новую строку в таблицу и записываем значение.

Посмотрим на пример готового кода:


// 1. Подготавливаем таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка"));

ИсходнаяСтрока = "Иванов, Сидоров, Ушаков, Самолов";

// 2. Получаем массив строк, отбрасывая пустые значения (передаем Ложь третьим параметром)
МассивФамилий = СтрРазделить(ИсходнаяСтрока, ",", Ложь);

// 3. Заполняем таблицу в цикле
Для Каждого ТекФамилия Из МассивФамилий Цикл
    НоваяСтрока = ТЗ.Добавить();
    // Функция СокрЛП убирает лишние пробелы, которые могли быть после запятой
    НоваяСтрока.Фамилия = СокрЛП(ТекФамилия); 
КонецЦикла;

Важный нюанс: Обратите внимание на использование функции СокрЛП. В реальных бизнес-задачах пользователи или внешние системы часто ставят пробел после запятой. Если не использовать СокрЛП, в нашу таблицу попадут значения с ведущим пробелом, например " Сидоров", что в дальнейшем вызовет проблемы при поиске или сортировке.

Способ 2. Элегантное решение без цикла (через Список Значений)

Часто на собеседованиях или профессиональных форумах задают вопрос: «А как сделать то же самое, но без явного цикла с методом Добавить()?». Выясним, как платформа 1С позволяет обойтись без прямого перебора. Для этого мы задействуем вспомогательный объект — СписокЗначений.

Дело в том, что СписокЗначений умеет мгновенно загружать в себя данные из массива, а затем так же мгновенно выгружать их в ТаблицаЗначений. Проанализируем этот подход:


Фамилии = "Иванов,Сидоров,Ушаков,Самолов";

// 1. Разбиваем строку на массив (цикл здесь скрыт внутри функции платформы)
МассивФамилий = СтрРазделить(Фамилии, ",");

// 2. Создаем Список Значений и загружаем в него наш массив
СЗ = Новый СписокЗначений;
СЗ.ЗагрузитьЗначения(МассивФамилий);

// 3. Магическим образом выгружаем список сразу в Таблицу Значений
ТЗ = СЗ.Выгрузить();

// 4. По умолчанию единственная колонка будет называться "Значение". Переименуем её:
ТЗ.Колонки[0].Имя = "Фамилия";

Это лаконичный и красивый код, который избавляет разработчика от необходимости писать обход коллекции руками. Он работает быстро и выглядит очень профессионально.

Миф о методе ЗагрузитьКолонку

Рассмотрим еще один метод, который часто предлагают разработчики — это метод ЗагрузитьКолонку объекта ТаблицаЗначений. Казалось бы, если у нас есть массив данных от СтрРазделить, можно просто загрузить его в колонку таблицы.

Здесь кроется опасная ловушка. Метод ЗагрузитьКолонку не умеет создавать новые строки в таблице. Он берет массив и поочередно записывает его элементы в уже существующие строки таблицы. Если ваша ТаблицаЗначений изначально была пустой (в ней 0 строк), то выполнение метода ТЗ.ЗагрузитьКолонку(МассивФамилий, "Фамилия") пройдет без ошибок, но таблица так и останется пустой.

Чтобы этот метод сработал, вам все равно придется предварительно создать в таблице пустые строки в количестве, равном размеру массива, что возвращает нас к необходимости писать цикл.

Способ 3. Экзотический хак с использованием XML

Иногда программисты в шутку (а иногда и всерьез) предлагают решать задачу путем превращения текстовой строки в валидный XML. Разберем этот нестандартный метод для расширения кругозора.

Идея заключается в том, чтобы с помощью функции СтрЗаменить заменить все запятые на закрывающиеся и открывающиеся теги XML, формируя структуру, которую сериализатор 1С воспримет как готовую таблицу или структуру данных.


// Пример генерации фрагмента XML из обычной строки
Фамилии = "Иванов,Сидоров,Ушаков";
ТекстXML = "<Value>" + СтрЗаменить(Фамилии, ",", "</Value></row><row><Value>") + "</Value>";
// Далее этот текст оборачивается в корневые узлы и читается через СериализаторXDTO

Важное предупреждение: Несмотря на то что этот трюк формально избавляет нас от использования цикла в коде, применять его в рабочих конфигурациях настоятельно не рекомендуется. Он делает код абсолютно нечитаемым, сильно зависит от точного совпадения пространств имен 1С, работает медленнее из-за тяжеловесного парсера XML и гарантированно приведет к снижению оценки на сертификационных экзаменах вроде «1С:Специалист».

Подведение итогов

Мы подробно проанализировали задачу трансформации строки в таблицу значений. Выбор конкретного метода всегда зависит от ваших предпочтений и стандартов разработки в команде:

  1. Если вам нужно легко читаемое решение с возможностью дополнительной обработки данных (например, обрезка пробелов), используйте комбинацию СтрРазделить и классического цикла.
  2. Если вы хотите написать максимально короткий и изящный код без циклов, применяйте загрузку массива в СписокЗначений с последующей выгрузкой в таблицу.
  3. Избегайте метода ЗагрузитьКолонку для пустых таблиц и не увлекайтесь сложными хаками с заменой текста на XML-теги в простых задачах.

Применяйте эти знания на практике, и работа с текстовыми данными в 1С перестанет быть для вас головоломкой!

← На главную