Перенос данных из самописной или сильно измененной нетиповой конфигурации в комплексную систему, такую как 1С:Управление производственным предприятием (УПП) редакции 1.3, — задача регулярная, но нередко сопровождающаяся техническими сложностями. Стандартные инструменты, такие как обработка ВыгрузкаЗагрузкаДанныхXML.epf или выгрузка структуры метаданных для конфигурации «Конвертация данных» (обработки MD82Exp.epf / MD83Exp.epf), могут выдавать критические ошибки при работе с объемной структурой метаданных УПП.
В рамках этой статьи мы подробно разберем причины возникновения основных ошибок компиляции и выгрузки метаданных, а также рассмотрим пошаговые сценарии успешного переноса объектов.
---
При попытке запустить универсальную обработку выгрузки/загрузки XML в базе-приемнике УПП вы можете столкнуться со следующей ошибкой компиляции:
{Справочник.ДокументыРеализацииПолномочийНалоговыхОрганов.МодульМенеджера(5,10)}: Переменная не определена (КонтекстЭДО)
Возврат <<?>>КонтекстЭДО.ДанныеТребованияОПредставленииПоясненийКДекларацииНДС(Требование);
Выясним причину этой проблемы. Переменная КонтекстЭДО является глобальной экспортной переменной. Она объявляется в Модуле обычного приложения конфигурации УПП. Ошибка компиляции возникает по одной из следующих причин:
МодульОбычногоПриложения платформой просто игнорируется. Глобальная переменная не создается, а серверные вызовы к менеджеру справочника завершаются аварийно.Рассмотрим варианты устранения этой ошибки:
Вариант 1. Запуск в режиме обычного приложения. Убедитесь, что запуск информационной базы УПП в стартере 1С настроен принудительно в режиме «Толстый клиент (обычное приложение)». Для этого перейдите в настройки информационной базы в списке запуска и в поле «Режим запуска» выберите «Толстый клиент».
Вариант 2. Временная корректировка кода в конфигураторе. Если вы используете базу только в качестве приемника данных и справочники ЭДО вам в процессе переноса не требуются, можно локально обойти эту ошибку в Конфигураторе УПП. Откройте модуль менеджера справочника ДокументыРеализацииПолномочийНалоговыхОрганов и оберните проблемные строки в инструкцию препроцессора:
#Если Клиент Тогда
Возврат КонтекстЭДО.ДанныеТребованияОПредставленииПоясненийКДекларацииНДС(Требование);
#Иначе
Возврат Неопределено;
#КонецЕсли
Аналогичным образом поступите со второй строкой, вызывающей ошибку компиляции переменной КонтекстЭДО.
---
При попытке подготовить структуру метаданных УПП для работы в базе «Конвертация данных 2» с помощью обработки MD82Exp.epf (или MD83Exp.epf) часто возникает ошибка:
{ВнешняяОбработка.ВыгрузкаМетаданных.МодульОбъекта(2041)}: Значение не является значением объектного типа (ИмяТипа)
Результат = XMLТип(Тип).ИмяТипа;
Проанализируем ситуацию. Метод платформы XMLТип() предназначен для получения соответствующего типа схемы XML для переданного типа данных 1С. В конфигурациях уровня УПП или ERP присутствуют сложные универсальные реквизиты, а также объекты, использующие устаревшие типы данных, такие как ПостроительОтчета или ПостроительЗапроса. Для этих системных объектов метод XMLТип() возвращает значение Неопределено. Обработка выгрузки пытается прочитать свойство ИмяТипа у пустого значения, что приводит к падению.
Чтобы исправить этот сбой, выполните следующие шаги:
MD82Exp.epf (или MD83Exp.epf) в конфигураторе как внешний файл.XMLТип(Тип).ИмяТипа.Неопределено). Измените участок кода следующим образом:
ТипXML = XMLТип(Тип);
Если ТипXML <> Неопределено Тогда
Результат = ТипXML.ИмяТипа;
Иначе
Результат = ""; // Предотвращаем падение программы при неопределенном типе
КонецЕсли;
После сохранения изменений обработка успешно завершит анализ структуры даже на тяжелых и нестандартных объектах метаданных УПП.
---
Рассмотрим подробнее три основных подхода к переносу документов и справочников из вашей конфигурации-источника в УПП.
Этот метод подходит только в том случае, если структуры переносимых справочников и документов в источнике и приемнике абсолютно идентичны (совпадают имена, типы реквизитов, табличные части).
Проанализируем шаги реализации данного метода:
ВыгрузкаЗагрузкаДанныхXML.epf в базе-источнике, отметьте галочками нужный документ и справочники, укажите путь к файлу и выполните выгрузку.Если структуры объектов незначительно отличаются или вам требуется сопоставить новые данные со старыми системными справочниками УПП (например, перенести контрагентов или номенклатуру в типовые справочники приемника), оптимальным решением будет использование конфигурации «Конвертация данных 2».
Многие разработчики совершают ошибку, пытаясь выгрузить структуру всей УПП целиком. УПП содержит тысячи объектов, что приводит к нехватке памяти и ошибкам. Выясним, как оптимизировать этот процесс:
MD83Exp.epf в УПП не выгружайте всю конфигурацию. В дереве объектов снимите флажки со всех разделов.Если вам требуется перенести всего один документ и несколько справочников, а разворачивать «Конвертацию данных» нет времени, можно использовать встроенные возможности платформы по сериализации объектов в XML. Напишем компактный код для выгрузки и загрузки.
Рассмотрим пример кода для выгрузки объектов из базы-источника:
// Внешний запуск выгрузки в базе-источнике
ПутьКФайлу = "C:\temp\transfer_data.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Записываем корневой элемент
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеПереноса");
ВыборкаДокументов = Документы.НашНовыйДокумент.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
// Используем СериализаторXDTO для автоматической выгрузки объекта со всеми таб. частями
ЗаписатьXML(ЗаписьXML, ВыборкаДокументов.ПолучитьОбъект());
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Теперь рассмотрим код для загрузки этих данных в базе-приемнике (УПП). Перед выполнением загрузки убедитесь, что структура метаданных документа уже перенесена в УПП:
// Код загрузки в базе УПП
ПутьКФайлу = "C:\temp\transfer_data.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
// Читаем корневой элемент
ЧтениеXML.Прочитать();
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
// Считываем очередной объект метаданных
ДанныеОбъекта = ПрочитатьXML(ЧтениеXML);
Если ДанныеОбъекта <> Неопределено Тогда
// Записываем объект в базу-приемник
ДанныеОбъекта.ОбменДанными.Загрузка = Истина;
ДанныеОбъекта.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Использование свойства ОбменДанными.Загрузка = Истина позволяет отключить при записи платформенные и прикладные проверки в модулях объектов УПП, что гарантирует быструю и беспрепятственную запись переносимых документов.
---
Мы проанализировали основные технические препятствия при интеграции нетиповых метаданных в конфигурацию 1С:УПП 1.3. При возникновении ошибок компиляции всегда проверяйте контекст выполнения кода и режим запуска клиентского приложения. При работе с универсальными обработками выгрузки метаданных не пренебрегайте возможностью точечной доработки кода обработок под специфику вашей конфигурации или используйте выборочную выгрузку объектов, чтобы избежать падения системы по нехватке памяти.