Разработка и Конфигурация · 8 мин
Как вывести числа в обратном порядке в 1С
Как вывести числа в обратном порядке в 1С: перебор массива с конца, разворот строки посимвольно, инверсия цифр числа. Готовые примеры кода на встроенном языке.
Задача вывести числа в обратном порядке в 1С встречается в двух типовых ситуациях: нужно обойти набор чисел (массив, список значений, таблицу) от последнего элемента к первому, либо развернуть само число — например, из 12345 получить 54321. Обе задачи решаются штатными средствами встроенного языка без внешних компонент.
Важно сразу различать эти сценарии, потому что код для них разный. Обратный обход коллекции выполняется циклом с убывающим индексом. Разворот цифр числа делается либо через преобразование в строку с посимвольным чтением, либо арифметически — через остаток от деления и целочисленное деление.
Встроенной функции «развернуть строку» или «развернуть число» в языке 1С нет, поэтому разворот реализуется вручную. Ниже приведены рабочие примеры кода, которые можно скопировать в общий модуль или процедуру формы и адаптировать под свою задачу.
Обратный обход массива чисел
Самый частый случай — есть массив чисел, и его нужно вывести или обработать от последнего элемента к первому. В 1С индексация массива начинается с нуля, а верхняя граница возвращается методом ВГраница(). Цикл с отрицательным шагом записывается так:
МассивЧисел = Новый Массив;
МассивЧисел.Добавить(10);
МассивЧисел.Добавить(20);
МассивЧисел.Добавить(30);
МассивЧисел.Добавить(40);
Для Инд = -МассивЧисел.ВГраница() По 0 Цикл
Сообщить(МассивЧисел[-Инд]);
КонецЦикла;
Этот приём с унарным минусом работает, но выглядит неочевидно и часто вызывает вопросы при чтении кода. Более понятная альтернатива — вычислить индекс вручную внутри обычного цикла:
Для Инд = 0 По МассивЧисел.ВГраница() Цикл
ТекущееЧисло = МассивЧисел[МассивЧисел.ВГраница() - Инд];
Сообщить(ТекущееЧисло);
КонецЦикла;
Оба варианта выведут 40, 30, 20, 10. Второй вариант предпочтительнее в командной разработке: его проще читать и отлаживать, а по производительности разницы нет.
Разворот числа через строку
Если нужно из числа 12345 получить 54321, проще всего перевести число в строку и пройтись по символам с конца. Длина строки возвращается функцией СтрДлина(), отдельный символ — функцией Сред():
Функция РазвернутьЧисло(ИсходноеЧисло)
СтрокаЧисла = Формат(ИсходноеЧисло, "ЧГ=");
Результат = "";
Для Поз = 1 По СтрДлина(СтрокаЧисла) Цикл
Результат = Результат + Сред(СтрокаЧисла, СтрДлина(СтрокаЧисла) - Поз + 1, 1);
КонецЦикла;
Возврат Число(Результат);
КонецФункции
Здесь важен формат ЧГ=: он убирает разделители групп разрядов. Если преобразовать число в строку обычным способом, в строке могут оказаться неразрывные пробелы между тысячами, и разворот даст некорректный результат или ошибку преобразования.
Функция Число() в конце возвращает числовой тип. Если развёрнутая строка нужна именно как строка (например, для печати или сравнения), последнюю строку можно заменить на Возврат Результат;.
- 1Преобразуйте число в строку с форматом ЧГ=, чтобы убрать разделители разрядов
- 2Пройдите циклом от последнего символа к первому, собирая новую строку
- 3Преобразуйте результат обратно функцией Число()
- 4Проверьте результат на контрольном примере, например 12345 должно дать 54321
Разворот числа арифметически
Строковый способ удобен, но иногда требуется решить задачу чисто математически — например, в учебных заданиях или когда работа со строками нежелательна. Алгоритм использует остаток от деления на 10 (оператор %) и целочисленное деление:
Функция РазвернутьЧислоАрифметически(ИсходноеЧисло)
Результат = 0;
Остаток = ИсходноеЧисло;
Пока Остаток > 0 Цикл
Цифра = Остаток % 10;
Результат = Результат * 10 + Цифра;
Остаток = Цел(Остаток / 10);
КонецЦикла;
Возврат Результат;
КонецФункции
На каждой итерации последняя цифра числа извлекается через остаток от деления и приписывается к результату, после чего число укорачивается целочисленным делением. Цикл завершается, когда от исходного числа ничего не остаётся.
У арифметического способа есть ограничение: он корректно работает только с положительными целыми числами. Для отрицательных чисел знак нужно обрабатывать отдельно — сохранить его до цикла и вернуть после. Дробные числа этим методом не разворачиваются.
Сравнение способов разворота
Короткий и понятный код, подходит для большинства задач. Требует аккуратности с форматом и типом результата.
Без преобразования типов, работает только с целыми неотрицательными числами. Подходит для учебных задач и ограниченных контекстов.
Нужен, когда разворачивается не число, а порядок элементов в коллекции. Реализуется индексным циклом.
Обратный порядок в списке значений и таблице
Для списка значений логика та же, что и для массива: обращение по индексу и метод Количество(). Индексы также начинаются с нуля:
Для Инд = 1 По СписокЧисел.Количество() Цикл
Элемент = СписокЧисел[СписокЧисел.Количество() - Инд];
Сообщить(Элемент.Значение);
КонецЦикла;
Если числа хранятся в таблице значений и нужен просто обратный порядок строк, не всегда требуется ручной цикл. Можно добавить служебную колонку с номером строки и отсортировать по ней по убыванию методом Сортировать() — это читаемее при дальнейшей обработке таблицы целиком.
Для выборки из запроса обратный порядок задаётся ещё проще — конструкцией УПОРЯДОЧИТЬ ПО Поле УБЫВ в тексте запроса. Если числа берутся из базы, сортировка на уровне запроса предпочтительнее любого программного разворота: она выполняется на сервере СУБД и не требует дополнительного кода.
Если данные приходят из запроса, задачу «в обратном порядке» почти всегда стоит решать через УБЫВ в запросе, а не разворотом результата в коде. Это короче, быстрее и не требует хранения промежуточного массива.
Типичные ошибки и проверка результата
Чаще всего при развороте чисел в 1С ошибаются в трёх местах. Первая ошибка — забыть формат ЧГ=, из-за чего в строку попадают разделители разрядов, и функция Число() либо выдаёт ошибку, либо возвращает неожиданное значение. Вторая — путаница с индексацией: в массивах и списках отсчёт идёт с нуля, а СтрДлина() и Сред() работают с позициями от единицы. Третья — потеря ведущих нулей: число 1200 после разворота даёт 21, а не 0021, потому что числовой тип не хранит нули слева.
Если ведущие нули значимы (например, вы разворачиваете код или номер фиксированной длины), результат нужно оставлять строкой и не преобразовывать в число. Это принципиальный момент выбора типа результата, который стоит определить до написания кода.
Проверять результат удобно на контрольных примерах: однозначное число (должно вернуться без изменений), число с нулями на конце (1200 → 21), число с одинаковыми цифрами (1111 → 1111). Такой набор быстро выявляет ошибки в логике цикла.
FAQ
Можно ли развернуть строку в 1С одной встроенной функцией?
Нет, штатной функции разворота строки во встроенном языке нет. Строку разворачивают посимвольно через СтрДлина() и Сред() в цикле, собирая символы с конца в начало.
Как вывести числа в обратном порядке без массива?
Если числа генерируются в цикле, можно сразу идти от большего к меньшему, вычисляя значение от границ диапазона. Если числа уже лежат в базе — используйте УПОРЯДОЧИТЬ ПО ... УБЫВ в запросе, тогда разворот в коде вообще не понадобится.
Почему после разворота числа пропадают нули?
Числовой тип не хранит ведущие нули: разворот 100 даёт 1. Если нули важны, работайте с результатом как со строкой и не применяйте функцию Число().
Как развернуть отрицательное число?
Сохраните знак отдельно: проверьте число условием, работайте с модулем числа, а в конце верните знак умножением на -1. В строковом способе можно просто исключить символ минуса из перебора.
Что быстрее — строковый или арифметический разворот?
Для прикладных задач разница в производительности незаметна, выбирайте по читаемости кода. Арифметический вариант имеет смысл в учебных заданиях или когда преобразование типов нежелательно по логике программы.
Что важно запомнить
Обратный порядок элементов коллекции делается индексным циклом от верхней границы к нулю, разворот числа — через строку с форматом ЧГ= или арифметически через остаток от деления. Для данных из базы предпочтительна сортировка УБЫВ в запросе. Следите за типом результата: преобразование в число удаляет ведущие нули.