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

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

В практике разработчика 1С периодически возникает специфическая задача: передать данные отчета в систему, которая понимает только простой текст (Plain Text), или сформировать документ для печати на старых матричных принтерах. Основная сложность заключается в том, что обычное сохранение ТабличныйДокумент в формат .txt часто ломает структуру: колонки «съезжают», а многострочные тексты внутри ячеек превращаются в нечитаемую кашу. Рассмотрим подробнее, как решить эту задачу программно, сохранив «красивый» вид документа.

Метод 1: Программный обход ячеек с расчетом ширины в символах

Разберем наиболее гибкий подход — ручной перенос данных из ТабличныйДокумент в текстовый файл. Основная идея заключается в итерации по строкам и колонкам сформированного макета с вычислением визуальной ширины каждой ячейки. Проанализируем ситуацию: в 1С ширина измеряется в условных единицах, а в текстовом файле — в количестве символов моноширинного шрифта (например, Courier New или Fixedsys).

Для корректного выравнивания нам необходимо вычислить коэффициент пересчета. Эмпирическим путем установлено, что одна единица ширины колонки в 1С примерно соответствует 1.151.2 символа. Выясним причину: это связано с тем, что стандартная единица ширины в 1С базируется на среднем значении символа шрифта Arial. Для точного результата рекомендуется использовать формулу: КоличествоСимволов = Целое(ШиринаКолонки / 1.15).

Рассмотрим пример алгоритма обхода:


Процедура ПреобразоватьВТекст(ТабДок, ПутьКФайлу)
    ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.OEM); // Используем OEM (CP866) для DOS-систем
    
    Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
        СтрокаТекста = "";
        МаксВысотаСтроки = 1;
        
        // Сначала определим, есть ли в строке ячейки с переносами
        Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
            Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
            // Логика определения количества подстрок в ячейке
            КоличествоПодстрок = СтрЧислоСтрок(Ячейка.Текст);
            МаксВысотаСтроки = Макс(МаксВысотаСтроки, КоличествоПодстрок);
        КонецЦикла;
        
        // Выводим столько физических строк текста, сколько подстрок в самой «высокой» ячейке
        Для ИтераторСтрок = 1 По МаксВысотаСтроки Цикл
            ТекущаяСтрокаФайла = "";
            Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
                Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
                ШиринаВТексте = Целое(ТабДок.Область(1, НомерКолонки, 1, НомерКолонки).ШиринаКолонки / 1.15);
                
                ТекстЯчейки = СтрПолучитьСтроку(Ячейка.Текст, ИтераторСтрок);
                // Дополняем текст пробелами до нужной ширины
                ТекущаяСтрокаФайла = ТекущаяСтрокаФайла + Лев(ТекстЯчейки + СтрШаблон("%1", СтрСоединить(Новый Массив(ШиринаВТексте), " ")), ШиринаВТексте);
            КонецЦикла;
            ЗаписьТекста.ЗаписатьСтроку(ТекущаяСтрокаФайла);
        КонецЦикла;
    КонецЦикла;
    ЗаписьТекста.Закрыть();
КонецПроцедуры

Метод 2: Использование системного драйвера «Generic / Text Only»

Проанализируем альтернативный, «хитрый» способ, который часто использовали во времена перехода с 1С 7.7 на 8.0. Если нам нужно получить идеальное текстовое представление без написания сложных циклов, мы можем воспользоваться возможностями операционной системы Windows. Суть метода заключается в установке виртуального принтера с драйвером Generic / Text Only (Только текст).

Выполним следующие шаги:

  1. Установим в системе новый принтер, выбрав в качестве драйвера «Generic» -> «Generic / Text Only».
  2. В свойствах принтера укажем порт «FILE:» (Печать в файл).
  3. В коде 1С перед выводом документа установим этот принтер для нашего объекта ТабличныйДокумент, используя свойство ИмяПринтера.
  4. Вызовем метод Напечатать(РежимИспользованияПринтера.ПечатьБезПросмотра).

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

Работа с многострочными ячейками и выравниванием

Одной из главных проблем является ситуация, когда текст в ячейке не помещается по ширине и должен переноситься. Посмотрим на пример из обсуждения: продукт «Мыло Хозяйственное особое» должно занимать две строки в своей колонке, при этом цена в соседней колонке должна оставаться на уровне первой строки или выравниваться по центру.

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

Кодировка и псевдографика

Если целевая программа клиента работает в среде DOS, крайне важно записывать файл в кодировке CP866. В 1С это реализуется через объект ЗаписьТекста с параметром КодировкаТекста.OEM. Если же требуется отобразить границы таблиц «красиво», как в старых интерфейсах, мы можем анализировать свойства ЛинияСверху, ЛинияСлева и подставлять символы псевдографики.

Например, для одинарных рамок используем:

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

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

← На главную