Перенос регистра бухгалтерии "Хозрасчетный" в идентичную конфигурацию

Опубликовал Сергей Степанюк (modul) в раздел Программирование - Практика программирования

Был такой случай: у клиента при реструктуризации хозрасчетного затирались все субконто.
Нужно было после реструктуризации перенести все данные из копии вручную. Проблема стала в переносе ссылок между базами, так как ссылка из одной базы после перемещения через внешнее соединение в другую базу ставала "чужой" в той базе, хоть УникальныйИдентификатор оставался одинаковый.
Решил выложить обработку, которая успешно переносит все данные регистра бухгалтерии хозрасчетного через внешнее соединение.

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

В общем, в базе, к которой подключается обработка, в модуле внешнего соединения должна быть процедура:

// Процедура в модуле внешнего соединения подключаемой базы:  
        Функция ПолучитьДанныеТаблицыОбъекта() Экспорт   
           Запрос = Новый Запрос;  
           Запрос.Текст = "ВЫБРАТЬ  
           |   *  
           |ИЗ  
           |   РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
           |ГДЕ
           |   ХозрасчетныйДвиженияССубконто.Регистратор = &Регистратор";  
           Запрос.УстановитьПараметр("Регистратор",Документы.ЗакрытиеМесяца.НайтиПоНомеру("ГД000000001",'20110731'));
           ТЗ = Запрос.Выполнить().Выгрузить();  
           ТЗ.Сортировать("Регистратор");  
           ТЗ.Колонки.Добавить("СубконтоДт1Тип");  
           ТЗ.Колонки.Добавить("СубконтоДт2Тип");  
           ТЗ.Колонки.Добавить("СубконтоДт3Тип");  
           //ТЗ.Колонки.Добавить("СубконтоДт4Тип");  
           ТЗ.Колонки.Добавить("СубконтоКт1Тип");  
           ТЗ.Колонки.Добавить("СубконтоКт2Тип");  
           ТЗ.Колонки.Добавить("СубконтоКт3Тип");  
           //ТЗ.Колонки.Добавить("СубконтоКт4Тип");     
           ТЗ.Колонки.Добавить("РегистраторСсылка");  
           ТЗ.Колонки.Добавить("СчетДтСсылка");  
           ТЗ.Колонки.Добавить("СубконтоДт1Ссылка");  
           ТЗ.Колонки.Добавить("СубконтоДт2Ссылка");  
           ТЗ.Колонки.Добавить("СубконтоДт3Ссылка");  
           //ТЗ.Колонки.Добавить("СубконтоДт4Ссылка");  
           ТЗ.Колонки.Добавить("СчетКтСсылка");  
           ТЗ.Колонки.Добавить("СубконтоКт1Ссылка");  
           ТЗ.Колонки.Добавить("СубконтоКт2Ссылка");  
           ТЗ.Колонки.Добавить("СубконтоКт3Ссылка");  
           //ТЗ.Колонки.Добавить("СубконтоКт4Ссылка");  
           ТЗ.Колонки.Добавить("ОрганизацияСсылка");  
           ТЗ.Колонки.Добавить("ВалютаДтСсылка");  
           ТЗ.Колонки.Добавить("ВалютаКтСсылка");  
           ТЗ.Колонки.Добавить("НалоговоеНазначениеДтСсылка");  
           ТЗ.Колонки.Добавить("НалоговоеНазначениеКтСсылка");
           ТЗ.Колонки.Добавить("СчетДополнительныйСсылка");  
           Для Каждого Строка Из ТЗ Цикл  
              Строка.СубконтоДт1Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоДт1);  
              Строка.СубконтоДт2Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоДт2);  
              Строка.СубконтоДт3Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоДт3);  
              //Строка.СубконтоДт4Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоДт4);  
              Строка.СубконтоКт1Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоКт1);  
              Строка.СубконтоКт2Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоКт2);  
              Строка.СубконтоКт3Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоКт3);  
              //Строка.СубконтоКт4Тип = ЗначениеВСтрокуВнутр(Строка.ВидСубконтоКт4);        
              Строка.РегистраторСсылка = ЗначениеВСтрокуВнутр(Строка.Регистратор);  
              Строка.СчетДтСсылка = ЗначениеВСтрокуВнутр(Строка.СчетДт);  
              Строка.СубконтоДт1Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоДт1);  
              Строка.СубконтоДт2Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоДт2);  
              Строка.СубконтоДт3Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоДт3);  
              //Строка.СубконтоДт4Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоДт4);  
              Строка.СчетКтСсылка = ЗначениеВСтрокуВнутр(Строка.СчетКт);  
              Строка.СубконтоКт1Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоКт1);  
              Строка.СубконтоКт2Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоКт2);  
              Строка.СубконтоКт3Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоКт3);  
              //Строка.СубконтоКт4Ссылка = ЗначениеВСтрокуВнутр(Строка.СубконтоКт4);  
              Строка.ОрганизацияСсылка = ЗначениеВСтрокуВнутр(Строка.Организация);  
              Строка.ВалютаДтСсылка = ЗначениеВСтрокуВнутр(Строка.ВалютаДт);  
              Строка.ВалютаКтСсылка = ЗначениеВСтрокуВнутр(Строка.ВалютаКт);  
              Строка.НалоговоеНазначениеДтСсылка = ЗначениеВСтрокуВнутр(Строка.НалоговоеНазначениеДт);  
              Строка.НалоговоеНазначениеКтСсылка = ЗначениеВСтрокуВнутр(Строка.НалоговоеНазначениеКт);  
              Строка.СчетДополнительныйСсылка = ЗначениеВСтрокуВнутр(Строка.СчетДополнительный);     
           КонецЦикла;  
           Возврат(ТЗ);  
        КонецФункции

