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