В практике разработчика 1С часто возникает задача разбора текстовой строки на составляющие элементы. Типичный пример: из внешней системы или текстового поля приходит характеристика номенклатуры в виде единой строки (например, "46, Красный"), которую необходимо разделить и записать в разные колонки таблицы или реквизиты объекта — "Размер" и "Цвет". Рассмотрим подробнее, какими инструментами располагает платформа и типовые конфигурации для решения этой задачи, а также разберем типичные ошибки.
Если ваша конфигурация построена на базе БСП (УТ 11, Розница 2.3/3.0, БП 3.0 и др.), самым простым способом будет использование готового общего модуля СтроковыеФункцииКлиентСервер. Рассмотрим, как применить функцию разложения строки на сервере при заполнении таблицы.
Проанализируем ситуацию: у нас есть переменная СтрокаТЧ.Размер, содержащая значение "46, Красный". Нам нужно разбить её по разделителю "запятая". Для этого используем следующий код:
// Получаем массив подстрок, используя запятую как разделитель
МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаТЧ.Размер, ",");
// Проверяем количество элементов, чтобы избежать ошибки "Индекс находится за границами массива"
Если МассивПодстрок.Количество() >= 2 Тогда
НоваяСтрока.Размер = СокрЛП(МассивПодстрок[0]);
НоваяСтрока.Цвет = СокрЛП(МассивПодстрок[1]);
ИначеЕсли МассивПодстрок.Количество() = 1 Тогда
НоваяСтрока.Размер = СокрЛП(МассивПодстрок[0]);
КонецЕсли;
Важный момент: Функция РазложитьСтрокуВМассивПодстрок по умолчанию обрезает лишние пробелы, если передан соответствующий параметр, но использование СокрЛП() гарантирует, что в ваши реквизиты не попадут случайные пробелы, стоящие до или после запятой.
Начиная с версии платформы 8.3.6, в языке 1С появилась встроенная функция СтрРазделить(). Она работает значительно быстрее функций из общих модулей, так как реализована на уровне ядра платформы. Разберем её применение.
// Разделяем строку. Третий параметр Ложь означает, что пустые строки не будут включены в массив.
МассивРезультат = СтрРазделить(СтрокаДляРазбора, ",", Ложь);
// Безопасное извлечение данных
Если МассивРезультат.Количество() > 0 Тогда
Значение1 = СокрЛП(МассивРезультат[0]);
КонецЕсли;
Выясним причину, по которой этот метод предпочтительнее: при работе в цикле (например, при обработке тысяч строк номенклатуры) вызов встроенной функции платформы экономит время на вызове процедур из общих модулей и снижает нагрузку на сервер.
Часто программисты сталкиваются с ошибкой "Индекс находится за границами массива", если во входящей строке не оказалось разделителя. Чтобы не загромождать код постоянными проверками Количество(), можно создать вспомогательную функцию "обертку":
Функция ПолучитьЭлементМассиваБезопасно(Массив, Индекс)
Если Массив.Количество() > Индекс Тогда
Возврат СокрЛП(Массив[Индекс]);
Иначе
Возврат "";
КонецЕсли;
КонецФункции
// Пример использования в цикле
Для каждого СтрокаТЧ из Таблица Цикл
МассивДанных = СтрРазделить(СтрокаТЧ.Размер, ",");
НоваяСтрока.Размер = ПолучитьЭлементМассиваБезопасно(МассивДанных, 0);
НоваяСтрока.Цвет = ПолучитьЭлементМассиваБезопасно(МассивДанных, 1);
КонецЦикла;
Этот подход делает код чистым и устойчивым к некорректным входным данным, когда, например, цвет не указан вовсе.
Рассмотрим ситуацию глубже. В типовых конфигурациях (Розница, УТ) хранение значений свойств прямо в строке наименования — это не самый надежный путь. Данные о цвете и размере уже хранятся в базе в структурированном виде. Проанализируем, как получить их правильно с помощью запроса, не прибегая к "парсингу" строк.
Значения свойств характеристик обычно хранятся в табличной части ДополнительныеРеквизиты справочника ХарактеристикиНоменклатуры. Посмотрим на пример запроса:
ВЫБРАТЬ
Характеристики.Ссылка КАК Характеристика,
Характеристики.Владелец КАК Номенклатура,
МАКСИМУМ(ВЫБОР
КОГДА ДопРеквизиты.Свойство.Наименование ПОДОБНО "%Размер%"
ТОГДА ДопРеквизиты.Значение
КОНЕЦ) КАК Размер,
МАКСИМУМ(ВЫБОР
КОГДА ДопРеквизиты.Свойство.Наименование ПОДОБНО "%Цвет%"
ТОГДА ДопРеквизиты.Значение
КОНЕЦ) КАК Цвет
ИЗ
Справочник.ХарактеристикиНоменклатуры КАК Характеристики
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО Характеристики.Ссылка = ДопРеквизиты.Ссылка
ГДЕ
Характеристики.Ссылка В(&МассивСсылок)
СГРУППИРОВАТЬ ПО
Характеристики.Ссылка,
Характеристики.Владелец
Почему это лучше?
Подведем итог. Если вам нужно разобрать строку "здесь и сейчас" (например, при загрузке из Excel), используйте СтрРазделить с обязательной проверкой количества полученных элементов. Если же вы работаете внутри системы с характеристиками 1С, всегда старайтесь обращаться к Дополнительным реквизитам через запрос или объектную модель. Это исключит ошибки, связанные с разным написанием разделителей (кто-то поставит запятую, кто-то точку с запятой или пробел) и сделает вашу разработку профессиональной.