Как видим в запросе стоит отбор по регистратору. Таким образом перетянутся данные только одного документа. Если убрать отбор - перетянутся все данные.

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

Перем ТекПоказатьСостояние;  
        Процедура КнопкаВыполнитьНажатие(Кнопка)  

           ПоказатьСостояние("Попытка подключения...");  
           Соединение = Новый COMObject("V82.COMConnector");   

           База = Соединение.Connect("Srvr=""server1c"";Ref=""GOR_B"";Usr=""Логин"";Pwd=""36787463""");         // Для серверной базы
         //    База = Соединение.Connect("File=""D:\Bases\GOR_B"";Usr=""Логин"";Pwd=""36787463""");  // Для файловой базы

           ПоказатьСостояние("Выполняется получение данных из удаленной базы...");  
           ТЗ = База.ПолучитьДанныеТаблицыОбъекта();   
           КолВсего = ТЗ.Количество();  
           ПоказатьСостояние("Выполняется заполнене данных на этой базе...");  

           Итератор = 1;  

           ПервыйРаз = Истина;  
           ТекРегистратор = Неопределено;  
           НаборЗаписей = Неопределено;  
           Для Каждого Выборка Из ТЗ Цикл        
              Если ЗначениеИзСтрокиВнутр(Выборка.РегистраторСсылка) <> ТекРегистратор Тогда  
                 Если ПервыйРаз Тогда  
                    ПервыйРаз = Ложь;  
                 Иначе           
                    Попытка  
                       НаборЗаписей.Записать();  
                    Исключение  
                       Сообщить("Не удалось присвоить регистратора: "+ТекРегистратор);  
                       Возврат;  
                    КонецПопытки  
                 КонецЕсли;  
                 ТекРегистратор = ЗначениеИзСтрокиВнутр(Выборка.РегистраторСсылка);  
                 НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();  
                 НаборЗаписей.Отбор.Регистратор.Установить(ТекРегистратор);
                 //НаборЗаписей.Записать();
              КонецЕсли;  
              ПоказатьСостояние("Выполняется заполнене данных "+Окр(Итератор*100 /КолВсего,6)+" %");  
              Итератор = Итератор + 1;  
              Запись = НаборЗаписей.Добавить();  
              ЗаполнитьЗначенияСвойств(Запись,Выборка);  
              Запись.Регистратор = ЗначениеИзСтрокиВнутр(Выборка.РегистраторСсылка);  
              Запись.СчетДт = ЗначениеИзСтрокиВнутр(Выборка.СчетДтСсылка);  
              Запись.СубконтоДт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт1Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт1Ссылка);  
              Запись.СубконтоДт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт2Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт2Ссылка);  
              Запись.СубконтоДт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт3Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт3Ссылка);  
              //Запись.СубконтоДт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт4Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоДт4Ссылка);  
              Запись.СчетКт = ЗначениеИзСтрокиВнутр(Выборка.СчетКтСсылка);  
              Запись.СубконтоКт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт1Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт1Ссылка);  
              Запись.СубконтоКт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт2Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт2Ссылка);  
              Запись.СубконтоКт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт3Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт3Ссылка);  
              //Запись.СубконтоКт[ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт4Тип)] = ЗначениеИзСтрокиВнутр(Выборка.СубконтоКт4Ссылка);  
              Запись.Организация = ЗначениеИзСтрокиВнутр(Выборка.ОрганизацияСсылка);  
              Запись.ВалютаДт = ЗначениеИзСтрокиВнутр(Выборка.ВалютаДтСсылка);  
              Запись.ВалютаКт = ЗначениеИзСтрокиВнутр(Выборка.ВалютаКтСсылка);
              Запись.НалоговоеНазначениеДт = ЗначениеИзСтрокиВнутр(Выборка.НалоговоеНазначениеДтСсылка);  
              Запись.НалоговоеНазначениеКт = ЗначениеИзСтрокиВнутр(Выборка.НалоговоеНазначениеКтСсылка);
              Запись.СчетДополнительный = ЗначениеИзСтрокиВнутр(Выборка.СчетДополнительныйСсылка);     
           КонецЦикла;  
           НаборЗаписей.Записать();  

        КонецПроцедуры  

        Процедура ПоказатьСостояние(Текст)  
           ТекПоказатьСостояние = Текст;  
           Состояние(Текст);  
        КонецПроцедуры  

        Процедура ОбновлениеОтображения()  
           Состояние(ТекПоказатьСостояние);  

       КонецПроцедуры

Конечно при нажатии на кнопку "Выполнить" запускается процедура "КнопкаВыполнитьНажатие".

Обработка перетяжки добавлена.

Опубликовал по своей оригинальной статье здесь: http://pro1c.org.ua/index.php?showtopic=4883

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

Наименование Файл Версия Размер
Выгрузка хозрасчетного через внешнее соединение
.epf 7,74Kb
09.08.12
27
.epf 7,74Kb 27 Скачать

См. также

Комментарии
1. Oleg Moskvichev (m_aster) 67 26.09.12 06:54 Сейчас в теме
Не открывается, ошибка хранилища!(
2. Сергей Степанюк (modul) 145 27.09.12 12:23 Сейчас в теме
Странно, попробуйте скопируйте код из текста статьи.
3. Антонина Гвоздарева (a-m-gv) 33 12.12.13 22:44 Сейчас в теме
Идея понравилась - за это плюсик.
НО выходит ошибка как и у m_asret. У меня обычная файловая база.