gifts2017

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

Опубликовал Сергей Степанюк (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) 26.09.12 06:54
Не открывается, ошибка хранилища!(
2. Сергей Степанюк (modul) 27.09.12 12:23
Странно, попробуйте скопируйте код из текста статьи.
3. Антонина Гвоздарева (a-m-gv) 12.12.13 22:44
Идея понравилась - за это плюсик.
НО выходит ошибка как и у m_asret. У меня обычная файловая база.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа