При работе в конфигурациях на базе Библиотеки стандартных подсистем (например, 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация) разработчики и администраторы часто сталкиваются с ошибкой при вводе документов на основании. При попытке сформировать документ СчетНаОплатуКлиенту из документа РеализацияТоваровУслуг платформа прерывает выполнение и выдает системное исключение:
{ОбщийМодуль.ОбщегоНазначения.Модуль}: Значение не является значением объектного типа (Метаданные)
Разберем детально механизм возникновения этой неполадки, посмотрим, в каких процедурах формируются данные, и выясним, как правильно исправить алгоритм заполнения при работе с типовыми и нетиповыми документами.
Проанализируем контекст вызова ошибки. В типовом общем модуле ОбщегоНазначения (или ОбщегоНазначенияКлиентСервер) функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) формирует динамический запрос для получения значений реквизитов переданного объекта. Пример типового фрагмента кода:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
|" + ТекстПолей + "
|ИЗ
| " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы
|ГДЕ
| ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Метод Метаданные() существует только у ссылочных типов (например, СправочникСсылка, ДокументСсылка), а также у объектов и менеджеров метаданных. Если в качестве параметра Ссылка в функцию передается значение Неопределено, Null или примитивный тип данных, платформа не находит метод Метаданные() и вызывает критическую ошибку.
Рассмотрим основные сценарии, приводящие к передаче пустого значения в чтение реквизитов:
ЗаявкаПокупателя) или содержит ссылку на нестандартное распоряжение, типовой запрос выборки параметров для счета на оплату не находит нужного типа в своих соединениях и условиях. В результате реквизит основания или контрагента остается со значением Неопределено.ОтветственныеЛицаОрганизаций возвращает пустую ссылку или Null, последующая попытка прочитать реквизиты физического лица вызывает этот сбой.Разберем по шагам, как отследить источник некорректного значения с помощью отладчика:
СчетНаОплатуКлиенту и установим точку останова в процедуре ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения). При нажатии кнопки ввода на основании платформа первым делом передает ссылку на исходный документ в параметр ДанныеЗаполнения.ДокументОснование и связанные с ним цепочки (заказы, договоры, соглашения).ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Проверим, корректно ли заполнены реквизиты Объект.Организация, Объект.Контрагент и Объект.ДокументОснование.Рассмотрим подробнее варианты устранения проблемы в зависимости от источника сбоя.
Если в цепочку продаж добавлен сторонний документ, необходимо включить его в типы оснований и алгоритмы заполнения. Для этого расширим проверку типов и скорректируем запрос выборки данных:
// В процедуре ОбработкаЗаполнения модуля объекта документа СчетНаОплатуКлиенту
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Заполняем типовые реквизиты из реализации
ЗаполнитьПоРеализации(ДанныеЗаполнения);
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаПокупателя") Тогда
// Логика заполнения на основании нетипового документа
ДокументОснование = ДанныеЗаполнения;
ЗаполнитьПоЗаявке(ДанныеЗаполнения);
КонецЕсли;
В запросах получения связанных документов обязательно проверяем условия соединения таблиц, чтобы левое соединение не возвращало Null вместо ссылки на документ или справочник.
Если дорабатываются типовые алгоритмы конфигурации, защитим вызовы чтения реквизитов от пустых значений. Перед вызовом функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта добавим проверку типа:
Если ЗначениеЗаполнено(СсылкаНаОбъект) И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СсылкаНаОбъект)) Тогда
СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "ИНН, КПП, Наименование");
Иначе
СтруктураРеквизитов = Новый Структура("ИНН, КПП, Наименование", "", "", "");
КонецЕсли;
Если доработка конфигурации не производилась, а ошибка возникает только на некоторых организациях, выполним следующие действия в режиме «1С:Предприятие»: