Выгрузка данных из БП 1.6 в БП 2.0
При выгрузке данных из БП 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#»;
//Дополнение входящих данных пустыми таблицами
ВходящиеДанные.ОС = Новый ТаблицаЗначений;
ВходящиеДанные.НМА = Новый ТаблицаЗначений;
ВходящиеДанные.РасчетыПоНалогамИСборам = Новый ТаблицаЗначений;
ВходящиеДанные.РасчетыСПодотчетнымиЛицами = Новый ТаблицаЗначений;
ВходящиеДанные.БухСправка = Новый ТаблицаЗначений;
ВходящиеДанные.РасчетыСКонтрагентами = Новый ТаблицаЗначений;
ВходящиеДанные.РасчетыПоЗаработнойПлате = Новый ТаблицаЗначений;
ВходящиеДанные.МПЗОтгруженные = Новый ТаблицаЗначений;
ВходящиеДанные.Обороты = Новый ТаблицаЗначений;
ВходящиеДанные.ДанныеПоСФНДС = Новый ТаблицаЗначений;
ВходящиеДанные.РасходыБудущихПериодов = Новый ТаблицаЗначений;
ВходящиеДанные.МПЗРеализованныеИП = Новый ТаблицаЗначений;
ВходящиеДанные.ДопРасходыИП = Новый ТаблицаЗначений;
ВходящиеДанные.ПрочиеРасходыИП = Новый ТаблицаЗначений;
ВходящиеДанные.МПЗРеализованныеУСН = Новый ТаблицаЗначений;
ВходящиеДанные.ДопРасходыУСН = Новый ТаблицаЗначений;
ВходящиеДанные.УслугиУСН = Новый ТаблицаЗначений;
//***
ВыгрузитьПоПравилу(,, ВходящиеДанные,, «ВводНачальныхОстатковНаДату»);
КонецЕсли;
КонецЕсли;
КонецЦикла;

