|   |   | 
| 
 | 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) А, всё, понял. Нужно в начале сделать ИспользоватьКорСубконто в цикле до МаксимальноеКоличествоСубконто. А потом, когда получили корсчет, узнать номер вида субконто Номенклатура для этого корсчета, и в дальнейшем использовать именно этот номер в Выбрать.. и Получить.. Так работает.
 Спасибо! | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |