Как перенести табличную часть документа «Формирование записей книги покупок» между базами 1С?

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

При работе с базами данных 1С:Предприятие часто возникает необходимость перенести данные из одной информационной базы (например, тестовой копии) в другую (рабочую базу). Если перенос простых справочников обычно не вызывает трудностей, то перенос табличных частей сложных документов, таких как «Формирование записей книги покупок», нередко превращается в настоящую проблему.

Попытки выгрузить строки табличной части в Excel и загрузить их обратно с помощью популярной обработки ЗагрузкаДанныхИзТабличногоДокумента_УФ часто заканчиваются неудачей. Поля со ссылками на документы-основания, счета-фактуры или платежно-расчетные документы остаются пустыми. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные способы решения этой задачи.


Выясняем причину: почему загрузка из Excel не заполняет ссылочные поля?

Для того чтобы понять, почему стандартная загрузка из табличного документа пасует перед этой задачей, давайте проанализируем структуру данных документа ФормированиеЗаписейКнигиПокупок. В его табличной части (обычно она называется Ценности) реквизиты, отвечающие за документы-основания (например, ДокументОснование, СчетФактура), имеют составной тип данных.

Составной тип означает, что в одной и той же ячейке может храниться ссылка на совершенно разные типы объектов метаданных: это может быть ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.СчетФактураПолученный, ДокументСсылка.АвансовыйОтчет или даже ДокументСсылка.ОтражениеНДСКВычету.

Когда мы выгружаем эту таблицу в Excel, все сложные типы преобразуются в обычные текстовые строки. Например, ссылка на документ превращается в строку вида «Поступление (акт, накладная, УПД) № 125 от 10.02.2026 12:00:00». При последующей обратной загрузке обработка считывает эту строку и пытается сопоставить ее с объектами в базе данных. Но поскольку тип данных составной, система не знает, в какой именно таблице искать этот документ. Без жесткого указания типа и детальной настройки правил поиска сопоставить текстовое представление с реальным объектом в базе практически невозможно.


Решение 1: Универсальная выгрузка и загрузка данных XML

Наиболее надежным и быстрым способом точечного переноса документов вместе с их табличными частями и сохранением всех внутренних связей является использование стандартной обработки «Выгрузка и загрузка данных XML» (ВыгрузкаЗагрузкаДанныхXML.epf). Этот инструмент переносит данные в формате XML, сохраняя уникальные идентификаторы (GUID) объектов, что гарантирует абсолютную точность сопоставления.

Многие пользователи опасаются применять эту обработку, думая, что она выгрузит из базы абсолютно все документы выбранного типа. Разберем по шагам, как настроить выгрузку только для одного конкретного документа:

  1. Запустите обработку ВыгрузкаЗагрузкаДанныхXML.epf в базе-источнике (копии базы).
  2. В открывшемся окне на вкладке «Выгрузка» в списке объектов найдите документ Формирование записей книги покупок и отметьте его галочкой.
  3. Обратите внимание на колонку «Отбор» в строке выбранного документа. Кликните по ней дважды или нажмите на кнопку настройки отбора.
  4. Добавьте новое условие отбора: выберите поле Ссылка, вид сравнения установите в значение Равно, а в качестве значения укажите тот самый конкретный документ, табличную часть которого нужно перенести.
  5. В нижней части формы обратите внимание на флаг «Выгружать при необходимости». Если вы уверены, что все связанные документы (счета-фактуры, документы поступления и контрагенты) уже существуют в целевой базе и имеют такие же идентификаторы, этот флаг можно снять или настроить так, чтобы не выгружать лишние гигабайты данных. Если базы идентичны, достаточно выгрузить только сам документ.
  6. Укажите путь к файлу выгрузки на диске и нажмите кнопку «Выгрузить».
  7. Откройте обработку в базе-приемнике (рабочей базе), перейдите на вкладку «Загрузка», укажите созданный XML-файл и нажмите кнопку «Загрузить».

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


Решение 2: Использование буфера обмена (Ctrl+C / Ctrl+V) для идентичных баз

Если ваша рабочая база и копия были созданы из одного источника и не претерпевали изменений, которые могли бы нарушить уникальные идентификаторы (GUID) документов, можно воспользоваться стандартным функционалом платформы 1С:Предприятие 8.3.

В современных управляемых формах реализован механизм прямого копирования строк табличных частей через буфер обмена:

  1. Откройте нужный документ-источник в копии базы.
  2. Перейдите в табличную часть и выделите все строки. Это можно сделать, нажав комбинацию клавиш Ctrl + A, либо выделив первую строку и кликнув на последнюю с зажатой клавишей Shift.
  3. Нажмите кнопку «Скопировать строки» на панели инструментов табличной части (или воспользуйтесь стандартным сочетанием клавиш Ctrl + C). Строки со всеми скрытыми идентификаторами объектов скопируются в буфер обмена 1С.
  4. Откройте рабочую базу, найдите или создайте аналогичный документ Формирование записей книги покупок.
  5. Очистите его табличную часть, активируйте ее кликом мыши и нажмите кнопку «Вставить строки» (или сочетание клавиш Ctrl + V).

Важное предостережение: Данный метод безупречно работает только тогда, когда переносимые ссылочные объекты (документы-основания) в обеих базах имеют одинаковые GUID. Если документы-основания создавались в базах независимо друг от друга (например, вручную заносились в каждую базу), то при вставке строк в рабочей базе вы получите битые ссылки со знакомой всем надписью <Объект не найден...>.


Решение 3: Перенос данных с помощью кода (для разработчиков)

Если вам требуется автоматизировать этот процесс или стандартные обработки недоступны, задачу переноса табличной части можно легко решить программным путем. Мы можем использовать встроенные механизмы сериализации платформы 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);
        
        // Записываем и проводим документ
        ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Табличная часть успешно перенесена!");
    Исключение
        Сообщить("Произошла ошибка при загрузке данных: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Этот способ позволяет обойтись без внешних файлов и сложных настроек сопоставления полей, используя внутренние оптимизированные механизмы платформы.


Резюме и рекомендации

Мы проанализировали различные варианты решения проблемы и можем сделать следующие выводы:

← На главную