Выгрузка и загрузка данных XML в 1С: скачать обработку

Дата: 06.10.2026 16:54:16
Обмен данными
XML
Перенос данных
Внешняя обработка
Проведение документов
Клиент-сервер
Программирование 1С
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

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

Скачать обработку выгрузки и загрузки данных XML (1C-Only)

Выгрузка и загрузка данных XML (1C-Only) — наша бесплатная внешняя обработка для переноса данных между базами одной конфигурации. В одном файле две формы: в тонком, веб- и толстом клиенте управляемого приложения открывается управляемая, в толстом клиенте обычного приложения (УТ 10.3, УПП, БП 2.0) — обычная. Нужна платформа 8.3.6 или новее; для платформы 8.2 есть отдельный файл с обычной формой.

Скачать обработку (EPF, 41 КБ) версия 1.1 от 09.10.2026 · для платформы 8.2 (EPF, 28 КБ)

Выгрузка и загрузка данных XML (1C-Only), управляемая форма: дерево объектов с колонкой отбора и отбор справочника по родителю, как в настройках отчёта

  • Что выгружать — дерево объектов конфигурации с флажками: справочники, документы с движениями, регистры, константы; для документов и движений — период.
  • Отбор как в отчётах для любого справочника и документа: условия по любым реквизитам, в том числе через точку — «Родитель в группе», «Организация равно», «Дата больше». Текст отбора виден в дереве.
  • Отдельные объекты: подбор конкретных документов и элементов из формы выбора; выбранная группа справочника добавляется со всем содержимым.
  • Произвольный запрос с параметрами: все ссылки из результата попадают в выгрузку, параметры запроса заполняются в таблице под текстом.
  • Объекты по ссылкам: контрагенты, номенклатура, договоры из выгружаемых документов выгружаются сами, чтобы в другой базе не появились битые ссылки.
  • Связанные регистры сведений: с валютами — курсы, с номенклатурой — цены и другие записи, где выбранный объект в ведущем или первом измерении.
  • Загрузка в режиме обмена данными — без проверок, проведения и подписок; предопределённые элементы сопоставляются по имени, загрузку можно выполнить одной транзакцией.

Та же обработка в обычной форме для толстого клиента: закладки объектов, отдельные объекты и запрос, отбор вида под деревом

Как подключить: сохраните файл, в 1С откройте Файл → Открыть (Ctrl+O) и выберите .epf — форма выберется сама по режиму запуска. Нужно право на интерактивное открытие внешних обработок; при включённой защите от опасных действий подтвердите открытие. Загрузка пишет данные в базу без проверок, поэтому перед загрузкой сделайте копию базы-приёмника.

Где встречается задача

  • Справочники — номенклатуру, контрагентов, договоры — подготовили в копии базы, и их нужно перенести в рабочую, не трогая остальное.
  • Документы за период удалили или испортили групповой обработкой, и их надо вернуть из резервной копии.
  • Пока рабочая база была недоступна, пользователи вводили документы в её копии.
  • Программисту нужен небольшой срез реальных данных в чистой базе для отладки.

Ограничение одно, но жёсткое: базы должны быть однородными. По методической поддержке 1С конфигурации должны быть идентичны (данные могут различаться) или выгружаемые объекты — практически полностью совпадать по составу и типам реквизитов. Перенос из УТ в Бухгалтерию или из УТ 10.3 в УТ 11 — задача для синхронизации и правил конвертации, см. способы обмена данными между базами. А если данные приходят таблицей, а не из другой базы 1С, нужна загрузка из Excel.

Где взять обработку «Выгрузка и загрузка данных XML»

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). В типовых на БСП у пользователя должна быть роль «Интерактивное открытие внешних отчетов и обработок» или полные права, а при включённой защите от опасных действий платформа попросит подтверждение. Сам перенос делайте под пользователем с полными правами.

Выгрузка из 1С в XML: что выбрать в обработке

На закладке выгрузки — дерево объектов конфигурации с двумя колонками флажков:

  • «Выгружать» — в файл идут все объекты отмеченного вида. Для данных с датой задаётся период.
  • «Выгружать при необходимости» — объект попадёт в файл, только если на него ссылаются выгружаемые данные. С документами так уезжают контрагенты, номенклатура, склады и документы-основания, поэтому файл часто выходит больше ожидаемого.

