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