При переносе данных между базами (например, при переходе с «1С:Управление торговлей 10.3» на «1С:Управление торговлей 11.4») с использованием конфигурации «Конвертация данных 2» и обработки УниверсальныйОбменДаннымиXML разработчики нередко сталкиваются со следующей ошибкой:
«Ошибка в обработчике события ПередОбработкойПравилаВыгрузки. ПВД = ВводОстатков. ОписаниеОшибки = Значение не является значением объектного типа (ПВД_ПередОбработкой_ВводОстатков). ПозицияМодуля = (1)».
Проанализируем ситуацию, выясним причину такого поведения и разберем по шагам, как устранить ошибку и правильно настроить программную выгрузку остатков.
Обратите внимание на указание строки: ПозицияМодуля = (1). Ошибка в первой же строке обработчика означает, что сбой произошел еще до выполнения пользовательского кода запроса и заполнения коллекций.
В конфигурации «Конвертация данных, ред. 2.1» предусмотрен специальный механизм отладки обработчиков выгрузки и загрузки через вынос их в отдельный модуль. Если при сохранении правил выгрузки включен режим отладки в модуле, тело обработчика не записывается внутрь результирующего XML-файла. Вместо этого в XML помещается вызов внешней процедуры вида МодульОбработчиков.ПВД_ПередОбработкой_ВводОстатков(...).
Если после этого правила загружаются в типовую обработку УниверсальныйОбменДаннымиXML без подключенного модуля отладки, переменная МодульОбработчиков принимает значение Неопределено. При попытке вызвать у нее метод платформа 1С сообщает, что значение не является значением объектного типа.
Если вам требуется выполнить штатный перенос данных без пошаговой отладки кода в Конфигураторе, выполним следующие действия:
В этом случае весь программный код обработчиков будет сохранен непосредственно внутри XML-файла и выполнится динамически с помощью функции Выполнить().
Если вам необходимо отладить алгоритм выборки остатков в Конфигураторе источника (УТ 10.3), настроим режим отладки правильно:
УниверсальныйОбменДаннымиXML.epf и вставим сгенерированный код в модуль объекта.Убедимся, что версия обработки УниверсальныйОбменДаннымиXML.epf соответствует используемой конфигурации-источнику. Для конфигураций на обычных формах (УТ 10.3) должна использоваться версия обработки для обычного приложения, поддерживающая текущий формат правил обмена КД 2.
Рассмотрим подробнее код обработчика ПередОбработкойВыгрузкиДанных правила выгрузки данных (ПВД). При переносе остатков через произвольный алгоритм мы формируем структуру ИсходящиеДанные, наполняем таблицы значений и передаем их в процедуру ВыгрузитьПоПравилу:
ДатаСреза = ТекущаяДата();
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Дата", ДатаСреза);
ИсходящиеДанные.Вставить("ТипОперации", "ОстаткиСобственныхТоваров");
ИсходящиеДанные.Вставить("Товары", Новый ТаблицаЗначений);
ИсходящиеДанные.Товары.Колонки.Добавить("Номенклатура");
ИсходящиеДанные.Товары.Колонки.Добавить("Характеристика");
ИсходящиеДанные.Товары.Колонки.Добавить("Серия");
ИсходящиеДанные.Товары.Колонки.Добавить("Количество");
ИсходящиеДанные.Товары.Колонки.Добавить("Цена");
ИсходящиеДанные.Товары.Колонки.Добавить("Сумма");
ИсходящиеДанные.Товары.Колонки.Добавить("Упаковка");
ИсходящиеДанные.Товары.Колонки.Добавить("КоличествоУпаковок");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаБезНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СтавкаНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаРегл");
ИсходящиеДанные.Товары.Колонки.Добавить("НДСРегл");
ИсходящиеДанные.Товары.Колонки.Добавить("СуммаСНДС");
ИсходящиеДанные.Товары.Колонки.Добавить("КодСтроки");
ИсходящиеДанные.Товары.Колонки.Добавить("ИдентификаторСтроки");
ИсходящиеДанные.Вставить("ДетализацияПартий", Новый ТаблицаЗначений);
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("ИдентификаторСтроки");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("Партнер");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("Контрагент");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("ДокументПоступления");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("СтавкаНДС");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("СуммаРегл");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("НДСРегл");
ИсходящиеДанные.ДетализацияПартий.Колонки.Добавить("НДСУпр");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыКПолучениюНаСкладыОстатки.Склад,
| ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения,
| ТоварыКПолучениюНаСкладыОстатки.Номенклатура,
| ТоварыКПолучениюНаСкладыОстатки.ХарактеристикаНоменклатуры КАК Характеристика,
| ТоварыКПолучениюНаСкладыОстатки.СерияНоменклатуры КАК Серия,
| ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток КАК Количество,
| ТоварыКПолучениюНаСкладыОстатки.ЦенаОстаток КАК Цена,
| ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК Сумма,
| ТоварыКПолучениюНаСкладыОстатки.Номенклатура.ЕдиницаДляОтчетов КАК Упаковка,
| ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток КАК КоличествоУпаковок,
| ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаБезНДС,
| ""БезНДС"" КАК СтавкаНДС,
| 0 КАК СуммаНДС,
| ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаРегл,
| 0 КАК НДСРегл,
| ТоварыКПолучениюНаСкладыОстатки.СуммаОстаток КАК СуммаСНДС,
| ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Контрагент КАК Партнер,
| ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Контрагент КАК Контрагент,
| ТоварыКПолучениюНаСкладыОстатки.ДокументПолучения.Ссылка КАК ДокументПоступления,
| 0 КАК НДСУпр
|ИЗ
| РегистрНакопления.ТоварыКПолучениюНаСклады.Остатки(&ДатаСреза, ) КАК ТоварыКПолучениюНаСкладыОстатки";
Запрос.УстановитьПараметр("ДатаСреза", ДатаСреза);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Сч = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.Количество = 0 Тогда
Продолжить;
КонецЕсли;
Сч = Сч + 1;
НоваяСтрокаТовары = ИсходящиеДанные.Товары.Добавить();
НоваяСтрокаДетализацияПартий = ИсходящиеДанные.ДетализацияПартий.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаТовары, Выборка);
ЗаполнитьЗначенияСвойств(НоваяСтрокаДетализацияПартий, Выборка);
НоваяСтрокаТовары.ИдентификаторСтроки = Сч;
НоваяСтрокаТовары.КодСтроки = Сч;
НоваяСтрокаДетализацияПартий.ИдентификаторСтроки = Сч;
КонецЦикла;
ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "ВводОстатков");
При настройке целевого правила конвертации объекта (ПКО ВводОстатков) важно учесть два ключевых момента:
Товары и ДетализацияПартий (ПКГС), а также для их колонок (ПКС) обязательно должен быть установлен флаг «Получать из входящих данных».