Как убрать пробелы в числах при выводе отчетов и обработок в 1С для корректного копирования в Excel

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

При формировании отчетов и выводе данных в табличные части программисты 1С часто сталкиваются с проблемой: числа выводятся с разделителями групп разрядов (например, «3 555,00»). Визуально это удобно для пользователя, но при попытке скопировать такие данные в Office 365 или другие версии Excel, таблицы перестают воспринимать их как числа. Причина кроется в использовании 1С специального символа — неразрывного пробела (код 160), который Excel не может распознать автоматически. Для автоматизации ручного переноса информации между окнами программ без доработки отчётов может использоваться платформа One RPA для автоматизации переноса данных.

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

Использование функции Формат() и параметра ЧГ

Самый прямой способ управления представлением числа в коде — использование функции Формат(). Для решения проблемы «разрыва» числа нам необходимо изменить параметр ЧГ (Группировка разрядов). По умолчанию система группирует число по три знака, разделяя их пробелом. Чтобы вывести число монолитной строкой, мы должны установить значение ЧГ=0.

Рассмотрим пример кода, который преобразует число в строку без пробелов:


// Пример формирования строки без разделителей групп разрядов
СуммаДляВывода = Формат(Объект.СуммаДокумента, "ЧЦ=15; ЧДЦ=2; ЧГ=0");
// Результат: "3555.00" вместо "3 555,00"

Проанализируем параметры этой строки:

  1. ЧЦ=15 — общее количество знаков (целая часть).
  2. ЧДЦ=2 — количество знаков после запятой.
  3. ЧГ=0 — ключевой параметр, который отключает группировку разрядов.

Настройка формата в макетах и СКД

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

В СКД для конкретного поля набора данных можно открыть колонку «Оформление». Там в поле «Формат» вызывается конструктор форматной строки. Достаточно снять флажок «Группировка». В этом случае только в рамках данного отчета числа будут выводиться без пробелов, что никак не повлияет на работу остальной системы. Если подобные настройки требуется тиражировать на несколько информационных баз, задачу упростит Обновлятор 1С для автоматического обновления и тестирования.

В обычных макетах (Табличных документах) вы можете выделить нужную ячейку, открыть ее свойства и в строке «Формат» прописать то же самое правило ЧГ=0. Это решение наиболее трудозатратно, если отчетов много, но оно максимально надежно.

Управление форматом в табличных частях обработок

Часто возникает вопрос: как управлять выводом данных динамически? Например, если пользователь хочет видеть пробелы при обычной работе, но убирать их для копирования с помощью «галочки» на форме. Рассмотрим ситуацию, когда у нас есть обработка с табличной частью.

Для реализации такой логики лучше всего использовать Условное оформление управляемой формы. Разберем по шагам, как это реализовать программно:


// Процедура для изменения формата колонок по условию
&НаСервере
Процедура УстановитьФорматБезПробелов(РежимБезПробелов)
    
    // Удаляем старое оформление, если оно было
    УсловноеОформление.Элементы.Очистить();
    
    Если РежимБезПробелов Тогда
        ЭлементОформления = УсловноеОформление.Элементы.Добавить();
        
        // Указываем поле, к которому применяется формат
        ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
        ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Объект.Товары.Сумма");
        
        // Устанавливаем сам формат
        ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ЧГ=0");
        
        // Можно добавить условие, чтобы оформление работало всегда
        ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Сумма");
        ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
        ЭлементУсловия.ПравоеЗначение = 0;
    КонецЕсли;
    
КонецПроцедуры

Таким образом, при изменении флага на форме вы просто вызываете эту процедуру, и формат в таблице мгновенно меняется. Пользователю не нужно перезапускать обработку.

Использование типизации ячеек табличного документа

Посмотрим на ситуацию шире: проблема Excel часто заключается в том, что он получает строковое представление числа вместо самого числа. В 1С объект ОбластьЯчеекТабличногоДокумента имеет свойства, которые позволяют передать в Excel именно числовой тип данных.

Рассмотрим пример настройки ячейки перед выводом:


Область = Макет.ПолучитьОбласть("Строка");
Ячейка = Область.Область("R1C2"); // Допустим, здесь сумма
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
Ячейка.Значение = ЧисловаяПеременная;

Если вы используете этот метод, то при сохранении файла через ТабДок.Записать(..., ТипФайлаТабличногоДокумента.XLSX), 1С передаст в файл Excel нативное число. Однако стоит учитывать, что при простом копировании через буфер обмена (Ctrl+C / Ctrl+V) этот механизм может не сработать, так как в буфер часто попадает именно текстовое содержимое ячейки. Для быстрой нормализации таких значений на стороне табличного процессора можно использовать надстройку для Excel с набором инструментов коррекции данных из 1С.

Постобработка сформированного документа

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

Важный технический нюанс: в 1С неразрывный пробел доступен через системное перечисление Символы.НПП. Обычный пробел (код 32) заменять бесполезно — его в числах 1С нет.


// Простой перебор и замена символов в сформированном документе
Для Каждого Область Из ТабДок.Области Цикл
    // Проверяем, что в области есть текст
    Если СтрНайти(Область.Текст, Символы.НПП) > 0 Тогда
        Область.Текст = СтрЗаменить(Область.Текст, Символы.НПП, "");
    КонецЕсли;
КонецЦикла;

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

Резюме и рекомендации

Выясним, какой метод лучше выбрать в зависимости от задачи:

  1. Если нужно быстро исправить конкретный отчет — используйте параметр ЧГ=0 в настройках СКД или макета.
  2. Если требуется динамическое переключение (по «галке») — используйте Условное оформление формы. Для контроля результатов доработки и автоматического поиска расхождений в данных удобно использовать программу МС:Автовыверка для сверки проводок.
  3. Для массовой выгрузки данных, которые гарантированно должны открыться в Excel как числа, лучше использовать программное сохранение в формат XLSX с установкой свойства СодержитЗначение.
  4. В коде всегда используйте функцию Формат(Число, "ЧГ=0"), если данные предназначены для экспорта.

Таким образом, использование функции Формат() и сопутствующих свойств табличного документа позволяет полностью решить проблему с «разрывом» чисел, делая отчеты удобными как для визуального контроля, так и для дальнейшего анализа в стороннем ПО.

← На главную