В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничением штатного объекта Таблица: в нем отсутствует прямой метод УдалитьСтроку(), аналогичный тому, что есть в табличных частях документов или в списках значений. Особенно остро эта проблема встает, когда необходимо сформировать отчет, в котором пользователь должен видеть все данные для контроля, но при выгрузке в Excel часть строк (например, служебная информация или внутренние расчеты) должна быть удалена.
Рассмотрим несколько эффективных способов решения этой задачи — от манипуляций с областями до использования внешних компонент.
Это самый надежный «штатный» способ. Суть заключается в том, что мы не пытаемся физически удалить строки из существующего объекта, а создаем второй, «чистый» объект Таблица, и копируем в него только те данные, которые должны попасть в финальный файл. Проанализируем этот алгоритм подробнее.
Для реализации нам потребуется пройти циклом по всем строкам исходной таблицы, проверять условие и, если строка нам подходит, переносить ее в новую таблицу. Основная сложность здесь — сохранить форматирование (цвета, шрифты, границы ячеек). Рассмотрим пример кода:
// Предположим, Таб - исходная заполненная таблица
ТабЧистая = СоздатьОбъект("Таблица");
СчетчикЧистыхСтрок = 1;
Для НомерСтроки = 1 По Таб.ВысотаТаблицы() Цикл
// Проверяем условие, например, по значению в первой колонке
ЗначениеЯчейки = Таб.Область(НомерСтроки, 1, НомерСтроки, 1).Текст;
Если Найти(ЗначениеЯчейки, "Служебная") = 0 Тогда
// Копируем всю строку как область
ОбластьИсточник = Таб.Область(НомерСтроки, 1, НомерСтроки, Таб.ШиринаТаблицы());
ОбластьПриемник = ТабЧистая.Область(СчетчикЧистыхСтрок, 1, СчетчикЧистыхСтрок, Таб.ШиринаТаблицы());
// Используем метод копирования параметров области
ТабЧистая.ВывестиСекцию(ОбластьИсточник);
СчетчикЧистыхСтрок = СчетчикЧистыхСтрок + 1;
КонецЕсли;
КонецЦикла;
ТабЧистая.Записать(ИмяФайла, 1); // 1 - формат Excel
Важный нюанс: при использовании метода ВывестиСекцию() или прямого назначения параметров области, 1С 7.7 может накапливать большое количество уникальных форматов, что иногда приводит к ошибке «Слишком много различных форматов ячеек». Чтобы этого избежать, старайтесь оперировать целыми строками, а не отдельными ячейками.
Если создание новой таблицы по каким-то причинам неудобно, можно применить метод «сдвига». Мы находим строку, которую нужно удалить, и копируем на ее место область строк, находящуюся ниже. Выясним, как это работает на практике:
N, которую нужно удалить.N+1 до ВысотаТаблицы().N.Разберем ситуацию: такой подход сохраняет структуру документа, но требует аккуратности с индексами строк в цикле. Если вы удалили строку, следующий шаг цикла должен проверять ту же самую позицию индекса, так как данные «подтянулись» снизу вверх.
Для профессиональной работы с табличными документами в 1С 7.7 рекомендуется использовать компоненту Йоксель. Она расширяет возможности встроенной таблицы и добавляет в нее те методы, которых не хватило разработчикам фирмы 1С. В частности, объект ТабличныйДокумент в Йокселе имеет прямой метод УдалитьСтроки().
Посмотрим на пример работы с этой компонентой:
// Загружаем компоненту (обычно через ЗагрузитьВнешнююКомпоненту)
// Конвертируем стандартную таблицу 1С в объект Йокселя
ЙокТаб = СоздатьОбъект("ТабличныйДокумент");
ЙокТаб.ЗагрузитьИзТаблицы(Таб);
// Удаляем ненужные строки (например, с 5-й по 10-ю)
ЙокТаб.УдалитьСтроки(5, 10);
// Сохраняем результат сразу в Excel
ЙокТаб.Записать(ИмяФайла, 1);
Этот способ является наиболее быстрым и корректным с точки зрения сохранения форматирования. Кроме того, Йоксель записывает файлы 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() вместо полного выхода из приложения, если вы планируете продолжать работу.
Иногда физическое удаление данных можно заменить их скрытием. В 1С 7.7 мы можем программно установить высоту строки в 0. При сохранении в Excel такие строки останутся в файле, но будут невидимы для пользователя. Выясним причину, почему это удобно: это мгновенная операция, не требующая копирования данных.
// Скрываем 5-ю строку
Таб.Область(5, , 5, ).ВысотаСтроки(0);
Однако помните, что если цель удаления — скрыть конфиденциальную информацию (например, «откаты» или внутреннюю себестоимость), то этот метод не подходит, так как опытный пользователь Excel сможет легко «раздвинуть» строки и увидеть скрытые данные.
Мы рассмотрели различные подходы к модификации таблицы. Выбор метода зависит от ваших задач:
Йоксель.Всегда помните о производительности: операции с ячейками в цикле работают медленно, поэтому старайтесь оперировать целыми строками и областями.