Как разбить число или строку на отдельные символы в 1С 7.7

Программист 1С v7.7
← На главную

В практике разработки на платформе 1С:Предприятие 7.7 часто возникает задача разделения длинного числа или строки на отдельные символы. Типичный пример — заполнение регламентированной отчетности или печатных форм, таких как СНИЛС, ИНН или расчетный счет, где каждый знак должен попадать в отдельную ячейку (квадратик). В этой статье мы подробно разберем несколько способов реализации этой задачи, проанализируем их плюсы и минусы, а также выясним, как избежать типичных ошибок, связанных с типами данных.

Метод 1: Использование строковых функций (универсальный подход)

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

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


// Предположим, СНИЛС хранится в виде "123-456-789 01"
СтрСнилс = "123-456-789 01";
// Очищаем от тире и пробелов
СтрСнилс = СтрЗаменить(СтрСнилс, "-", "");
СтрСнилс = СтрЗаменить(СтрСнилс, " ", "");

// Теперь в строке только цифры: "12345678901"
Для Счет = 1 По СтрДлина(СтрСнилс) Цикл
    Символ = Сред(СтрСнилс, Счет, 1);
    Сообщить("Символ номер " + Счет + ": " + Символ);
КонецЦикла;

В этом примере функция Сред(СтрСнилс, Счет, 1) берет ровно один символ, начиная с позиции Счет. Это позволяет нам в цикле перебрать всю строку целиком.

Метод 2: Прямой вывод в печатную форму (оптимально для отчетов)

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

Разберем этот процесс по шагам:

  1. В модуле формирования отчета подготовьте чистую строку, содержащую только нужные символы (как в Методе 1). Например, переменная ТекСнилс.
  2. В макете (таблице) выделите ячейку, где должна быть первая цифра.
  3. В свойствах ячейки на закладке "Текст" выберите тип "Выражение".
  4. В поле выражения напишите: Сред(ТекСнилс, 1, 1).
  5. Для второй ячейки напишите: Сред(ТекСнилс, 2, 1) и так далее.

Важный нюанс: Если строка окажется короче, чем количество ячеек (например, номер ИНН короче ожидаемого), функция Сред() просто вернет пустую строку, и ячейка останется пустой, что не приведет к ошибке выполнения кода.

Метод 3: Работа с ведущими нулями

Одна из главных проблем при работе с числами в 1С 7.7 — автоматическое отсекание ведущих нулей. Если СНИЛС начинается на "0", то при преобразовании в число этот ноль пропадет, и при последующем разбиении на символы вся структура данных сдвинется.

Чтобы этого избежать, мы должны использовать функцию Формат(). Рассмотрим ситуацию, когда у нас есть число, которое должно превратиться в строку строго определенной длины (например, 11 символов для СНИЛС):


ЧисловойСнилс = 5678901; // Предположим, в начале были нули
// Превращаем в строку длиной 11 символов с дополнение нулями слева
СтрСнилс = Формат(ЧисловойСнилс, "Ч(0)11");
// Результат будет: "00005678901"

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

Метод 4: Использование «Списка Значений» для хранения символов

Иногда требуется не просто вывести символы, а сохранить их для дальнейшей программной обработки (например, для расчета контрольной суммы). В 1С 7.7 для этих целей удобно использовать объект СписокЗначений, который выступает аналогом динамического массива.

Проанализируем пример кода:


Стр = "123456";
СЗ = СоздатьОбъект("СписокЗначений");
Для и = 1 По СтрДлина(Стр) Цикл
    СЗ.ДобавитьЗначение(Сред(Стр, и, 1));
КонецЦикла;

// Теперь мы можем обратиться к любому символу по индексу
// Помните, что в 1С 7.7 индексация в СпискеЗначений начинается с 1
Цифра3 = СЗ.ПолучитьЗначение(3); // Вернет "3"

Метод 5: Математический способ (только для чисел)

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

Выясним, как это работает на примере числа 123:

  1. 123 / 100 = 1.23. С помощью Цел(1.23) получаем 1.
  2. Вычитаем из числа сотни: 123 - (1 * 100) = 23.
  3. 23 / 10 = 2.3. С помощью Цел(2.3) получаем 2.
  4. Остаток — 3.

Пример реализации в коде для 6-значного числа:


Число = 123456; 
Ц1 = Цел(Число / 100000);
Число = Число - Ц1 * 100000;
Ц2 = Цел(Число / 10000);
Число = Число - Ц2 * 10000;
Ц3 = Цел(Число / 1000);
Число = Число - Ц3 * 1000;
Ц4 = Цел(Число / 100);
Число = Число - Ц4 * 100;
Ц5 = Цел(Число / 10);
Ц6 = Число - Ц5 * 10;

Внимание: Мы крайне не рекомендуем использовать математический метод для работы с ИНН, СНИЛС или номерами счетов. Как было сказано выше, математика "не знает" о ведущих нулях и имеет ограничения по разрядности. Строковые функции в данном случае гораздо надежнее и проще в отладке.

Рекомендации и лучшие практики

Подводя итог, приведем основные правила, которых стоит придерживаться при разделении данных на символы в 1С 7.7:

Таким образом, мы рассмотрели все основные инструменты для решения задачи. Выбор конкретного метода зависит от ваших целей: простая печать требует работы с макетом, а сложные расчеты контрольных сумм — использования циклов и коллекций значений.

← На главную