gifts2017

Выгрузка данных из БП 1.6 в БП 2.0

Опубликовал Максим Зудин (kasper076) в раздел Программирование - Практика программирования

При выгрузке данных  из БП 1.6 в БП 2.0 столкнулся с проблемой нехватки памяти при обработке раздела "Товары и торговая наценка (счета 41, 42)". В итоге пришлось изменить алгоритм ПВД "Остатки_Товары".
Данные выгружаются порциями по 1000 объектов, при выгрузке первой порции ТЧ очищается, а все последующие порции добавляются.

В обработчиках "Перед обработкой" ПКГС "МПЗПриобретенные" и ПКГС "ДанныеПоСФ" ПКО "ВводНачальныхОстатковНаДату" добавить строки:

Если ВходящиеДанные.Свойство("НеОчищать") Тогда

    НеОчищать = ВходящиеДанные.НеОчищать;
КонецЕсли;

В обработчике ПВД "Остатки_Товары" после строк:

ТаблицаДанных = РезультатЗапроса.СкопироватьКолонки();
ТаблицаДанныхНДС = РезультатЗапросаПоПартиямНДС.СкопироватьКолонки();
ТаблицаОрганизаций = РезультатЗапроса.Скопировать(,"Организация,СчетУчета");
ТаблицаОрганизаций.Свернуть("Организация,СчетУчета",);

Заменить весь код на:

Для Каждого СтрокаТаблицыОрганизаций ИЗ ТаблицаОрганизаций Цикл

   
ТекОрганизация      = СтрокаТаблицыОрганизаций.Организация;
   
ТекСчетУчета        = СтрокаТаблицыОрганизаций.СчетУчета;

   
ПрименениеУСН = НалоговыйУчетУСН.ПрименениеУСН(ТекОрганизация, ДатаНачала);
   
Предприниматель = ДоходыИРасходыПредпринимателя.Предприниматель(ТекОрганизация, ДатаНачала);
    Если
Предприниматель Тогда
       
УчетнаяПолитикаНеЗадана = Истина;
       
УчетнаяПолитика = ОбщегоНазначения.ПолучитьПараметрыУчетнойПолитики(ДатаНачала, УчетнаяПолитикаНеЗадана, ТекОрганизация);
        Если
УчетнаяПолитикаНеЗадана Тогда
           
ОсновнойХарактерДеятельности = Неопределено;
           
ОсновнаяНоменклатурнаяГруппа = Неопределено;
        Иначе
           
ОсновнойХарактерДеятельности = УчетнаяПолитика.ОсновнойХарактерДеятельности;
           
ОсновнаяНоменклатурнаяГруппа = УчетнаяПолитика.ОсновнаяНоменклатурнаяГруппа;
        КонецЕсли;
    КонецЕсли;

   
СтруктураОтбора = Новый Структура;
   
СтруктураОтбора.Вставить("Организация", ТекОрганизация);
   
СтруктураОтбора.Вставить("СчетУчета", ТекСчетУчета);

   
МассивДанных = РезультатЗапроса.НайтиСтроки(СтруктураОтбора);

   
//Подсчитываем количество порций

   
Количество = МассивДанных.Количество();
   
РазмерПорции      = 1000;
   
КоличествоПорций = Цел(Количество / РазмерПорции);
   
КоличествоПорцийЦел   = КоличествоПорций * РазмерПорции;

    Для
СчетчикПорций = 1 По КоличествоПорций Цикл

       
//Очищаем таблицы данных для каждой порции

       
ТаблицаДанных.Очистить();
       
ТаблицаДанныхНДС.Очистить();

       
//Вычисляем начало и конец выгружаемого диапазона

       
Начало  = РазмерПорции * (СчетчикПорций - 1) + 1;
       
Конец   = РазмерПорции * СчетчикПорций;
        Для
Н = Начало По Конец Цикл

           
НоваяСтрока = ТаблицаДанных.Добавить();
           
ЗаполнитьЗначенияСвойств(НоваяСтрока,МассивДанных.Получить(Н-1));
           
НоваяСтрока.Ключ = Н;
           
НоваяСтрока.НомерСтрокиТЧ = Н;
            Если
Предприниматель Тогда
                Если
НоваяСтрока.ХарактерДеятельности = Неопределено Тогда
                   
НоваяСтрока.ХарактерДеятельности = ОсновнойХарактерДеятельности;
                КонецЕсли;
                Если
НоваяСтрока.НоменклатурнаяГруппа = Неопределено Тогда
                   
