При работе с табличными документами в 1С, особенно сформированными отчетами или загруженными из внешних источников (например, Excel), часто возникает проблема. Некоторые области или группы строк могут иметь свой собственный, уникальный формат, в частности — свою ширину колонок. Визуально это выглядит так, будто колонки "плывут" или разъезжаются при прокрутке документа. В интерактивном режиме для решения этой проблемы в контекстном меню есть пункт "Удалить формат строк", который сбрасывает все уникальные настройки к единому формату документа.
В этой статье мы подробно разберем, как выполнить это действие программно. Проанализируем несколько способов, от самых современных и простых до более сложных, но работающих на старых версиях платформы.
Начнем с самого эффективного и лаконичного решения, которое стало доступно в платформе 1С:Предприятие, начиная с версии 8.3.22. В этой версии у области табличного документа появилось управляемое свойство ФорматСтрок.
Идея заключается в том, чтобы взять "эталонный" формат из любой ячейки или строки (проще всего — из самой первой) и принудительно применить его ко всей области табличного документа. Это действие сбрасывает все индивидуальные форматы строк и унифицирует их.
Посмотрим на пример кода:
// ТабДок - это переменная, содержащая ваш табличный документ
// Получаем формат строк из области первой ячейки (1,1)
ЕдиныйФормат = ТабДок.Область(1, 1, 1, 1).ФорматСтрок;
// Присваиваем этот формат всей области табличного документа
// Это сбросит все остальные, "собственные" форматы строк
ТабДок.Область.ФорматСтрок = ЕдиныйФормат;
Преимущества этого способа очевидны:
Если ваша конфигурация работает на платформе 8.3.22 или более новой, настоятельно рекомендуется использовать именно этот метод.
Если вы работаете на более старых версиях платформы, где свойство ФорматСтрок еще недоступно, приходится использовать более сложные подходы. Один из них основан на механизме сериализации.
Суть метода: мы преобразуем табличный документ в объект XDTO. Это структурированное представление документа, в котором можно найти и удалить определения уникальных форматов колонок. После модификации объекта мы преобразуем его обратно в табличный документ.
Разберем по шагам:
columns).id). Строки, использующие этот формат, ссылаются на данный id.id. Таким образом, мы уничтожаем сами определения "собственных" форматов.Этот подход также позволяет ответить на смежный вопрос: "Как найти группы строк с одинаковым форматом?". Ответ прост: это строки, которые в 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);
КонецПроцедуры
Плюсы и минусы метода:
Еще один обходной путь, который работает на старых платформах. Его логика заключается в "перекладывании" данных из области с "плохим" форматированием в область с "хорошим".
Алгоритм действий следующий:
ТабличныйДокумент.Область(1,1,Высота,Ширина), а не как область строк. В противном случае скопируются и уникальные форматы.Пример реализации на сервере:
&НаСервере
Процедура УдалитьФорматСтрокТабличногоДокументаНаСервере()
// 1. Попытаемся установить у всех колонок одинаковую ширину,
// создав единый собственный формат для всего документа.
ТабличныйДокумент.Область.СоздатьФорматСтрок();
// 2. Запоминаем размеры области с данными
ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы;
ШиринаТаблицы = ТабличныйДокумент.ШиринаТаблицы;
// 3. Получаем область как "прямоугольник", чтобы не скопировать форматы строк
ОбластьТД = ТабличныйДокумент.Область(1, 1, ВысотаТаблицы, ШиринаТаблицы);
// 4. Вставляем нашу область в новую часть документа, ниже исходной.
// Ширины колонок при этом возьмутся из общего формата.
ТабличныйДокумент.ВставитьОбласть(ОбластьТД, ТабличныйДокумент.Область(ВысотаТаблицы + 1, 1));
// 5. Удаляем изначальную область. Здесь уже обязательно удаляем область типа "строки",
// чтобы произошел сдвиг по вертикали.
ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(1, , ВысотаТаблицы), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецПроцедуры
Плюсы и минусы метода:
Выбирайте этот способ с осторожностью, полностью осознавая его последствия для структуры вашего документа.