Часто в процессе разработки на платформе 1С возникает задача обработки пользовательского ввода. Например, когда пользователь вводит числа через запятую или пробел в поле ввода, и нам необходимо получить из этой строки отсортированный массив чисел. Разберем, почему простая сортировка строк не работает для чисел и как правильно реализовать этот механизм.
Если мы просто разделим строку методом СтрРазделить, мы получим массив строк. При попытке отсортировать такой массив 1С применит «алфавитную» сортировку. В такой логике строка «10» будет меньше, чем строка «9», потому что символ «1» стоит раньше символа «9». Чтобы избежать этого, нам нужно заставить систему воспринимать данные именно как числа.
Наиболее эффективным и простым способом решения задачи является использование объекта СписокЗначений. Ключевой момент здесь — принудительное указание типа данных через ОписаниеТипов. Это обеспечит неявное приведение типов при загрузке данных в список.
Рассмотрим пошаговый алгоритм реализации:
СтрРазделить.СписокЗначений.ТипЗначения, чтобы список «понимал», что внутри будут числа.Давайте посмотрим на готовый код, который реализует данную логику. Этот код можно использовать в модуле формы или в серверном модуле.
ИсходнаяСтрока = "122, 18, 9, 10";
МассивСтрок = СтрРазделить(ИсходнаяСтрока, ",");
СЗ = Новый СписокЗначений;
// Указываем, что в списке будут только числа
СЗ.ТипЗначения = Новый ОписаниеТипов("Число");
// Загружаем данные — приведение типов произойдет автоматически
СЗ.ЗагрузитьЗначения(МассивСтрок);
// Выполняем сортировку по возрастанию
СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр);
// Получаем отсортированный массив чисел
Результат = СЗ.ВыгрузитьЗначения();
Если вы написали код, но по нажатию кнопки ничего не происходит, рекомендуем проверить следующие моменты:
&НаКлиенте, &НаСервере). Если вы пытаетесь выполнить специфические действия на клиенте, которые требуют серверного контекста, код может аварийно завершиться.СтрРазделить убедитесь, что разделители в строке соответствуют тем, что вы указали в функции. Если в строке есть лишние пробелы, используйте СокрЛП для очистки элементов массива перед приведением к типу Число.Для создания более профессионального кода учитывайте, что пользователь может ввести некорректные данные (буквы или спецсимволы вместо цифр). Чтобы программа не «вылетала» с ошибкой, используйте конструкцию Попытка...Исключение при преобразовании каждого элемента в число. Также, если вы планируете в дальнейшем выполнять сложные манипуляции с этими числами, рассмотрите возможность использования ТаблицыЗначений с одной колонкой типа Число — это дает больше возможностей для последующей фильтрации и группировки данных.