Почему не заполняется значение ссылки в расширении 1С и как это исправить?

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

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

Разбор причин возникновения проблемы

Основная причина заключается в строгой типизации платформы 1С. Когда вы создаете новый документ в расширении, он является «новым» объектом метаданных. Если основной объект (например, ДеревоЗначений или КритерийОтбора) был создан в основной конфигурации, он «не знает» о существовании вашего нового документа.

Даже если вы добавили документ в состав КритерияОтбора через расширение, логика работы типовых общих модулей может быть жестко «зашита» на проверку типов основной конфигурации. Если тип данных не входит в перечень разрешенных для колонки, платформа просто отсекает присваивание, оставляя значение Неопределено.

Решение 1: Проверка и настройка типов в расширении

Прежде чем менять архитектуру, убедитесь, что вы правильно заимствовали объект в расширение. Для того чтобы колонка ДереваЗначений принимала ваш документ, тип данных должен быть явно указан в свойствах этой колонки внутри расширения.

  1. Зайдите в расширение и найдите форму, содержащую таблицу.
  2. Заимствуйте эту форму в расширение.
  3. Найдите нужный реквизит или колонку таблицы.
  4. Убедитесь, что в составе типов присутствуют все необходимые ссылки на документы, в том числе те, что созданы в расширении.

Важно помнить, что простого добавления в метаданные недостаточно, если программный код использует жесткую проверку типа, как в примере ниже:


Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда 
    Возврат Неопределено; 
КонецЕсли;

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

Решение 2: Использование универсальных коллекций данных

Если редактирование основной конфигурации или изменение состава типов затруднено, рекомендуется перейти на использование универсальных коллекций. Вместо жестко типизированных колонок, можно использовать ТаблицуЗначений, где тип колонки Ссылка не ограничен.

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

Решение 3: Динамическое построение списка связанных документов

Если типовой механизм КритериевОтбора становится препятствием, оптимальным решением будет отказ от его использования в пользу собственного запроса. Это позволит вам полностью контролировать выборку.

Рассмотрим, как можно программно собрать данные:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Док.Ссылка КАК Ссылка,
    |    Док.Дата КАК Дата,
    |    Док.СуммаДокумента КАК Сумма
    |ИЗ
    |    Документ.ПоступлениеБухт КАК Док
    |ГДЕ
    |    Док.Основание = &СсылкаОснование";
Запрос.УстановитьПараметр("СсылкаОснование", СсылкаОснование);
РезультатЗапроса = Запрос.Выполнить();
// Далее заполняем дерево значений полученными данными

Таким образом, вы полностью обходите ограничения метаданных, так как Запрос работает на уровне СУБД и не требует предварительной регистрации типов в форме.

Рекомендации по исправлению ошибок

Если вы сталкиваетесь с ошибкой Значение не является значением объектного типа (Метаданные), это означает, что объект не может быть корректно идентифицирован платформой в текущем контексте. Чтобы избежать этого:

  1. Всегда проверяйте значение на Неопределено перед обращением к свойствам объекта.
  2. Используйте ЗначениеЗаполнено(Ссылка) для первичной валидации.
  3. Вместо прямого обращения к Ссылка.Метаданные() используйте ОбщегоНазначения.МетаданныеОбъекта(Ссылка), если используете типовые библиотеки БСП — они более устойчивы к работе в расширениях.

В заключение, старайтесь не менять архитектуру типовых решений без крайней необходимости. Если типовой механизм не позволяет гибко добавлять новые документы, создание собственного алгоритма поиска и вывода данных будет гораздо более надежным и обновляемым решением, чем снятие типовых объектов с поддержки.

← На главную