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