Разработка и Конфигурация · 8 мин
Как найти самое длинное слово в 1С
Разбираем, как найти самое длинное слово в строке в 1С: разбор строки на слова, функция СтрДлина, массивы, работа с текстом из файла и типичные ошибки разработчика.
Задача поиска самого длинного слова в строке — типичная учебная и практическая задача на встроенном языке 1С. Она встречается при обработке текстовых файлов, разборе наименований номенклатуры, проверке длины полей перед записью в базу и в тестовых заданиях при приёме на работу.
В платформе 1С нет готовой функции «найти самое длинное слово», поэтому задача решается в два этапа: сначала строка разбивается на отдельные слова, затем в цикле сравниваются их длины. Ключевые инструменты — функции СтрДлина(), СтрРазделить() (или СтрПолучитьСтроку() для многострочного текста) и стандартный цикл Для Каждого.
Ниже разобраны рабочие варианты кода для тонкого и толстого клиента, способы учесть знаки препинания, обработку текста из файла и типичные ошибки, которые приводят к неверному результату.
Базовый алгоритм поиска самого длинного слова
Суть алгоритма одинакова для любой реализации: заводится переменная для хранения текущего «чемпиона», затем каждое слово сравнивается с ним по длине. Если текущее слово длиннее — оно становится новым чемпионом. После прохода по всем словам в переменной остаётся самое длинное.
Функция СтрДлина() возвращает количество символов в строке, включая пробелы и служебные символы, если они есть. Поэтому перед сравнением слово стоит очистить от лишних пробелов функцией СокрЛП() — иначе слово с пробелом на конце может ошибочно победить.
- 1Получите исходную строку — из переменной, поля ввода или файла
- 2Разбейте строку на слова через СтрРазделить() с разделителем-пробелом
- 3Создайте переменную МаксСлово с пустым значением
- 4В цикле Для Каждого сравнивайте СтрДлина(Слово) с длиной МаксСлово
- 5Если слово длиннее — сохраните его в МаксСлово
- 6После цикла выведите результат через Сообщить() или верните из функции
Готовая функция на встроенном языке 1С
Ниже — универсальная функция, которую можно поместить в общий модуль или модуль обработки. Она принимает строку и возвращает самое длинное слово.
Функция НайтиСамоеДлинноеСлово(ИсходнаяСтрока) Экспорт
МаксСлово = "";
МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);
Для Каждого Слово Из МассивСлов Цикл
Слово = СокрЛП(Слово);
Если СтрДлина(Слово) > СтрДлина(МаксСлово) Тогда
МаксСлово = Слово;
КонецЕсли;
КонецЦикла;
Возврат МаксСлово;
КонецФункции
Третий параметр СтрРазделить() со значением Ложь отбрасывает пустые элементы — это важно, если в строке встречаются двойные пробелы. Без этого параметра в массив попадут пустые строки, которые не сломают логику сравнения, но замедлят обработку больших текстов.
Вызов функции выглядит так:
Текст = "Найти самое длинное слово в строке";
Результат = НайтиСамоеДлинноеСлово(Текст);
Сообщить("Самое длинное слово: " + Результат + " (" + СтрДлина(Результат) + " символов)");
МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);
МаксСлово = "";
Для Каждого Слово Из МассивСлов Цикл
Если СтрДлина(СокрЛП(Слово)) > СтрДлина(МаксСлово) Тогда
МаксСлово = СокрЛП(Слово);
КонецЕсли;
КонецЦикла;Как учесть знаки препинания и несколько разделителей
Если разделять текст только по пробелу, слова «слово,» и «слово» будут считаться разными по длине — запятая добавит лишний символ. Для честного сравнения знаки препинания нужно либо включить в список разделителей, либо удалить перед разбором.
Функция СтрРазделить() принимает строку разделителей, где каждый символ трактуется как самостоятельный разделитель. Это позволяет одним вызовом разбить текст по пробелам, запятым, точкам и другим знакам:
МассивСлов = СтрРазделить(ИсходнаяСтрока, " .,;:!?-()""", Ложь);
Альтернативный подход — предварительная очистка текста через СтрЗаменить(): каждый знак препинания заменяется на пробел или пустую строку. Этот способ нагляднее, когда набор удаляемых символов большой или нестандартный, но требует нескольких вызовов функции.
Поиск в многострочном тексте и тексте из файла
Когда текст содержит несколько строк (например, загружен из txt-файла или многострочного поля), разделителем слов выступают ещё и символы перевода строки. Проще всего заранее заменить их на пробелы:
Текст = СтрЗаменить(Текст, Символы.ПС, " ");
Текст = СтрЗаменить(Текст, Символы.ВК, " ");
МассивСлов = СтрРазделить(Текст, " ", Ложь);
Для чтения текста из файла используется объект ЧтениеТекста:
Чтение = Новый ЧтениеТекста("C:\Данные\текст.txt", КодировкаТекста.UTF8);
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Результат = НайтиСамоеДлинноеСлово(Текст);
На клиенте в тонком клиенте прямой доступ к файловой системе ограничен: файл сначала помещают во временное хранилище через НачатьПомещениеФайла() и обрабатывают на сервере. Это стоит учитывать при построении управляемых форм.
Альтернативные подходы и их ограничения
Кроме классического цикла, задачу можно решить другими способами. У каждого есть свои условия применения.
Сравнение вариантов
Универсальный и читаемый способ. Подходит почти всегда; ограничение — платформа не ниже 8.3.6
Работает на старых платформах. Ограничение — дополнительное копирование строки, медленнее на больших текстах
Полный контроль над правилами выделения слов. Ограничение — больше кода и выше риск ошибки в граничных условиях
Удобна, если нужны несколько самых длинных слов. Избыточна, если нужно только одно слово
Если нужна не только длина, но и позиция слова в исходной строке, дополнительно используют СтрНайти() — она вернёт номер символа, с которого начинается первое вхождение найденного слова. Учтите: при повторяющихся словах будет найдено первое вхождение, что не всегда совпадает с позицией именно «победившего» экземпляра.
Проверка результата и типичные ошибки
После реализации функцию стоит проверить на контрольных примерах: строке из одного слова, строке с несколькими словами одинаковой максимальной длины, пустой строке и строке, состоящей только из пробелов и знаков препинания. В корректной реализации пустая строка возвращает пустое значение, а при равной длине возвращается первое из самых длинных слов.
Как проверить результат
Функция возвращает это же слово
Возвращается пустая строка или ошибка
Возвращается первое из них
Возвращается последнее или слово со знаком препинания
Возвращается пустая строка без ошибки
Ошибка исполнения или Неопределено
Запятая не учитывается в длине
Слово с запятой побеждает за счёт лишнего символа
FAQ
Как найти не одно, а все самые длинные слова одинаковой длины?
Сначала одним проходом определите максимальную длину, затем вторым проходом соберите в массив все слова, чья длина равна найденному максимуму. Это эффективнее, чем сортировка всего массива слов.
Как найти самое короткое слово?
Логика зеркальная: инициализируйте переменную-минимум значением заведомо длиннее любого слова (или первым непустым словом) и сравнивайте оператором «меньше». Не забудьте пропускать пустые элементы массива.
Работает ли СтрРазделить() на старых платформах 1С?
Функция появилась в платформе 8.3.6. На более ранних версиях замените пробелы на символ перевода строки через СтрЗаменить() и перебирайте слова функцией СтрПолучитьСтроку() в цикле по СтрЧислоСтрок().
Как искать слова в значении поля объекта базы, а не в литерале?
Получите текстовое значение реквизита (например, Наименование или Описание) через запрос или обращение к объекту, приведите его к строке функцией Строка() при необходимости и передайте в ту же функцию поиска. Логика не меняется — меняется только источник строки.
Что считать словом, если в тексте встречаются числа и дефисы?
Это определяется набором разделителей. Если дефис не включён в разделители, «северо-восток» считается одним словом; если включён — двумя. Числа без пробелов вокруг тоже попадут в массив как «слова» — при необходимости их можно отфильтровать проверкой на цифры.
Как вывести результат пользователю в управляемой форме?
Создайте строковый реквизит формы, присвойте ему результат функции в серверной процедуре и разместите связанный элемент на форме. Для разового уведомления подойдёт Сообщить() или ПоказатьОповещениеПользователя().