Перенос документов за произвольный интервал времени между двумя одинаковыми конфигурациями платформы 1С:Предприятие 7.7 — одна из частых прикладных задач. Она возникает при разделении учета, объединении баз филиалов, восстановлении данных из архивных копий или частичном переносе торговых операций. Рассмотрим основные инструменты и механизмы, позволяющие выполнить такой обмен быстро и без потери ссылочной целостности.
Самым гибким, надежным и стандартным методом является использование конфигурации «1С:Конвертация данных» (КД) версий 2.0 / 2.1 или старых штатных утилит (CDExport.ert / CDImport.ert). Разберем по шагам, как выстроить перенос документов с помощью актуального механизма КД:
MD_V77.ert. Сохраняем структуру конфигурации в XML-файл.РасходнаяНакладная, ПоступлениеТМЦ, ПриходныйКассовыйОрдер).V77Exp.ert, выбираем файл с правилами обмена, указываем период выборки документов, отмечаем нужные виды документов и формируем результирующий XML-файл.V77Imp.ert, выбираем файл выгрузки и выполняем загрузку.Если нет возможности настраивать правила в «Конвертации данных», воспользуемся штатными обработками выгрузки и загрузки данных через текстовые файлы, поставляемыми фирмой «1С» на дисках ИТС — Export77.ert и Import77.ert.
Разберем особенности работы с ними:
Export77.ert позволяет сформировать текстовый файл обмена, содержащий шапку, табличные части документов и сопутствующие справочники.Import77.ert считывает текстовый файл, создает новые документы или обновляет уже существующие (по совпадению номера и даты).Для платформы 1С 7.7 сообществом разработчиков создано множество готовых внешних обработок, оптимизированных для переноса документов:
TranRef переносит справочную информацию, а TransDoc выгружает шапки и табличные части документов за указанный интервал с сохранением ссылочной целостности.Когда обе информационные базы находятся на одном сервере или в локальной сети, мы можем организовать перенос без создания промежуточных файлов, подключившись к базе-приемнику напрямую через COM-соединение V77.Application или V77S.Application.
Посмотрим на пример программной реализации такого переноса на встроенном языке 1С 7.7:
// Пример переноса проведенных расходных накладных за период через OLE
Процедура ПеренестиДокументыЧерезOLE()
БазаПриемник = СоздатьОбъект("V77.Application");
КаталогБазы = "C:\1C_Bases\Trade_Dest\";
ПараметрыПодключения = "/D" + СокрЛП(КаталогБазы) + " /NПеренос /P123";
Если БазаПриемник.Initialize(БазаПриемник.RMTrade, ПараметрыПодключения, "NO_SPLASH_SHOW") = 0 Тогда
Предупреждение("Не удалось подключиться к базе-приемнику!");
Возврат;
КонецЕсли;
ДокИсточник = СоздатьОбъект("Документ.РасходнаяНакладная");
ДокИсточник.ВыбратьДокументы(ДатаНачала, ДатаОкончания);
Пока ДокИсточник.ПолучитьДокумент() = 1 Цикл
// Пропускаем помеченные на удаление документы
Если ДокИсточник.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
ДокПриемник = БазаПриемник.СоздатьОбъект("Документ.РасходнаяНакладная");
// Проверяем наличие документа в приемнике по номеру и дате
Если ДокПриемник.НайтиПоНомеру(ДокИсточник.НомерДок, ДокИсточник.ДатаДок) = 0 Тогда
ДокПриемник.Новый();
ДокПриемник.НомерДок = ДокИсточник.НомерДок;
ДокПриемник.ДатаДок = ДокИсточник.ДатаДок;
КонецЕсли;
// Заполняем реквизиты шапки через сопоставление по коду
СпрКонтрПриемник = БазаПриемник.СоздатьОбъект("Справочник.Контрагенты");
Если СпрКонтрПриемник.НайтиПоКоду(ДокИсточник.Клиент.Код, 2) = 1 Тогда
ДокПриемник.Клиент = СпрКонтрПриемник.ТекущийЭлемент();
КонецЕсли;
СпрСкладПриемник = БазаПриемник.СоздатьОбъект("Справочник.Склады");
Если СпрСкладПриемник.НайтиПоКоду(ДокИсточник.Склад.Код, 2) = 1 Тогда
ДокПриемник.Склад = СпрСкладПриемник.ТекущийЭлемент();
КонецЕсли;
// Очищаем и переносим строки табличной части
ДокПриемник.УдалитьСтроки();
ДокИсточник.ВыбратьСтроки();
Пока ДокИсточник.ПолучитьСтроку() = 1 Цикл
ДокПриемник.НоваяСтрока();
СпрТМЦПриемник = БазаПриемник.СоздатьОбъект("Справочник.Номенклатура");
Если СпрТМЦПриемник.НайтиПоКоду(ДокИсточник.Товар.Код, 2) = 1 Тогда
ДокПриемник.Товар = СпрТМЦПриемник.ТекущийЭлемент();
КонецЕсли;
ДокПриемник.Количество = ДокИсточник.Количество;
ДокПриемник.Цена = ДокИсточник.Цена;
ДокПриемник.Сумма = ДокИсточник.Сумма;
КонецЦикла;
ДокПриемник.Записать();
Сообщить("Перенесен документ: " + ДокИсточник.НомерДок + " от " + ДокИсточник.ДатаДок);
КонецЦикла;
Сообщить("Перенос успешно завершен!");
КонецПроцедуры
Важное ограничение OLE: при обработке десятков тысяч документов платформа 7.7 может накапливать утечки памяти. При больших объемах данных разбиваем интервал выгрузки на несколько частей (по дням или неделям).
Конфигурация «Торговля и Склад 7.7» использует регистры оперативного учета (партии, остатки, взаиморасчеты). Чтобы избежать повреждения учетных данных и ошибок расчета себестоимости, соблюдаем следующие правила:
ПоследовательностьДокументов или групповое перепроведение в хронологическом порядке от даты самого раннего загруженного документа для корректного списания партий (FIFO/LIFO) и восстановления точки актуальности (ТА).