В практике разработки на платформе 1С:Предприятие 7.7 часто возникает задача разделения длинного числа или строки на отдельные символы. Типичный пример — заполнение регламентированной отчетности или печатных форм, таких как СНИЛС, ИНН или расчетный счет, где каждый знак должен попадать в отдельную ячейку (квадратик). В этой статье мы подробно разберем несколько способов реализации этой задачи, проанализируем их плюсы и минусы, а также выясним, как избежать типичных ошибок, связанных с типами данных.
Самый простой и надежный способ — это работа со значением как со строкой. Даже если исходные данные являются числом, мы преобразуем их в текстовый вид, чтобы иметь возможность обращаться к каждому знаку по его порядковому номеру. Основной функцией здесь является Сред().
Рассмотрим алгоритм действий. Сначала нам необходимо подготовить строку: убрать лишние пробелы, дефисы или другие разделители, которые могут присутствовать в номере СНИЛС или ИНН. Для этого используем функцию СтрЗаменить().
// Предположим, СНИЛС хранится в виде "123-456-789 01"
СтрСнилс = "123-456-789 01";
// Очищаем от тире и пробелов
СтрСнилс = СтрЗаменить(СтрСнилс, "-", "");
СтрСнилс = СтрЗаменить(СтрСнилс, " ", "");
// Теперь в строке только цифры: "12345678901"
Для Счет = 1 По СтрДлина(СтрСнилс) Цикл
Символ = Сред(СтрСнилс, Счет, 1);
Сообщить("Символ номер " + Счет + ": " + Символ);
КонецЦикла;
В этом примере функция Сред(СтрСнилс, Счет, 1) берет ровно один символ, начиная с позиции Счет. Это позволяет нам в цикле перебрать всю строку целиком.
Если ваша задача заключается исключительно в выводе цифр в «квадратики» печатной формы, не обязательно создавать промежуточные переменные в коде модуля. Мы можем прописать выражения прямо в свойствах ячеек таблицы (макета).
Разберем этот процесс по шагам:
ТекСнилс.Сред(ТекСнилс, 1, 1).Сред(ТекСнилс, 2, 1) и так далее.Важный нюанс: Если строка окажется короче, чем количество ячеек (например, номер ИНН короче ожидаемого), функция Сред() просто вернет пустую строку, и ячейка останется пустой, что не приведет к ошибке выполнения кода.
Одна из главных проблем при работе с числами в 1С 7.7 — автоматическое отсекание ведущих нулей. Если СНИЛС начинается на "0", то при преобразовании в число этот ноль пропадет, и при последующем разбиении на символы вся структура данных сдвинется.
Чтобы этого избежать, мы должны использовать функцию Формат(). Рассмотрим ситуацию, когда у нас есть число, которое должно превратиться в строку строго определенной длины (например, 11 символов для СНИЛС):
ЧисловойСнилс = 5678901; // Предположим, в начале были нули
// Превращаем в строку длиной 11 символов с дополнение нулями слева
СтрСнилс = Формат(ЧисловойСнилс, "Ч(0)11");
// Результат будет: "00005678901"
Теперь, используя Сред(), мы получим корректные значения для каждой позиции, включая ведущие нули.
Иногда требуется не просто вывести символы, а сохранить их для дальнейшей программной обработки (например, для расчета контрольной суммы). В 1С 7.7 для этих целей удобно использовать объект СписокЗначений, который выступает аналогом динамического массива.
Проанализируем пример кода:
Стр = "123456";
СЗ = СоздатьОбъект("СписокЗначений");
Для и = 1 По СтрДлина(Стр) Цикл
СЗ.ДобавитьЗначение(Сред(Стр, и, 1));
КонецЦикла;
// Теперь мы можем обратиться к любому символу по индексу
// Помните, что в 1С 7.7 индексация в СпискеЗначений начинается с 1
Цифра3 = СЗ.ПолучитьЗначение(3); // Вернет "3"
Если по каким-то причинам вы не хотите использовать строковые функции, можно прибегнуть к математическому методу получения разрядов числа. Этот способ основан на последовательном делении на 10 и взятии остатка.
Выясним, как это работает на примере числа 123:
123 / 100 = 1.23. С помощью Цел(1.23) получаем 1.123 - (1 * 100) = 23.23 / 10 = 2.3. С помощью Цел(2.3) получаем 2.Пример реализации в коде для 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:
Строка.СокрЛП() и СтрЗаменить(), чтобы избавиться от невидимых символов и знаков пунктуации.Формат() для приведения к нужному шаблону.Сред() прямо в ячейке таблицы — самый лаконичный способ, не загромождающий программный код лишними переменными.Таким образом, мы рассмотрели все основные инструменты для решения задачи. Выбор конкретного метода зависит от ваших целей: простая печать требует работы с макетом, а сложные расчеты контрольных сумм — использования циклов и коллекций значений.