Имя: Пароль:
1C
1C 7.7
v7: Выгрузка из 7.7 ПУБ
0 apostal147
 
07.02.16
20:09
С семёркой я не очень дружен, но нужно тут было поправить правила для  выгрузки из ПУБа в УПП. Выгружать нужно остатки по счёту 76АВ в разрезе счетов фактур. Но так как на этом счете субконто только контрагенты получается не очень красиво. В итоге родился кривенький алгоритм, реализованный ещё более кривенькими руками. Проблема в том, что алгоритм работает оочень медленно, но т.к. в семёрке я не особо разбираюсь, не могу понять где я накосячил. Помогите пожалуйста разобраться.
Вот такой вот код:
Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты);
Ит.ВключатьСубсчета(0,);

Ит.ВыполнитьЗапрос( , ДатаКонцаПериода, "76.АВ", , 1, , 5);

Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
    
    Ит.ВыбратьСубконто(1);
    Пока Ит.ПолучитьСубконто(1)=1 Цикл
        
        Контрагент = Ит.Субконто(1);
        
        Если (Ит.СКД()>0) Тогда
            
            ИтоговаяСумма = Ит.СКД();
            
            Запрос = СоздатьОбъект("Запрос");
            ТекстЗапроса =
            "//{{ЗАПРОС(ЗаписиКнигиПрод)
            |Период с ДатаНачалаРаботы по ДатаКонцаПериода;
            |ТипСчетаФактуры = Регистр.КнигаПродаж.ТекущийДокумент.СчетФактура.Тип;
            |СчетФактура = Регистр.КнигаПродаж.СчетФактура;
            |СтавкаНДС = Регистр.КнигаПродаж.СтавкаНДС;
            |БазаНДС = Регистр.КнигаПродаж.БазаНДС;
            |НДС = Регистр.КнигаПродаж.НДС;
            |Покупатель = Регистр.КнигаПродаж.ТекущийДокумент.СчетФактура.Контрагент;
            |
            |Функция СуммаРубКонОст = Сумма(БазаНДС);
            |Функция СуммаНДСКонОст = Сумма(НДС);
            |
            |Группировка ТипСчетаФактуры;
            |Группировка СчетФактура Упорядочить по СчетФактура.ДатаДок;
            |Группировка СтавкаНДС без групп;
            |
            |Условие (ТипСчетаФактуры = Перечисление.ТипыСчетовФактур.Аванс);
            |Условие (Покупатель = Контрагент);
            |";
            
            Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
                Сообщить("Не удалось выполнить запрос по регистру книга продаж !");
            КонецЕсли;  
            
            ТаблицаСтавок = СоздатьОбъект("ТаблицаЗначений");
            
            Пока Запрос.Группировка("ТипСчетаФактуры") = 1  Цикл
                Если ИтоговаяСумма <= 0 Тогда
                    Прервать;
                КонецЕсли;
                Пока Запрос.Группировка("СчетФактура", -1) = 1  Цикл
                    Если ИтоговаяСумма <= 0 Тогда
                        Прервать;
                    КонецЕсли;
                    Пока Запрос.Группировка("СтавкаНДС") = 1 Цикл  
                        Если (Запрос.СуммаРубКонОст = 0) и (Запрос.СуммаНДСКонОст = 0) Тогда
                            Продолжить;
                        КонецЕсли;
                        
                        СФ = Запрос.СчетФактура;
                        Если ИтоговаяСумма <= 0 Тогда
                            Прервать;
                        КонецЕсли;
1 zenik
 
07.02.16
20:17
А зачем обращение к БИ, а потом запрос... и все это между собой никак не связано. Убрать все что до запроса, все равно все авансовые СФ в запросе получаешь.
2 apostal147
 
07.02.16
20:57
(1) Проблема в том, что мне нужны остатки. Отбирая только по запросом по СФ я не узнаю остатки.
3 zenik
 
07.02.16
23:20
Регистр "КнигаПродаж" оборотный или остатки? Если остатки, то в запрос:
|Функция РубКонОст = КонОст(БазаНДС);
|Функция НДСКонОст = КонОст(НДС);
4 apostal147
 
07.02.16
23:56
(3) не, регистр оборотный
5 vip03
 
08.02.16
06:17
1. Запрос из цикла убрать.
2. В запросе Группировка ТипСчетаФактуры зачем вообще?
6 vip03
 
08.02.16
06:20
|Период с ДатаНачалаРаботы по ДатаКонцаПериода;
            |ТипСчетаФактуры = Регистр.КнигаПродаж.ТекущийДокумент.СчетФактура.Тип;
            |СчетФактура = Регистр.КнигаПродаж.СчетФактура;
            |СтавкаНДС = Регистр.КнигаПродаж.СтавкаНДС;
            |БазаНДС = Регистр.КнигаПродаж.БазаНДС;
            |НДС = Регистр.КнигаПродаж.НДС;
            |Покупатель = Регистр.КнигаПродаж.ТекущийДокумент.СчетФактура.Контрагент;
            |
            |Функция СуммаРубКонОст = Сумма(БазаНДС);
            |Функция СуммаНДСКонОст = Сумма(НДС);
            |
            |Группировка Покупатель;
            |Группировка СчетФактура Упорядочить по СчетФактура.ДатаДок;
            |Группировка СтавкаНДС без групп;
            |
            |Условие (ТипСчетаФактуры = Перечисление.ТипыСчетовФактур.Аванс);
            |Условие (Покупатель В СпКонтрагент);
            |";

СпКонтрагент формируешь ЗапросомБИ.
7 apostal147
 
08.02.16
10:08
(6) Да, очень хорошая идея, только хранить нужно ещё сумму по контрагенту, думаю можно сделать через ТЗ
8 apostal147
 
08.02.16
20:36
(6) Спасибо, всё классно получилось!