В процессе администрирования и сопровождения баз данных на платформе 1С:Предприятие 8.3 часто возникает классическая задача: необходимо выборочно перенести документы за несколько дней из одной информационной базы в другую (например, в её копию). Подобная необходимость обычно продиктована тем, что в рабочей базе были ошибочно созданы «лишние» документы, либо копия отстает на несколько дней, и её нужно актуализировать без полной перезаписи всей базы данных.
Посмотрим на практическую ситуацию. Имеется конфигурация «Штрих-магазин 5.2» (платформа 8.3). Рабочая база активно ведется, но в ней появились ненужные документы. Есть копия этой базы, сделанная несколько дней назад. Наша задача — аккуратно перекинуть документы, созданные за последние 4 дня, из рабочей базы в эту копию, не повредив при этом существующую структуру данных и избежав дублирования справочников.
Выясним, какие инструменты лучше всего использовать для решения этой задачи, подробно разобрав каждый из них.
Это самый простой, надежный и рекомендуемый метод для баз данных с абсолютно идентичной конфигурацией. Поскольку целевая база является копией рабочей, структура их метаданных совпадает на 100%. Главное преимущество этого способа заключается в сопоставлении объектов по их уникальному идентификатору — GUID (UUID).
При использовании XML-выгрузки все ссылки на справочники (номенклатуру, контрагентов, договоры, склады), которые были созданы ранее, сопоставятся идеально. Новые элементы справочников, созданные за эти 4 дня, перенесутся автоматически вместе с документами и не продублируют уже существующие записи.
Разберем по шагам, как правильно выполнить этот процесс:
ВыгрузкаЗагрузкаДанныхXML83.epf можно найти на локальном диске по пути: .../EXE/EXTREPS/UNIREPS83/UploadToXML/Выгрузка и загрузка данных XML.epf.C:\temp\data_transfer.xml) и нажмите кнопку «Выгрузить».ВыгрузкаЗагрузкаДанныхXML83.epf в базе-копии.Полезный совет по точечной выгрузке: Если стандартного отбора по периоду недостаточно (например, нужно перенести только определенные документы конкретного автора или по одному складу), в обработке на вкладке «Дополнительные объекты для выгрузки» можно использовать режим «Добавить запросом...». Это позволит написать простой запрос на встроенном языке 1С и отобрать только строго необходимые данные.
Рассмотрим ситуацию, когда базы-источник и приемник немного различаются по релизам конфигурации (например, рабочую базу успели обновить на новый релиз, а копию еще нет). В этом случае стандартная обработка XML может выдать ошибку чтения из-за несоответствия структуры таблиц в файле метаданных.
Для таких случаев в современных конфигурациях на платформе 1С 8.3, использующих БСП (Библиотеку стандартных подсистем), предусмотрен универсальный формат обмена EnterpriseData:
Выгрузка загрузка EnterpriseData или через встроенный механизм «Синхронизация данных».Проанализируем альтернативный, более гибкий метод, который часто используют программисты для кастомного или высокоскоростного переноса данных. Платформа 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/Наименованию в базе-приемнике) и принудительно вызывать метод Записать(РежимЗаписиДокумента.Проведение) для проведения созданных документов.
Если вам не хочется работать с промежуточными файлами (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-подключение.