Как исправить ошибку «Значение не является значением объектного типа (ПВД_ПередОбработкой_...)» при выгрузке данных в 1С?

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

При переносе данных между базами (например, при переходе с «1С:Управление торговлей 10.3» на «1С:Управление торговлей 11.4») с использованием конфигурации «Конвертация данных 2» и обработки УниверсальныйОбменДаннымиXML разработчики нередко сталкиваются со следующей ошибкой:

«Ошибка в обработчике события ПередОбработкойПравилаВыгрузки. ПВД = ВводОстатков. ОписаниеОшибки = Значение не является значением объектного типа (ПВД_ПередОбработкой_ВводОстатков). ПозицияМодуля = (1)».

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

Причина возникновения ошибки

Обратите внимание на указание строки: ПозицияМодуля = (1). Ошибка в первой же строке обработчика означает, что сбой произошел еще до выполнения пользовательского кода запроса и заполнения коллекций.

В конфигурации «Конвертация данных, ред. 2.1» предусмотрен специальный механизм отладки обработчиков выгрузки и загрузки через вынос их в отдельный модуль. Если при сохранении правил выгрузки включен режим отладки в модуле, тело обработчика не записывается внутрь результирующего XML-файла. Вместо этого в XML помещается вызов внешней процедуры вида МодульОбработчиков.ПВД_ПередОбработкой_ВводОстатков(...).

Если после этого правила загружаются в типовую обработку УниверсальныйОбменДаннымиXML без подключенного модуля отладки, переменная МодульОбработчиков принимает значение Неопределено. При попытке вызвать у нее метод платформа 1С сообщает, что значение не является значением объектного типа.

Способ 1. Выгрузка правил в стандартном режиме (без модуля отладки)

Если вам требуется выполнить штатный перенос данных без пошаговой отладки кода в Конфигураторе, выполним следующие действия:

  1. Откроем конфигурацию «Конвертация данных».
  2. Перейдем к форме выгрузки правил обмена.
  3. Снимем флаг выгрузки обработчиков в отдельный модуль (отключим режим создания отладочной обработки).
  4. Сохраним правила обмена в файл XML заново.

В этом случае весь программный код обработчиков будет сохранен непосредственно внутри XML-файла и выполнится динамически с помощью функции Выполнить().

Способ 2. Корректная настройка режима отладки выгрузки

Если вам необходимо отладить алгоритм выборки остатков в Конфигураторе источника (УТ 10.3), настроим режим отладки правильно:

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

Способ 3. Проверка версии обработки обмена

Убедимся, что версия обработки УниверсальныйОбменДаннымиXML.epf соответствует используемой конфигурации-источнику. Для конфигураций на обычных формах (УТ 10.3) должна использоваться версия обработки для обычного приложения, поддерживающая текущий формат правил обмена КД 2.

Особенности программного формирования остатков в ПВД

Рассмотрим подробнее код обработчика ПередОбработкойВыгрузкиДанных правила выгрузки данных (ПВД). При переносе остатков через произвольный алгоритм мы формируем структуру ИсходящиеДанные, наполняем таблицы значений и передаем их в процедуру ВыгрузитьПоПравилу:


ДатаСреза = ТекущаяДата();
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Дата", ДатаСреза);
ИсходящиеДанные.Вставить("ТипОперации", "ОстаткиСобственныхТоваров");
ИсходящиеДанные.Вставить("Товары", Новый ТаблицаЗначений);

ИсходящиеДанные.Товары.Колонки.Добавить("Номенклатура");
ИсходящиеДанные.Товары.Колонки.Добавить("Характеристика");
ИсходящиеДанные.Товары.Колонки.Добавить("Серия");
ИсходящиеДанные.Товары.Колонки.Добавить("Количество");
ИсходящиеДанные.Товары.Колонки.Добавить("Цена");
ИсходящиеДанные.Товары.Колонки.Добавить("Сумма");
ИсходящиеДанные.Товары.Колонки.Добавить("Упаковка");
ИсходящиеДанные.Товары.Колонки.Добавить("КоличествоУпаковок");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаБезНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СтавкаНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаРегл");
ИсходящиеДанные.Товары.Колонки.Добавить("НДСРегл");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаСНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("КодСтроки");
ИсходящиеДанные.Товары.Колонки.Добавить("ИдентификаторСтроки");

ИсходящиеДанные.Вставить("ДетализацияПартий", Новый ТаблицаЗначений);
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("ИдентификаторСтроки");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("Партнер");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("Контрагент");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("ДокументПоступления");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("СтавкаНДС");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("СуммаРегл");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("НДСРегл");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("НДСУпр");

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТоварыКПолучениюНаСкладыОстатки.Склад,
    |    ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения,
    |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура,
    |    ТоварыКПолучениюНаСкладыОстатки.ХарактеристикаНоменклатуры КАК Характеристика,
    |    ТоварыКПолучениюНаСкладыОстатки.СерияНоменклатуры КАК Серия,
    |    ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток КАК Количество,
    |    ТоварыКПолучениюНаСкладыОстатки.ЦенаОстаток КАК Цена,
    |    ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК Сумма,
    |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура.ЕдиницаДляОтчетов КАК Упаковка,
    |    ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток КАК КоличествоУпаковок,
    |    ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаБезНДС,
    |    ""БезНДС"" КАК СтавкаНДС,
    |    0 КАК СуммаНДС,
    |    ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаРегл,
    |    0 КАК НДСРегл,
    |    ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаСНДС,
    |    ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Контрагент КАК Партнер,
    |    ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Контрагент КАК Контрагент,
    |    ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Ссылка КАК ДокументПоступления,
    |    0 КАК НДСУпр
    |ИЗ
    |    РегистрНакопления.ТоварыКПолучениюНаСклады.Остатки(&ДатаСреза, ) КАК ТоварыКПолучениюНаСкладыОстатки";

Запрос.УстановитьПараметр("ДатаСреза", ДатаСреза);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Сч = 0;
Пока Выборка.Следующий() Цикл
    Если Выборка.Количество = 0 Тогда
        Продолжить;
    КонецЕсли;
    
    Сч = Сч + 1;
    НоваяСтрокаТовары = ИсходящиеДанные.Товары.Добавить();
    НоваяСтрокаДетализацияПартий = ИсходящиеДанные.ДетализацияПартий.Добавить();
    
    ЗаполнитьЗначенияСвойств(НоваяСтрокаТовары, Выборка);
    ЗаполнитьЗначенияСвойств(НоваяСтрокаДетализацияПартий, Выборка);
    
    НоваяСтрокаТовары.ИдентификаторСтроки = Сч;
    НоваяСтрокаТовары.КодСтроки = Сч;
    НоваяСтрокаДетализацияПартий.ИдентификаторСтроки = Сч;
КонецЦикла;

ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "ВводОстатков");

При настройке целевого правила конвертации объекта (ПКО ВводОстатков) важно учесть два ключевых момента:

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