Как исправить ошибку «Значение не является значением объектного типа (Метаданные)» при проведении возврата от покупателя в 1С:Бухгалтерия 3.0?

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

При проведении документа «Возврат товаров от покупателя» в типовой конфигурации «1С:Бухгалтерия предприятия 3.0» (а также в решениях на её базе, например, с установленным модулем «БИТ.Финанс») пользователи и администраторы иногда сталкиваются с критической ошибкой выполнения кода:

ОбщийМодуль.УчетТоваров.Модуль(1722)}: Значение не является значением объектного типа (Метаданные)
МетаданныеСделки = Реквизиты.Сделка.Метаданные();

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

Выясняем причину возникновения ошибки

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

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

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

Вариант 1. Указание реального документа отгрузки в форме документа

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

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

Важное примечание: Заполнение реальной сделки крайне важно для правильного списания себестоимости, восстановления партий и корректного формирования записей по НДС в книге покупок или книге продаж.

Вариант 2. Программно подстановка пустой ссылки (Обработкой)

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

В обычной конфигурации 1С:Бухгалтерия проведение возврата без основания разрешено, но код проверки метаданных требует, чтобы реквизит Сделка имел тип пустой ссылки, а не Неопределено. От пустой ссылки метод .Метаданные() срабатывает корректно и возвращает метаданные объекта Документ.РеализацияТоваровИУслуг.

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


ВыборкаДокументов = Документы.ВозвратТоваровОтПокупателя.Выбрать();

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

КонецЦикла;

После выполнения данного скрипта реквизиту Сделка во всех непроводящихся документах будет присвоено значение Документы.РеализацияТоваровИУслуг.ПустаяСсылка(). После этого документы проведутся без ошибок.

Вариант 3. Настройка правил обмена (ПКД) для предотвращения ошибки в будущем

Чтобы избежать повторного возникновения этой проблемы при регулярных загрузках из внешних систем (например, Далион), проанализируем правила конвертации данных (ПКД).

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

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

Подводим итоги

Ошибка вызова метода .Метаданные() возникает исключительно из-за некорректного типа данных в реквизите Сделка. Подстановка реального документа продажи либо замена значения Неопределено на Документы.РеализацияТоваровИУслуг.ПустаяСсылка() полностью устраняет проблему и позволяет штатно провести документы возврата в 1С:Бухгалтерии 3.0.

← На главную