Обработка умеет писать файл в двоичном формате FastInfoSet (он компактнее, но в блокноте его уже не посмотришь) и проверяет объекты на символы, недопустимые в XML. От сообщения обмена по плану обмена файл отличается заголовком, поэтому загружают его этой же обработкой.

Отдельно проверьте, попали ли в файл движения. Документ, загруженный без своих наборов записей, в приёмнике останется с признаком «Проведен», а в регистрах по нему будет пусто — остатки и взаиморасчёты разойдутся с источником.

Загрузка данных XML: что делает ОбменДанными.Загрузка

Загрузка читает объекты из файла и записывает их в режиме обмена данными, с ОбменДанными.Загрузка = Истина. Синтакс-помощник описывает этот режим так: при записи «будет производиться минимум проверок», поскольку данные считаются корректными. На практике это означает:

  • Объект ищется только по ссылке (GUID). Совпал идентификатор — объект в приёмнике перезаписывается целиком, со всеми реквизитами и табличными частями. Не совпал — появляется новый, даже если в приёмнике есть элемент с тем же кодом и наименованием.
  • Ссылки пишутся как есть. Не попал в файл склад — в документе будет <Объект не найден>.
  • Проведения нет. Документ сохраняет признак «Проведен» из файла, движения берутся только из файла.
  • Обработчики событий вызываются. Бизнес-логику пропускает сама конфигурация: в УТ 11.4 у документа РеализацияТоваровУслуг строка Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; стоит первой и в ПередЗаписью, и в ПриЗаписи. В своих объектах делайте так же, иначе загрузка запустит пересчёты и заполнение.
  • Регистрация для синхронизации работает. В БСП это сделано намеренно — так написано в комментарии к процедуре ЗарегистрироватьИзменениеОбъекта модуля ОбменДаннымиСобытия. Если у приёмника настроен обмен с другой базой, загруженное уйдёт туда со следующим сеансом синхронизации. Регистрацию БСП отключает дополнительное свойство ОтключитьМеханизмРегистрацииОбъектов, платформенную авторегистрацию — ОбменДанными.Получатели.АвтоЗаполнение = Ложь.

Выгрузка и загрузка XML в 1С кодом: своя обработка

Универсальная обработка не знает ваших правил: перезаписывать ли объекты, которые в приёмнике уже есть, совпадает ли релиз, что делать с документами без движений. Когда перенос нужен регулярно или выборочно, удобнее своя внешняя обработка. Листинги 1–5 — модуль объекта одной обработки, всё выполняется на сервере; листинг 6 — её форма.

Листинг 1. Выгрузка документов за период

// Модуль объекта внешней обработки, все процедуры выполняются на сервере.
// Выгружает документы одного вида за период вместе с движениями и всем,
// на что они ссылаются. Пример вызова (имя документа - из УТ 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, НаборЗаписей);
	КонецЦикла;

КонецПроцедуры

Листинг 2. Зависимые объекты — аналог «Выгружать при необходимости»

// Тот же модуль объекта. Очередь ссылок: объект пишется в файл,
// а все, на что он ссылается, встает в очередь следом.
Процедура ВыгрузитьОчередь(Контекст)

	Пока Контекст.Очередь.Количество() > 0 Цикл
		Ссылка = Контекст.Очередь[0];
		Контекст.Очередь.Удалить(0);
		Если Контекст.Выгружено.Получить(Ссылка) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Контекст.Выгружено.Вставить(Ссылка, Истина);

		Объект = Ссылка.ПолучитьОбъект();
		Если Объект = Неопределено Тогда
			Продолжить; // ссылка битая уже в источнике
		КонецЕсли;
		Если Не Контекст.ТипыДокументов.СодержитТип(ТипЗнч(Ссылка)) И Объект.Предопределенный Тогда
			Продолжить; // предопределенные элементы в приемнике уже есть
		КонецЕсли;

		ДобавитьСсылкиОбъекта(Контекст, Объект);
		Если ОчиститьНедопустимыеСимволы(Объект) > 0 Тогда // листинг 3
			ЗаписьЖурналаРегистрации("Выгрузка XML", УровеньЖурналаРегистрации.Предупреждение,
				Объект.Метаданные(), Ссылка, "Из строк вырезаны символы, недопустимые в XML");
		КонецЕсли;
		ЗаписатьXML(Контекст.ЗаписьXML, Объект);
	КонецЦикла;

