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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Решение 1: Предварительная подготовка данных (Best Practice)

Самый правильный и производительный метод — это разделение логики расчета данных и логики их визуального представления. Идея в том, чтобы сначала собрать все необходимые данные в промежуточную структуру в памяти, обработать их и только после этого вывести в итоговый табличный документ.

Почему это эффективно? Операции с данными в памяти (например, полученными при чтении динамических WEB-страниц в ТаблицеЗначений) выполняются на порядки быстрее, чем манипуляции с уже отрисованным графическим объектом табличного документа. Первоначальное мнение, что это "двойная работа", ошибочно, так как именно этот подход обеспечивает максимальный контроль и производительность.

Подход 1.1: Использование Таблицы Значений (ТЗ)

Это классический и наиболее универсальный способ. Он идеально подходит для вывода однотипных строк детализации.

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

  1. Создаем Таблицу Значений. В ней определяем колонки для всех данных, которые понадобятся для вывода в секциях отчета.
  2. Заполняем ТЗ. В цикле производим все необходимые расчеты и добавляем строки в нашу ТЗ. На этом этапе мы не выводим ничего в печатную форму.
  3. Обрабатываем данные. После завершения цикла у нас есть полная ТЗ со всеми данными. Теперь мы можем анализировать итоговые суммы, сортировать, группировать или, что самое главное для нашей задачи, — удалять ненужные строки из ТЗ.
  4. Выводим результат. Запускаем второй, финальный цикл по уже обработанной ТЗ и последовательно выводим секции в табличный документ, подставляя данные из каждой строки ТЗ.

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


// Создадим итоговый табличный документ
Таб = СоздатьОбъект("Таблица");

// 1. Создаем и настраиваем Таблицу Значений
ТЗ_Данные = СоздатьОбъект("ТаблицаЗначений");
ТЗ_Данные.НоваяКолонка("Номенклатура");
ТЗ_Данные.НоваяКолонка("Количество");
ТЗ_Данные.НоваяКолонка("Цена");
ТЗ_Данные.НоваяКолонка("Сумма");

// 2. Заполняем ТЗ данными в цикле
Пока Выборка.ПолучитьСтроку() = 1 Цикл
    // ... какие-то вычисления ...
    ТЗ_Данные.НоваяСтрока();
    ТЗ_Данные.Номенклатура = Выборка.Товар;
    ТЗ_Данные.Количество = Выборка.Количество;
    ТЗ_Данные.Цена = Выборка.Цена;
    ТЗ_Данные.Сумма = Выборка.Сумма;
КонецЦикла;

// 3. Анализируем и обрабатываем ТЗ
ИтоговаяСумма = ТЗ_Данные.Итог("Сумма");
Если ИтоговаяСумма < 1000 Тогда
    // По условию, если итоговая сумма меньше 1000,
    // нужно удалить последние 5 строк
    Для сч = 1 по 5 Цикл
        Если ТЗ_Данные.КоличествоСтрок() > 0 Тогда
            ТЗ_Данные.УдалитьСтроку(ТЗ_Данные.КоличествоСтрок());
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

// 4. Выводим готовые данные из ТЗ в табличный документ
Таб.ВывестиСекцию("Шапка");
ТЗ_Данные.ВыбратьСтроки();
Пока ТЗ_Данные.ПолучитьСтроку() = 1 Цикл
    Таб.ПрисоединитьСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");

Таб.Показать();

Подход 1.2: Использование Списка Значений

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

  1. Создаем СписокЗначений.
  2. В цикле получаем нужную секцию через Таб.ПолучитьСекцию(), заполняем ее параметрами, но вместо Таб.ВывестиСекцию(), добавляем полученный объект секции в наш список.
  3. После цикла анализируем результат и удаляем ненужные элементы (секции) из списка.
  4. В конце проходим по списку и выводим каждую секцию в итоговый документ.

Решение 2: Использование внешней компоненты Yoksel

Если по каким-то причинам предварительный расчет не подходит и нужна гибкость, сравнимая с платформой 8.x, можно использовать внешнюю компоненту Yoksel. Это мощный инструмент для работы с табличными документами в 1С 7.7.

Ключевая возможность: Объект ТабличныйДокумент, предоставляемый этой компонентой, имеет методы для прямого манипулирования структурой документа, включая вставку и удаление строк/столбцов.

Проанализируем шаги:

  1. Установите и зарегистрируйте компоненту yoksel.dll в системе.
  2. В коде подключите компоненту и создайте ее объект.
  3. Сформируйте табличный документ стандартными средствами или с помощью методов самой компоненты.
  4. После того как документ готов и принято решение об удалении строк, вызовите соответствующий метод, например УдалитьСтроки(НомерНачальнойСтроки, КоличествоСтрок).

Этот метод позволяет работать с таблицей "как есть", без предварительных расчетов, что и требовалось в исходной задаче. Однако это вносит зависимость от внешнего файла.


// Примерный код использования компоненты
Попытка
    ЗагрузитьВнешнююКомпоненту("yoksel.dll");
Исключение
    Сообщить("Не удалось загрузить компоненту Yoksel!");
    Возврат;
КонецПопытки;

ТабДок = СоздатьОбъект("ТабличныйДокумент");

// ... здесь идет стандартный код формирования документа ...
// ТабДок.ВывестиСекцию(...) и т.д.
// ... документ полностью сформирован ...

// Допустим, после всех расчетов нам нужно удалить строки с 20 по 30 (11 строк)
// НомерНачальнойСтроки = 20;
// КоличествоСтрок = 11;
ТабДок.УдалитьСтроки(20, 11);

ТабДок.Показать();

Решение 3: Построчное копирование в новый документ (не рекомендуется)

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

Почему его следует избегать:

Этот способ можно рассматривать только как крайнюю меру для небольших и просто оформленных таблиц.

Что точно не сработает: Манипуляция высотой строк

Иногда возникает идея не удалять строки, а "скрыть" их, установив высоту равной 0. В 1С 7.7 этот подход не работает корректно. Установка высоты строки в 0 игнорируется, а установка в 1 оставляет на странице видимый артефакт в виде тонкой пустой полосы. Таким образом, этот метод не позволяет добиться чистого визуального результата.

Итог: Для решения задачи удаления строк из табличного документа в 1С 7.7 наилучшей практикой является предварительный расчет данных в ТаблицеЗначений. Этот метод обеспечивает производительность, управляемость и не требует внешних зависимостей. Если же требуется максимальная гибкость и возможность редактировать уже созданный документ, стоит рассмотреть использование компоненты Yoksel.

← На главную