gifts2017

Перенос регистра бухгалтерии между идентичными базами используя xml-сериализацию

Опубликовал Николай Зайков (Mortiferus) в раздел Обработки - Обработка документов

Приводится пример использования xml-сериализации для переноса данных (в частности, записей регистра бухгалтерии) между идентичными базами, использование которого позволяет добиться очень компактного и "понятного" кода.

Недавно случилась следующая ситуация. У бухгалтера оказались "не те" бухгалтерские проводки, которые были ранее (неделей, месяцем - уже и не вспомнить), а перепроведение документа нежелательно, поскольку документ находится в "закрытом" периоде. И таких документов с "поехавшими" проводками оказалось несколько, порядка 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.Закрыть();

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

01.png

Синхронизация всех объектов, а это сам документ, субконто проводок, счета и пр. происходят по уникальному идентификатору, поэтому нам не нужно делать каких-либо дополнительных манипуляций с их поиском - все предельно просто и однозначно, главное, чтобы базы у нас были идентичными (не только в плане идентичности конфигурации, но и самих данных, т.е. в связке копия-рабочая база, но НЕ главная-распределенная).

Напоследок скажу, что подобным образом можно переносить любые приклданые объекты конфигурации, для которых доступна xml-сериализация (пишется в справке по объекту).

02.png

Скачать файлы

Наименование Файл Версия Размер
Перенос проводок между идентичными базами 57
.epf 7,51Kb
11.07.13
57
.epf 7,51Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Крынецкий (echo77) 11.07.13 21:05
ВыгрузкаЗагрузкаДанныхXML самое то в описанной вами ситуации
KonstB; hulio; +2 Ответить 2
2. Ирли Бёрд (EarlyBird) 11.07.13 21:18
(1) echo77, с помощью ВыгрузкаЗагрузкаДанныхXML - сделает любой тупица.
Автору плюс, за то что воспользовался этой в общем-то рутинной задачей, для своего самообучения, и повысил свои знания.
3. Stamper (Stamper) 12.07.13 11:45
(2) EarlyBird, или у него не было подписки на ИТС =)
4. Konstantin Konstantin (KonstB) 16.07.13 23:15
(2) EarlyBird, автор прокачалася молодец, но зачем об этом трезвонить... Обмен опытом - это да, но обмен таким "опытом"...
Перед тем как выкладывать посмотреть в интернете что есть... 5 минут и выход на выгрузкуЗагрузкуДанныхХМЛ
5. Ирли Бёрд (EarlyBird) 17.07.13 13:14
(4) KonstB, мне кажется, ты несколько зашорен, и не желаешь выглядывать из-за своих шор.
Автор воспользовался ситуацией, чтобы узнать больше об XML-сериализации.
Теперь он постиг Дао XML-сериализации и умеет применять её в своей работе.
А ты по-прежнему продолжай копаться с ВыгрузкойЗагрузкойДанныхXML, при этом твой кругозор (и твоя стоимость как специалиста) не повышается ни на копейку.
6. Антон Рощин (wolfsoft) 17.07.13 15:32
(5) EarlyBird,
при этом твой кругозор (и твоя стоимость как специалиста) не повышается ни на копейку

Как специалист он и так уже на порядок выше, поскольку хороший специалист должен уметь пользоваться готовым инструментом, а не изобретать по каждому поводу "велосипед", занимаясь собственной "прокачкой" за счёт работодателя.
7. Ирли Бёрд (EarlyBird) 17.07.13 15:54
Как специалист он и так уже на порядок выше, поскольку хороший специалист должен уметь пользоваться готовым инструментом, а не изобретать по каждому поводу "велосипед", занимаясь собственной "прокачкой" за счёт работодателя.

«Вы, Шариков, чепуху говорите и возмутительнее всего то, что говорите её безапелляционно и уверенно.»
© М. Булгаков. Собачье сердце.
8. Konstantin Konstantin (KonstB) 17.07.13 20:07
(5) EarlyBird, пфф )))

Зашорены (или заштырены) Вы, сударь. Ибо даже не понимаете смысл мого комментария.
9. Ирли Бёрд (EarlyBird) 18.07.13 09:02
10. pavel kuzmichev (p_kuzmichev) 15.10.14 23:39
(1) echo77, Но ВыгрузкаЗагрузкаДанныхXML не выгружает корректно бухгалтерские справки. Надо будет завтра попробовать с помощью этой обработки перенести.