Выгрузка и загрузка XML в 1С универсальной обработкой «Выгрузка и загрузка данных XML» — самый короткий путь перенести справочники и документы между базами одной конфигурации: из рабочей базы в копию для тестов, из резервной копии обратно в рабочую, из временной копии, где успели поработать пользователи, в основную. Ниже — где взять обработку, что означают её режимы и что на самом деле делает ОбменДанными.Загрузка, а во второй половине — код своей выгрузки и загрузки с зависимыми объектами, движениями и журналом ошибок.
Выгрузка и загрузка данных XML (1C-Only) — наша бесплатная внешняя обработка для переноса данных между базами одной конфигурации. В одном файле две формы: в тонком, веб- и толстом клиенте управляемого приложения открывается управляемая, в толстом клиенте обычного приложения (УТ 10.3, УПП, БП 2.0) — обычная. Нужна платформа 8.3.6 или новее; для платформы 8.2 есть отдельный файл с обычной формой.
Скачать обработку (EPF, 41 КБ) версия 1.1 от 09.10.2026 · для платформы 8.2 (EPF, 28 КБ)


Как подключить: сохраните файл, в 1С откройте Файл → Открыть (Ctrl+O) и выберите .epf — форма выберется сама по режиму запуска. Нужно право на интерактивное открытие внешних обработок; при включённой защите от опасных действий подтвердите открытие. Загрузка пишет данные в базу без проверок, поэтому перед загрузкой сделайте копию базы-приёмника.
Ограничение одно, но жёсткое: базы должны быть однородными. По методической поддержке 1С конфигурации должны быть идентичны (данные могут различаться) или выгружаемые объекты — практически полностью совпадать по составу и типам реквизитов. Перенос из УТ в Бухгалтерию или из УТ 10.3 в УТ 11 — задача для синхронизации и правил конвертации, см. способы обмена данными между базами. А если данные приходят таблицей, а не из другой базы 1С, нужна загрузка из Excel.
1С поставляет её в комплекте конфигурации «Конвертация данных», редакция 2. После установки шаблона КД 2 файлы лежат в каталоге шаблонов, в подкаталоге 1c\Conversion\<версия>, например 1c\Conversion\2_1_8_2. Нужен один из двух файлов:
ВыгрузкаЗагрузкаДанныхXML83.epf — для платформы 8.3;ВыгрузкаЗагрузкаДанныхXML82.epf — для 8.2, работает только в толстом клиенте (обычное приложение).На ИТС та же обработка лежит отдельным архивом UploadToXML.zip в методической поддержке для разработчиков (каталог EXE/EXTREPS/UNIREPS83/UploadToXML). Не путайте её с V8Exchan83.epf из того же комплекта: «Универсальный обмен данными в формате XML» работает по правилам конвертации и нужен как раз для разных конфигураций.
Открывают обработку командой Файл → Открыть (Ctrl+O). В типовых на БСП у пользователя должна быть роль «Интерактивное открытие внешних отчетов и обработок» или полные права, а при включённой защите от опасных действий платформа попросит подтверждение. Сам перенос делайте под пользователем с полными правами.
На закладке выгрузки — дерево объектов конфигурации с двумя колонками флажков:
Обработка умеет писать файл в двоичном формате FastInfoSet (он компактнее, но в блокноте его уже не посмотришь) и проверяет объекты на символы, недопустимые в XML. От сообщения обмена по плану обмена файл отличается заголовком, поэтому загружают его этой же обработкой.
Отдельно проверьте, попали ли в файл движения. Документ, загруженный без своих наборов записей, в приёмнике останется с признаком «Проведен», а в регистрах по нему будет пусто — остатки и взаиморасчёты разойдутся с источником.
Загрузка читает объекты из файла и записывает их в режиме обмена данными, с ОбменДанными.Загрузка = Истина. Синтакс-помощник описывает этот режим так: при записи «будет производиться минимум проверок», поскольку данные считаются корректными. На практике это означает:
<Объект не найден>.РеализацияТоваровУслуг строка Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; стоит первой и в ПередЗаписью, и в ПриЗаписи. В своих объектах делайте так же, иначе загрузка запустит пересчёты и заполнение.ЗарегистрироватьИзменениеОбъекта модуля ОбменДаннымиСобытия. Если у приёмника настроен обмен с другой базой, загруженное уйдёт туда со следующим сеансом синхронизации. Регистрацию БСП отключает дополнительное свойство ОтключитьМеханизмРегистрацииОбъектов, платформенную авторегистрацию — ОбменДанными.Получатели.АвтоЗаполнение = Ложь.Универсальная обработка не знает ваших правил: перезаписывать ли объекты, которые в приёмнике уже есть, совпадает ли релиз, что делать с документами без движений. Когда перенос нужен регулярно или выборочно, удобнее своя внешняя обработка. Листинги 1–5 — модуль объекта одной обработки, всё выполняется на сервере; листинг 6 — её форма.
// Модуль объекта внешней обработки, все процедуры выполняются на сервере.
// Выгружает документы одного вида за период вместе с движениями и всем,
// на что они ссылаются. Пример вызова (имя документа - из УТ 11):
// ВыгрузитьДокументы("ПриобретениеТоваровУслуг", НачалоМесяца(Дата), КонецДня(Дата), ИмяФайла);
Процедура ВыгрузитьДокументы(ИмяДокумента, НачалоПериода, КонецПериода, ИмяФайла) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ." + ИмяДокумента + " КАК Док
|ГДЕ
| Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|
|УПОРЯДОЧИТЬ ПО
| Док.Дата";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
СсылкиДокументов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Контекст = НовыйКонтекстВыгрузки(ИмяФайла);
Попытка
Для Каждого СсылкаДокумента Из СсылкиДокументов Цикл
Контекст.Очередь.Добавить(СсылкаДокумента);
ВыгрузитьОчередь(Контекст);
ВыгрузитьДвижения(Контекст, СсылкаДокумента);
КонецЦикла;
Контекст.ЗаписьXML.ЗаписатьКонецЭлемента();
Исключение
Контекст.ЗаписьXML.Закрыть();
ВызватьИсключение;
КонецПопытки;
Контекст.ЗаписьXML.Закрыть();
КонецПроцедуры
Функция НовыйКонтекстВыгрузки(ИмяФайла)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Data");
// По этим атрибутам загрузка проверит, что конфигурация та же.
ЗаписьXML.ЗаписатьАтрибут("config", Метаданные.Имя);
ЗаписьXML.ЗаписатьАтрибут("version", Метаданные.Версия);
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config");
// Какие ссылки тянем за собой: справочники, документы, ПВХ, планы счетов.
ТипыСсылок = Новый ОписаниеТипов(Справочники.ТипВсеСсылки(), Документы.ТипВсеСсылки().Типы());
ТипыСсылок = Новый ОписаниеТипов(ТипыСсылок, ПланыВидовХарактеристик.ТипВсеСсылки().Типы());
ТипыСсылок = Новый ОписаниеТипов(ТипыСсылок, ПланыСчетов.ТипВсеСсылки().Типы());
Контекст = Новый Структура;
Контекст.Вставить("ЗаписьXML", ЗаписьXML);
Контекст.Вставить("ТипыСсылок", ТипыСсылок);
Контекст.Вставить("ТипыДокументов", Документы.ТипВсеСсылки());
Контекст.Вставить("Очередь", Новый Массив);
Контекст.Вставить("Выгружено", Новый Соответствие); // каждый объект пишем один раз
Возврат Контекст;
КонецФункции
// Движения документа: сначала объекты, на которые ссылаются записи, потом сами наборы.
// Пустой набор тоже пишем: в приемнике он очистит старые движения документа.
Процедура ВыгрузитьДвижения(Контекст, СсылкаДокумента)
Для Каждого НаборЗаписей Из СсылкаДокумента.ПолучитьОбъект().Движения Цикл
НаборЗаписей.Прочитать();
ДобавитьСсылкиТаблицы(Контекст, НаборЗаписей.Выгрузить());
ВыгрузитьОчередь(Контекст);
ЗаписатьXML(Контекст.ЗаписьXML, НаборЗаписей);
КонецЦикла;
КонецПроцедуры
// Тот же модуль объекта. Очередь ссылок: объект пишется в файл,
// а все, на что он ссылается, встает в очередь следом.
Процедура ВыгрузитьОчередь(Контекст)
Пока Контекст.Очередь.Количество() > 0 Цикл
Ссылка = Контекст.Очередь[0];
Контекст.Очередь.Удалить(0);
Если Контекст.Выгружено.Получить(Ссылка) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Контекст.Выгружено.Вставить(Ссылка, Истина);
Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Продолжить; // ссылка битая уже в источнике
КонецЕсли;
Если Не Контекст.ТипыДокументов.СодержитТип(ТипЗнч(Ссылка)) И Объект.Предопределенный Тогда
Продолжить; // предопределенные элементы в приемнике уже есть
КонецЕсли;
ДобавитьСсылкиОбъекта(Контекст, Объект);
Если ОчиститьНедопустимыеСимволы(Объект) > 0 Тогда // листинг 3
ЗаписьЖурналаРегистрации("Выгрузка XML", УровеньЖурналаРегистрации.Предупреждение,
Объект.Метаданные(), Ссылка, "Из строк вырезаны символы, недопустимые в XML");
КонецЕсли;
ЗаписатьXML(Контекст.ЗаписьXML, Объект);
КонецЦикла;
КонецПроцедуры
// Ссылки из шапки и табличных частей, у справочника - еще владелец и родитель.
Процедура ДобавитьСсылкиОбъекта(Контекст, Объект)
МетаданныеОбъекта = Объект.Метаданные();
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
ДобавитьВОчередь(Контекст, Объект[Реквизит.Имя]);
КонецЦикла;
Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
ДобавитьСсылкиТаблицы(Контекст, Объект[ТабличнаяЧасть.Имя].Выгрузить());
КонецЦикла;
Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
Если МетаданныеОбъекта.Владельцы.Количество() > 0 Тогда
ДобавитьВОчередь(Контекст, Объект.Владелец);
КонецЕсли;
Если МетаданныеОбъекта.Иерархический Тогда
ДобавитьВОчередь(Контекст, Объект.Родитель);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Табличная часть или набор записей, выгруженные в таблицу значений.
Процедура ДобавитьСсылкиТаблицы(Контекст, Таблица)
Для Каждого Колонка Из Таблица.Колонки Цикл
Для Каждого Значение Из Таблица.ВыгрузитьКолонку(Колонка.Имя) Цикл
ДобавитьВОчередь(Контекст, Значение);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьВОчередь(Контекст, Значение)
Если Контекст.ТипыСсылок.СодержитТип(ТипЗнч(Значение))
И ЗначениеЗаполнено(Значение)
И Контекст.Выгружено.Получить(Значение) = Неопределено Тогда
Контекст.Очередь.Добавить(Значение);
КонецЕсли;
КонецПроцедуры
// Тот же модуль объекта. Вырезает из строк объекта символы, запрещенные в XML
// (обычно управляющие символы, вставленные из буфера обмена). Объект не
// записывается: чистится только копия в памяти, которая уходит в файл.
// Возвращает количество исправленных значений.
Функция ОчиститьНедопустимыеСимволы(Объект)
Исправлено = 0;
МетаданныеОбъекта = Объект.Метаданные();
Если Метаданные.Справочники.Содержит(МетаданныеОбъекта)
И МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
Исправлено = Исправлено + ОчиститьСвойство(Объект, "Наименование");
КонецЕсли;
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
Исправлено = Исправлено + ОчиститьСвойство(Объект, Реквизит.Имя);
КонецЦикла;
Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
Для Каждого СтрокаТЧ Из Объект[ТабличнаяЧасть.Имя] Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Исправлено = Исправлено + ОчиститьСвойство(СтрокаТЧ, Реквизит.Имя);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Исправлено;
КонецФункции
// 1 - строку почистили, 0 - чистить было нечего.
Функция ОчиститьСвойство(Данные, ИмяСвойства)
Значение = Данные[ИмяСвойства];
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
Возврат 0;
КонецЕсли;
// Функция есть в платформе с 8.3.20; на старых релизах - НайтиНедопустимыеСимволыXML.
Очищено = УдалитьНедопустимыеСимволыXML(Значение);
Если Очищено = Значение Тогда
Возврат 0;
КонецЕсли;
Данные[ИмяСвойства] = Очищено;
Возврат 1;
КонецФункции
// Тот же модуль объекта. Загружает файл, созданный ВыгрузитьДокументы.
// ТолькоНовые = Истина: объекты, которые в базе уже есть, не перезаписываются,
// движения таких документов тоже пропускаются.
Функция ЗагрузитьИзФайла(ИмяФайла, ТолькоНовые = Ложь) Экспорт
Итог = Новый Структура("Записано, Пропущено, Ошибки, Документы", 0, 0, Новый Массив, Новый ТаблицаЗначений);
Итог.Документы.Колонки.Добавить("Ссылка");
Итог.Документы.Колонки.Добавить("Дата");
Итог.Документы.Колонки.Добавить("Проведен");
УжеБыли = Новый Соответствие;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.ПерейтиКСодержимому(); // корневой элемент Data
Источник = СтрШаблон("%1 %2", ЧтениеXML.ПолучитьАтрибут("config"), ЧтениеXML.ПолучитьАтрибут("version"));
Приемник = СтрШаблон("%1 %2", Метаданные.Имя, Метаданные.Версия);
Если Источник <> Приемник Тогда
ЧтениеXML.Закрыть();
ВызватьИсключение СтрШаблон("Файл выгружен из «%1», а эта база - «%2»", Источник, Приемник);
КонецЕсли;
ЧтениеXML.Прочитать(); // первый объект внутри Data
Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
Если Не ВозможностьЧтенияXML(ЧтениеXML) Тогда
Итог.Ошибки.Добавить("В конфигурации нет типа " + ЧтениеXML.ЛокальноеИмя);
ЧтениеXML.Пропустить();
Продолжить;
КонецЕсли;
Попытка
Данные = ПрочитатьXML(ЧтениеXML);
Исключение
// Состав реквизитов в файле не совпал с конфигурацией: читать дальше нельзя.
ЧтениеXML.Закрыть();
ВызватьИсключение;
КонецПопытки;
Если ТолькоНовые И УжеЕстьВБазе(Данные, УжеБыли) Тогда
Итог.Пропущено = Итог.Пропущено + 1;
Продолжить;
КонецЕсли;
Данные.ОбменДанными.Загрузка = Истина; // без бизнес-логики и без проведения
Данные.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; // без авторегистрации в планах обмена
Данные.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина); // БСП
Попытка
Данные.Записать();
Исключение
Итог.Ошибки.Добавить(СтрШаблон("%1: %2", Данные, ОписаниеОшибки()));
Продолжить;
КонецПопытки;
Итог.Записано = Итог.Записано + 1;
Если Метаданные.Документы.Содержит(Данные.Метаданные()) Тогда
ЗаполнитьЗначенияСвойств(Итог.Документы.Добавить(), Данные); // Ссылка, Дата, Проведен
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Возврат Итог;
КонецФункции
// Для режима ТолькоНовые: объект уже есть в базе или это движения такого документа.
Функция УжеЕстьВБазе(Данные, УжеБыли)
МетаданныеДанных = Данные.Метаданные();
Если Метаданные.Справочники.Содержит(МетаданныеДанных)
Или Метаданные.Документы.Содержит(МетаданныеДанных)
Или Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеДанных)
Или Метаданные.ПланыСчетов.Содержит(МетаданныеДанных) Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК Найдено
|ИЗ
| " + МетаданныеДанных.ПолноеИмя() + " КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Данные.Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
Возврат Ложь;
КонецЕсли;
УжеБыли.Вставить(Данные.Ссылка, Истина);
Возврат Истина;
КонецЕсли;
// Набор записей: смотрим на регистратора.
ЭлементОтбора = Данные.Отбор.Найти("Регистратор");
Возврат ЭлементОтбора <> Неопределено И УжеБыли.Получить(ЭлементОтбора.Значение) <> Неопределено;
КонецФункции
// Тот же модуль объекта. Документы с признаком «Проведен», у которых после
// загрузки нет ни одной записи в регистрах: движения не попали в файл.
// ТаблицаДокументов - Итог.Документы из ЗагрузитьИзФайла.
Функция ПроведенныеБезДвижений(ТаблицаДокументов) Экспорт
Результат = Новый Массив;
Для Каждого СтрокаДокумента Из ТаблицаДокументов Цикл
Если Не СтрокаДокумента.Проведен Тогда
Продолжить;
КонецЕсли;
ЗаписейВсего = 0;
Для Каждого НаборЗаписей Из СтрокаДокумента.Ссылка.ПолучитьОбъект().Движения Цикл
НаборЗаписей.Прочитать();
ЗаписейВсего = ЗаписейВсего + НаборЗаписей.Количество();
КонецЦикла;
Если ЗаписейВсего = 0 Тогда
Результат.Добавить(СтрокаДокумента);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Проводит документы по возрастанию даты обычным порядком - с проверками
// и бизнес-логикой. Возвращает тексты ошибок и сообщений проверки заполнения.
Функция ПровестиПоПорядку(СтрокиДокументов) Экспорт
ПоДатам = Новый ТаблицаЗначений;
ПоДатам.Колонки.Добавить("Ссылка");
ПоДатам.Колонки.Добавить("Дата");
Для Каждого СтрокаДокумента Из СтрокиДокументов Цикл
ЗаполнитьЗначенияСвойств(ПоДатам.Добавить(), СтрокаДокумента);
КонецЦикла;
ПоДатам.Сортировать("Дата");
Ошибки = Новый Массив;
Для Каждого СтрокаДокумента Из ПоДатам Цикл
ДокументОбъект = СтрокаДокумента.Ссылка.ПолучитьОбъект();
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Ошибки.Добавить(СтрШаблон("%1: %2", СтрокаДокумента.Ссылка, ОписаниеОшибки()));
КонецПопытки;
// Сообщения проверки заполнения копятся на сервере - забираем их сразу.
Для Каждого Сообщение Из ПолучитьСообщенияПользователю(Истина) Цикл
Ошибки.Добавить(СтрШаблон("%1: %2", СтрокаДокумента.Ссылка, Сообщение.Текст));
КонецЦикла;
КонецЦикла;
Возврат Ошибки;
КонецФункции
// Модуль формы этой же обработки. Реквизиты обработки: НачалоПериода,
// КонецПериода (Дата), ТолькоНовые (Булево); команды Выгрузить и Загрузить.
// Файл лежит на компьютере пользователя, а код выгрузки работает на сервере,
// поэтому файл передаем через временное хранилище (платформа 8.3.18+).
&НаКлиенте
Асинх Процедура Выгрузить(Команда)
Адрес = ВыгрузитьНаСервере();
Ждать ПолучитьФайлССервераАсинх(Адрес, "vygruzka.xml",
Новый ПараметрыДиалогаПолученияФайлов("Сохранить выгрузку"));
КонецПроцедуры
&НаСервере
Функция ВыгрузитьНаСервере()
ИмяФайла = ПолучитьИмяВременногоФайла("xml"); // временный файл на сервере
Обработка = РеквизитФормыВЗначение("Объект");
Обработка.ВыгрузитьДокументы("ПриобретениеТоваровУслуг",
Объект.НачалоПериода, КонецДня(Объект.КонецПериода), ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
&НаКлиенте
Асинх Процедура Загрузить(Команда)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Файл выгрузки", Ложь, "Файл XML (*.xml)|*.xml");
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(, , , ПараметрыДиалога, УникальныйИдентификатор);
Если ОписаниеФайла = Неопределено Или ОписаниеФайла.ПомещениеФайлаОтменено Тогда
Возврат;
КонецЕсли;
ПоказатьПредупреждение(, ЗагрузитьНаСервере(ОписаниеФайла.Адрес));
КонецПроцедуры
&НаСервере
Функция ЗагрузитьНаСервере(Адрес)
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайла);
Обработка = РеквизитФормыВЗначение("Объект");
Попытка
Итог = Обработка.ЗагрузитьИзФайла(ИмяФайла, Объект.ТолькоНовые);
Исключение
УдалитьФайлы(ИмяФайла);
ВызватьИсключение;
КонецПопытки;
УдалитьФайлы(ИмяФайла);
// Документы, пришедшие без движений, проводим заново уже в этой базе.
Ошибки = Обработка.ПровестиПоПорядку(Обработка.ПроведенныеБезДвижений(Итог.Документы));
Для Каждого ТекстОшибки Из Ошибки Цикл
Итог.Ошибки.Добавить(ТекстОшибки);
КонецЦикла;
Для Каждого ТекстОшибки Из Итог.Ошибки Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстОшибки;
Сообщение.Сообщить();
КонецЦикла;
Возврат СтрШаблон("Записано: %1, пропущено: %2, ошибок: %3",
Итог.Записано, Итог.Пропущено, Итог.Ошибки.Количество());
КонецФункции
Битые ссылки после переноса удобно искать запросом. Пример для поступлений УТ 11 можно выполнить в консоли запросов, подставив свои документ и реквизит:
// Битые ссылки после загрузки: номенклатура в строках поступлений,
// которой нет в справочнике (УТ 11). Параметры: НачалоПериода, КонецПериода.
ВЫБРАТЬ РАЗЛИЧНЫЕ
Товары.Ссылка КАК Поступление,
Товары.Номенклатура КАК БитаяСсылка
ИЗ
Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО Товары.Номенклатура = Номенклатура.Ссылка
ГДЕ
Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Товары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
И Номенклатура.Ссылка ЕСТЬ NULL
ТипыСсылок — какие ссылки тянуть за собой. Перечисления не нужны — их значения хранятся в конфигурации; планы видов расчёта при необходимости добавьте так же. Узлы планов обмена не переносим: у каждой базы они свои.Выгружено — соответствие «ссылка → уже записана». Без него элемент, на который ссылаются сто документов, попал бы в файл сто раз, а взаимные ссылки зациклили бы выгрузку.Объект.Предопределенный — предопределённые элементы пропускаем: в базе-копии они уже есть с теми же идентификаторами. У документов такого свойства нет, поэтому сначала проверяется тип ссылки.НаборЗаписей.Выгрузить() — ссылки собираются и из движений. В УТ 11 записи регистров ссылаются на объекты, которых нет в шапке документа: например, РегистрНакопления.СебестоимостьТоваров хранит ключ аналитики из справочника КлючиАналитикиУчетаНоменклатуры.config и version корневого элемента — простая защита: загрузка остановится, если имя или версия конфигурации не совпали. Если состав объектов точно одинаковый, проверку можно ослабить.ВозможностьЧтенияXML и Пропустить() — элемент неизвестного типа пропускается целиком. Ошибка ПрочитатьXML, наоборот, останавливает загрузку: позиция чтения после неё не определена.ТолькоНовые — существование объекта проверяется запросом по полному имени таблицы. Пропущенный документ запоминается, и его наборы записей тоже не пишутся.ПровестиПоПорядку — обычное проведение со всеми проверками. Сообщения проверки заполнения забираются через ПолучитьСообщенияПользователю(Истина) сразу после каждого документа — так видно, к какому они относятся.ПолучитьФайлССервераАсинх и ПоместитьФайлНаСерверАсинх есть в платформе с 8.3.18.<Объект не найден> в реквизитах. Связанные объекты не попали в файл: не стоял флажок «Выгружать при необходимости» или своя выгрузка не собирала зависимости. Найти такие места поможет запрос выше.ИмяПредопределенныхДанных и замените ссылки на него.ОтключитьМеханизмРегистрацииОбъектов, как в листинге 4.Официально — в комплекте «Конвертации данных» редакции 2 или архивом UploadToXML.zip на ИТС. Копии с форумов в рабочей базе лучше не открывать: внешняя обработка выполняет любой код с правами того, кто её запустил.
Нет. Загрузка ждёт в файле ровно те типы и реквизиты, что есть в базе-приёмнике, а у УТ и БП они разные — чтение остановится на первом же несовпавшем объекте. Для разных программ есть синхронизация данных и правила конвертации, подробнее — в статье про конвертацию данных.
Файл .dt — вся информационная база: конфигурация, данные, пользователи. Его выгружают и загружают в конфигураторе, в меню «Администрирование», и загрузка полностью заменяет базу-приёмник. XML-выгрузка переносит только отмеченные данные в существующую базу.
Да. Объект с тем же идентификатором заменяется целиком, правки в приёмнике пропадут. Если это нежелательно, выгружайте только нужные объекты или загружайте в режиме ТолькоНовые из листинга 4.
Если базы разошлись по релизам или доработкам, объекты надо сопоставлять по кодам, а не по GUID, или перенос нужен регулярно, проще заказать обработку под задачу — такие работы входят в разработку отчётов и обработок 1С. Опишите базы и что нужно перенести на странице размещения задачи: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.