При работе в среде 1С:Предприятие 8 пользователи часто используют стандартную контекстную команду «Вывести список». Она удобна для быстрой выгрузки данных в текстовый или табличный документ. Однако, как только возникает задача добавить в этот список заголовок организации, номер документа, дату или другие реквизиты «шапки», разработчики сталкиваются с жестким ограничением платформы.
В этой статье мы разберем, почему стандартный механизм нельзя изменить, и рассмотрим подробнее, как реализовать собственную систему вывода данных, которая будет отвечать всем требованиям оформления.
Разберем ситуацию: команда Вывести список является платформенным механизмом. Это означает, что логика её работы скрыта внутри ядра 1С и не имеет открытого программного интерфейса для изменения. Мы не можем программно «подсунуть» ей макет или заставить её вывести дополнительные поля, которых нет в текущей экранной таблице.
Проанализируем доступные варианты решения проблемы:
ТабличныйДокумент по заранее подготовленному макету.Это самый гибкий способ. Мы создадим собственный алгоритм, который позволит вывести любые данные в нужном формате. Рассмотрим процесс по шагам.
Во-первых, нам необходимо создать Макет в объекте (документе или обработке). В макете определим три основные области:
НомерДокумента и Дата).Проанализируем пример кода для формирования такого вывода:
Процедура ПечатьСпискаНаСервере(ТабДок)
Макет = Документы.МойДокумент.ПолучитьМакет("МакетВыводаСписка");
// 1. Выводим заголовок
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Список работ по документу №" + Объект.Номер;
ОбластьЗаголовок.Параметры.Организация = Объект.Организация;
ТабДок.Вывести(ОбластьЗаголовок);
// 2. Выводим шапку таблицы
ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
ТабДок.Вывести(ОбластьШапка);
// 3. Выводим строки
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого ТекСтрока Из Объект.Товары Цикл
// Заполняем параметры сразу по именам колонок
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
Обратите внимание на использование метода ЗаполнитьЗначенияСвойств. Это позволяет избежать ручного присвоения каждого поля, если имена параметров в макете совпадают с именами реквизитов в табличной части.
Выясним причину проблем, с которыми часто сталкиваются новички (как в сообщениях темы форума). Если при выводе списка первая строка пропадает, а последняя двоится, проверьте логику цикла.
Ошибка пропуска строки: Часто возникает при работе с результатом запроса.
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий(); // ОШИБКА: Первый вызов вне цикла пропускает первую запись
Пока Выборка.Следующий() Цикл
// Код вывода...
КонецЦикла;
Ошибка дублирования: Происходит, если команда вывода области стоит вне цикла после его завершения.
Для Каждого Стр Из ТЧ Цикл
Область.Параметры.Ном = Стр.НомерСтроки;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.Вывести(Область); // ОШИБКА: Выведет последнюю строку еще раз
Если вам нужно фильтровать данные (например, выводить только конкретный день из 31 дня месяца, как упоминалось в теме), лучше всего использовать Систему компоновки данных (СКД). Это позволит пользователю самому настраивать группировки и отборы.
Выясним, как передать данные табличной части в СКД:
"ТаблицаДанных".ВнешниеНаборыДанных.Этот метод автоматически добавит профессиональные заголовки, позволит выводить параметры (организацию, период) в шапку отчета и избавит от проблем с нумерацией строк, так как в СКД можно использовать системное поле НомерПоПорядку.
Рассмотрим ситуацию, когда в табличной части 31 день, а вывести нужно только один. Если вы делаете это через запрос к базе данных, обязательно используйте условие ГДЕ в тексте запроса. Если же вы перебираете строки объектной коллекции Для Каждого..., используйте условие Продолжить.
Пример фильтрации в цикле:
Счетчик = 0;
Для Каждого Стр Из Объект.Расписание Цикл
Если Стр.День <> НужныйДень Тогда
Продолжить;
КонецЕсли;
Счетчик = Счетчик + 1;
ОбластьСтрока.Параметры.Ном = Счетчик; // Свой счетчик вместо НомерСтроки
// ... дальнейший вывод
КонецЦикла;
Использование собственного счетчика Счетчик вместо системного Стр.НомерСтроки гарантирует, что в печатной форме нумерация всегда будет начинаться с единицы и идти без пропусков, даже если из 50 строк вы вывели только 5.
Подведем итог: Для добавления заголовков и реквизитов в список табличной части откажитесь от стандартной кнопки «Вывести список» в пользу собственного макета или СКД. Это даст вам полный контроль над визуальным представлением данных и логикой их обработки.