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