КонецПроцедуры

// Ссылки из шапки и табличных частей, у справочника - еще владелец и родитель.
Процедура ДобавитьСсылкиОбъекта(Контекст, Объект)

	МетаданныеОбъекта = Объект.Метаданные();
	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
		ДобавитьВОчередь(Контекст, Объект[Реквизит.Имя]);
	КонецЦикла;
	Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
		ДобавитьСсылкиТаблицы(Контекст, Объект[ТабличнаяЧасть.Имя].Выгрузить());
	КонецЦикла;
	Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
		Если МетаданныеОбъекта.Владельцы.Количество() > 0 Тогда
			ДобавитьВОчередь(Контекст, Объект.Владелец);
		КонецЕсли;
		Если МетаданныеОбъекта.Иерархический Тогда
			ДобавитьВОчередь(Контекст, Объект.Родитель);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

// Табличная часть или набор записей, выгруженные в таблицу значений.
Процедура ДобавитьСсылкиТаблицы(Контекст, Таблица)

	Для Каждого Колонка Из Таблица.Колонки Цикл
		Для Каждого Значение Из Таблица.ВыгрузитьКолонку(Колонка.Имя) Цикл
			ДобавитьВОчередь(Контекст, Значение);
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

Процедура ДобавитьВОчередь(Контекст, Значение)

	Если Контекст.ТипыСсылок.СодержитТип(ТипЗнч(Значение))
		И ЗначениеЗаполнено(Значение)
		И Контекст.Выгружено.Получить(Значение) = Неопределено Тогда
		Контекст.Очередь.Добавить(Значение);
	КонецЕсли;

КонецПроцедуры

Листинг 3. Символы, недопустимые в XML

// Тот же модуль объекта. Вырезает из строк объекта символы, запрещенные в XML
// (обычно управляющие символы, вставленные из буфера обмена). Объект не
// записывается: чистится только копия в памяти, которая уходит в файл.
// Возвращает количество исправленных значений.
Функция ОчиститьНедопустимыеСимволы(Объект)

	Исправлено = 0;
	МетаданныеОбъекта = Объект.Метаданные();
	Если Метаданные.Справочники.Содержит(МетаданныеОбъекта)
		И МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
		Исправлено = Исправлено + ОчиститьСвойство(Объект, "Наименование");
	КонецЕсли;
	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
		Исправлено = Исправлено + ОчиститьСвойство(Объект, Реквизит.Имя);
	КонецЦикла;
	Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
		Для Каждого СтрокаТЧ Из Объект[ТабличнаяЧасть.Имя] Цикл
			Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
				Исправлено = Исправлено + ОчиститьСвойство(СтрокаТЧ, Реквизит.Имя);
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	Возврат Исправлено;

КонецФункции

// 1 - строку почистили, 0 - чистить было нечего.
Функция ОчиститьСвойство(Данные, ИмяСвойства)

	Значение = Данные[ИмяСвойства];
	Если ТипЗнч(Значение) <> Тип("Строка") Тогда
		Возврат 0;
	КонецЕсли;
	// Функция есть в платформе с 8.3.20; на старых релизах - НайтиНедопустимыеСимволыXML.
	Очищено = УдалитьНедопустимыеСимволыXML(Значение);
	Если Очищено = Значение Тогда
		Возврат 0;
	КонецЕсли;
	Данные[ИмяСвойства] = Очищено;
	Возврат 1;

КонецФункции

Листинг 4. Загрузка в режиме обмена данными

