В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача обработки текстовой информации. Одной из типичных задач, особенно для начинающих разработчиков, является разбиение строки на отдельные слова с последующим анализом их уникальности. В этой статье мы подробно разберем, как правильно использовать встроенные функции работы со строками и коллекции значений для решения этой задачи.
Представим ситуацию: пользователь вводит текст в поле ввода на форме, и нам необходимо определить, сколько уникальных слов содержится в этом сообщении. Для реализации нам понадобятся следующие инструменты платформы:
СтрРазделить — для преобразования строки в массив подстрок по заданному разделителю.ВРег (или НРег) — для приведения всех слов к одному регистру, чтобы слова "Привет" и "привет" считались одинаковыми.Соответствие — специальная коллекция, которая хранит данные в формате "Ключ — Значение". Главная особенность этой коллекции заключается в том, что ключи всегда уникальны.Проанализируем простейший способ реализации. Основная идея заключается в том, что мы обходим массив слов, полученный после разделения строки, и добавляем каждое слово в Соответствие в качестве ключа. Если слово уже есть в коллекции, оно просто перезапишется, не создавая дублей.
Рассмотрим пример кода:
// Создаем объект для хранения уникальных слов
УникальныеСлова = Новый Соответствие;
// Разделяем строку, приведенную к верхнему регистру, по пробелу
МассивВсехСлов = СтрРазделить(ВРег(ИсходнаяСтрока), " ");
// Наполняем соответствие
Для Каждого ТекущееСлово Из МассивВсехСлов Цикл
// Вставляем слово в ключ. Значение в данном случае не важно, можно передать Истина
УникальныеСлова.Вставить(ТекущееСлово, Истина);
КонецЦикла;
Сообщить("Количество уникальных слов: " + УникальныеСлова.Количество());
Разберем подробнее работу функции СтрРазделить. В современных версиях платформы (8.3.10 и выше) эта функция имеет третий параметр — ВключатьПустые. Это критически важно для корректного подсчета слов.
Если пользователь введет два пробела подряд, при стандартном разделении в массив попадет "пустая строка". Если мы не хотим считать пустые промежутки за слова, параметр ВключатьПустые нужно установить в значение Ложь.
Посмотрим на улучшенный пример кода:
&НаКлиенте
Процедура ПодсчитатьКоличествоСлов(Команда)
// Используем правильное именование переменной (не "Массив", а "Соответствие")
УникальныеСлова = Новый Соответствие;
// Третий параметр Ложь позволяет игнорировать лишние пробелы
МассивСлов = СтрРазделить(ВРег(ТекстИзПоляВвода), " ", Ложь);
Для Каждого Слово Из МассивСлов Цикл
УникальныеСлова.Вставить(Слово, Неопределено);
КонецЦикла;
ОбщееКоличество = УникальныеСлова.Количество();
Сообщить("Найдено уникальных слов (без учета регистра): " + ОбщееКоличество);
КонецПроцедуры
Проанализируем ситуацию, когда в строке присутствуют не только пробелы, но и запятые, точки или восклицательные знаки. Если использовать только пробел в качестве разделителя, слово "Привет," (с запятой) и "Привет" (без запятой) будут считаться разными словами.
Функция СтрРазделить позволяет передавать в качестве разделителя строку, содержащую все символы, по которым нужно "резать" текст. Платформа воспримет каждый символ в этой строке как отдельный разделитель.
Выясним, как это реализовать программно:
// Указываем все возможные знаки препинания как разделители
Разделители = " ,.!?;:-" + Символы.ПС + Символы.Таб;
// Теперь строка разложится правильно, даже если слова разделены точками или переносами строк
МассивСлов = СтрРазделить(ВРег(ИсходныйТекст), Разделители, Ложь);
Рассмотрим несколько моментов, на которые стоит обратить внимание начинающему разработчику:
Соответствие именем МассивСлов. Это запутывает других программистов, которые будут читать ваш код. Используйте осмысленные имена, такие как УникальныеСлова или СловарьСлов.Соответствие чувствительно к регистру. Без использования ВРег() или НРег() вы получите некорректный результат, так как заглавные и строчные буквы будут считаться разными символами.СтрРазделить создает массив в памяти. Если вы обрабатываете очень большой файл (например, книгу объемом в несколько мегабайт), лучше использовать объект ЧтениеТекста и обрабатывать данные посимвольно или построчно, чтобы избежать переполнения оперативной памяти.Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), вы можете встретить функции в общем модуле СтроковыеФункцииКлиентСервер. Например, функция РазложитьСтрокуВМассивПодстрок долгое время была стандартом до появления встроенной системной функции СтрРазделить.
Проанализируем пример использования функции из БСП:
// Пример использования функции из БСП
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, " ");
Однако на текущий момент рекомендуется использовать именно встроенную функцию СтрРазделить, так как она работает значительно быстрее за счет исполнения на уровне ядра платформы, а не на языке 1С.
Мы разобрали, как эффективно использовать СтрРазделить и Соответствие для анализа текста. Использование объекта Соответствие — это наиболее быстрый и лаконичный способ фильтрации уникальных значений в языке 1С. Помните о важности очистки данных от пустых строк и приведении текста к единому регистру для получения точного результата.