Как перенести данные из нетиповой конфигурации в 1С:УПП 1.3 и исправить сопутствующие ошибки

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

Перенос данных из самописной или сильно измененной нетиповой конфигурации в комплексную систему, такую как 1С:Управление производственным предприятием (УПП) редакции 1.3, — задача регулярная, но нередко сопровождающаяся техническими сложностями. Стандартные инструменты, такие как обработка ВыгрузкаЗагрузкаДанныхXML.epf или выгрузка структуры метаданных для конфигурации «Конвертация данных» (обработки MD82Exp.epf / MD83Exp.epf), могут выдавать критические ошибки при работе с объемной структурой метаданных УПП.

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

---

Причина и решение ошибки «Переменная не определена (КонтекстЭДО)» в УПП

При попытке запустить универсальную обработку выгрузки/загрузки XML в базе-приемнике УПП вы можете столкнуться со следующей ошибкой компиляции:


{Справочник.ДокументыРеализацииПолномочийНалоговыхОрганов.МодульМенеджера(5,10)}: Переменная не определена (КонтекстЭДО)
    Возврат <<?>>КонтекстЭДО.ДанныеТребованияОПредставленииПоясненийКДекларацииНДС(Требование);

Выясним причину этой проблемы. Переменная КонтекстЭДО является глобальной экспортной переменной. Она объявляется в Модуле обычного приложения конфигурации УПП. Ошибка компиляции возникает по одной из следующих причин:

  1. Неверный режим запуска базы данных. Если вы запускаете УПП в режиме управляемого приложения (например, под тонким клиентом), то МодульОбычногоПриложения платформой просто игнорируется. Глобальная переменная не создается, а серверные вызовы к менеджеру справочника завершаются аварийно.
  2. Компиляция в серверном контексте. Модули менеджеров справочников компилируются в том числе на сервере 1С:Предприятия. На стороне сервера контекст обычного клиентского приложения недоступен, что делает вызов глобальной переменной ошибочным, если разработчики типового решения не обернули вызов в соответствующие директивы компиляции.
  3. Неполное или некорректное обновление конфигурации. Если правила обновления были применены частично, модули менеджеров справочников ЭДО могли обновиться, а общий модуль инициализации или модуль приложения остался старой версии.

Рассмотрим варианты устранения этой ошибки:

Вариант 1. Запуск в режиме обычного приложения. Убедитесь, что запуск информационной базы УПП в стартере 1С настроен принудительно в режиме «Толстый клиент (обычное приложение)». Для этого перейдите в настройки информационной базы в списке запуска и в поле «Режим запуска» выберите «Толстый клиент».

Вариант 2. Временная корректировка кода в конфигураторе. Если вы используете базу только в качестве приемника данных и справочники ЭДО вам в процессе переноса не требуются, можно локально обойти эту ошибку в Конфигураторе УПП. Откройте модуль менеджера справочника ДокументыРеализацииПолномочийНалоговыхОрганов и оберните проблемные строки в инструкцию препроцессора:


#Если Клиент Тогда
    Возврат КонтекстЭДО.ДанныеТребованияОПредставленииПоясненийКДекларацииНДС(Требование);
#Иначе
    Возврат Неопределено;
#КонецЕсли

Аналогичным образом поступите со второй строкой, вызывающей ошибку компиляции переменной КонтекстЭДО.

---

Решение ошибки «Значение не является значением объектного типа (ИмяТипа)» при выгрузке метаданных

При попытке подготовить структуру метаданных УПП для работы в базе «Конвертация данных 2» с помощью обработки MD82Exp.epf (или MD83Exp.epf) часто возникает ошибка:


{ВнешняяОбработка.ВыгрузкаМетаданных.МодульОбъекта(2041)}: Значение не является значением объектного типа (ИмяТипа)
    Результат = XMLТип(Тип).ИмяТипа;

Проанализируем ситуацию. Метод платформы XMLТип() предназначен для получения соответствующего типа схемы XML для переданного типа данных 1С. В конфигурациях уровня УПП или ERP присутствуют сложные универсальные реквизиты, а также объекты, использующие устаревшие типы данных, такие как ПостроительОтчета или ПостроительЗапроса. Для этих системных объектов метод XMLТип() возвращает значение Неопределено. Обработка выгрузки пытается прочитать свойство ИмяТипа у пустого значения, что приводит к падению.

Чтобы исправить этот сбой, выполните следующие шаги:

  1. Откройте обработку MD82Exp.epf (или MD83Exp.epf) в конфигураторе как внешний файл.
  2. Перейдите в модуль объекта обработки и найдите строку, содержащую вызов метода XMLТип(Тип).ИмяТипа.
  3. Модифицируйте код, добавив проверку на пустое значение (Неопределено). Измените участок кода следующим образом:

ТипXML = XMLТип(Тип);
Если ТипXML <> Неопределено Тогда
    Результат = ТипXML.ИмяТипа;
Иначе
    Результат = ""; // Предотвращаем падение программы при неопределенном типе
КонецЕсли;

После сохранения изменений обработка успешно завершит анализ структуры даже на тяжелых и нестандартных объектах метаданных УПП.

---

Сценарии переноса данных: какой метод выбрать

Рассмотрим подробнее три основных подхода к переносу документов и справочников из вашей конфигурации-источника в УПП.

Способ 1. Использование универсального обмена «Выгрузка и загрузка данных XML»

Этот метод подходит только в том случае, если структуры переносимых справочников и документов в источнике и приемнике абсолютно идентичны (совпадают имена, типы реквизитов, табличные части).

Проанализируем шаги реализации данного метода:

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

Способ 2. Выборочная выгрузка через «Конвертацию данных 2»

Если структуры объектов незначительно отличаются или вам требуется сопоставить новые данные со старыми системными справочниками УПП (например, перенести контрагентов или номенклатуру в типовые справочники приемника), оптимальным решением будет использование конфигурации «Конвертация данных 2».

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

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

Способ 3. Быстрая выгрузка через сериализацию XDTO (программный метод)

Если вам требуется перенести всего один документ и несколько справочников, а разворачивать «Конвертацию данных» нет времени, можно использовать встроенные возможности платформы по сериализации объектов в 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. При возникновении ошибок компиляции всегда проверяйте контекст выполнения кода и режим запуска клиентского приложения. При работе с универсальными обработками выгрузки метаданных не пренебрегайте возможностью точечной доработки кода обработок под специфику вашей конфигурации или используйте выборочную выгрузку объектов, чтобы избежать падения системы по нехватке памяти.

← На главную