// Тот же модуль объекта. Загружает файл, созданный ВыгрузитьДокументы.
// ТолькоНовые = Истина: объекты, которые в базе уже есть, не перезаписываются,
// движения таких документов тоже пропускаются.
Функция ЗагрузитьИзФайла(ИмяФайла, ТолькоНовые = Ложь) Экспорт

	Итог = Новый Структура("Записано, Пропущено, Ошибки, Документы", 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
		|	ИСТИНА КАК Найдено
		|ИЗ
		|	" + МетаданныеДанных.ПолноеИмя() + " КАК Т
		|ГДЕ
		|	Т.Ссылка = &Ссылка");
		Запрос.УстановитьПараметр("Ссылка", Данные.Ссылка);
		Если Запрос.Выполнить().Пустой() Тогда
			Возврат Ложь;
		КонецЕсли;
		УжеБыли.Вставить(Данные.Ссылка, Истина);
		Возврат Истина;

	КонецЕсли;

	// Набор записей: смотрим на регистратора.
	ЭлементОтбора = Данные.Отбор.Найти("Регистратор");
	Возврат ЭлементОтбора <> Неопределено И УжеБыли.Получить(ЭлементОтбора.Значение) <> Неопределено;

КонецФункции

Листинг 5. После загрузки: документы без движений

// Тот же модуль объекта. Документы с признаком «Проведен», у которых после
// загрузки нет ни одной записи в регистрах: движения не попали в файл.
// ТаблицаДокументов - Итог.Документы из ЗагрузитьИзФайла.
Функция ПроведенныеБезДвижений(ТаблицаДокументов) Экспорт

	Результат = Новый Массив;
	Для Каждого СтрокаДокумента Из ТаблицаДокументов Цикл
		Если Не СтрокаДокумента.Проведен Тогда
			Продолжить;
		КонецЕсли;
		ЗаписейВсего = 0;
		Для Каждого НаборЗаписей Из СтрокаДокумента.Ссылка.ПолучитьОбъект().Движения Цикл
			НаборЗаписей.Прочитать();
			ЗаписейВсего = ЗаписейВсего + НаборЗаписей.Количество();
		КонецЦикла;
		Если ЗаписейВсего = 0 Тогда
			Результат.Добавить(СтрокаДокумента);
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

КонецФункции

// Проводит документы по возрастанию даты обычным порядком - с проверками
// и бизнес-логикой. Возвращает тексты ошибок и сообщений проверки заполнения.
Функция ПровестиПоПорядку(СтрокиДокументов) Экспорт

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

	Ошибки = Новый Массив;
	Для Каждого СтрокаДокумента Из ПоДатам Цикл
		ДокументОбъект = СтрокаДокумента.Ссылка.ПолучитьОбъект();
		Попытка
			ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
		Исключение
			Ошибки.Добавить(СтрШаблон("%1: %2", СтрокаДокумента.Ссылка, ОписаниеОшибки()));
		КонецПопытки;
		// Сообщения проверки заполнения копятся на сервере - забираем их сразу.
		Для Каждого Сообщение Из ПолучитьСообщенияПользователю(Истина) Цикл
			Ошибки.Добавить(СтрШаблон("%1: %2", СтрокаДокумента.Ссылка, Сообщение.Текст));
		КонецЦикла;
	КонецЦикла;
	Возврат Ошибки;

КонецФункции

Листинг 6. Форма: файл с компьютера пользователя

// Модуль формы этой же обработки. Реквизиты обработки: НачалоПериода,
// КонецПериода (Дата), ТолькоНовые (Булево); команды Выгрузить и Загрузить.
// Файл лежит на компьютере пользователя, а код выгрузки работает на сервере,
// поэтому файл передаем через временное хранилище (платформа 8.3.18+).

&НаКлиенте
Асинх Процедура Выгрузить(Команда)
	Адрес = ВыгрузитьНаСервере();
	Ждать ПолучитьФайлССервераАсинх(Адрес, "vygruzka.xml",
		Новый ПараметрыДиалогаПолученияФайлов("Сохранить выгрузку"));
КонецПроцедуры

&НаСервере
Функция ВыгрузитьНаСервере()
	ИмяФайла = ПолучитьИмяВременногоФайла("xml"); // временный файл на сервере
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.ВыгрузитьДокументы("ПриобретениеТоваровУслуг",
		Объект.НачалоПериода, КонецДня(Объект.КонецПериода), ИмяФайла);
	Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
	УдалитьФайлы(ИмяФайла);
	Возврат Адрес;
КонецФункции

&НаКлиенте
Асинх Процедура Загрузить(Команда)
	ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Файл выгрузки", Ложь, "Файл XML (*.xml)|*.xml");
	ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(, , , ПараметрыДиалога, УникальныйИдентификатор);
	Если ОписаниеФайла = Неопределено Или ОписаниеФайла.ПомещениеФайлаОтменено Тогда
		Возврат;
	КонецЕсли;
	ПоказатьПредупреждение(, ЗагрузитьНаСервере(ОписаниеФайла.Адрес));
КонецПроцедуры

&НаСервере
Функция ЗагрузитьНаСервере(Адрес)
	ИмяФайла = ПолучитьИмяВременногоФайла("xml");
	ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайла);
	Обработка = РеквизитФормыВЗначение("Объект");
	Попытка
		Итог = Обработка.ЗагрузитьИзФайла(ИмяФайла, Объект.ТолькоНовые);
	Исключение
		УдалитьФайлы(ИмяФайла);
		ВызватьИсключение;
	КонецПопытки;
	УдалитьФайлы(ИмяФайла);

	// Документы, пришедшие без движений, проводим заново уже в этой базе.
	Ошибки = Обработка.ПровестиПоПорядку(Обработка.ПроведенныеБезДвижений(Итог.Документы));
	Для Каждого ТекстОшибки Из Ошибки Цикл
		Итог.Ошибки.Добавить(ТекстОшибки);
	КонецЦикла;
	Для Каждого ТекстОшибки Из Итог.Ошибки Цикл
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ТекстОшибки;
		Сообщение.Сообщить();
	КонецЦикла;
	Возврат СтрШаблон("Записано: %1, пропущено: %2, ошибок: %3",
		Итог.Записано, Итог.Пропущено, Итог.Ошибки.Количество());
