При разработке в системе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с ситуацией, когда попытка вывести на экран печатную форму заканчивается ошибками типа: «Метод недоступен на тонком клиенте» или «Метод недоступен на сервере». Эти ошибки связаны с фундаментальным принципом разделения кода между клиентским приложением и сервером. Разберем по шагам, почему возникают эти ошибки и как правильно организовать процесс формирования табличного документа.
Рассмотрим ситуацию, в которой оказался автор темы. Он пытался получить макет на сервере и передать его на клиент для вывода в табличный документ. Однако система выдавала ошибки в обоих случаях. Проанализируем причину:
Вывести() объекта ТабличныйДокумент требует наличия объекта типа Макет или ОбластьМакет. Но в управляемом приложении объект макета доступен только на стороне сервера. Тонкий клиент просто «не знает», что такое макет и как с ним работать.Показать() предназначен для открытия окна пользователю. Поскольку на сервере нет графического интерфейса (монитора), этот метод там физически не может существовать.Таким образом, основная ошибка заключается в попытке смешать логику подготовки данных и логику их визуализации в одном контексте.
Для решения задачи нам необходимо четко разделить обязанности. Рассмотрим алгоритм, который является стандартом для 1С 8.3:
ТабличныйДокумент (или получает его из функции) и вызывает метод отображения формы.ТабличныйДокумент обратно на клиент.Посмотрим на пример правильного кода, который исправляет ошибки автора:
&НаСервере
Функция СформироватьПечатнуюФормуНаСервере()
// Создаем табличный документ прямо на сервере
ТабДок = Новый ТабличныйДокумент;
// Получаем макет из метаданных (например, из справочника Клиенты)
Макет = Справочники.Клиенты.ПолучитьМакет("Макет");
// Выводим макет в табличный документ.
// В реальных задачах мы бы использовали Макет.ПолучитьОбласть("ИмяОбласти")
ТабДок.Вывести(Макет);
// Возвращаем полностью готовый объект на клиент
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
// Получаем уже заполненный документ с сервера
ТабДок = СформироватьПечатнуюФормуНаСервере();
// Показываем его пользователю (этот метод доступен только на клиенте)
ТабДок.Показать("Печать макета");
КонецПроцедуры
Важно понимать: объект ТабличныйДокумент является сериализуемым. Это означает, что платформа 1С умеет «упаковывать» его на сервере и «распаковывать» на клиенте автоматически. А вот объект типа Макет передать таким образом нельзя.
Просто вывести весь макет целиком (как в примере выше) — задача редкая. Чаще всего макет состоит из шапки, многострочной части (таблицы) и подвала. Рассмотрим подробнее, как работать с областями на сервере, чтобы форма выглядела профессионально.
Проанализируем ситуацию, когда нам нужно заполнить параметры в макете:
&НаСервере
Функция ПечатьКарточкиКлиента(СсылкаНаКлиента)
ТабДок = Новый ТабличныйДокумент;
Макет = Справочники.Клиенты.ПолучитьМакет("Макет");
// Получаем конкретную область макета по имени
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем параметры области данными из базы
ОбластьШапка.Параметры.Наименование = СсылкаНаКлиента.Наименование;
ОбластьШапка.Параметры.Код = СсылкаНаКлиента.Код;
// Выводим подготовленную область в итоговый документ
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
В данном примере мы используем свойство Параметры. Это позволяет динамически подставлять данные в ячейки макета, где в конфигураторе указано заполнение "Параметр".
Автор темы также столкнулся со специфической ошибкой: «Достигнуто ограничение учебной версии. Достигнуто предельное количество подключений к ИБ». Выясним причину этого поведения.
Учебная версия платформы имеет жесткие лимиты, один из которых — количество одновременных сеансов. Если вы работаете в конфигураторе и одновременно запустили клиентское приложение, это считается за подключения. Если программа завершилась аварийно (например, «зависла» или была закрыта через дерево процессов), сессия в базе данных может остаться активной («фантомное подключение»).
Как решить проблему с подключениями:
1cv8.exe или 1cv8s.exe. Если они есть — завершите их.Метод Показать() имеет полезные параметры, которые делают работу пользователя удобнее. Рассмотрим их:
ТабДок.Показать("Заголовок окна", "ПутьКФайлу.mxl");
Первый параметр позволяет задать осмысленный заголовок окна вместо стандартного «Таблица». Второй параметр позволяет указать имя файла, под которым документ будет предложен к сохранению. Это критически важно для удобства интерфейса.
Также стоит упомянуть использование Временного хранилища. Если ваш табличный документ весит несколько десятков мегабайт (сотни страниц с картинками), передача его напрямую через Возврат может привести к «подтормаживанию» интерфейса. В таких случаях программисты используют следующий прием:
Адрес = ПоместитьВоВременноеХранилище(ТабДок, УникальныйИдентификатор);Адрес (строку).ТабДок = ПолучитьИзВременногоХранилища(Адрес);Однако для простых печатных форм, как в обсуждаемом случае, прямой возврат объекта является самым простым и эффективным способом.
Подведем итог: Чтобы избежать ошибок контекста, всегда помните — подготовка данных (Макет, Вывести) происходит на Сервере, а взаимодействие с пользователем (Показать) — только на Клиенте. Соблюдение этого правила избавит вас от большинства проблем при разработке печатных форм.