Как в 1С автоматически дополнить строку пробелами до фиксированной длины?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

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

Рассмотрим самый простой и быстрый способ, который работает в любой версии платформы. Если нам нужно гарантированно получить строку длиной 5 символов, мы можем сначала прибавить к исходному значению строку из нужного количества пробелов, а затем обрезать результат слева до требуемой длины. Проанализируем пример кода:


// Пример дополнения строки пробелами справа
Реквизит = "ул";
Результат = Лев(Реквизит + "     ", 5); 
// В результате получим "ул   "

Важный нюанс: в этом методе количество добавляемых пробелов в строке-шаблоне должно быть не меньше, чем итоговая требуемая длина. Если вы добавите 10 пробелов и возьмете Лев(..., 5), это тоже будет работать корректно. Это надежный «старый» метод, который часто встречается в типовых конфигурациях.

Метод 2: Программная типизация через Квалификаторы Строки

Если задача стоит более масштабно — например, вы формируете таблицу значений, которая в дальнейшем будет выгружена в файл, — правильнее будет использовать возможности типизации платформы. Разберем ситуацию, когда мы создаем колонку в таблице значений. Чтобы 1С сама следила за длиной строк, мы укажем параметр ДопустимаяДлина.Фиксированная.

Посмотрим, как это реализуется программно:


// Создаем квалификатор с фиксированной длиной 5
Квалификатор5 = Новый КвалификаторыСтроки(5, ДопустимаяДлина.Фиксированная);

// Создаем описание типа на основе квалификатора
ОписаниеТипаСтрока5 = Новый ОписаниеТипов("Строка", Квалификатор5);

// Добавляем колонку в таблицу значений
ТаблицаОбъектов.Колонки.Добавить("Идентификатор", ОписаниеТипаСтрока5);

Выясним, почему это решение является наиболее профессиональным. При использовании ДопустимаяДлина.Фиксированная платформа берет на себя всю рутину:

  1. Если вы записываете строку короче 5 символов, 1С автоматически добавит пробелы в конец.
  2. Если строка длиннее 5 символов, она будет автоматически обрезана.
  3. Это гарантирует однородность данных во всей колонке таблицы или в реквизите базы данных.

Метод 3: Использование функции Формат()

Проанализируем еще один способ, который часто незаслуженно забывают — использование функции Формат(). Хотя чаще она применяется для чисел и дат, для строк также можно задать определенную ширину. Это удобно использовать прямо в текстах запросов или при выводе данных в отчеты.

Пример использования форматной строки:


// Использование параметра СЦ (Символов Целого) для строк
// Обратите внимание, что поведение может зависеть от контекста использования
Значение = "пр-кт";
Результат = Формат(Значение, "СЦ=5");

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

Метод 4: Специализированные функции (платформа 8.3.6 и выше)

В современных версиях платформы 1С:Предприятие 8.3 появились встроенные функции для работы со строками, которые делают код более читаемым. Рассмотрим функцию СтрЗаполнитьСправа. Она идеально подходит под нашу задачу, так как позволяет явно указать символ-заполнитель.


// Самый современный и читаемый способ
ИсходнаяСтрока = "ул";
Результат = СтрЗаполнитьСправа(ИсходнаяСтрока, 5, " ");

Здесь мы явно передаем три параметра: исходную строку, итоговую длину и символ, которым нужно заполнить недостающее пространство (в нашем случае — пробел). Если нужно заполнить строку нулями (например, для кодов), просто замените пробел на "0": СтрЗаполнитьСлева(Код, 5, "0").

Особенности работы с DBF и XBase

Разберем ситуацию, которая часто возникает при чтении или записи файлов формата .dbf. Объект XBase в 1С при работе с полями типа "String" ведет себя строго в соответствии со структурой файла. Если в структуре DBF поле определено как NCHAR(5), то при записи значения 1С сама дополнит его пробелами.

Однако при чтении из DBF вы можете столкнуться с обратной проблемой: вы читаете "ул " (с пробелами), и сравнение "ул" = "ул " вернет Ложь. В этом случае обязательно используйте функции обрезки пробелов:


// Очистка считанных данных из DBF
ЗначениеИзФайла = СокрП(ТекстИзПоляDBF); 

Итоги и рекомендации

Подводя итог, выберем оптимальное решение в зависимости от вашей задачи:

Использование ДопустимаяДлина.Фиксированная — это наиболее надежный способ избежать ошибок при выгрузке данных в государственные классификаторы или банковские системы, где формат каждого символа строго регламентирован.

← На главную