КонецФункции

Битые ссылки после переноса удобно искать запросом. Пример для поступлений УТ 11 можно выполнить в консоли запросов, подставив свои документ и реквизит:

// Битые ссылки после загрузки: номенклатура в строках поступлений,
// которой нет в справочнике (УТ 11). Параметры: НачалоПериода, КонецПериода.
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Товары.Ссылка КАК Поступление,
	Товары.Номенклатура КАК БитаяСсылка
ИЗ
	Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
		ПО Товары.Номенклатура = Номенклатура.Ссылка
ГДЕ
	Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	И Товары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
	И Номенклатура.Ссылка ЕСТЬ NULL

Разбор ключевых строк

  • ТипыСсылок — какие ссылки тянуть за собой. Перечисления не нужны — их значения хранятся в конфигурации; планы видов расчёта при необходимости добавьте так же. Узлы планов обмена не переносим: у каждой базы они свои.
  • Выгружено — соответствие «ссылка → уже записана». Без него элемент, на который ссылаются сто документов, попал бы в файл сто раз, а взаимные ссылки зациклили бы выгрузку.
  • Объект.Предопределенный — предопределённые элементы пропускаем: в базе-копии они уже есть с теми же идентификаторами. У документов такого свойства нет, поэтому сначала проверяется тип ссылки.
  • НаборЗаписей.Выгрузить() — ссылки собираются и из движений. В УТ 11 записи регистров ссылаются на объекты, которых нет в шапке документа: например, РегистрНакопления.СебестоимостьТоваров хранит ключ аналитики из справочника КлючиАналитикиУчетаНоменклатуры.
  • Атрибуты config и version корневого элемента — простая защита: загрузка остановится, если имя или версия конфигурации не совпали. Если состав объектов точно одинаковый, проверку можно ослабить.
  • ВозможностьЧтенияXML и Пропустить() — элемент неизвестного типа пропускается целиком. Ошибка ПрочитатьXML, наоборот, останавливает загрузку: позиция чтения после неё не определена.
  • ТолькоНовые — существование объекта проверяется запросом по полному имени таблицы. Пропущенный документ запоминается, и его наборы записей тоже не пишутся.
  • ПровестиПоПорядку — обычное проведение со всеми проверками. Сообщения проверки заполнения забираются через ПолучитьСообщенияПользователю(Истина) сразу после каждого документа — так видно, к какому они относятся.
  • В форме файл всегда идёт через временное хранилище: в клиент-серверном варианте путь с компьютера пользователя на сервере не существует. Методы ПолучитьФайлССервераАсинх и ПоместитьФайлНаСерверАсинх есть в платформе с 8.3.18.

