Как добавить заголовок и дополнительные реквизиты при выводе списка табличной части в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Ограничения стандартной команды «Вывести список»

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

Проанализируем доступные варианты решения проблемы:

  1. Оставить как есть: Использовать стандартную команду, если требования к оформлению не критичны.
  2. Создать свою команду: Написать процедуру на встроенном языке, которая будет формировать ТабличныйДокумент по заранее подготовленному макету.
  3. Использовать СКД: Создать отчет на базе Системы компоновки данных, где источником будет табличная часть.

Решение №1: Программное формирование списка через Табличный документ

Это самый гибкий способ. Мы создадим собственный алгоритм, который позволит вывести любые данные в нужном формате. Рассмотрим процесс по шагам.

Во-первых, нам необходимо создать Макет в объекте (документе или обработке). В макете определим три основные области:

Проанализируем пример кода для формирования такого вывода:


Процедура ПечатьСпискаНаСервере(ТабДок)
    
    Макет = Документы.МойДокумент.ПолучитьМакет("МакетВыводаСписка");
    
    // 1. Выводим заголовок
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Список работ по документу №" + Объект.Номер;
    ОбластьЗаголовок.Параметры.Организация = Объект.Организация;
    ТабДок.Вывести(ОбластьЗаголовок);
    
    // 2. Выводим шапку таблицы
    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ТабДок.Вывести(ОбластьШапка);
    
    // 3. Выводим строки
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    Для Каждого ТекСтрока Из Объект.Товары Цикл
        // Заполняем параметры сразу по именам колонок
        ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекСтрока);
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;

КонецПроцедуры

Обратите внимание на использование метода ЗаполнитьЗначенияСвойств. Это позволяет избежать ручного присвоения каждого поля, если имена параметров в макете совпадают с именами реквизитов в табличной части.

Разбор типичных ошибок: «Пропуск первой строки» и «Дублирование последней»

Выясним причину проблем, с которыми часто сталкиваются новички (как в сообщениях темы форума). Если при выводе списка первая строка пропадает, а последняя двоится, проверьте логику цикла.

Ошибка пропуска строки: Часто возникает при работе с результатом запроса.


Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий(); // ОШИБКА: Первый вызов вне цикла пропускает первую запись

Пока Выборка.Следующий() Цикл
    // Код вывода...
КонецЦикла;

Ошибка дублирования: Происходит, если команда вывода области стоит вне цикла после его завершения.


Для Каждого Стр Из ТЧ Цикл
    Область.Параметры.Ном = Стр.НомерСтроки;
    ТабДок.Вывести(Область); 
КонецЦикла;
ТабДок.Вывести(Область); // ОШИБКА: Выведет последнюю строку еще раз

Решение №2: Использование СКД для вывода табличной части

Если вам нужно фильтровать данные (например, выводить только конкретный день из 31 дня месяца, как упоминалось в теме), лучше всего использовать Систему компоновки данных (СКД). Это позволит пользователю самому настраивать группировки и отборы.

Выясним, как передать данные табличной части в СКД:

  1. Создайте новый отчет.
  2. В схеме компоновки добавьте Набор данных - объект.
  3. Имя внешнего набора данных укажите, например, "ТаблицаДанных".
  4. Добавьте поля (Номенклатура, Количество, Сумма и т.д.).
  5. В модуле отчета или обработки вызовите компоновщик, передав туда вашу табличную часть через структуру ВнешниеНаборыДанных.

Этот метод автоматически добавит профессиональные заголовки, позволит выводить параметры (организацию, период) в шапку отчета и избавит от проблем с нумерацией строк, так как в СКД можно использовать системное поле НомерПоПорядку.

Работа с номерами строк и фильтрацией

Рассмотрим ситуацию, когда в табличной части 31 день, а вывести нужно только один. Если вы делаете это через запрос к базе данных, обязательно используйте условие ГДЕ в тексте запроса. Если же вы перебираете строки объектной коллекции Для Каждого..., используйте условие Продолжить.

Пример фильтрации в цикле:


Счетчик = 0;
Для Каждого Стр Из Объект.Расписание Цикл
    Если Стр.День <> НужныйДень Тогда
        Продолжить;
    КонецЕсли;
    
    Счетчик = Счетчик + 1;
    ОбластьСтрока.Параметры.Ном = Счетчик; // Свой счетчик вместо НомерСтроки
    // ... дальнейший вывод
КонецЦикла;

Использование собственного счетчика Счетчик вместо системного Стр.НомерСтроки гарантирует, что в печатной форме нумерация всегда будет начинаться с единицы и идти без пропусков, даже если из 50 строк вы вывели только 5.

Подведем итог: Для добавления заголовков и реквизитов в список табличной части откажитесь от стандартной кнопки «Вывести список» в пользу собственного макета или СКД. Это даст вам полный контроль над визуальным представлением данных и логикой их обработки.

← На главную