База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку: метод объекта не обнаружен (Метаданные) в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 25 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
22 сентября 2026 в 7:42 #38692
Метод объекта не обнаружен (Метаданные)
{СуммарныйВесОбъемПлощадь ОбщийМодуль._ОбщийВызовСервера.Модуль(5)}:Мета = мДокументы[0].Метаданные();
{СуммарныйВесОбъемПлощадь ОбщийМодуль.ВОП_ОбщийМодульКлиент.Модуль(46)}:Показатели = _ОбщийВызовСервера.ПолучитьОбщиеПоказатели(мДокументы);
{СуммарныйВесОбъемПлощадь Обработка.ЖурналДокументовВнутреннегоТовародвижения.Форма.СписокДокументов.Форма(10)}:ВОП_ОбщийМодульКлиент._ЗаполнитьПоказателиДокументаКлиент(ЭтаФорма);[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
-
22 сентября 2026 в 7:42 #38693
Ошибка возникает на строке:
1С (Код)1Мета = мДокументы[0].Метаданные();Метод
Метаданные()у элементамДокументы[0]недоступен. Скорее всего, в массив передаются не ссылки на документы, а:— объекты документов;
— строки динамического списка;
— данные формы;
— структура;
— другой объект, не являющийся ссылкой.Для получения метаданных надежнее использовать тип значения:
1С (Код)1Мета = Метаданные.НайтиПоТипу(ТипЗнч(мДокументы[0]));Но важно: если в
мДокументынаходятся объекты документов,ТипЗнч()вернет типДокументОбъект.<ИмяДокумента>, а для поиска метаданных документа нужно получить тип ссылки.## Исправление для ссылок на документы
Если
мДокументысодержит ссылки на документы, замените строку:1С (Код)1Мета = мДокументы[0].Метаданные();на:
1С (Код)1Мета = Метаданные.НайтиПоТипу(ТипЗнч(мДокументы[0]));Например:
1С (Код)1234567891011121314151617181920212223&НаСервереБезКонтекстаФункция ПолучитьОбщиеПоказатели(мДокументы)Если мДокументы = НеопределеноИли мДокументы.Количество() = 0 ТогдаВозврат Неопределено;КонецЕсли;ПервыйДокумент = мДокументы[0];Если Не ЗначениеЗаполнено(ПервыйДокумент) ТогдаВозврат Неопределено;КонецЕсли;Мета = Метаданные.НайтиПоТипу(ТипЗнч(ПервыйДокумент));Если Мета = Неопределено ТогдаВызватьИсключение "Не удалось определить метаданные переданного документа";КонецЕсли;// Дальнейшая обработкаКонецФункцииОднако такой вариант корректен только тогда, когда первый элемент действительно является ссылкой на документ.
## Если в массив передается объект документа
Если
мДокументы[0]является объектом документа, например:1С (Код)1ДокументОбъект = Документы.РеализацияТоваровУслуг.НайтиПоСсылке(Ссылка);то его тип будет примерно таким:
1С (Код)1ДокументОбъект.РеализацияТоваровУслугВ этом случае нужно преобразовать тип объекта документа в тип ссылки:
1С (Код)12345678910ТипДокумента = ТипЗнч(мДокументы[0]);ИмяТипа = Строка(ТипДокумента);ИмяТипаСсылки = СтрЗаменить(ИмяТипа,"ДокументОбъект.","ДокументСсылка.");ТипДокументаСсылка = Новый Тип(ИмяТипаСсылки);Мета = Метаданные.НайтиПоТипу(ТипДокументаСсылка);Но такой вариант менее удобен. Лучше передавать в
ПолучитьОбщиеПоказатели()именно ссылки на документы, а не объекты.## Универсальный вариант для ссылок и объектов
Если ваш общий модуль может получать и ссылки, и объекты, используйте проверку типа:
1С (Код)1234567891011121314151617181920212223242526272829&НаСервереБезКонтекстаФункция ПолучитьМетаданныеДокумента(Документ)Если Документ = Неопределено ТогдаВозврат Неопределено;КонецЕсли;ТипДокумента = ТипЗнч(Документ);ИмяТипа = Строка(ТипДокумента);Если СтрНачинаетсяС(ИмяТипа, "ДокументСсылка.") ТогдаВозврат Метаданные.НайтиПоТипу(ТипДокумента);ИначеЕсли СтрНачинаетсяС(ИмяТипа, "ДокументОбъект.") ТогдаИмяТипаСсылки = СтрЗаменить(ИмяТипа,"ДокументОбъект.","ДокументСсылка.");Возврат Метаданные.НайтиПоТипу(Новый Тип(ИмяТипаСсылки));КонецЕсли;Возврат Неопределено;КонецФункцииТогда в функции
ПолучитьОбщиеПоказатели():1С (Код)12345Мета = ПолучитьМетаданныеДокумента(мДокументы[0]);Если Мета = Неопределено ТогдаВызватьИсключение "В массиве передан объект, который не является документом";КонецЕсли;## Если в массиве находятся строки списка
Судя по вызову:
1С (Код)1ВОП_ОбщийМодульКлиент._ЗаполнитьПоказателиДокументаКлиент(ЭтаФорма);обработка запускается из формы списка документов. В этом случае в массив могли попасть не ссылки, а строки формы или структуры.
Например, ошибочный вариант:
1С (Код)1МассивДокументов.Добавить(ТекущаяСтрока);где
ТекущаяСтрокаявляется данными строки динамического списка.Нужно добавлять именно ссылку на документ:
1С (Код)1МассивДокументов.Добавить(ТекущаяСтрока.Ссылка);В зависимости от формы поле может называться:
1С (Код)1ТекущаяСтрока.Ссылкаили:
1С (Код)1ТекущаяСтрока.Документили:
1С (Код)1ТекущаяСтрока.РегистраторНапример:
1С (Код)1234567891011121314151617&НаКлиентеПроцедура ЗаполнитьПоказатели(Команда)МассивДокументов = Новый Массив;Для Каждого СтрокаДокумента Из Элементы.Список.ТекущиеДанные ЦиклЕсли ЗначениеЗаполнено(СтрокаДокумента.Ссылка) ТогдаМассивДокументов.Добавить(СтрокаДокумента.Ссылка);КонецЕсли;КонецЦикла;Показатели = _ОбщийВызовСервера.ПолучитьОбщиеПоказатели(МассивДокументов);КонецПроцедурыКонкретное имя реквизита зависит от источника динамического списка.
## Как быстро определить фактический тип
Временно добавьте перед строкой с ошибкой:
1С (Код)1Сообщить(Строка(ТипЗнч(мДокументы[0])));Либо в отладчике посмотрите значение:
1С (Код)1ТипЗнч(мДокументы[0])Возможные результаты:
1С (Код)1ДокументСсылка.РеализацияТоваровУслугТогда достаточно:
1С (Код)1Мета = Метаданные.НайтиПоТипу(ТипЗнч(мДокументы[0]));Если результат:
1С (Код)1ДокументОбъект.РеализацияТоваровУслугнужно либо передавать ссылку:
1С (Код)1мДокументы.Добавить(ДокументОбъект.Ссылка);либо использовать преобразование типа объекта в тип ссылки.
Если результат:
1С (Код)1Структураили:
1С (Код)1ДанныеФормыСтруктуразначит в серверную функцию передается не сам документ, а структура или строка формы. Нужно извлечь из нее ссылку до вызова серверной функции.
## Рекомендуемое исправление
В модуле
_ОбщийВызовСерверазамените:1С (Код)1Мета = мДокументы[0].Метаданные();на:
1С (Код)1Мета = Метаданные.НайтиПоТипу(ТипЗнч(мДокументы[0]));А в коде формирования массива убедитесь, что добавляется именно ссылка:
1С (Код)1МассивДокументов.Добавить(ТекущаяСтрока.Ссылка);Для формы списка документов оптимальная схема такая:
1С (Код)12345// На клиентеМассивДокументов.Добавить(СтрокаСписка.Ссылка);// На сервереМета = Метаданные.НайтиПоТипу(ТипЗнч(мДокументы[0]));Метод
мДокументы[0].Метаданные()в данном случае использовать не нужно.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.