К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как вывести числа в обратном порядке в 1С

Как вывести числа в обратном порядке в 1С: перебор массива с конца, разворот строки посимвольно, инверсия цифр числа. Готовые примеры кода на встроенном языке.

Задача вывести числа в обратном порядке в 1С встречается в двух типовых ситуациях: нужно обойти набор чисел (массив, список значений, таблицу) от последнего элемента к первому, либо развернуть само число — например, из 12345 получить 54321. Обе задачи решаются штатными средствами встроенного языка без внешних компонент.

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

Встроенной функции «развернуть строку» или «развернуть число» в языке 1С нет, поэтому разворот реализуется вручную. Ниже приведены рабочие примеры кода, которые можно скопировать в общий модуль или процедуру формы и адаптировать под свою задачу.

Обратный обход массива чисел

Самый частый случай — есть массив чисел, и его нужно вывести или обработать от последнего элемента к первому. В 1С индексация массива начинается с нуля, а верхняя граница возвращается методом ВГраница(). Цикл с отрицательным шагом записывается так:

МассивЧисел = Новый Массив;

МассивЧисел.Добавить(10);

МассивЧисел.Добавить(20);

МассивЧисел.Добавить(30);

МассивЧисел.Добавить(40);

Для Инд = -МассивЧисел.ВГраница() По 0 Цикл

Сообщить(МассивЧисел[-Инд]);

КонецЦикла;

Этот приём с унарным минусом работает, но выглядит неочевидно и часто вызывает вопросы при чтении кода. Более понятная альтернатива — вычислить индекс вручную внутри обычного цикла:

Для Инд = 0 По МассивЧисел.ВГраница() Цикл

ТекущееЧисло = МассивЧисел[МассивЧисел.ВГраница() - Инд];

Сообщить(ТекущееЧисло);

КонецЦикла;

Оба варианта выведут 40, 30, 20, 10. Второй вариант предпочтительнее в командной разработке: его проще читать и отлаживать, а по производительности разницы нет.

Разворот числа через строку

Если нужно из числа 12345 получить 54321, проще всего перевести число в строку и пройтись по символам с конца. Длина строки возвращается функцией СтрДлина(), отдельный символ — функцией Сред():

Функция РазвернутьЧисло(ИсходноеЧисло)

СтрокаЧисла = Формат(ИсходноеЧисло, "ЧГ=");

Результат = "";

Для Поз = 1 По СтрДлина(СтрокаЧисла) Цикл

Результат = Результат + Сред(СтрокаЧисла, СтрДлина(СтрокаЧисла) - Поз + 1, 1);

КонецЦикла;

Возврат Число(Результат);

КонецФункции

Здесь важен формат ЧГ=: он убирает разделители групп разрядов. Если преобразовать число в строку обычным способом, в строке могут оказаться неразрывные пробелы между тысячами, и разворот даст некорректный результат или ошибку преобразования.

Функция Число() в конце возвращает числовой тип. Если развёрнутая строка нужна именно как строка (например, для печати или сравнения), последнюю строку можно заменить на Возврат Результат;.

Порядок действий при развороте числа строкой
  1. 1
    Преобразуйте число в строку с форматом ЧГ=, чтобы убрать разделители разрядов
  2. 2
    Пройдите циклом от последнего символа к первому, собирая новую строку
  3. 3
    Преобразуйте результат обратно функцией Число()
  4. 4
    Проверьте результат на контрольном примере, например 12345 должно дать 54321

Разворот числа арифметически

Строковый способ удобен, но иногда требуется решить задачу чисто математически — например, в учебных заданиях или когда работа со строками нежелательна. Алгоритм использует остаток от деления на 10 (оператор %) и целочисленное деление:

Функция РазвернутьЧислоАрифметически(ИсходноеЧисло)

Результат = 0;

Остаток = ИсходноеЧисло;

Пока Остаток > 0 Цикл

Цифра = Остаток % 10;

Результат = Результат * 10 + Цифра;

Остаток = Цел(Остаток / 10);

КонецЦикла;

Возврат Результат;

КонецФункции

На каждой итерации последняя цифра числа извлекается через остаток от деления и приписывается к результату, после чего число укорачивается целочисленным делением. Цикл завершается, когда от исходного числа ничего не остаётся.

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

Сравнение способов разворота

Через строку

Короткий и понятный код, подходит для большинства задач. Требует аккуратности с форматом и типом результата.

Арифметически

Без преобразования типов, работает только с целыми неотрицательными числами. Подходит для учебных задач и ограниченных контекстов.

Обратный обход массива

Нужен, когда разворачивается не число, а порядок элементов в коллекции. Реализуется индексным циклом.

Обратный порядок в списке значений и таблице

Для списка значений логика та же, что и для массива: обращение по индексу и метод Количество(). Индексы также начинаются с нуля:

Для Инд = 1 По СписокЧисел.Количество() Цикл

Элемент = СписокЧисел[СписокЧисел.Количество() - Инд];

Сообщить(Элемент.Значение);

КонецЦикла;

Если числа хранятся в таблице значений и нужен просто обратный порядок строк, не всегда требуется ручной цикл. Можно добавить служебную колонку с номером строки и отсортировать по ней по убыванию методом Сортировать() — это читаемее при дальнейшей обработке таблицы целиком.

Для выборки из запроса обратный порядок задаётся ещё проще — конструкцией УПОРЯДОЧИТЬ ПО Поле УБЫВ в тексте запроса. Если числа берутся из базы, сортировка на уровне запроса предпочтительнее любого программного разворота: она выполняется на сервере СУБД и не требует дополнительного кода.

Если данные приходят из запроса, задачу «в обратном порядке» почти всегда стоит решать через УБЫВ в запросе, а не разворотом результата в коде. Это короче, быстрее и не требует хранения промежуточного массива.
ПЗ
Практическое замечание

Типичные ошибки и проверка результата

Чаще всего при развороте чисел в 1С ошибаются в трёх местах. Первая ошибка — забыть формат ЧГ=, из-за чего в строку попадают разделители разрядов, и функция Число() либо выдаёт ошибку, либо возвращает неожиданное значение. Вторая — путаница с индексацией: в массивах и списках отсчёт идёт с нуля, а СтрДлина() и Сред() работают с позициями от единицы. Третья — потеря ведущих нулей: число 1200 после разворота даёт 21, а не 0021, потому что числовой тип не хранит нули слева.

Если ведущие нули значимы (например, вы разворачиваете код или номер фиксированной длины), результат нужно оставлять строкой и не преобразовывать в число. Это принципиальный момент выбора типа результата, который стоит определить до написания кода.

Проверять результат удобно на контрольных примерах: однозначное число (должно вернуться без изменений), число с нулями на конце (1200 → 21), число с одинаковыми цифрами (1111 → 1111). Такой набор быстро выявляет ошибки в логике цикла.

Типичные ошибки
01
Преобразование в строку без ЧГ= — в строку попадают разделители разрядов, итоговое число искажается
02
Смешение индексации с нуля у массивов и позиций с единицы у строк — сдвиг на один символ и неверный результат
03
Преобразование результата в число, когда нужны ведущие нули — нули теряются безвозвратно
04
Попытка развернуть отрицательное или дробное число арифметическим способом без обработки знака и дробной части

FAQ

Можно ли развернуть строку в 1С одной встроенной функцией?

Нет, штатной функции разворота строки во встроенном языке нет. Строку разворачивают посимвольно через СтрДлина() и Сред() в цикле, собирая символы с конца в начало.

Как вывести числа в обратном порядке без массива?

Если числа генерируются в цикле, можно сразу идти от большего к меньшему, вычисляя значение от границ диапазона. Если числа уже лежат в базе — используйте УПОРЯДОЧИТЬ ПО ... УБЫВ в запросе, тогда разворот в коде вообще не понадобится.

Почему после разворота числа пропадают нули?

Числовой тип не хранит ведущие нули: разворот 100 даёт 1. Если нули важны, работайте с результатом как со строкой и не применяйте функцию Число().

Как развернуть отрицательное число?

Сохраните знак отдельно: проверьте число условием, работайте с модулем числа, а в конце верните знак умножением на -1. В строковом способе можно просто исключить символ минуса из перебора.

Что быстрее — строковый или арифметический разворот?

Для прикладных задач разница в производительности незаметна, выбирайте по читаемости кода. Арифметический вариант имеет смысл в учебных заданиях или когда преобразование типов нежелательно по логике программы.

Итог

Что важно запомнить

Обратный порядок элементов коллекции делается индексным циклом от верхней границы к нулю, разворот числа — через строку с форматом ЧГ= или арифметически через остаток от деления. Для данных из базы предпочтительна сортировка УБЫВ в запросе. Следите за типом результата: преобразование в число удаляет ведущие нули.