НоваяСтрока.НоменклатурнаяГруппа = ОсновнаяНоменклатурнаяГруппа;
                КонецЕсли;
            КонецЕсли;

           
//Формируем таблицу по партиям НДС
           
Если РезультатЗапросаПоПартиямНДС.Количество() <> 0 Тогда

               
СтруктураОтбора = Новый Структура;
               
СтруктураОтбора.Вставить("Организация", ТекОрганизация);
               
СтруктураОтбора.Вставить("СчетУчета", ТекСчетУчета);
               
СтруктураОтбора.Вставить("Номенклатура", НоваяСтрока.Номенклатура);
                Если
Параметры.ВестиСуммовойУчетПоСкладамБУ Тогда
                   
СтруктураОтбора.Вставить("Склад", НоваяСтрока.Склад);
                КонецЕсли;
               
СтруктураОтбора.Вставить("Партия", НоваяСтрока.Партия);

               
МассивДанныхНДС = РезультатЗапросаПоПартиямНДС.Скопировать(СтруктураОтбора);

                Если
МассивДанныхНДС.Количество() <> 0 Тогда

                    Если
МассивДанныхНДС.Итог("Количество") = 0 Тогда
                       
Коэфф = 1;
                    Иначе
                       
Коэфф = НоваяСтрока.Количество/МассивДанныхНДС.Итог("Количество");
                    КонецЕсли;

                    Для
НС=1 По МассивДанныхНДС.Количество() Цикл
                       
НоваяСтрокаНДС = ТаблицаДанныхНДС.Добавить();
                       
ЗаполнитьЗначенияСвойств(НоваяСтрокаНДС,МассивДанныхНДС.Получить(НС-1));
                       
НоваяСтрокаНДС.Ключ = НоваяСтрока.Ключ;
                       
НоваяСтрокаНДС.НомерСтрокиТЧ = НС;
                       
НоваяСтрокаНДС.Количество = НоваяСтрокаНДС.Количество*Коэфф;
                       
НоваяСтрокаНДС.Стоимость = НоваяСтрокаНДС.Стоимость*Коэфф;
                       
НоваяСтрокаНДС.НДС = НоваяСтрокаНДС.НДС*Коэфф;
                    КонецЦикла;

                КонецЕсли;

            КонецЕсли;
        КонецЦикла;

        Если
ТаблицаДанных.Количество() <> 0 Тогда

           
ВходящиеДанные = Новый Структура("НеОчищать, Комментарий, Организация, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете, ОтражатьПоСпециальнымРегистрам, ПодразделениеОрганизации, РазделУчета, ОС, НМА, БухСправка, ДанныеПоСФ, ДанныеПоСФНДС, ДопРасходыИП, ДопРасходыУСН, МПЗОтгруженные, МПЗПриобретенные, МПЗРеализованныеИП, МПЗРеализованныеУСН, Обороты, ПрочиеРасходыИП, РасходыБудущихПериодов, РасчетыПоЗаработнойПлате, РасчетыПоНалогамИСборам, РасчетыСКонтрагентами, РасчетыСПодотчетнымиЛицами, УслугиУСН");

           
//Если выгружается первая порция, то очищаем ТЧ, иначе не очищаем

           
Если СчетчикПорций = 1 Тогда
               
ВходящиеДанные.НеОчищать = Ложь;
            Иначе
               
ВходящиеДанные.НеОчищать = Истина;
            КонецЕсли;
           
ВходящиеДанные.Организация                    = ТекОрганизация;
           
ВходящиеДанные.ОтражатьВБухгалтерскомУчете    = Истина;
           
ВходящиеДанные.ОтражатьВНалоговомУчете        = Истина;
           
ВходящиеДанные.ОтражатьПоСпециальнымРегистрам = Истина;
           
ВходящиеДанные.ПодразделениеОрганизации       = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
           
ВходящиеДанные.РазделУчета                    = Перечисления.РазделыУчетаДляВводаОстатков[РазделУчета];
           
ВходящиеДанные.МПЗПриобретенные               = ТаблицаДанных;
           
ВходящиеДанные.ДанныеПоСФ                     = ТаблицаДанныхНДС;
           
