Недавно случилась следующая ситуация. У бухгалтера оказались "не те" бухгалтерские проводки, которые были ранее (неделей, месяцем - уже и не вспомнить), а перепроведение документа нежелательно, поскольку документ находится в "закрытом" периоде. И таких документов с "поехавшими" проводками оказалось несколько, порядка 10. Развернутый архив базы подтвердил, что да, действительно, движения по регистру бухгалтерии по этим документам отличаются в копии и рабочей базе, в копии они "правильные". Поначалу просьба бухгалтера перенести эти проводки из одной базы в другую вызвала с моей стороны поток профессиональной программистской информации, дабы он/она (бухгалтер) отстал от меня, однако задачка показалась мне интересной и я вспомнил о такой замечательной вещи, как xml-сериализация, которой как-то довольно успешно воспользовался, чтобы перенести целиком всю базу из поломанной базы (в которой при попытке обновления конфигуратора тупо происходило вылетание из конфигуратора без каких-либо сообщений в журнале) в чистую базу.
Простота кода и его компактность до того понравилась мне, что я решил поделиться полученными навыками со всеми, кто налаживает подобные обмены между базами.
Итак, все прикладные объекты в 1С имеют xml-сериализацию (почти уверен, что все), а это значит, что 1С обладает встроенными средствами для записи и (что более важно) корректного чтения этих данных с записью в базу 1С. Из названия понятно, что обмен при этом происходит посредством записи/чтения файлов типа XML. При этом процесс как записи, так и чтения банально просты.
Вот пример процедуры записи:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
ЗаписьXML.ЗаписатьАтрибут("Дата_Выгрузки", Формат(ТекущаяДата(), "ДЛФ=Д"));
ЗаписьXML.ЗаписатьКомментарий("Выгрузка проводок по документу:" + СокрЛП(Документ));
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Документ);
НаборЗаписей.Прочитать();
ЗаписатьXML(ЗаписьXML, НаборЗаписей);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
А это пример чтения (и одновременно записи данных в базу):
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.Прочитать();
Пока ЧтениеXML.Прочитать() Цикл
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
ЗагружаемыйОбъект = ПрочитатьXML(ЧтениеXML);
Попытка
ЗагружаемыйОбъект.Записать();
Исключение
Сообщить(СокрЛП(ЗагружаемыйОбъект));
КонецПопытки;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Обработка позволяет записывать бухпроводки по выбранному документу в промежуточный файл в базе источнике и загружать эти проводки из промежуточного файла в базу приемник.
Синхронизация всех объектов, а это сам документ, субконто проводок, счета и пр. происходят по уникальному идентификатору, поэтому нам не нужно делать каких-либо дополнительных манипуляций с их поиском - все предельно просто и однозначно, главное, чтобы базы у нас были идентичными (не только в плане идентичности конфигурации, но и самих данных, т.е. в связке копия-рабочая база, но НЕ главная-распределенная).
Напоследок скажу, что подобным образом можно переносить любые приклданые объекты конфигурации, для которых доступна xml-сериализация (пишется в справке по объекту).