Имя: Пароль:
1C
1C 7.7
v7: Корсчет и корсубконто в одном бухзапросе как подружить?
0 Провинциальный 1сник
 
13.06.20
16:17
Задача: нужно из бухитогов достать информацию по оборотам счета с отбором по значению субконто, при этом конкретный корсчет нужно развернуть по корсубконто. Сделал вот так (сокращенный фрагмент), и получил следующую проблему.

Если в коде присутствует БИ.ИспользоватьКорСубконто, то в выборку корсчетов попадают только те корсчета, в которых присутствует данный вид субконто. Если же корсчет такого субконто "Номенклатура" не имеет, то и в выборку он не попадает. А нужно, чтобы выборка по корсчетам была полностью, но по одному корсчету дополнительно развернуть по корсубконто. Это возможно сделать без дополнительного запроса бухитогов?

    БИ=СоздатьОбъект("БухгалтерскиеИтоги");
    
    БИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,ВыбНоменклатура,2);
    БИ.ИспользоватьКорСубконто(ВидыСубконто.Номенклатура);
    
    БИ.ВыполнитьЗапрос(НачДата,КонДата,ВыбСчет,,,2);
        
    БИ.ВыбратьСчета();
    Пока БИ.ПолучитьСчет()=1 цикл
        Счет=БИ.Счет;
        БИ.ВыбратьКорСчета();
        Пока БИ.ПолучитьКорСчет()=1 цикл
                
            КорСчет=БИ.КорСчет;    
            
            // ...
            Если КорСчет=ВыбКорСчет Тогда
                БИ.ВыбратьКорСубконто(ВидыСубконто.Номенклатура);
                Пока БИ.ПолучитьКорСубконто(ВидыСубконто.Номенклатура)=1 цикл
            
                // ...
                
                КонецЦикла; // по корсубконто
            КонецЕсли; // корсчет с корсубконто
        КонецЦикла; // по корсчетам
    КонецЦикла; // по счетам
1 Cthulhu
 
13.06.20
18:39
.ИспользоватьКорСубконто(); // без параметров - даст корсубконто всех типов
2 Cthulhu
 
13.06.20
18:39
(1)+: аналогично - для субконто, так, на всякий случай...
3 Провинциальный 1сник
 
13.06.20
19:43
(1) Не работает так, на ВыбратьКорСубконто выдает "Число фильтров субконто превысило допустимое значение!", если ИспользоватьКорСубконто без параметров..
4 Cthulhu
 
13.06.20
21:00
(3): работает.
5 Провинциальный 1сник
 
14.06.20
07:39
(4) У меня не работает. sql-база.
6 Cthulhu
 
14.06.20
15:38
(5): работает везде, от формата данных не зависит. просто не надо делать Ит.ИспользоватьКорСубконто() больше трех раз, (или какое там у вас в конфигурации макс.кол-во субконто указано в свойствах ветки метаданных "Планы счетов").
(кстати - то же самое касается метода ИспользоватьСубконто)
7 Cthulhu
 
14.06.20
15:40
прим.: и - имейте ввиду, что если на кор.счете кол-во субконто меньше, чем в бух.запросе выполнено ".ИспользоватьКорСубконто" - данные по этому кор.счету могут вообще не попасть в результаты запроса (не уверен - надо проверять).
8 Cthulhu
 
14.06.20
19:05
слепил оборомотку на коленке. по заданным счету, фирме, периодичности ("Период"/"Операция"/"Проводка"/"День"/...) за указанный период выводит на ТЗ (на форме) все обороты в полном разрезе аналитики и кор.аналитики вне зависимости от типов субконто и корсубконто... все работает.
9 Cthulhu
 
14.06.20
19:06
(8)+* только кво и сумму (без валют и вал.сумм) - лень...
10 Провинциальный 1сник
 
14.06.20
20:22
(6) Ну вот смотрите, контрольный пример. Задача - вытащить все дебетовые обороты 20 счета, но дополнительно вывести обороты по всем субконто Номенклатура 10 счета (по материалам).

//*******************************************
Процедура Сформировать()
    БИ=СоздатьОбъект("БухгалтерскиеИтоги");
    
    БИ.ИспользоватьКорСубконто(ВидыСубконто.Номенклатура);
