Как вывести табличный документ на экран из модуля команды в 1С?

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

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

Понимаем архитектуру: почему сервер не может «показать»?

В архитектуре управляемого приложения 1С строго разделены два контекста исполнения кода: клиент и сервер. Это сделано для безопасности и производительности системы.

  1. Сервер — это место, где происходит работа с базой данных, выполнение сложных расчетов и формирование табличных документов. Сервер «не знает» о текущем сеансе пользователя в плане отображения интерфейса: у него нет доступа к монитору, клавиатуре или оконной системе компьютера.
  2. Клиент — это рабочее место пользователя. Именно здесь живут формы, элементы управления и здесь пользователь может взаимодействовать с данными. Метод ТабличныйДокумент.Показать() напрямую связан с отрисовкой окна на конкретном мониторе, поэтому он физически может выполняться только в контексте клиента.

Следовательно, прямое правило разработки: сервер не может вызывать клиентские процедуры. Сервер может лишь вернуть результат своей работы клиенту, который уже сам решит, как его отобразить.

Правильный алгоритм вывода табличного документа

Чтобы вывести отчет на экран, мы должны разбить задачу на два этапа: подготовительный (серверный) и отображающий (клиентский).

  1. На клиенте мы инициируем команду.
  2. Вызываем серверную функцию, которая создаст ТабличныйДокумент, заполнит его данными из базы или макетов и вернет готовый объект обратно на клиент.
  3. Получив результат на клиенте, мы вызываем метод Показать().

Пример реализации кода

Рассмотрим, как правильно организовать структуру модуля команды. Обратите внимание на то, как мы передаем управление и получаем результат работы.


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

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

Важные замечания

При использовании данного подхода учитывайте следующие нюансы:

Теперь, когда вы понимаете, что сервер лишь готовит «сырье», а клиент занимается его «презентацией», вы сможете избежать подобных ошибок в будущем!

← На главную