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

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

При работе с табличными документами в 1С, особенно сформированными отчетами или загруженными из внешних источников (например, Excel), часто возникает проблема. Некоторые области или группы строк могут иметь свой собственный, уникальный формат, в частности — свою ширину колонок. Визуально это выглядит так, будто колонки "плывут" или разъезжаются при прокрутке документа. В интерактивном режиме для решения этой проблемы в контекстном меню есть пункт "Удалить формат строк", который сбрасывает все уникальные настройки к единому формату документа.

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

Способ 1: Современный и простой (для платформы 8.3.22 и новее)

Начнем с самого эффективного и лаконичного решения, которое стало доступно в платформе 1С:Предприятие, начиная с версии 8.3.22. В этой версии у области табличного документа появилось управляемое свойство ФорматСтрок.

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

Посмотрим на пример кода:


// ТабДок - это переменная, содержащая ваш табличный документ
// Получаем формат строк из области первой ячейки (1,1)
ЕдиныйФормат = ТабДок.Область(1, 1, 1, 1).ФорматСтрок;

// Присваиваем этот формат всей области табличного документа
// Это сбросит все остальные, "собственные" форматы строк
ТабДок.Область.ФорматСтрок = ЕдиныйФормат;

Преимущества этого способа очевидны:

  1. Простота: Решение занимает всего две строки кода.
  2. Производительность: Это нативный платформенный механизм, который работает очень быстро.
  3. Надежность: Отсутствуют сложные манипуляции с данными, что снижает риск возникновения ошибок.

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

Способ 2: Удаление формата через сериализацию XDTO (на клиенте)

Если вы работаете на более старых версиях платформы, где свойство ФорматСтрок еще недоступно, приходится использовать более сложные подходы. Один из них основан на механизме сериализации.

Суть метода: мы преобразуем табличный документ в объект XDTO. Это структурированное представление документа, в котором можно найти и удалить определения уникальных форматов колонок. После модификации объекта мы преобразуем его обратно в табличный документ.

Разберем по шагам:

  1. Сериализуем табличный документ в объект XDTO.
  2. Внутри этого объекта находим коллекцию, описывающую форматы колонок (columns).
  3. Перебираем эту коллекцию. Уникальные форматы строк, созданные для отдельных областей, имеют собственный идентификатор (атрибут id). Строки, использующие этот формат, ссылаются на данный id.
  4. Удаляем из коллекции все описания колонок, у которых заполнен id. Таким образом, мы уничтожаем сами определения "собственных" форматов.
  5. Десериализуем измененный объект XDTO обратно в табличный документ. В результате все строки будут использовать общий формат документа.

Этот подход также позволяет ответить на смежный вопрос: "Как найти группы строк с одинаковым форматом?". Ответ прост: это строки, которые в XDTO-представлении ссылаются на один и тот же id формата колонок.

Пример реализации на клиенте:


&НаКлиенте
Процедура УдалитьФорматСтрокТабличногоДокумента(Команда)

    // 1. Сериализуем наш табличный документ в объект XDTO
    ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТабличныйДокумент);

    // 2. Ищем коллекцию XDTO, описывающую форматы колонок
    КолонкиXDTO = ОбъектXDTO.columns;
    
    // 3. Перебираем коллекцию с конца, чтобы не нарушать индексацию при удалении
    сч = КолонкиXDTO.Количество() - 1;
    Пока Сч >= 0 Цикл
        Колонка = КолонкиXDTO[сч];
        
        // 4. Если колонка имеет свой собственный ID, значит, это уникальный формат.
        // Некоторые строки на него ссылаются.
        Если ЗначениеЗаполнено(Колонка.id) Тогда
            // Удаляем определение этого уникального формата
            КолонкиXDTO.Удалить(Сч);
        КонецЕсли;
        
        Сч = Сч - 1;
    КонецЦикла;

    // 5. Десериализуем объект XDTO обратно в табличный документ
    ТабличныйДокумент = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
    
КонецПроцедуры

Плюсы и минусы метода:

Способ 3: Копирование и замена области (на сервере)

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

Алгоритм действий следующий:

  1. Принудительно создаем для всего документа единый (хоть и "собственный") формат строк. Это нужно, чтобы подготовить "чистую" область для вставки.
  2. Запоминаем размеры (высоту и ширину) области с данными.
  3. Копируем исходную область с данными. Важный нюанс: область нужно получать как прямоугольник ТабличныйДокумент.Область(1,1,Высота,Ширина), а не как область строк. В противном случае скопируются и уникальные форматы.
  4. Вставляем скопированную прямоугольную область в новую часть документа, например, сразу после исходных данных. Новая область унаследует единый формат документа, который мы установили на шаге 1.
  5. Удаляем исходную область данных. Удалять нужно именно область строк, чтобы данные, вставленные ниже, сместились вверх на свое место.

Пример реализации на сервере:


&НаСервере
Процедура УдалитьФорматСтрокТабличногоДокументаНаСервере()

    // 1. Попытаемся установить у всех колонок одинаковую ширину,
    // создав единый собственный формат для всего документа.
    ТабличныйДокумент.Область.СоздатьФорматСтрок();

    // 2. Запоминаем размеры области с данными
    ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы;
    ШиринаТаблицы = ТабличныйДокумент.ШиринаТаблицы;

    // 3. Получаем область как "прямоугольник", чтобы не скопировать форматы строк
    ОбластьТД = ТабличныйДокумент.Область(1, 1, ВысотаТаблицы, ШиринаТаблицы);

    // 4. Вставляем нашу область в новую часть документа, ниже исходной.
    // Ширины колонок при этом возьмутся из общего формата.
    ТабличныйДокумент.ВставитьОбласть(ОбластьТД, ТабличныйДокумент.Область(ВысотаТаблицы + 1, 1));

    // 5. Удаляем изначальную область. Здесь уже обязательно удаляем область типа "строки",
    // чтобы произошел сдвиг по вертикали.
    ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(1, , ВысотаТаблицы), ТипСмещенияТабличногоДокумента.ПоВертикали);

КонецПроцедуры

Плюсы и минусы метода:

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

← На главную