Ошибка присваивания ссылки документа из расширения в типовых формах 1С

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке расширений для «1С:Предприятие» программисты часто сталкиваются с ситуацией, когда новый документ, созданный в расширении, необходимо интегрировать в типовые механизмы конфигурации. Одной из таких задач является вывод движений документа через стандартный отчет «Движения документа» или форму «Корректировка движений». Однако при попытке передать ссылку на такой документ в типовую форму возникает ошибка: «Значение не является значением объектного типа» или значение просто не присваивается реквизиту формы. Рассмотрим подробнее, почему это происходит и как решить данную проблему.

Анализ причины проблемы: фундаментальные ограничения типизации

Проанализируем ситуацию, описанную в сообщениях. Автор создал в расширении новый документ и пытается вызвать для него стандартную команду ПоказатьДвиженияДокумента. В модуле формы КорректировкаДвижений в процедуре ПриСозданииНаСервере параметр Параметры.ДокументДвижений содержит верную ссылку на документ из расширения, но при попытке присвоить это значение реквизиту формы ДокументДвижений, переменная остается пустой или вызывает программный сбой.

Выясним причину такого поведения платформы. В основной конфигурации тип данных ДокументСсылка (если не указан конкретный вид документа) представляет собой составной тип (Union), включающий в себя ссылки на все документы, определенные в метаданных основной конфигурации. Когда мы создаем документ в расширении, он физически не попадает в этот список типов основной базы. Платформа строго следит за типизацией: поскольку ваш новый документ не входит в состав типа ДокументСсылка основной конфигурации, она блокирует операцию присваивания.

Важный нюанс: на текущий момент объекты расширения не «инжектируются» в базовые типы основной конфигурации автоматически. Это означает, что любая типовая форма, где реквизит жестко ограничен типом ДокументСсылка, не сможет принять ссылку на объект из расширения без дополнительных манипуляций.

Решение №1: Изменение типа реквизита в расширении (Hack)

Самый быстрый и действенный способ обойти проверку типов платформой — это «ослабить» типизацию целевого реквизита. Разберем по шагам, как это сделать:

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

После установки типа Произвольный код присваивания в ПриСозданииНаСервере начнет работать корректно:


// В типовом коде это выглядит так:
Если Параметры.Свойство("ДокументДвижений", ДокументДвижений) Тогда
    ЭтаФорма.ДокументДвижений = ДокументДвижений; // Теперь это сработает!
КонецЕсли;

Решение №2: Регистрация регистраторов в расширении

Если после решения проблемы с присваиванием отчет открывается, но остается пустым (как в сообщении 16), необходимо проверить настройки метаданных. Посмотрим на ситуацию со стороны регистров. Чтобы отчет по движениям увидел данные, ваш документ должен быть указан как Регистратор для соответствующих регистров.

Рассмотрим порядок действий:

  1. Заимствуйте в расширение те регистры (накопления, бухгалтерии, сведения), по которым ваш документ делает движения.
  2. В свойствах каждого регистра в расширении перейдите в список «Регистраторы».
  3. Установите галочку напротив вашего нового документа из расширения.

Без этого шага типовые запросы, которые строят отчет, не будут учитывать таблицы вашего документа, даже если физически записи в базе данных существуют.

Решение №3: Интеграция с Библиотекой стандартных подсистем (БСП)

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

В модуле менеджера вашего документа добавьте процедуру:


// Процедура для регистрации документа в подсистеме "Движения документов"
Процедура ПриОпределенииСпискаРегистровДвижений(СписокРегистров) Экспорт
    СписокРегистров.Добавить(Метаданные.РегистрыБухгалтерии.Хозрасчетный);
    СписокРегистров.Добавить(Метаданные.РегистрыНакопления.НДСПродажи);
КонецПроцедуры

Также может потребоваться расширить общий модуль МодификацияКонфигурацииПереопределяемый, чтобы система понимала, как именно выводить отчет для вашего типа документа. Это позволит избежать «ручного» заимствования форм и изменения их реквизитов на Произвольный, так как БСП будет использовать свои универсальные механизмы.

Проблема структуры подчиненности (Критерии отбора)

В сообщении 18 упоминалось, что документ невозможно добавить в критерий отбора. Проанализируем современное состояние платформы: начиная с версии 8.3.15, расширения позволяют изменять состав типов Критериев отбора. Если вам нужно, чтобы ваш документ отображался в «Структуре подчиненности»:

  1. Заимствуйте критерий отбора СвязанныеДокументы в расширение.
  2. В списке типов «Данные» добавьте ваш документ.
  3. В составе критерия укажите реквизиты вашего документа, которые ссылаются на другие объекты (например, ДокументОснование).

Это штатный механизм, который теперь поддерживается платформой и не требует «костылей» в виде изменения типов на произвольные.

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

Подводя итог, можно сказать, что ошибка «не является значением объектного типа» при работе с документами из расширений — это следствие жесткой типизации платформы. Для решения задачи мы рассмотрели три уровня интеграции:

Используйте замену типа на Произвольный только в тех случаях, когда типовой код невозможно адаптировать иным способом, так как это отключает проверку ссылочной целостности на уровне интерфейса формы.

← На главную