Типичные ошибки

  • «Ошибка преобразования данных XDTO» при загрузке. В том же тексте — строка «Чтение объекта типа: …CatalogObject.Номенклатура» и свойство, на котором споткнулось чтение («Неизвестное свойство», «Свойство '…' не обнаружено»). Базы различаются по метаданным: другой релиз, доработка или расширение, которого нет в приёмнике. Помогает только выравнивание: тот же релиз и те же расширения.
  • <Объект не найден> в реквизитах. Связанные объекты не попали в файл: не стоял флажок «Выгружать при необходимости» или своя выгрузка не собирала зависимости. Найти такие места поможет запрос выше.
  • Документы проведены, а в отчётах пусто. Движения не загружены. Перепроведите документы листингом 5 или из списка: выделить строки и выполнить «Провести» — платформа проводит их по возрастанию момента времени.
  • Дубли в справочниках: две «шт», два «Основной склад». Базы не были копиями друг друга, и у одинаковых по смыслу элементов разные GUID. По коду и наименованию обработка не сопоставляет — для независимых баз нужны правила конвертации или своя загрузка с поиском по коду.
  • «Предопределенный элемент не уникален». В файл попал предопределённый элемент из базы, созданной отдельно, и в приёмнике оказалось два элемента с одним именем предопределённых данных. Не выгружайте предопределённые (листинг 2 их пропускает), а у лишнего элемента очистите ИмяПредопределенныхДанных и замените ссылки на него.
  • Ошибка о недопустимом символе XML. В строковом реквизите оказался управляющий символ, обычно вставленный из буфера обмена. Вырезать его до записи в файл помогает листинг 3.
  • «Нарушение прав доступа!» У пользователя нет полных прав или действуют ограничения на уровне записей. Перенос делают под администратором.
  • Загруженное «уехало» в другую базу. В приёмнике настроена синхронизация, и БСП зарегистрировала объекты к отправке. Помогает флаг ОтключитьМеханизмРегистрацииОбъектов, как в листинге 4.

Частые вопросы

Где скачать обработку выгрузки и загрузки данных XML для 8.3?

Официально — в комплекте «Конвертации данных» редакции 2 или архивом UploadToXML.zip на ИТС. Копии с форумов в рабочей базе лучше не открывать: внешняя обработка выполняет любой код с правами того, кто её запустил.

Можно ли так перенести данные из УТ в Бухгалтерию?

Нет. Загрузка ждёт в файле ровно те типы и реквизиты, что есть в базе-приёмнике, а у УТ и БП они разные — чтение остановится на первом же несовпавшем объекте. Для разных программ есть синхронизация данных и правила конвертации, подробнее — в статье про конвертацию данных.

Чем это отличается от выгрузки базы в файл .dt?

Файл .dt — вся информационная база: конфигурация, данные, пользователи. Его выгружают и загружают в конфигураторе, в меню «Администрирование», и загрузка полностью заменяет базу-приёмник. XML-выгрузка переносит только отмеченные данные в существующую базу.

Перезапишет ли загрузка то, что изменили в приёмнике?

Да. Объект с тем же идентификатором заменяется целиком, правки в приёмнике пропадут. Если это нежелательно, выгружайте только нужные объекты или загружайте в режиме ТолькоНовые из листинга 4.

Когда проще заказать

Если базы разошлись по релизам или доработкам, объекты надо сопоставлять по кодам, а не по GUID, или перенос нужен регулярно, проще заказать обработку под задачу — такие работы входят в разработку отчётов и обработок 1С. Опишите базы и что нужно перенести на странице размещения задачи: оценка бесплатная, ответ в течение рабочего дня.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.