При работе с механизмом Конвертации данных 2.1 разработчики часто сталкиваются с ситуацией, когда стандартная выгрузка данных прерывается критической ошибкой. Одной из самых коварных является ошибка Значение не является значением объектного типа (Количество). Она может возникнуть внезапно, даже если, на первый взгляд, все правила настроены верно, а типы данных в источнике и приемнике совпадают. Давайте подробно разберем, почему это происходит и как устранить проблему, основываясь на практическом опыте и технических особенностях платформы.
Прежде всего, проанализируем саму формулировку ошибки. Сообщение Значение не является значением объектного типа означает, что программный код обработки «Универсальный обмен данными XML» пытается обратиться к свойству Количество через точку (например, Объект.Количество), но в переменной Объект в этот момент находится не строка таблицы значений, не структура и не объект метаданных, а нечто иное: Неопределено, NULL или простое число.
В контексте ПКС (Правил конвертации свойств) для табличных частей или наборов записей регистров это чаще всего происходит в цикле обхода коллекции. Если система ожидает итерацию по строкам, но получает некорректно сформированную структуру, обращение к любому реквизиту (в нашем случае к Количество) вызывает аварийное завершение обработки.
Рассмотрим ситуацию, когда вы выгружаете движения регистра накопления (например, Продажи), которые не привязаны напрямую к табличной части документа-источника. В этом случае в ПКС для набора движений в обработчике Перед выгрузкой вы, скорее всего, формируете данные программно, используя переменную КоллекцияОбъектов.
Разберем типичную ошибку: разработчик создает таблицу значений, заполняет ее данными, но забывает явно добавить колонку, которая указана в правилах конвертации. Если в настройках ПКС создана строка для свойства Количество, а в вашей программно созданной таблице такой колонки нет, код обмена «споткнется» при попытке прочитать это значение из строки таблицы.
Чтобы избежать этого, проанализируем правильный алгоритм инициализации таблицы в обработчике Перед выгрузкой:
// Правильная инициализация коллекции объектов
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("Контрагент");
КоллекцияОбъектов.Колонки.Добавить("Количество"); // Обязательно добавляем колонку!
КоллекцияОбъектов.Колонки.Добавить("Цена");
// Далее следует заполнение таблицы данными
НоваяСтрока = КоллекцияОбъектов.Добавить();
НоваяСтрока.Номенклатура = Источник.Товар;
НоваяСтрока.Количество = Источник.Кво; // Убеждаемся, что значение передается
Важный момент: Имя колонки в ТаблицеЗначений должно символ в символ совпадать с тем, что указано в поле «Источник» в настройках ПКС. Если вы ошибетесь в одной букве или регистре, система не найдет колонку и выдаст ошибку объектного типа.
Иногда ошибка кроется уровнем выше — в Правилах выгрузки данных. Если вы используете произвольный алгоритм выборки данных (ВыборкаДанных), необходимо следить за тем, чтобы структура возвращаемого результата полностью соответствовала ожиданиям ПКО (Правила конвертации объектов).
Рассмотрим ситуацию: вы передаете из ПВД структуру, содержащую несколько табличных частей. Если вы определили одну таблицу, но «забыли» проинициализировать или правильно описать вторую (где как раз и находится реквизит Количество), обработка обмена получит пустую ссылку или неверный тип данных. Выясним, как это выглядит на практике: если ПКО ожидает наличие определенного входящего реквизита, а он не передан в структуре ВыборкаДанных, система может интерпретировать это как отсутствие объекта там, где он должен быть.
Если в настройках ПКС установлен флаг «Получить из входящих данных», система перестает искать значение в объекте-источнике и начинает искать его в структуре ВходящиеДанные. Если вы программно не передали в эту структуру ключ с именем Количество, либо передали туда значение, не являющееся структурой/строкой таблицы, возникнет обсуждаемая ошибка.
Посмотрим на пример правильной передачи данных через ВходящиеДанные в обработчике Перед выгрузкой ПКС:
// В обработчике ПКС для табличной части/набора
СтруктураСтроки = Новый Структура;
СтруктураСтроки.Вставить("Номенклатура", Источник.Товар);
СтруктураСтроки.Вставить("Количество", 10); // Указываем явно
ВходящиеДанные = СтруктураСтроки;
Когда текст ошибки указывает на строку в модуле обработки УниверсальныйОбменДаннымиXML (обычно это район 8000–8010 строк), это сигнал к тому, что пора использовать конфигуратор. Пошагово разберем процесс диагностики:
УниверсальныйОбменДаннымиXML и откройте ее модуль объекта.ОбъектКоллекции или аналогичное имя.Неопределено, значит, ваша КоллекцияОбъектов не была инициализирована.Количество в списке колонок этой таблицы через «Вычислить выражение».Проанализируем еще один нюанс: иногда разработчики проверяют свой код во внешней обработке (как автор сообщения в теме), и там он работает. Почему же он падает в КД? Ответ прост: в КД важен контекст исполнения. Убедитесь, что вы не используете в коде ПКС функции, доступные только на клиенте или только в определенных модулях, которые могут возвращать Неопределено в контексте работы выгрузки.
Для успешного решения проблемы рекомендуем последовательно проверить следующие пункты:
ТаблицуЗначений добавлена колонка с точным именем реквизита.КоллекцияОбъектов инициализируется всегда, даже если данных для выгрузки нет (в этом случае она должна быть пустой таблицей, а не Неопределено).Следование этим правилам позволит вам быстро локализовать причину сбоя и обеспечить стабильный обмен данными между конфигурациями 1С.