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

Программист 1С v7.7
← На главную

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

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

Метод 1: Формирование новой таблицы на основе исходной

Это самый надежный «штатный» способ. Суть заключается в том, что мы не пытаемся физически удалить строки из существующего объекта, а создаем второй, «чистый» объект Таблица, и копируем в него только те данные, которые должны попасть в финальный файл. Проанализируем этот алгоритм подробнее.

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


// Предположим, Таб - исходная заполненная таблица
ТабЧистая = СоздатьОбъект("Таблица");
СчетчикЧистыхСтрок = 1;

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

ТабЧистая.Записать(ИмяФайла, 1); // 1 - формат Excel

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

Метод 2: Программная имитация удаления («Сдвиг строк»)

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

  1. Определяем строку N, которую нужно удалить.
  2. Выделяем область от строки N+1 до ВысотаТаблицы().
  3. Копируем эту область и вставляем ее, начиная со строки N.
  4. Последнюю строку таблицы очищаем или скрываем.

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

Метод 3: Использование внешней компоненты Йоксель (Yoksel)

Для профессиональной работы с табличными документами в 1С 7.7 рекомендуется использовать компоненту Йоксель. Она расширяет возможности встроенной таблицы и добавляет в нее те методы, которых не хватило разработчикам фирмы 1С. В частности, объект ТабличныйДокумент в Йокселе имеет прямой метод УдалитьСтроки().

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


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

// Удаляем ненужные строки (например, с 5-й по 10-ю)
ЙокТаб.УдалитьСтроки(5, 10);

// Сохраняем результат сразу в Excel
ЙокТаб.Записать(ИмяФайла, 1);

Этот способ является наиболее быстрым и корректным с точки зрения сохранения форматирования. Кроме того, Йоксель записывает файлы Excel гораздо быстрее штатных средств и лучше справляется с объединением ячеек.

Метод 4: Очистка данных через COM-объект Excel

Если таблица уже записана в файл методом Таб.Записать(ИмяФайла, 1), мы можем открыть этот файл «втихую» через Excel как COM-объект, удалить лишнее и сохранить изменения. Проанализируем, как правильно управлять процессом, чтобы не мешать пользователю.


Попытка
    Эксель = СоздатьОбъект("Excel.Application");
    Книга = Эксель.Workbooks.Open(ИмяФайла);
    Лист = Книга.Worksheets(1);
    
    // Отключаем визуальные уведомления
    Эксель.DisplayAlerts = 0;
    
    // Удаляем, например, 2-ю строку
    Лист.Rows(2).Delete();
    
    Книга.Save();
    Книга.Close();
    Эксель.Quit();
Исключение
    Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
    Эксель.Quit();
КонецПопытки;

Обратите внимание: крайне важно использовать Эксель.Quit() и обнулять переменные объектов в конце работы. Если этого не сделать, процесс EXCEL.EXE останется висеть в памяти (в диспетчере задач), что может привести к блокировке файлов или ошибкам при закрытии основного приложения пользователем. Чтобы закрытие конкретной книги не влияло на другие открытые файлы Excel, используйте Книга.Close() вместо полного выхода из приложения, если вы планируете продолжать работу.

Метод 5: Использование скрытых строк

Иногда физическое удаление данных можно заменить их скрытием. В 1С 7.7 мы можем программно установить высоту строки в 0. При сохранении в Excel такие строки останутся в файле, но будут невидимы для пользователя. Выясним причину, почему это удобно: это мгновенная операция, не требующая копирования данных.


// Скрываем 5-ю строку
Таб.Область(5, , 5, ).ВысотаСтроки(0);

Однако помните, что если цель удаления — скрыть конфиденциальную информацию (например, «откаты» или внутреннюю себестоимость), то этот метод не подходит, так как опытный пользователь Excel сможет легко «раздвинуть» строки и увидеть скрытые данные.

Подведение итогов

Мы рассмотрели различные подходы к модификации таблицы. Выбор метода зависит от ваших задач:

  1. Для простых отчетов без сложного форматирования идеально подойдет создание «чистой» таблицы через копирование областей.
  2. Для сложных и тяжелых отчетов лучшим выбором будет использование компоненты Йоксель.
  3. Если нужно «почистить» уже готовый файл — используйте автоматизацию через COM-объект Excel.

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

← На главную