Почему возникает ошибка «Значение не является значением объектного типа (Метаданные)» при создании счета на оплату на основании реализации?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе в конфигурациях на базе Библиотеки стандартных подсистем (например, 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация) разработчики и администраторы часто сталкиваются с ошибкой при вводе документов на основании. При попытке сформировать документ СчетНаОплатуКлиенту из документа РеализацияТоваровУслуг платформа прерывает выполнение и выдает системное исключение:

{ОбщийМодуль.ОбщегоНазначения.Модуль}: Значение не является значением объектного типа (Метаданные)

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

Причина возникновения ошибки в механизмах БСП

Проанализируем контекст вызова ошибки. В типовом общем модуле ОбщегоНазначения (или ОбщегоНазначенияКлиентСервер) функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) формирует динамический запрос для получения значений реквизитов переданного объекта. Пример типового фрагмента кода:


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

Метод Метаданные() существует только у ссылочных типов (например, СправочникСсылка, ДокументСсылка), а также у объектов и менеджеров метаданных. Если в качестве параметра Ссылка в функцию передается значение Неопределено, Null или примитивный тип данных, платформа не находит метод Метаданные() и вызывает критическую ошибку.

Рассмотрим основные сценарии, приводящие к передаче пустого значения в чтение реквизитов:

  1. Использование нетиповых документов-оснований: если документ реализации был сформирован по нетиповому документу (например, ЗаявкаПокупателя) или содержит ссылку на нестандартное распоряжение, типовой запрос выборки параметров для счета на оплату не находит нужного типа в своих соединениях и условиях. В результате реквизит основания или контрагента остается со значением Неопределено.
  2. Незаполненный регистр сведений «Ответственные лица организаций»: при инициализации формы счета выполняется чтение руководителя и главного бухгалтера организации на дату документа. Если срез последних в регистре ОтветственныеЛицаОрганизаций возвращает пустую ссылку или Null, последующая попытка прочитать реквизиты физического лица вызывает этот сбой.
  3. Создание на основании незаписанного документа: если команда ввода на основании вызвана для объекта, который еще не записан в информационную базу, ссылка на него отсутствует.

Пошаговый поиск и локализация проблемы

Разберем по шагам, как отследить источник некорректного значения с помощью отладчика:

  1. Проверяем точку входа: откроем модуль объекта документа СчетНаОплатуКлиенту и установим точку останова в процедуре ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения). При нажатии кнопки ввода на основании платформа первым делом передает ссылку на исходный документ в параметр ДанныеЗаполнения.
  2. Анализируем заполнение реквизитов: перейдем по шагам отладки в модули менеджеров и модули заполнения торговых документов. Обратим внимание на то, как обрабатывается реквизит ДокументОснование и связанные с ним цепочки (заказы, договоры, соглашения).
  3. Проверяем серверную инициализацию формы: если в обработке заполнения ошибок нет, поставим точку останова в модуле формы счета на сервере в процедуре ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Проверим, корректно ли заполнены реквизиты Объект.Организация, Объект.Контрагент и Объект.ДокументОснование.

Способы решения и исправления кода

Рассмотрим подробнее варианты устранения проблемы в зависимости от источника сбоя.

Вариант 1. Доработка запросов для поддержки нетиповых документов

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


// В процедуре ОбработкаЗаполнения модуля объекта документа СчетНаОплатуКлиенту
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    // Заполняем типовые реквизиты из реализации
    ЗаполнитьПоРеализации(ДанныеЗаполнения);
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаПокупателя") Тогда
    // Логика заполнения на основании нетипового документа
    ДокументОснование = ДанныеЗаполнения;
    ЗаполнитьПоЗаявке(ДанныеЗаполнения);
КонецЕсли;

В запросах получения связанных документов обязательно проверяем условия соединения таблиц, чтобы левое соединение не возвращало Null вместо ссылки на документ или справочник.

Вариант 2. Безопасный вызов функций получения реквизитов

Если дорабатываются типовые алгоритмы конфигурации, защитим вызовы чтения реквизитов от пустых значений. Перед вызовом функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта добавим проверку типа:


Если ЗначениеЗаполнено(СсылкаНаОбъект) И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СсылкаНаОбъект)) Тогда
    СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "ИНН, КПП, Наименование");
Иначе
    СтруктураРеквизитов = Новый Структура("ИНН, КПП, Наименование", "", "", "");
КонецЕсли;

Вариант 3. Проверка нормативно-справочной информации

Если доработка конфигурации не производилась, а ошибка возникает только на некоторых организациях, выполним следующие действия в режиме «1С:Предприятие»:

  1. Перейдем в карточку организации, указанной в документе реализации.
  2. Откроем регистр Лица с правом подписи (или Ответственные лица организаций).
  3. Убедимся, что на дату реализации и предполагаемую дату счета назначены действующие ответственные лица (руководитель, главный бухгалтер). При необходимости создадим записи с актуальной датой начала действия.
← На главную