Как правильно отобразить несколько табличных документов на клиенте в 1С:Предприятии?

Программист 1С v8.3 (Управляемые формы)
← К списку

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

Нам важно понимать, что прямое использование метода ТабДокумент.Показать() для каждого документа в цикле, хотя и является интуитивным, может быть не самым эффективным или даже неработоспособным в веб-клиенте и тонком клиенте. Давайте рассмотрим, как мы можем организовать вывод нескольких табличных документов, чтобы это было корректно, удобно и производительно.

Вариант 1: Объединение нескольких табличных документов в один

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

Рассмотрим подробнее шаги и нюансы:

  1. Формирование на сервере: Все табличные документы должны быть сформированы на сервере. Последовательно создавайте каждый документ, наполняйте его данными и затем объединяйте.
  2. Использование методов объединения: Для объединения табличных документов мы можем использовать методы Присоединить() и Вывести().
    • Метод Присоединить(ТабличныйДокументИсточник) позволяет добавить содержимое одного табличного документа к другому. Он выводит переданный табличный документ в результирующий, размещая его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий документ.
    • Метод Вывести(Область) обычно используется для формирования линейных отчетов, где области макета являются областями строк и должны выводиться последовательно. Для объединения документов мы можем выводить их поочередно, используя метод Вывести() для каждой области или целого документа.
  3. Решение проблем с разной шириной колонок: При объединении табличных документов, особенно если они имеют разную структуру или ширину колонок, могут возникнуть смещения (сдвиги) печатных форм. Чтобы избежать этого, рекомендуем использовать метод СоздатьФорматСтрок() для области ячеек присоединяемого документа. Это позволяет создать новый формат строк для всей области, гарантируя, что колонки различной ширины не будут "разъезжаться".
  4. Сохранение группировок: При использовании методов типа Область() и ВставитьОбласть() для объединения, группировки строк могут теряться. Для их сохранения потребуется более сложный алгоритм, который может разбивать присоединяемый табличный документ на блоки с разными форматами строк и присоединять каждый блок по отдельности.
  5. Разбивка на страницы: Для улучшения читаемости объемных документов мы можем принудительно разбивать их на страницы. Используйте метод ПроверитьВывод(Область), который проверяет, вмещается ли указанная область (например, строка и подвал таблицы) в текущую страницу. Если не вмещается, можно вызвать НачатьНовуюСтраницу(). Также можно указать ОбластьПечати, а также ПовторятьПриПечатиСтроки и ПовторятьПриПечатиКолонки для вывода заголовков на каждой странице.
  6. Пакетная печать: Для печати нескольких табличных документов, объединенных в один или даже не объединенных, предназначен режим пакетной печати. Он использует объекты ПакетОтображаемыхДокументов, ЭлементыПакетаОтображаемыхДокументов, ЭлементПакетаОтображаемыхДокументов. Это позволяет нам устанавливать настройки печати (количество экземпляров, разбор по копиям, имя принтера) как для всего пакета, так и для отдельных документов внутри него.

Вариант 2: Программное создание закладок (вкладок) на форме

Если мы хотим представить каждый табличный документ как отдельную сущность, не объединяя их физически в один, мы можем программно создать на форме элементы управления типа "Закладка" или "Страница" и на каждой из них разместить поле табличного документа.

Давайте разберем этот подход:

  1. Динамическое создание элементов формы: Нам потребуется создать элементы формы программно. Для этого мы будем использовать коллекцию Элементы формы. Мы создадим группу страниц (ГруппаСтраниц), а затем для каждого табличного документа будем добавлять новую страницу (СтраницаФормы) в эту группу.
  2. Размещение поля табличного документа: На каждой созданной странице мы разместим элемент формы типа "Поле табличного документа", который будет связан с соответствующим табличным документом, сформированным на сервере.
  3. Передача данных: Табличные документы, сформированные на сервере, должны быть переданы на клиент и присвоены соответствующим полям табличного документа на каждой вкладке.

Этот метод может быть более трудоемким в реализации, так как требует активной работы с


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

Вариант 3: Простой вывод массива табличных документов без использования БСП

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

Рассмотрим подробнее этот вариант:

  1. Формирование массива на сервере: Создайте серверную функцию, которая будет формировать все необходимые табличные документы и добавлять их в
    
    Новый Массив
    
    .
    
    &НаСервере
    Функция СформироватьПулТабДокументов()
        МассивТабДокументов = Новый Массив;
    
        // Здесь формируем первый табличный документ
        // Например: ТабДок1 = Новый ТабличныйДокумент;
        // ... заполняем ТабДок1 ...
        МассивТабДокументов.Добавить(ТабДок1); 
    
        // Здесь формируем второй табличный документ
        // Например: ТабДок2 = Новый ТабличныйДокумент;
        // ... заполняем ТабДок2 ...
        МассивТабДокументов.Добавить(ТабДок2); 
    
        // Добавляем все необходимые табличные документы в массив
    
        Возврат МассивТабДокументов;
    КонецФункции
    
  2. Вывод на клиенте: На клиенте вызываем эту серверную функцию, получаем массив и затем в цикле для каждого элемента массива вызываем метод Показать().
    
    &НаКлиенте
    Процедура ПоказатьПулТабДокументов()
        МассивТабДокументов = СформироватьПулТабДокументов();
        
        Для Каждого ТабДок Из МассивТабДокументов Цикл
             ТабДок.Показать();
        КонецЦикла;
    КонецПроцедуры
    

Важно: Этот подход может быть не самым оптимальным для веб-клиента и тонкого клиента, так как метод ТабДокумент.Показать() может работать иначе или вовсе не выводить таблицу на экран в этих режимах. Он больше подходит для толстого клиента или обычных форм. Мы должны это учитывать при выборе данного варианта.

Вариант 4: Использование БСП (Библиотека стандартных подсистем) для вывода печатных форм

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

Разберем этот вариант по шагам:

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

Общие рекомендации и особенности работы

Помимо конкретных решений, существуют общие рекомендации, которые помогут нам при работе с табличными документами, особенно когда их несколько.

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

Выбор конкретного метода зависит от требований к отчету, используемой архитектуры (наличие БСП), а также от типа клиента, в котором будет работать пользователь. Мы рекомендуем использовать БСП как наиболее универсальный и поддерживаемый подход для современных конфигураций 1С.

← К списку