ВходящиеДанные.Комментарий                    = "#Счет учета: """ + Строка(ТекСчетУчета) + """# #Раздел учета """ + Строка(Перечисления.РазделыУчетаДляВводаОстатков[РазделУчета]) + """# #Перенесено из 1С:Бухгалтерии 8, ред. 1.6#";

           
//Дополнение входящих данных пустыми таблицами
           
ВходящиеДанные.ОС                           = Новый ТаблицаЗначений;
           
ВходящиеДанные.НМА                          = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыПоНалогамИСборам      = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыСПодотчетнымиЛицами   = Новый ТаблицаЗначений;
           
ВходящиеДанные.БухСправка                   = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыСКонтрагентами        = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыПоЗаработнойПлате     = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗОтгруженные               = Новый ТаблицаЗначений;
           
ВходящиеДанные.Обороты                      = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДанныеПоСФНДС                = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасходыБудущихПериодов       = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗРеализованныеИП           = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДопРасходыИП                 = Новый ТаблицаЗначений;
           
ВходящиеДанные.ПрочиеРасходыИП              = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗРеализованныеУСН          = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДопРасходыУСН                = Новый ТаблицаЗначений;
           
ВходящиеДанные.УслугиУСН                    = Новый ТаблицаЗначений;
           
//***

           
ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ВводНачальныхОстатковНаДату");

        КонецЕсли;

    КонецЦикла;
   
//Если осталась последняя неполная порция то выгружаем ее
   
Если КоличествоПорцийЦел < Количество Тогда

       
//Очищаем таблицы данных

       
ТаблицаДанных.Очистить();
       
ТаблицаДанныхНДС.Очистить();

       
//Вычисляем начало и конец выгружаемого диапазона

       
Начало  = КоличествоПорций * РазмерПорции + 1;
       
Конец   = Количество;

        Для
Н = Начало По Конец Цикл

           
НоваяСтрока = ТаблицаДанных.Добавить();
           
ЗаполнитьЗначенияСвойств(НоваяСтрока,МассивДанных.Получить(Н-1));
           
НоваяСтрока.Ключ = Н;
           
НоваяСтрока.НомерСтрокиТЧ = Н;
            Если
Предприниматель Тогда
                Если
НоваяСтрока.ХарактерДеятельности = Неопределено Тогда
                   
НоваяСтрока.ХарактерДеятельности = ОсновнойХарактерДеятельности;
                КонецЕсли;
                Если
НоваяСтрока.НоменклатурнаяГруппа = Неопределено Тогда
                   
НоваяСтрока.НоменклатурнаяГруппа = ОсновнаяНоменклатурнаяГруппа;
                КонецЕсли;
            КонецЕсли;

           
//Формируем таблицу по партиям НДС
           
Если РезультатЗапросаПоПартиямНДС.Количество() <> 0 Тогда

               
СтруктураОтбора = Новый Структура;
               
СтруктураОтбора.Вставить("Организация", ТекОрганизация);
               
СтруктураОтбора.Вставить("СчетУчета", ТекСчетУчета);
               
СтруктураОтбора.Вставить("Номенклатура", НоваяСтрока.Номенклатура);
                Если
Параметры.ВестиСуммовойУчетПоСкладамБУ Тогда
                   
СтруктураОтбора.Вставить("Склад", НоваяСтрока.Склад);
                КонецЕсли;
               
СтруктураОтбора.Вставить("Партия", НоваяСтрока.Партия);

               
МассивДанныхНДС = РезультатЗапросаПоПартиямНДС.Скопировать(СтруктураОтбора);

                Если
МассивДанныхНДС.Количество() <> 0 Тогда

                    Если
МассивДанныхНДС.Итог("Количество") = 0 Тогда
                       
Коэфф = 1;
                    Иначе
                       
Коэфф = НоваяСтрока.Количество/МассивДанныхНДС.Итог("Количество");
                    КонецЕсли;

                    Для
НС=1 По МассивДанныхНДС.Количество() Цикл
                       
НоваяСтрокаНДС = ТаблицаДанныхНДС.Добавить();
                       
ЗаполнитьЗначенияСвойств(НоваяСтрокаНДС,МассивДанныхНДС.Получить(НС-1));
                       
НоваяСтрокаНДС.Ключ = НоваяСтрока.Ключ;
                       
НоваяСтрокаНДС.НомерСтрокиТЧ = НС;
                       
НоваяСтрокаНДС.Количество = НоваяСтрокаНДС.Количество*Коэфф;
                       
НоваяСтрокаНДС.Стоимость = НоваяСтрокаНДС.Стоимость*Коэфф;
                       
НоваяСтрокаНДС.НДС = НоваяСтрокаНДС.НДС*Коэфф;
                    КонецЦикла;

                КонецЕсли;

            КонецЕсли;
        КонецЦикла;
        Если
ТаблицаДанных.Количество() <> 0 Тогда

           
ВходящиеДанные = Новый Структура("НеОчищать, Комментарий, Организация, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете, ОтражатьПоСпециальнымРегистрам, ПодразделениеОрганизации, РазделУчета, ОС, НМА, БухСправка, ДанныеПоСФ, ДанныеПоСФНДС, ДопРасходыИП, ДопРасходыУСН, МПЗОтгруженные, МПЗПриобретенные, МПЗРеализованныеИП, МПЗРеализованныеУСН, Обороты, ПрочиеРасходыИП, РасходыБудущихПериодов, РасчетыПоЗаработнойПлате, РасчетыПоНалогамИСборам, РасчетыСКонтрагентами, РасчетыСПодотчетнымиЛицами, УслугиУСН");

           
//Если выгружается первая порция, то очищаем ТЧ, иначе не очищаем

           
Если СчетчикПорций = 1 Тогда
               
ВходящиеДанные.НеОчищать = Ложь;
            Иначе
               
ВходящиеДанные.НеОчищать = Истина;
            КонецЕсли;
           
ВходящиеДанные.НеОчищать                      = Истина;
           
ВходящиеДанные.Организация                    = ТекОрганизация;
           
ВходящиеДанные.ОтражатьВБухгалтерскомУчете    = Истина;
           
ВходящиеДанные.ОтражатьВНалоговомУчете        = Истина;
           
ВходящиеДанные.ОтражатьПоСпециальнымРегистрам = Истина;
           
ВходящиеДанные.ПодразделениеОрганизации       = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
           
ВходящиеДанные.РазделУчета                    = Перечисления.РазделыУчетаДляВводаОстатков[РазделУчета];
           
ВходящиеДанные.МПЗПриобретенные               = ТаблицаДанных;
           
ВходящиеДанные.ДанныеПоСФ                     = ТаблицаДанныхНДС;
           
ВходящиеДанные.Комментарий                    = "#Счет учета: """ + Строка(ТекСчетУчета) + """# #Раздел учета """ + Строка(Перечисления.РазделыУчетаДляВводаОстатков[РазделУчета]) + """# #Перенесено из 1С:Бухгалтерии 8, ред. 1.6#";

           
//Дополнение входящих данных пустыми таблицами
           
ВходящиеДанные.ОС                           = Новый ТаблицаЗначений;
           
ВходящиеДанные.НМА                          = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыПоНалогамИСборам      = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыСПодотчетнымиЛицами   = Новый ТаблицаЗначений;
           
ВходящиеДанные.БухСправка                   = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыСКонтрагентами        = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасчетыПоЗаработнойПлате     = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗОтгруженные               = Новый ТаблицаЗначений;
           
ВходящиеДанные.Обороты                      = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДанныеПоСФНДС                = Новый ТаблицаЗначений;
           
ВходящиеДанные.РасходыБудущихПериодов       = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗРеализованныеИП           = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДопРасходыИП                 = Новый ТаблицаЗначений;
           
ВходящиеДанные.ПрочиеРасходыИП              = Новый ТаблицаЗначений;
           
ВходящиеДанные.МПЗРеализованныеУСН          = Новый ТаблицаЗначений;
           
ВходящиеДанные.ДопРасходыУСН                = Новый ТаблицаЗначений;
           
ВходящиеДанные.УслугиУСН                    = Новый ТаблицаЗначений;
           
//***

           
ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ВводНачальныхОстатковНаДату");

        КонецЕсли;
    КонецЕсли;

КонецЦикла;

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Кузнецов (kuzev) 14.10.10 16:01
Молодец. У меня вот не только по этим счетам остатки не выгружаются, но и по остальным (ОС, 60-й и пр.). Лезть в правила и переписывать для каждого счета желания нет.
ИМХО, 1С-овцы могли бы сами догадаться, что выгрузку данных нужно делать порциями. Ведь выгрузка - она же в первую очередь актуальна для тех, у кого размер баз в десятки гигов.
2. Максим Зудин (kasper076) 14.10.10 16:35
У меня на этом проблемы тоже не закончились. Сижу правлю правила и отлаживаю загрузку теперь.
3. Klavdiya (kvp) 17.12.10 13:37
Спасибо! Помогло, была как раз эта проблема.
4. Алексей (merlindude) 01.04.11 15:34
Огромное спасибо! По аналогии дописал расчеты с контрагентами и прочие счета бух учета.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа