В процессе разработки в среде «1С:Предприятие 8.3» программисты часто сталкиваются с ситуацией, когда ссылка на объект, полученная на сервере и переданная на клиент, кажется «пустой» или «неактивной». Особенно остро это проявляется при попытке использовать стандартные механизмы Библиотеки стандартных подсистем (БСП) для печати документов. Разберем подробно, почему это происходит и как правильно организовать передачу данных.
Рассмотрим ситуацию: мы вызываем серверную функцию, которая находит связанный документ (например, «Аренда номенклатуры» на основании «Заказа клиента») и возвращает его ссылку на клиент. В отладчике на стороне клиента мы видим только текстовое представление документа, и у ссылки отсутствует привычный «плюсик», позволяющий развернуть ее реквизиты. Важно понимать: это нормальное поведение платформы в режиме тонкого клиента.
Проанализируем причины этого явления:
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати, ожидают строго определенные типы данных в качестве источника.Если ваша задача — передать найденный документ в стандартную команду печати, основной ошибкой является передача «голой» ссылки. Процедуры БСП чаще всего работают с массивами или специальными структурами данных формы. Выясним, как изменить код, чтобы команда печати отработала корректно.
Посмотрим на типичный пример исправления кода в модуле формы:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
Если Команда.Имя = "ГруппаПечатьКомандаПечати3" Тогда
// Получаем ссылку на связанный документ через сервер
СсылкаНаДокумент = ПолучитьДоговорПрокатаПоЗаказу(Объект.Ссылка);
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
// БСП требует массив источников, даже если документ один
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
// Вызываем команду печати, передавая массив вместо одиночной ссылки
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтотОбъект, МассивОбъектов);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для того чтобы ссылка корректно вернулась на клиент и была пригодна для дальнейшего использования, серверная функция должна быть максимально простой. Однако стоит обратить внимание на метод получения связанных документов. Метод ПолучитьПодчиненныеДокументы считается устаревшим. В современных конфигурациях (УТ 11, ERP, КА 2) рекомендуется использовать запросы к критериям отбора или специализированные функции БСП.
Рассмотрим пример серверной функции с использованием запроса:
&НаСервере
Функция ПолучитьДоговорПрокатаПоЗаказу(ЗаказСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СвязанныеДокументы.Ссылка КАК Ссылка
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&ЗаказСсылка) КАК СвязанныеДокументы
|ГДЕ
| СвязанныеДокументы.Ссылка ССЫЛКА Документ.АрендаНоменклатуры";
Запрос.УстановитьПараметр("ЗаказСсылка", ЗаказСсылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Документы.АрендаНоменклатуры.ПустаяСсылка();
КонецФункции
Если вам на клиенте все же нужны конкретные значения реквизитов (например, номер или дата найденного документа), не пытайтесь получить их через точку от ссылки Док.Номер. Это вызовет неявный и дорогостоящий серверный вызов (или ошибку). Проанализируем правильный подход: получение данных в структуре.
Выполним следующие шаги:
Пример реализации:
&НаСервере
Функция ПолучитьДанныеДокумента(СсылкаНаДокумент)
Данные = Новый Структура;
Данные.Вставить("Ссылка", СсылкаНаДокумент);
Данные.Вставить("Номер", СсылкаНаДокумент.Номер);
Данные.Вставить("Дата", СсылкаНаДокумент.Дата);
Возврат Данные;
КонецФункции
&НаКлиенте
Процедура ПроверитьДанные()
СтруктураДока = ПолучитьДанныеДокумента(НайденнаяСсылка);
Сообщить("Документ номер: " + СтруктураДока.Номер + " от " + СтруктураДока.Дата);
КонецПроцедуры
Для успешного решения задачи придерживайтесь следующих правил:
КритерииОтбора, так как они работают быстрее и надежнее в распределенных системах.Таким образом, ключ к решению проблемы лежит в понимании того, что клиентская часть 1С работает с «облегченными» типами данных, а механизмы БСП требуют строгого соблюдения передаваемых коллекций (массивов объектов).