Как правильно разделить строку на части и разложить значения по колонкам в 1С 8.3

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

В практике разработчика 1С часто возникает задача разбора текстовой строки на составляющие элементы. Типичный пример: из внешней системы или текстового поля приходит характеристика номенклатуры в виде единой строки (например, "46, Красный"), которую необходимо разделить и записать в разные колонки таблицы или реквизиты объекта — "Размер" и "Цвет". Рассмотрим подробнее, какими инструментами располагает платформа и типовые конфигурации для решения этой задачи, а также разберем типичные ошибки.

Метод 1: Использование функций БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП (УТ 11, Розница 2.3/3.0, БП 3.0 и др.), самым простым способом будет использование готового общего модуля СтроковыеФункцииКлиентСервер. Рассмотрим, как применить функцию разложения строки на сервере при заполнении таблицы.

Проанализируем ситуацию: у нас есть переменная СтрокаТЧ.Размер, содержащая значение "46, Красный". Нам нужно разбить её по разделителю "запятая". Для этого используем следующий код:


// Получаем массив подстрок, используя запятую как разделитель
МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаТЧ.Размер, ",");

// Проверяем количество элементов, чтобы избежать ошибки "Индекс находится за границами массива"
Если МассивПодстрок.Количество() >= 2 Тогда
    НоваяСтрока.Размер = СокрЛП(МассивПодстрок[0]);
    НоваяСтрока.Цвет   = СокрЛП(МассивПодстрок[1]);
ИначеЕсли МассивПодстрок.Количество() = 1 Тогда
    НоваяСтрока.Размер = СокрЛП(МассивПодстрок[0]);
КонецЕсли;

Важный момент: Функция РазложитьСтрокуВМассивПодстрок по умолчанию обрезает лишние пробелы, если передан соответствующий параметр, но использование СокрЛП() гарантирует, что в ваши реквизиты не попадут случайные пробелы, стоящие до или после запятой.

Метод 2: Встроенная функция платформы СтрРазделить

Начиная с версии платформы 8.3.6, в языке 1С появилась встроенная функция СтрРазделить(). Она работает значительно быстрее функций из общих модулей, так как реализована на уровне ядра платформы. Разберем её применение.


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

// Безопасное извлечение данных
Если МассивРезультат.Количество() > 0 Тогда
    Значение1 = СокрЛП(МассивРезультат[0]);
КонецЕсли;

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

Метод 3: Безопасная обработка пустых значений (избегаем ошибок индекса)

Часто программисты сталкиваются с ошибкой "Индекс находится за границами массива", если во входящей строке не оказалось разделителя. Чтобы не загромождать код постоянными проверками Количество(), можно создать вспомогательную функцию "обертку":


Функция ПолучитьЭлементМассиваБезопасно(Массив, Индекс)
    Если Массив.Количество() > Индекс Тогда
        Возврат СокрЛП(Массив[Индекс]);
    Иначе
        Возврат "";
    КонецЕсли;
КонецФункции

// Пример использования в цикле
Для каждого СтрокаТЧ из Таблица Цикл
    МассивДанных = СтрРазделить(СтрокаТЧ.Размер, ",");
    НоваяСтрока.Размер = ПолучитьЭлементМассиваБезопасно(МассивДанных, 0);
    НоваяСтрока.Цвет   = ПолучитьЭлементМассиваБезопасно(МассивДанных, 1);
КонецЦикла;

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

Метод 4: Получение характеристик через Дополнительные Реквизиты (Архитектурный подход)

Рассмотрим ситуацию глубже. В типовых конфигурациях (Розница, УТ) хранение значений свойств прямо в строке наименования — это не самый надежный путь. Данные о цвете и размере уже хранятся в базе в структурированном виде. Проанализируем, как получить их правильно с помощью запроса, не прибегая к "парсингу" строк.

Значения свойств характеристик обычно хранятся в табличной части ДополнительныеРеквизиты справочника ХарактеристикиНоменклатуры. Посмотрим на пример запроса:


ВЫБРАТЬ
    Характеристики.Ссылка КАК Характеристика,
    Характеристики.Владелец КАК Номенклатура,
    МАКСИМУМ(ВЫБОР
            КОГДА ДопРеквизиты.Свойство.Наименование ПОДОБНО "%Размер%"
                ТОГДА ДопРеквизиты.Значение
        КОНЕЦ) КАК Размер,
    МАКСИМУМ(ВЫБОР
            КОГДА ДопРеквизиты.Свойство.Наименование ПОДОБНО "%Цвет%"
                ТОГДА ДопРеквизиты.Значение
        КОНЕЦ) КАК Цвет
ИЗ
    Справочник.ХарактеристикиНоменклатуры КАК Характеристики
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ДопРеквизиты
        ПО Характеристики.Ссылка = ДопРеквизиты.Ссылка
ГДЕ
    Характеристики.Ссылка В(&МассивСсылок)
СГРУППИРОВАТЬ ПО
    Характеристики.Ссылка,
    Характеристики.Владелец

Почему это лучше?

  1. Точность: Вы получаете ссылку на объект (значение свойства), а не просто текст "Красный".
  2. Надежность: Даже если пользователь переименует характеристику вручную, программный код все равно найдет верный цвет и размер.
  3. Производительность: Запрос выполняется на стороне СУБД и сразу возвращает таблицу с нужными колонками.

Рекомендации по реализации

Подведем итог. Если вам нужно разобрать строку "здесь и сейчас" (например, при загрузке из Excel), используйте СтрРазделить с обязательной проверкой количества полученных элементов. Если же вы работаете внутри системы с характеристиками 1С, всегда старайтесь обращаться к Дополнительным реквизитам через запрос или объектную модель. Это исключит ошибки, связанные с разным написанием разделителей (кто-то поставит запятую, кто-то точку с запятой или пробел) и сделает вашу разработку профессиональной.

← На главную