Как в 1С разделить строку на слова и подсчитать количество уникальных слов

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

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

Постановка задачи и выбор инструментов

Представим ситуацию: пользователь вводит текст в поле ввода на форме, и нам необходимо определить, сколько уникальных слов содержится в этом сообщении. Для реализации нам понадобятся следующие инструменты платформы:

  1. Функция СтрРазделить — для преобразования строки в массив подстрок по заданному разделителю.
  2. Функция ВРег (или НРег) — для приведения всех слов к одному регистру, чтобы слова "Привет" и "привет" считались одинаковыми.
  3. Объект Соответствие — специальная коллекция, которая хранит данные в формате "Ключ — Значение". Главная особенность этой коллекции заключается в том, что ключи всегда уникальны.

Базовый алгоритм решения

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

Рассмотрим пример кода:


// Создаем объект для хранения уникальных слов
УникальныеСлова = Новый Соответствие;

// Разделяем строку, приведенную к верхнему регистру, по пробелу
МассивВсехСлов = СтрРазделить(ВРег(ИсходнаяСтрока), " ");

// Наполняем соответствие
Для Каждого ТекущееСлово Из МассивВсехСлов Цикл
    // Вставляем слово в ключ. Значение в данном случае не важно, можно передать Истина
    УникальныеСлова.Вставить(ТекущееСлово, Истина);
КонецЦикла;

Сообщить("Количество уникальных слов: " + УникальныеСлова.Количество());

Тонкости использования функции СтрРазделить

Разберем подробнее работу функции СтрРазделить. В современных версиях платформы (8.3.10 и выше) эта функция имеет третий параметр — ВключатьПустые. Это критически важно для корректного подсчета слов.

Если пользователь введет два пробела подряд, при стандартном разделении в массив попадет "пустая строка". Если мы не хотим считать пустые промежутки за слова, параметр ВключатьПустые нужно установить в значение Ложь.

Посмотрим на улучшенный пример кода:


&НаКлиенте
Процедура ПодсчитатьКоличествоСлов(Команда)
    
    // Используем правильное именование переменной (не "Массив", а "Соответствие")
    УникальныеСлова = Новый Соответствие;
    
    // Третий параметр Ложь позволяет игнорировать лишние пробелы
    МассивСлов = СтрРазделить(ВРег(ТекстИзПоляВвода), " ", Ложь);
    
    Для Каждого Слово Из МассивСлов Цикл
        УникальныеСлова.Вставить(Слово, Неопределено);
    КонецЦикла;
    
    ОбщееКоличество = УникальныеСлова.Количество();
    Сообщить("Найдено уникальных слов (без учета регистра): " + ОбщееКоличество);
    
КонецПроцедуры

Обработка знаков препинания и нескольких разделителей

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

Функция СтрРазделить позволяет передавать в качестве разделителя строку, содержащую все символы, по которым нужно "резать" текст. Платформа воспримет каждый символ в этой строке как отдельный разделитель.

Выясним, как это реализовать программно:


// Указываем все возможные знаки препинания как разделители
Разделители = " ,.!?;:-" + Символы.ПС + Символы.Таб;

// Теперь строка разложится правильно, даже если слова разделены точками или переносами строк
МассивСлов = СтрРазделить(ВРег(ИсходныйТекст), Разделители, Ложь);

Типичные ошибки при реализации

Рассмотрим несколько моментов, на которые стоит обратить внимание начинающему разработчику:

Альтернативные способы через БСП

Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), вы можете встретить функции в общем модуле СтроковыеФункцииКлиентСервер. Например, функция РазложитьСтрокуВМассивПодстрок долгое время была стандартом до появления встроенной системной функции СтрРазделить.

Проанализируем пример использования функции из БСП:


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

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

Заключение

Мы разобрали, как эффективно использовать СтрРазделить и Соответствие для анализа текста. Использование объекта Соответствие — это наиболее быстрый и лаконичный способ фильтрации уникальных значений в языке 1С. Помните о важности очистки данных от пустых строк и приведении текста к единому регистру для получения точного результата.

← На главную