//    БИ.ИспользоватьКорСубконто();
    
    БИ.ВключатьСубсчета(-1,-1);
    БИ.ВыполнитьЗапрос(НачДата,КонДата,"20",,,2);
        
    БИ.ВыбратьСчета();
    Пока БИ.ПолучитьСчет()=1 цикл
        БИ.ВыбратьКорСчета();
        Пока БИ.ПолучитьКорСчет()=1 цикл
            Сообщить(""+БИ.Счет+" - "+БИ.КорСчет+" - "+БИ.КорДО("С")); // для любого корсчета выдаем дебетовые обороты с корреспондентом
            Если БИ.КорСчет.ПринадлежитГруппе(СчетПоКоду("10"))=1 Тогда
                БИ.ВыбратьКорСубконто(ВидыСубконто.Номенклатура);
                Пока БИ.ПолучитьКорСубконто(ВидыСубконто.Номенклатура)=1 цикл
                    Сообщить(""+БИ.Счет+" - "+БИ.КорСчет+" - "+БИ.КорСубконто(ВидыСубконто.Номенклатура)+БИ.КорДО("С")); // для 10 счета выдаем также субконто номенклатуру (материал)
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

КонецПроцедуры
                      
Если указать БИ.ИспользоватьКорСубконто(ВидыСубконто.Номенклатура) - то выдает только те счета в корреспонденциях, где есть субконто Номенклатура. Если как вы предлагаете БИ.ИспользоватьКорСубконто() - то на БИ.ВыбратьКорСубконто(ВидыСубконто.Номенклатура) выдает "Число фильтров субконто превысило допустимое значение!".

Как бы вы реализовали эту задачу?
11 Cthulhu
 
14.06.20
22:50
(10): извините, мне даже в голову не приходило, что в принцпе логика может отказать настолько, что в паре с .ИспользоватьСубконто() можно не догадаться по аналогии, не конкретизируя тип, использвать .ВыбратьКорСубконто() и .ПолучитьКорСубконто() - при необходимости в параметре указівать НОМЕР вызова .ИспользоватьСубконто....
голову включайте. не ленитесь.
12 Cthulhu
 
14.06.20
22:58
<1с>
// ******* ну ня тебе готовый рабочий код обработки....
// Ревизиты формы (диалога):
//    ВsбНачПериода,ВsбКонПериода - реквизиты типа "Дата"
//    ВыбСчет - реквизит типа Счет.Основной
//    ВыбФирма - реквизит типа Справочник.Фирмы (разделитель учета)
//    ВыбПериодыСЗ - Поле со списком
//    фОборотыТЗ - Таблица значений
//    Сформировать - кнопка с формулой "Сформировать()" (без кавычек)

//==============================================================================
Функция ДобавитьДанныеБухИтогов(БухИт,БухТЗ,СубКво,КорСубКво)
    БухПериод
    =ВыбПериодыСЗ.ПолучитьЗначение(Мин(ВыбПериодыСЗ.РазмерСписка(),Макс(1,ВыбПериодыСЗ.ТекущаяСтрока())));
    БухИт.ВыбратьПериоды(); Пока БухИт.ПолучитьПериод()<>0 Цикл
        //БухИт.ВыбратьВалюты(); Пока БухИт.ПолучитьВалюту()<>0 Цикл    // лееенннньььььь.....
        БухТЗ.НоваяСтрока(); кСтр=БухТЗ.КоличествоСтрок(); БухТЗ.ПолучитьСтрокуПоНомеру(кСтр);
        БухТЗ.Счет=БухИт.Счет; БухТЗ.КорСчет=БухИт.КорСчет;
        Если БухПериод="Операция" Тогда БухТЗ.Период=""+БухИт.Операция.Документ;
        ИначеЕсли БухПериод="Проводка" Тогда БухТЗ.Период
        =""+БухИт.Операция.Документ+" #"+БухИт.Операция.НомерПроводки();
        ИначеЕсли БухПериод="День" Тогда БухТЗ.Период=""+БухИт.НачДата;
        Иначе БухТЗ.Период=ПериодСтр(БухИт.НачДата,БухИт.КонДата) КонецЕсли;
        Для Сч=1 По СубКво Цикл БухТЗ.УстановитьЗначение
        (БухТЗ.НомерСтроки,"Субконто"+Сч,БухИт.Субконто(Сч)) КонецЦикла;
        Для Сч=1 По КорСубКво Цикл БухТЗ.УстановитьЗначение
        (БухТЗ.НомерСтроки,"КорСубконто"+Сч,БухИт.КорСубконто(Сч)) КонецЦикла;
        БухТЗ.СуммаДт=БухИт.ДО("С"); БухТЗ.КвоДт=БухИт.ДО("К");
        БухТЗ.СуммаКт=БухИт.КО("С"); БухТЗ.КвоКт=БухИт.КО("К");
    КонецЦикла;
