При формировании печатных форм в 1С:Предприятие 7.7 часто возникает задача: после вывода определенного блока данных (например, шапки, строк детализации и подвала) необходимо, на основе итоговых вычислений, удалить этот блок из уже готового документа. Однако, в отличие от более поздних версий платформы, в 1С 7.7 у объекта Таблица нет встроенных методов, таких как УдалитьОбласть() или УдалитьСтроки().
Рассмотрим несколько подходов для решения этой задачи, от наиболее правильного и рекомендуемого до более экзотических.
Самый правильный и производительный метод — это разделение логики расчета данных и логики их визуального представления. Идея в том, чтобы сначала собрать все необходимые данные в промежуточную структуру в памяти, обработать их и только после этого вывести в итоговый табличный документ.
Почему это эффективно? Операции с данными в памяти (например, полученными при чтении динамических WEB-страниц в ТаблицеЗначений) выполняются на порядки быстрее, чем манипуляции с уже отрисованным графическим объектом табличного документа. Первоначальное мнение, что это "двойная работа", ошибочно, так как именно этот подход обеспечивает максимальный контроль и производительность.
Это классический и наиболее универсальный способ. Он идеально подходит для вывода однотипных строк детализации.
Разберем по шагам:
Посмотрим на пример структуры кода:
// Создадим итоговый табличный документ
Таб = СоздатьОбъект("Таблица");
// 1. Создаем и настраиваем Таблицу Значений
ТЗ_Данные = СоздатьОбъект("ТаблицаЗначений");
ТЗ_Данные.НоваяКолонка("Номенклатура");
ТЗ_Данные.НоваяКолонка("Количество");
ТЗ_Данные.НоваяКолонка("Цена");
ТЗ_Данные.НоваяКолонка("Сумма");
// 2. Заполняем ТЗ данными в цикле
Пока Выборка.ПолучитьСтроку() = 1 Цикл
// ... какие-то вычисления ...
ТЗ_Данные.НоваяСтрока();
ТЗ_Данные.Номенклатура = Выборка.Товар;
ТЗ_Данные.Количество = Выборка.Количество;
ТЗ_Данные.Цена = Выборка.Цена;
ТЗ_Данные.Сумма = Выборка.Сумма;
КонецЦикла;
// 3. Анализируем и обрабатываем ТЗ
ИтоговаяСумма = ТЗ_Данные.Итог("Сумма");
Если ИтоговаяСумма < 1000 Тогда
// По условию, если итоговая сумма меньше 1000,
// нужно удалить последние 5 строк
Для сч = 1 по 5 Цикл
Если ТЗ_Данные.КоличествоСтрок() > 0 Тогда
ТЗ_Данные.УдалитьСтроку(ТЗ_Данные.КоличествоСтрок());
КонецЕсли;
КонецЦикла;
КонецЕсли;
// 4. Выводим готовые данные из ТЗ в табличный документ
Таб.ВывестиСекцию("Шапка");
ТЗ_Данные.ВыбратьСтроки();
Пока ТЗ_Данные.ПолучитьСтроку() = 1 Цикл
Таб.ПрисоединитьСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.Показать();
Этот способ удобен, когда выводимые секции разнородны или уже содержат сложное форматирование, которое хочется сохранить. Вместо сырых данных мы будем хранить в памяти уже готовые к выводу объекты секций.
СписокЗначений.Таб.ПолучитьСекцию(), заполняем ее параметрами, но вместо Таб.ВывестиСекцию(), добавляем полученный объект секции в наш список.Если по каким-то причинам предварительный расчет не подходит и нужна гибкость, сравнимая с платформой 8.x, можно использовать внешнюю компоненту Yoksel. Это мощный инструмент для работы с табличными документами в 1С 7.7.
Ключевая возможность: Объект ТабличныйДокумент, предоставляемый этой компонентой, имеет методы для прямого манипулирования структурой документа, включая вставку и удаление строк/столбцов.
Проанализируем шаги:
yoksel.dll в системе.УдалитьСтроки(НомерНачальнойСтроки, КоличествоСтрок).Этот метод позволяет работать с таблицей "как есть", без предварительных расчетов, что и требовалось в исходной задаче. Однако это вносит зависимость от внешнего файла.
// Примерный код использования компоненты
Попытка
ЗагрузитьВнешнююКомпоненту("yoksel.dll");
Исключение
Сообщить("Не удалось загрузить компоненту Yoksel!");
Возврат;
КонецПопытки;
ТабДок = СоздатьОбъект("ТабличныйДокумент");
// ... здесь идет стандартный код формирования документа ...
// ТабДок.ВывестиСекцию(...) и т.д.
// ... документ полностью сформирован ...
// Допустим, после всех расчетов нам нужно удалить строки с 20 по 30 (11 строк)
// НомерНачальнойСтроки = 20;
// КоличествоСтрок = 11;
ТабДок.УдалитьСтроки(20, 11);
ТабДок.Показать();
Этот метод является "силовым" и крайне непроизводительным, но технически возможен. Его суть — создать второй, пустой табличный документ и перенести в него ячейка за ячейкой только те строки из исходного документа, которые нужно оставить.
Почему его следует избегать:
Этот способ можно рассматривать только как крайнюю меру для небольших и просто оформленных таблиц.
Иногда возникает идея не удалять строки, а "скрыть" их, установив высоту равной 0. В 1С 7.7 этот подход не работает корректно. Установка высоты строки в 0 игнорируется, а установка в 1 оставляет на странице видимый артефакт в виде тонкой пустой полосы. Таким образом, этот метод не позволяет добиться чистого визуального результата.
Итог: Для решения задачи удаления строк из табличного документа в 1С 7.7 наилучшей практикой является предварительный расчет данных в ТаблицеЗначений. Этот метод обеспечивает производительность, управляемость и не требует внешних зависимостей. Если же требуется максимальная гибкость и возможность редактировать уже созданный документ, стоит рассмотреть использование компоненты Yoksel.