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