Как правильно передать ссылку на документ из серверной функции на клиент для печати?

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

В процессе разработки в среде «1С:Предприятие 8.3» программисты часто сталкиваются с ситуацией, когда ссылка на объект, полученная на сервере и переданная на клиент, кажется «пустой» или «неактивной». Особенно остро это проявляется при попытке использовать стандартные механизмы Библиотеки стандартных подсистем (БСП) для печати документов. Разберем подробно, почему это происходит и как правильно организовать передачу данных.

Анализируем поведение ссылки на клиенте и сервере

Рассмотрим ситуацию: мы вызываем серверную функцию, которая находит связанный документ (например, «Аренда номенклатуры» на основании «Заказа клиента») и возвращает его ссылку на клиент. В отладчике на стороне клиента мы видим только текстовое представление документа, и у ссылки отсутствует привычный «плюсик», позволяющий развернуть ее реквизиты. Важно понимать: это нормальное поведение платформы в режиме тонкого клиента.

Проанализируем причины этого явления:

  1. Ограничение контекста: На клиенте объект типа «Ссылка» представляет собой лишь уникальный идентификатор (GUID) и строку представления. Самих данных объекта (реквизитов, табличных частей) в оперативной памяти клиента нет.
  2. Работа отладчика: Когда вы видите «разворачивающуюся» ссылку в учебной базе или на сервере, это происходит потому, что отладчик в этом контексте имеет возможность неявно обратиться к базе данных. В тонком клиенте такая возможность ограничена для оптимизации трафика.
  3. Типизация БСП: Большинство процедур БСП, таких как УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати, ожидают строго определенные типы данных в качестве источника.

Решение проблемы передачи данных для печати БСП

Если ваша задача — передать найденный документ в стандартную команду печати, основной ошибкой является передача «голой» ссылки. Процедуры БСП чаще всего работают с массивами или специальными структурами данных формы. Выясним, как изменить код, чтобы команда печати отработала корректно.

Посмотрим на типичный пример исправления кода в модуле формы:


&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
    Если Команда.Имя = "ГруппаПечатьКомандаПечати3" Тогда
        // Получаем ссылку на связанный документ через сервер
        СсылкаНаДокумент = ПолучитьДоговорПрокатаПоЗаказу(Объект.Ссылка);
        
        Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
            // БСП требует массив источников, даже если документ один
            МассивОбъектов = Новый Массив;
            МассивОбъектов.Добавить(СсылкаНаДокумент);
            
            // Вызываем команду печати, передавая массив вместо одиночной ссылки
            УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтотОбъект, МассивОбъектов);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Как правильно получать данные на сервере

Для того чтобы ссылка корректно вернулась на клиент и была пригодна для дальнейшего использования, серверная функция должна быть максимально простой. Однако стоит обратить внимание на метод получения связанных документов. Метод ПолучитьПодчиненныеДокументы считается устаревшим. В современных конфигурациях (УТ 11, ERP, КА 2) рекомендуется использовать запросы к критериям отбора или специализированные функции БСП.

Рассмотрим пример серверной функции с использованием запроса:


&НаСервере
Функция ПолучитьДоговорПрокатаПоЗаказу(ЗаказСсылка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    СвязанныеДокументы.Ссылка КАК Ссылка
        |ИЗ
        |    КритерийОтбора.СвязанныеДокументы(&ЗаказСсылка) КАК СвязанныеДокументы
        |ГДЕ
        |    СвязанныеДокументы.Ссылка ССЫЛКА Документ.АрендаНоменклатуры";
    
    Запрос.УстановитьПараметр("ЗаказСсылка", ЗаказСсылка);
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Документы.АрендаНоменклатуры.ПустаяСсылка();
КонецФункции

Работа с реквизитами ссылки на клиенте

Если вам на клиенте все же нужны конкретные значения реквизитов (например, номер или дата найденного документа), не пытайтесь получить их через точку от ссылки Док.Номер. Это вызовет неявный и дорогостоящий серверный вызов (или ошибку). Проанализируем правильный подход: получение данных в структуре.

Выполним следующие шаги:

  1. На сервере сформируем структуру и заполним ее нужными полями.
  2. Передадим структуру на клиент.
  3. На клиенте обратимся к свойствам структуры.

Пример реализации:


&НаСервере
Функция ПолучитьДанныеДокумента(СсылкаНаДокумент)
    Данные = Новый Структура;
    Данные.Вставить("Ссылка", СсылкаНаДокумент);
    Данные.Вставить("Номер", СсылкаНаДокумент.Номер);
    Данные.Вставить("Дата", СсылкаНаДокумент.Дата);
    Возврат Данные;
КонецФункции

&НаКлиенте
Процедура ПроверитьДанные()
    СтруктураДока = ПолучитьДанныеДокумента(НайденнаяСсылка);
    Сообщить("Документ номер: " + СтруктураДока.Номер + " от " + СтруктураДока.Дата);
КонецПроцедуры

Резюме и рекомендации

Для успешного решения задачи придерживайтесь следующих правил:

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

← На главную