При работе с базами данных 1С:Предприятие часто возникает необходимость перенести данные из одной информационной базы (например, тестовой копии) в другую (рабочую базу). Если перенос простых справочников обычно не вызывает трудностей, то перенос табличных частей сложных документов, таких как «Формирование записей книги покупок», нередко превращается в настоящую проблему.
Попытки выгрузить строки табличной части в Excel и загрузить их обратно с помощью популярной обработки ЗагрузкаДанныхИзТабличногоДокумента_УФ часто заканчиваются неудачей. Поля со ссылками на документы-основания, счета-фактуры или платежно-расчетные документы остаются пустыми. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные способы решения этой задачи.
Для того чтобы понять, почему стандартная загрузка из табличного документа пасует перед этой задачей, давайте проанализируем структуру данных документа ФормированиеЗаписейКнигиПокупок. В его табличной части (обычно она называется Ценности) реквизиты, отвечающие за документы-основания (например, ДокументОснование, СчетФактура), имеют составной тип данных.
Составной тип означает, что в одной и той же ячейке может храниться ссылка на совершенно разные типы объектов метаданных: это может быть ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.СчетФактураПолученный, ДокументСсылка.АвансовыйОтчет или даже ДокументСсылка.ОтражениеНДСКВычету.
Когда мы выгружаем эту таблицу в Excel, все сложные типы преобразуются в обычные текстовые строки. Например, ссылка на документ превращается в строку вида «Поступление (акт, накладная, УПД) № 125 от 10.02.2026 12:00:00». При последующей обратной загрузке обработка считывает эту строку и пытается сопоставить ее с объектами в базе данных. Но поскольку тип данных составной, система не знает, в какой именно таблице искать этот документ. Без жесткого указания типа и детальной настройки правил поиска сопоставить текстовое представление с реальным объектом в базе практически невозможно.
Наиболее надежным и быстрым способом точечного переноса документов вместе с их табличными частями и сохранением всех внутренних связей является использование стандартной обработки «Выгрузка и загрузка данных XML» (ВыгрузкаЗагрузкаДанныхXML.epf). Этот инструмент переносит данные в формате XML, сохраняя уникальные идентификаторы (GUID) объектов, что гарантирует абсолютную точность сопоставления.
Многие пользователи опасаются применять эту обработку, думая, что она выгрузит из базы абсолютно все документы выбранного типа. Разберем по шагам, как настроить выгрузку только для одного конкретного документа:
ВыгрузкаЗагрузкаДанныхXML.epf в базе-источнике (копии базы).Формирование записей книги покупок и отметьте его галочкой.Ссылка, вид сравнения установите в значение Равно, а в качестве значения укажите тот самый конкретный документ, табличную часть которого нужно перенести.Этот метод гарантирует, что документ перенесется в целостности, а все его сложные составные ссылки будут указывать на правильные объекты в целевой базе.
Если ваша рабочая база и копия были созданы из одного источника и не претерпевали изменений, которые могли бы нарушить уникальные идентификаторы (GUID) документов, можно воспользоваться стандартным функционалом платформы 1С:Предприятие 8.3.
В современных управляемых формах реализован механизм прямого копирования строк табличных частей через буфер обмена:
Формирование записей книги покупок.Важное предостережение: Данный метод безупречно работает только тогда, когда переносимые ссылочные объекты (документы-основания) в обеих базах имеют одинаковые GUID. Если документы-основания создавались в базах независимо друг от друга (например, вручную заносились в каждую базу), то при вставке строк в рабочей базе вы получите битые ссылки со знакомой всем надписью <Объект не найден...>.
Если вам требуется автоматизировать этот процесс или стандартные обработки недоступны, задачу переноса табличной части можно легко решить программным путем. Мы можем использовать встроенные механизмы сериализации платформы 1С для преобразования табличной части в текстовую строку и обратно.
Рассмотрим пример кода, который выгружает табличную часть документа в строку XML в базе-источнике:
// Шаг 1. Находим документ-источник в базе-копии
СсылкаНаДокумент = Документы.ФормированиеЗаписейКнигиПокупок.НайтиПоНомеру("0000-000001", ТекущаяДата());
Если Не СсылкаНаДокумент.Пустая() Тогда
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Сериализуем табличную часть "Ценности" в формат XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Записываем табличную часть как самостоятельный объект
ЗаписатьXML(ЗаписьXML, ДокОбъект.Ценности, "ТабличнаяЧастьКнигиПокупок");
СтрокаXML = ЗаписьXML.Закрыть();
// Полученную строку XML можно сохранить в файл или передать через буфер обмена
Сообщить("Выгрузка завершена! Скопируйте эту строку:");
Сообщить(СтрокаXML);
КонецЕсли;
Теперь рассмотрим, как прочитать эту строку XML и загрузить данные непосредственно в документ базы-приемника:
// Шаг 2. Находим документ-приемник в рабочей базе
СсылкаНаДокументПриемник = Документы.ФормированиеЗаписейКнигиПокупок.НайтиПоНомеру("0000-000001", ТекущаяДата());
Если Не СсылкаНаДокументПриемник.Пустая() Тогда
ДокОбъект = СсылкаНаДокументПриемник.ПолучитьОбъект();
// Очищаем текущую табличную часть перед заполнением
ДокОбъект.Ценности.Очистить();
// Инициализируем чтение XML из полученной строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML); // Сюда подставляем полученную ранее XML-строку
Попытка
// Читаем данные XML напрямую в табличную часть документа
ДокОбъект.Ценности.ПрочестьXML(ЧтениеXML);
// Записываем и проводим документ
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Табличная часть успешно перенесена!");
Исключение
Сообщить("Произошла ошибка при загрузке данных: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Этот способ позволяет обойтись без внешних файлов и сложных настроек сопоставления полей, используя внутренние оптимизированные механизмы платформы.
Мы проанализировали различные варианты решения проблемы и можем сделать следующие выводы:
Ctrl + C / Ctrl + V).ВыгрузкаЗагрузкаДанныхXML.epf с установленным отбором по конкретной ссылке.ЗаписатьXML() и ПрочестьXML().