КонецФункции //ДобавитьДанныеБухИтогов
//------------------------------------------------------------------------------
Функция ВыбратьПоВсемКорСубконто(БухИт,БухТЗ,СубКво,КорСубКво,СубНом,Знач КорСубНом=0)
    КорСубНом=КорСубНом+1; Если КорСубНом<=КорСубКво Тогда
        Бухит.ВыбратьКорСубконто(КорСубНом); Пока Бухит.ПолучитьКорСубконто(КорСубНом)<>0 Цикл
            ВыбратьПоВсемКорСубконто(БухИт,БухТЗ,СубКво,КорСубКво,СубНом,КорСубНом);
            Если КорСубНом=КорСубКво Тогда ДобавитьДанныеБухИтогов(БухИт,БухТЗ,СубКво,КорСубКво) КонецЕсли;
        КонецЦикла;
    ИначеЕсли КорСубКво=0 Тогда
        ДобавитьДанныеБухИтогов(БухИт,БухТЗ,СубКво,КорСубКво);
    КонецЕсли;
КонецФункции //ВыбратьПоВсемКорСубконто
//------------------------------------------------------------------------------
Функция ВыбратьПоВсемСубконто(БухИт,БухТЗ,СубКво,КорСубКво,Знач СубНом=0,Знач КорСубНом=0)
    СубНом=СубНом+1;
    Если СубНом<=СубКво Тогда
        Бухит.ВыбратьСубконто(СубНом); Пока Бухит.ПолучитьСубконто(СубНом)<>0 Цикл
            ВыбратьПоВсемСубконто(БухИт,БухТЗ,СубКво,КорСубКво,СубНом); Если СубНом=СубКво
            Тогда ВыбратьПоВсемКорСубконто(БухИт,БухТЗ,СубКво,КорСубКво,СубНом,КорСубНом) КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецФункции //ВыбратьПоВсемСубконто
//==============================================================================
Процедура Сформировать()
    МаксКвоСубконто=Метаданные.МаксимальноеКоличествоСубконто;
    СумДлина=Метаданные.ДлинаСуммыПроводки; СумТочн=Метаданные.ТочностьСуммыПроводки;
    КвоДлина=Метаданные.ДлинаКоличестваПроводки; КвоТочн=Метаданные.ТочностьКоличестваПроводки;
    СумФрмт="Ч"+СумДлина+"."+СумТочн+", "; КвоФрмт="Ч"+КвоДлина+"."+КвоТочн+", ";
    фОборотыТЗ.Очистить(); фОборотыТЗ.НоваяКолонка("Счет","Счет",,,"Счет:",7);
    фОборотыТЗ.НоваяКолонка("Тип","Строка",,,"тип",4);
    БухИт=СоздатьОбъект("БухгалтерскиеИтоги"); БухИт.ВключатьСубсчета(-1, -1);
    Если ВыбФирма.Выбран()<>0 Тогда БухИт.ИспользоватьРазделительУчета(ВыбФирма) КонецЕсли;
    Для Ном=1 По ВыбСчет.КоличествоСубконто() Цикл фОборотыТЗ.НоваяКолонка("Субконто"
    +Ном,,,,"("+Ном+") "+ВыбСчет.ВидСубконто(Ном),19); БухИт.ИспользоватьСубконто(); КонецЦикла;
    //фОборотыТЗ.НоваяКолонка("НачСуммаДт","Число",СумДлина,СумТочн,"Нач.Дт(Сумма)",СумДлина+2,СумФрмт,2);
    //фОборотыТЗ.НоваяКолонка("НачКвоДт","Число",КвоДлина,КвоТочн,"Нач.Дт(К-во)",КвоДлина,КвоФрмт,2);
    //фОборотыТЗ.НоваяКолонка("НачСуммаКт","Число",СумДлина,СумТочн,"Нач.Кт(Сумма)",СумДлина+2,СумФрмт,2);
    //фОборотыТЗ.НоваяКолонка("НачКвоКт","Число",КвоДлина,КвоТочн,"Нач.Кт(Кол-во)",КвоДлина,КвоФрмт,2);
    фОборотыТЗ.НоваяКолонка("Период","Строка",,,"Период",15);
    фОборотыТЗ.НоваяКолонка("КорСчет","Счет",,,"Корр.",7);
    Для Ном=1 По Метаданные.МаксимальноеКоличествоСубконто Цикл фОборотыТЗ.НоваяКолонка("КорСубконто"
    +Ном,,,,"Кор.Субконто("+Ном+")",19); БухИт.ИспользоватьКорСубконто(,,,-1); КонецЦикла;
    фОборотыТЗ.НоваяКолонка("СуммаДт","Число",СумДлина,СумТочн,"Дт-Оборот",СумДлина+2,СумФрмт,2);
    фОборотыТЗ.НоваяКолонка("КвоДт","Число",КвоДлина,КвоТочн,"(Кол-во)",КвоДлина,КвоФрмт,2);
    фОборотыТЗ.НоваяКолонка("СуммаКт","Число",СумДлина,СумТочн,"Кт-Оборот",СумДлина+2,СумФрмт,2);
    фОборотыТЗ.НоваяКолонка("КвоКт","Число",КвоДлина,КвоТочн,"(Кол-во)",КвоДлина,КвоФрмт,2);
    БухИт.ВыполнитьЗапрос(ВыбНачПериода,ВыбКонПериода,""+ВыбСчет,,,3,
    ВыбПериодыСЗ.ПолучитьЗначение(Мин(ВыбПериодыСЗ.РазмерСписка(),Макс(1,ВыбПериодыСЗ.ТекущаяСтрока()))),"КС");
    БухИт.ВыбратьСчета(); Пока БухИт.ПолучитьСчет()<>0 Цикл
        СубКво=БухИт.Счет.КоличествоСубконто();
        БухИт.ВыбратьКорСчета(); Пока Бухит.ПолучитьКорСчет()<>0 Цикл
            Состояние("Данные запроса: Счет = "+БухИт.Счет+" / Кор.счет = "+БухИт.КорСчет+" ...");
            ВыбратьПоВсемСубконто(БухИт,фОборотыТЗ,СубКво,БухИт.КорСчет.КоличествоСубконто());
            Состояние("Данные запроса: Счет = "+БухИт.Счет+" / Кор.счет = "+БухИт.КорСчет+" - выполнено ...");
        КонецЦикла;
    КонецЦикла;
    Сигнал(); Состояние("");
