При разработке отчетов или печатных форм в 1С:Предприятии мы часто сталкиваемся с необходимостью показать пользователю не один, а сразу несколько табличных документов. Это может быть связано с выводом отчетов по разным организациям, филиалам или формирование комплекта печатных форм. В этой статье мы подробно разберем различные подходы к решению этой задачи, от простых до более продвинутых, с учетом современных рекомендаций и особенностей работы в различных клиентах 1С.
Нам важно понимать, что прямое использование метода ТабДокумент.Показать() для каждого документа в цикле, хотя и является интуитивным, может быть не самым эффективным или даже неработоспособным в веб-клиенте и тонком клиенте. Давайте рассмотрим, как мы можем организовать вывод нескольких табличных документов, чтобы это было корректно, удобно и производительно.
Один из самых простых и часто используемых подходов — это объединение всех необходимых табличных документов в один большой табличный документ, который затем будет показан пользователю. Этот метод позволяет представить всю информацию в одном окне, возможно, с разбивкой по страницам.
Рассмотрим подробнее шаги и нюансы:
Присоединить() и Вывести().
Присоединить(ТабличныйДокументИсточник) позволяет добавить содержимое одного табличного документа к другому. Он выводит переданный табличный документ в результирующий, размещая его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий документ.
Вывести(Область) обычно используется для формирования линейных отчетов, где области макета являются областями строк и должны выводиться последовательно. Для объединения документов мы можем выводить их поочередно, используя метод Вывести() для каждой области или целого документа.
СоздатьФорматСтрок() для области ячеек присоединяемого документа. Это позволяет создать новый формат строк для всей области, гарантируя, что колонки различной ширины не будут "разъезжаться".
Область() и ВставитьОбласть() для объединения, группировки строк могут теряться. Для их сохранения потребуется более сложный алгоритм, который может разбивать присоединяемый табличный документ на блоки с разными форматами строк и присоединять каждый блок по отдельности.
ПроверитьВывод(Область), который проверяет, вмещается ли указанная область (например, строка и подвал таблицы) в текущую страницу. Если не вмещается, можно вызвать НачатьНовуюСтраницу(). Также можно указать ОбластьПечати, а также ПовторятьПриПечатиСтроки и ПовторятьПриПечатиКолонки для вывода заголовков на каждой странице.
ПакетОтображаемыхДокументов, ЭлементыПакетаОтображаемыхДокументов, ЭлементПакетаОтображаемыхДокументов. Это позволяет нам устанавливать настройки печати (количество экземпляров, разбор по копиям, имя принтера) как для всего пакета, так и для отдельных документов внутри него.
Если мы хотим представить каждый табличный документ как отдельную сущность, не объединяя их физически в один, мы можем программно создать на форме элементы управления типа "Закладка" или "Страница" и на каждой из них разместить поле табличного документа.
Давайте разберем этот подход:
Элементы формы. Мы создадим группу страниц (ГруппаСтраниц), а затем для каждого табличного документа будем добавлять новую страницу (СтраницаФормы) в эту группу.
Этот метод может быть более трудоемким в реализации, так как требует активной работы с
Динамическое создание элементов формы
Если в нашей конфигурации не используется Библиотека стандартных подсистем (БСП) или мы предпочитаем более прямой подход, мы можем сформировать массив табличных документов на сервере и затем поочередно показать их на клиенте.
Рассмотрим подробнее этот вариант:
Новый Массив
&НаСервере
Функция СформироватьПулТабДокументов()
МассивТабДокументов = Новый Массив;
// Здесь формируем первый табличный документ
// Например: ТабДок1 = Новый ТабличныйДокумент;
// ... заполняем ТабДок1 ...
МассивТабДокументов.Добавить(ТабДок1);
// Здесь формируем второй табличный документ
// Например: ТабДок2 = Новый ТабличныйДокумент;
// ... заполняем ТабДок2 ...
МассивТабДокументов.Добавить(ТабДок2);
// Добавляем все необходимые табличные документы в массив
Возврат МассивТабДокументов;
КонецФункции
Показать().
&НаКлиенте
Процедура ПоказатьПулТабДокументов()
МассивТабДокументов = СформироватьПулТабДокументов();
Для Каждого ТабДок Из МассивТабДокументов Цикл
ТабДок.Показать();
КонецЦикла;
КонецПроцедуры
Важно: Этот подход может быть не самым оптимальным для веб-клиента и тонкого клиента, так как метод ТабДокумент.Показать() может работать иначе или вовсе не выводить таблицу на экран в этих режимах. Он больше подходит для толстого клиента или обычных форм. Мы должны это учитывать при выборе данного варианта.
Наиболее современный и рекомендуемый подход для работы с печатными формами в управляемом приложении, особенно при использовании типовых конфигураций, — это применение механизмов Библиотеки стандартных подсистем (БСП). БСП предоставляет унифицированный и гибкий способ управления печатью.
Разберем этот вариант по шагам:
&НаСервере
Функция СформироватьПулПечатныхФормБСП()
МассивСтруктурПечатныхФорм = Новый Массив;
// Пример формирования первой печатной формы
СтруктураПечатнойФормы1 = Новый Структура("ИдентификаторПечатнойФормы, СинонимМакета, ТабличныйДокумент");
СтруктураПечатнойФормы1.Вставить("ИдентификаторПечатнойФормы", "ОтчетПоОрганизацииА"); // Уникальный идентификатор
СтруктураПечатнойФормы1.Вставить("СинонимМакета", "Отчет по ООО 'Ромашка'"); // Название для пользователя
// ТабДок1 = Новый ТабличныйДокумент; ... заполняем ТабДок1 ...
СтруктураПечатнойФормы1.Вставить("ТабличныйДокумент", ТабДок1);
МассивСтруктурПечатныхФорм.Добавить(СтруктураПечатнойФормы1);
// Пример формирования второй печатной формы
СтруктураПечатнойФормы2 = Новый Структура("ИдентификаторПечатнойФормы, СинонимМакета, ТабличныйДокумент");
СтруктураПечатнойФормы2.Вставить("ИдентификаторПечатнойФормы", "ОтчетПоОрганизацииБ");
СтруктураПечатнойФормы2.Вставить("СинонимМакета", "Отчет по ИП 'Василек'");
// ТабДок2 = Новый ТабличныйДокумент; ... заполняем ТабДок2 ...
СтруктураПечатнойФормы2.Вставить("ТабличныйДокумент", ТабДок2);
МассивСтруктурПечатныхФорм.Добавить(СтруктураПечатнойФормы2);
Возврат МассивСтруктурПечатныхФорм;
КонецФункции
УправлениеПечатьюКлиент.ПечатьДокументов().
&НаКлиенте
Процедура ПоказатьПулПечатныхФормБСП()
МассивСтруктурПечатныхФорм = СформироватьПулПечатныхФормБСП();
КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм();
// Получаем имена полей, которые ожидаются в структуре ПечатнаяФорма
ПоляКоллекции = УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм();
Для Каждого СтрТабДок Из МассивСтруктурПечатныхФорм Цикл
// Создаем структуру, соответствующую требованиям КоллекцииПечатныхФорм
ПечатнаяФорма = Новый Структура(СтрСоединить(ПоляКоллекции, ","));
ПечатнаяФорма.СинонимМакета = СтрТабДок.СинонимМакета;
// Имя файла обычно совпадает с синонимом для удобства
ПечатнаяФорма.ИмяФайлаПечатнойФормы = ПечатнаяФорма.СинонимМакета;
ПечатнаяФорма.ТабличныйДокумент = СтрТабДок.ТабличныйДокумент;
// Можно добавить другие параметры, если они есть в ПоляКоллекции
КоллекцияПечатныхФорм.Добавить(ПечатнаяФорма);
КонецЦикла;
// Дополнительные параметры для формы просмотра печати
ДополнительныеПараметры = УправлениеПечатьюКлиент.ПараметрыПечати();
ДополнительныеПараметры.ЗаголовокФормы = "Пакет печатных форм"; // Заголовок окна просмотра
ДополнительныеПараметры.ВладелецФормы = ЭтотОбъект; // Указываем владельца формы
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, , ДополнительныеПараметры);
КонецПроцедуры
НастройкиПечатиОбъектов и убедиться, что процедуры печати отдельных форм делают разметку табличного документа по объектам печати.
Помимо конкретных решений, существуют общие рекомендации, которые помогут нам при работе с табличными документами, особенно когда их несколько.
ТабДок.Показать() в веб-клиенте и тонком клиенте: Как мы уже упоминали, метод ТабДок.Показать() может работать некорректно или иметь ограниченную функциональность в веб-клиенте и тонком клиенте по сравнению с толстым клиентом. Всегда отдавайте предпочтение механизмам БСП для отображения печатных форм в управляемом приложении.
&НаСервереБезКонтекста.
Выбор конкретного метода зависит от требований к отчету, используемой архитектуры (наличие БСП), а также от типа клиента, в котором будет работать пользователь. Мы рекомендуем использовать БСП как наиболее универсальный и поддерживаемый подход для современных конфигураций 1С.
← К списку