Как перенести документы из одной базы 1С в её копию за определенный период

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Посмотрим на практическую ситуацию. Имеется конфигурация «Штрих-магазин 5.2» (платформа 8.3). Рабочая база активно ведется, но в ней появились ненужные документы. Есть копия этой базы, сделанная несколько дней назад. Наша задача — аккуратно перекинуть документы, созданные за последние 4 дня, из рабочей базы в эту копию, не повредив при этом существующую структуру данных и избежав дублирования справочников.

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

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

Это самый простой, надежный и рекомендуемый метод для баз данных с абсолютно идентичной конфигурацией. Поскольку целевая база является копией рабочей, структура их метаданных совпадает на 100%. Главное преимущество этого способа заключается в сопоставлении объектов по их уникальному идентификатору — GUID (UUID).

При использовании XML-выгрузки все ссылки на справочники (номенклатуру, контрагентов, договоры, склады), которые были созданы ранее, сопоставятся идеально. Новые элементы справочников, созданные за эти 4 дня, перенесутся автоматически вместе с документами и не продублируют уже существующие записи.

Разберем по шагам, как правильно выполнить этот процесс:

  1. Где найти обработку: Данная обработка не встроена в саму конфигурацию по умолчанию, но она является официальным инструментом фирмы 1С. Её можно скачать на портале 1С:ИТС в разделе дополнительных материалов. Также, если у вас установлен дистрибутив конфигурации «Конвертация данных 2.1», файл обработки под названием ВыгрузкаЗагрузкаДанныхXML83.epf можно найти на локальном диске по пути: .../EXE/EXTREPS/UNIREPS83/UploadToXML/Выгрузка и загрузка данных XML.epf.
  2. Настройка выгрузки в источнике (рабочей базе):
    • Откройте обработку в рабочей базе через меню «Файл» — «Открыть».
    • В открывшемся окне на вкладке «Выгрузка» выберите типы документов, которые необходимо перенести (например, «Поступление товаров», «Реализация товаров и услуг»).
    • Настройте период выгрузки — укажите диапазон за последние 4 дня.
    • Критически важный момент: Перейдите на вкладку «Настройки выгрузки» и обязательно установите флажок «Вместе с документами выгружать их движения». Если этого не сделать, документы перенесутся в базу-приемник «непроведенными» или проведенными, но без фактических движений по регистрам накопления, сведений и бухгалтерии. Также рекомендуется отметить флаг «Выгружать сопутствующие справочники», чтобы новые элементы перенеслись корректно.
    • Укажите путь к файлу выгрузки на диске (например, C:\temp\data_transfer.xml) и нажмите кнопку «Выгрузить».
  3. Загрузка данных в приемнике (копии базы):
    • Откройте эту же обработку ВыгрузкаЗагрузкаДанныхXML83.epf в базе-копии.
    • Перейдите на вкладку «Загрузка».
    • Укажите путь к вашему созданному XML-файлу и нажмите кнопку «Загрузить данные».
    • Система автоматически сопоставит все объекты по их внутренним идентификаторам GUID и запишет документы с сохранением всех движений.

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

Способ 2. Обмен данными через формат EnterpriseData

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

Для таких случаев в современных конфигурациях на платформе 1С 8.3, использующих БСП (Библиотеку стандартных подсистем), предусмотрен универсальный формат обмена EnterpriseData:

Способ 3. Программный перенос документов через JSON

Проанализируем альтернативный, более гибкий метод, который часто используют программисты для кастомного или высокоскоростного переноса данных. Платформа 1С 8.3 поддерживает полноценную работу с форматом JSON с возможностью сериализации объектов XDTO.

Этот способ требует написания небольшого программного кода, но он работает быстрее стандартного XML и позволяет полностью контролировать процесс записи документов в базу-приемник.

Посмотрим на пример кода для выгрузки документов в JSON-файл в базе-источнике:


// Создаем объект записи JSON и открываем файл
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
ЗаписьJSON.ОткрытьФайл("C:\temp\export_documents.json", , , ПараметрыЗаписи);

ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Документы");
ЗаписьJSON.ЗаписатьНачалоМассива();

// Запрос для выборки документов за последние 4 дня
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", ТекущаяДата() - 4 * 24 * 60 * 60);
Запрос.УстановитьПараметр("КонецПериода", ТекущаяДата());

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Сериализуем объект документа через XDTO в формат JSON
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(), НазначениеТипаXML.Явное);
КонецЦикла;

ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.Закрыть();

А теперь изучим, как будет выглядеть чтение этого файла и создание документов в базе-приемнике:


// Открываем файл для чтения
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\temp\export_documents.json");

// Читаем структуру данных
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

// Пример ручного разбора или использования XDTO-сериализатора для восстановления объектов
// Обратите внимание: для полной автоматической загрузки через XDTO структуры метаданных должны совпадать

Предупреждение: Использование JSON-сериализации — это отличный инструмент оптимизации, но разработчику необходимо самостоятельно продумать алгоритм сопоставления ссылочных типов (например, поиск существующих справочников по GUID/Наименованию в базе-приемнике) и принудительно вызывать метод Записать(РежимЗаписиДокумента.Проведение) для проведения созданных документов.

Способ 4. Прямой перенос данных через COM-соединение

Если вам не хочется работать с промежуточными файлами (XML, JSON), можно настроить прямое подключение из базы-копии к рабочей базе. Этот метод реализуется программно с помощью COM-объекта.

Рассмотрим пример сценария, выполняемого непосредственно в базе-приемнике:


// Инициализируем COM-соединение с рабочей базой данных
Connector = Новый COMОбъект("V83.COMConnector");
ПутьКБазе = "Srvr=""ИмяСервера"";Ref=""ИмяРабочейБазы"";";
// Или для файловой базы: ПутьКБазе = "File=""C:\Put_K_Baze"";";

Попытка
    Connection = Connector.Connect(ПутьКБазе + "Usr=""Администратор"";Pwd=""Пароль"";");
Исключение
    Сообщить("Не удалось подключиться к рабочей базе: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Выполняем запрос в рабочей базе через COM
ЗапросВИсточнике = Connection.NewObject("Query");
ЗапросВИсточнике.Text = 
    "ВЫБРАТЬ
    |	Реализация.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК Реализация
    |ГДЕ
    |	Реализация.Дата >= &НачалоПериода";

// Задаем параметры запроса в формате базы-источника
ЗапросВИсточнике.SetParameter("НачалоПериода", ТекущаяДата() - 4 * 24 * 60 * 60);
Результат = ЗапросВИсточнике.Execute().Select();

Пока Результат.Next() Цикл
    // Здесь пишется алгоритм переноса реквизитов документа через COM-ссылку в локальную базу
    // Данный способ гарантирует точечный контроль над каждым реквизитом
КонецЦикла;

Подведем итоги

Для быстрого и безопасного решения задачи по переносу документов за 4 дня между идентичными базами лучше всего использовать стандартную обработку «Выгрузка и загрузка данных XML». Это сэкономит время, исключит появление дубликатов и сохранит все движения документов по регистрам.

Если же перед вами стоят нестандартные задачи интеграции, легкие различия в версиях конфигураций или необходимость автоматизации процесса без участия пользователя — смело используйте механизмы EnterpriseData, обмен через JSON или прямое COM-подключение.

← На главную