КонецПроцедуры //Сформировать
//==============================================================================

ВыбПериодыСЗ.УдалитьВсе();
ВыбПериодыСЗ.ДобавитьЗначение("Период");
ВыбПериодыСЗ.ДобавитьЗначение("Операция");
ВыбПериодыСЗ.ДобавитьЗначение("Проводка");
ВыбПериодыСЗ.ДобавитьЗначение("День");
ВыбПериодыСЗ.ДобавитьЗначение("Неделя");
ВыбПериодыСЗ.ДобавитьЗначение("Декада");
ВыбПериодыСЗ.ДобавитьЗначение("Месяц");
ВыбПериодыСЗ.ДобавитьЗначение("Квартал");
ВыбПериодыСЗ.ДобавитьЗначение("Год");
</1с>
13 Провинциальный 1сник
 
15.06.20
07:57
(11) То есть, вы хотите сказать, что для того чтобы получить конкретный вид субконто, нужно:

1. В цикле Метаданные.МаксимальноеКоличествоСубконто  выполнить БухИт.ИспользоватьКорСубконто без параметров
2. При выборке соответствущего корсчета выбирать вложенно ВСЕ субконто этого субсчета по порядку номеров

И что возможности без всей этой галиматьи обратиться к конкретному субконто в запросе - нет?
14 Cthulhu
 
15.06.20
15:17
(13): не надоело тупить?..
выбирай и получай [кор]субконто по номеру метода ".Использовать[Кор]Субконто()" а не по типу если ты НЕ использовал типы субконто в настройке бух.итогов. не "БИ.ВыбратьКорСубконто(ВидыСубконто.Номенклатура)" и "БИ.ПолучитьКорСубконто(ВидыСубконто.Номенклатура)", а БИ.ВыбратьКорСубконто(1)" и "БИ.ПолучитьКорСубконто(1)"
блин, тебе даже обработку закопипастили сюда. где все видно. слепи да проверь - как и где оно работает.
15 Провинциальный 1сник
 
15.06.20
20:14
(14) Я реально не понимаю. Номер вообще не решает проблему, по сравнению с видом. В моей коротенькой обработке если поменять вид субконто на номер - та же фигня, при попытке ВыбратКорСубконто выдает ошибку на число фильтров. И ещё - а как платформа узнает, какой именно вид субконто я хочу выбирать, если в ИспользоватьВидСубконто() я ничего не указал?
16 Провинциальный 1сник
 
15.06.20
20:19
(15) Мне же надо не просто первый по порядку вид субконто, а конкретный..
17 Провинциальный 1сник
 
15.06.20
20:41
(14) А, всё, понял. Нужно в начале сделать ИспользоватьКорСубконто в цикле до МаксимальноеКоличествоСубконто. А потом, когда получили корсчет, узнать номер вида субконто Номенклатура для этого корсчета, и в дальнейшем использовать именно этот номер в Выбрать.. и Получить.. Так работает.
Спасибо!
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.