Есть бухия 1С7 исписана в доль и поперек. Необходимо сформировать отчет по всем счетам(субсчетам) и субконто развернуто.
Примерно так
Счет Субконто1 Субконто2 Субконто3 Субконто4 СКД СКК СКД(,2) СКК(,2) Валюта
Подскажите куда копать. Спасибо!
а Типы Субконто для каждого счета - куда-с пихать? а НЕвалютные счета? а колонки для не-валютных сумм? а кол-во не нужно? а признак забалансового счета? а как со счетами-группами - не выводить вообще? а какое сальдо по оборотным субконто? (и как в резултате это всё в отчете выглядеть должно?)
А так - копать в сторону бух.итогов.
Для каждого встречаемого количества субконто - список счетов и отдельный бух.запрос по нему с "ИспользоватьСубконто" без параметров (счета очень желательно указывать в виде строки кодов а не СЗ - были там какие-то глюки). Собирать результаты макс.разворотов в ТЗ. Потом эту ТЗ сортануть и распечатать.
прим.: "по разному количеству субконто" - потому что в результат бух.запроса не попадают данные по счету, на котором количество субконто меньше количества методов ИспользоватьСубконто(), примененных в настройке бух.запроса - даже на обходах номера субконто, которій (номер субконто) есть на єтих счетах - есть такое не очевидное обстоятельство
может это спасет?
Когда-то пришлось писать отчет под разные конфигурации. Количество субконто везде разные.
вот фрагмент кода:
максСубконто = Ит.Счет.КоличествоСубконто();
ИтСубк.ИспользоватьСубконто(ВидыСубконто.Контрагенты);
ш = 1;
Пока ш <= максСубконто Цикл
Если Ит.Счет.ВидСубконто(ш) <> ВидыСубконто.Контрагенты Тогда
ИтСубк.ИспользоватьСубконто(Ит.Счет.ВидСубконто(ш));
КонецЕсли;
ш = ш + 1;
КонецЦикла;
ИтСубк.ВыполнитьЗапрос(Дата1-1,Дата1-1,Ит.Счет);
Если ИтСубк.ВыбратьСубконто(1) = 0 Тогда
Сообщить("Нет итогов субконто по счету "+ Строка(Ит.Счет));
Продолжить;
КонецЕсли;
тек = 1;
Пока тек > 0 Цикл
Пока ИтСубк.ПолучитьСубконто(тек) = 1 Цикл
Если тек = 1 Тогда
Если тз.НайтиЗначение(ИтСубк.Субконто(тек),,"Субконто") = 1 Тогда
тз.Дт = тз.Дт + ИтСубк.СКД();
тз.Кт = тз.Кт + ИтСубк.СКК();
Иначе
тз.НоваяСтрока();
тз.Субконто = ИтСубк.Субконто(тек);
тз.Счета = СоздатьОбъект("ТаблицаЗначений");
тз.Счета.НоваяКолонка("Счет","Счет");
тз.Счета.НоваяКолонка("Дт","Число",19,2);
тз.Счета.НоваяКолонка("Кт","Число",19,2);
тз.Дт = ИтСубк.СКД();
тз.Кт = ИтСубк.СКК();
КонецЕсли;
КонецЕсли;
Если тек < максСубконто Тогда
тек=тек+1;
Если ИтСубк.ВыбратьСубконто(тек) = 0 Тогда
Сообщить("Не выбран субконто уровня "+Строка(тек));
КонецЕсли;
Иначе
ИтСубк.ВыбратьСчета();
Пока ИтСубк.ПолучитьСчет() = 1 Цикл
Если тз.Счета.НайтиЗначение(ИтСубк.Счет,,"Счет") = 1 Тогда
тз.Счета.Дт = тз.Счета.Дт + ИтСубк.СКД();
тз.Счета.Кт = тз.Счета.Кт + ИтСубк.СКК();
Иначе
тз.Счета.НоваяСтрока();
тз.Счета.Счет = ИтСубк.Счет;
тз.Счета.Дт = ИтСубк.СКД();
тз.Счета.Кт = ИтСубк.СКК();
КонецЕсли
КонецЦикла;
КонецЕсли;
КонецЦикла;
тек = тек-1;
КонецЦикла;
КонецЦикла;
Прямой запрос к таблицам - там по-фигу какого типа и т.д
фільтри по н-субконто і іншим характеристикам рахунків мають бути присутні на формі?
#==TABLE no 286 : Итоги
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=1SBKTTLC|Итоги |A |1SBKTTLC |1
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=DATE |Period |D |8 |0
F=ACCDTID |AccountDt Id |C |9 |0
F=ACCKTID |AccountKt Id |C |9 |0
F=CURRID |Currency Id |C |9 |0
F=KIND |Total kind |C |1 |0
F=OB1 |Total turnover |C |15 |0
F=OB2 |Total turnover |C |15 |0
F=OB3 |Total turnover |C |15 |0
F=DTFLAGS | |N |1 |0
F=KTFLAGS | |N |1 |0
F=PLANID | |C |4 |0
#----Indexes------
# Name |Descr |Unique|Indexed fields |DBName
I=ACCDT1 | |0 |DATE,KIND,ACCDTID,ACCKTID,CURRID |ACCDT1
I=ACCKT1 | |0 |DATE,KIND,ACCKTID,ACCDTID,CURRID |ACCKT1
#
#===============================================================================
#==TABLE no 287 : Остатки
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=1SBKTTL |Остатки |A |1SBKTTL |1
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=DATE |Period |D |8 |0
F=ACCID |AccountDt Id |C |9 |0
F=CURRID |Currency Id |C |9 |0
F=KIND |Total kind |C |1 |0
F=OBDT1 |Total turnover DT |C |15 |0
F=OBKT1 |Total turnover KT |C |15 |0
F=OBDT2 |Total turnover DT |C |15 |0
F=OBKT2 |Total turnover KT |C |15 |0
F=OBDT3 |Total turnover DT |C |15 |0
F=OBKT3 |Total turnover KT |C |15 |0
F=SD |Saldo |C |15 |0
F=FLAGS | |N |1 |0
F=PLANID | |C |4 |0
F=VSC0 | |C |4 |0
F=SC0 | |C |13 |0
F=OSC0 | |N |1 |0
F=VSC1 | |C |4 |0
F=SC1 | |C |13 |0
F=OSC1 | |N |1 |0
F=VSC2 | |C |4 |0
F=SC2 | |C |13 |0
F=OSC2 | |N |1 |0
F=VSC3 | |C |4 |0
F=SC3 | |C |13 |0
F=OSC3 | |N |1 |0
щось на кшталт типових звітів ОСВ і ОСВ по рахунку?
отже, напрямок я дав? там для 3-х субконто реалізовано, вам треба в циклі перебрати всі можливі субконто
// Модуль Формы внешней обработки
// На Форме должны наличествовать:
// - ТаблицаЗначений с наименованием ПечТЗ;
// - Кнопка с формулой "Сформировать()" (без кавычек)
Перем МаксКвоСубконто,тхтКолСубконто, СумДлина,СумТочн,СумФрмт,ВалСумДлина,ВалСумТочн,ВалСумФрмт;
//==============================================================================
Процедура ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тВалюта="")
тПечТЗ.НоваяСтрока(); тПечТЗ.ПолучитьСтрокуПоНомеру(тПечТЗ.КоличествоСтрок());
тПечТЗ.Счет=тБухит.Счет; Для СчСубконто=1 По тКвоСубконто
Цикл тПечТЗ.УстановитьЗначение(тПечТЗ.НомерСтроки,"Субконто"+СчСубконто,тБухИт.Субконто(СчСубконто)) КонецЦикла;
тПечТЗ.СуммаДт=тБухит.СКД("С"); тПечТЗ.СуммаКт=тБухит.СКК("С");
тПечТЗ.Валюта=тВалюта; Если ПустоеЗначение(тВалюта)<>1
Тогда тПечТЗ.ВалСуммаДт=тБухИт.СКД("В"); тПечТЗ.ВалСуммаКт=тБухИт.СКК("В"); КонецЕсли;
КонецПроцедуры //ДобавитьСтрокуДанныхПоТекРазвороту
//------------------------------------------------------------------------------
Процедура ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто=1)
Если ТекВыбСубконто<=тКвоСубконто Тогда
тБухит.ВыбратьСубконто(); Пока тБухит.ПолучитьСубконто()<>0
Цикл ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто+1) КонецЦикла;
ИначеЕсли тБухИт.Счет.Валютный<>0 Тогда
тБухит.ВыбратьВалюты(); Пока тБухит.ПолучитьВалюту()<>0
Цикл ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тБухИт.Валюта) КонецЦикла;
Иначе ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто) КонецЕсли;
КонецПроцедуры //ДоРазвернутьПоСубконто
//------------------------------------------------------------------------------
Процедура Сформировать()
Перем тБухИт,счСубконто;
тБухит=СоздатьОбъект("БухгалтерскиеИтоги");
Для счСубконто=1 По МаксКвоСубконто Цикл тБухИт.ИспользоватьСубконто(,,1,0) КонецЦикла;
тБухит.ВключатьСубсчета(-1); тБухит.ВыполнитьЗапрос(,ВыбДата,,,,"СВ",,3);
тБухИт.ВыбратьСчета(); Пока тБухИт.ПолучитьСчет()<>0
Цикл ДоРазвернутьПоСубконто(тБухИт,тБухит.Счет.КоличествоСубконто(),ПечТЗ) КонецЦикла;
Если ПечТЗ.КоличествоСтрок()<>0 Тогда
ПечТЗ.Сортировать("+Счет,"+тхтКолСубконто,1); ПечТЗ.ТекущаяСтрока(1);
КонецЕсли;
КонецПроцедуры //Сформировать
//==============================================================================
ВалСумДлина=Метаданные.ДлинаВалютнойСуммыПроводки; ВалСумТочн=Метаданные.ТочностьВалютнойСуммыПроводки;
Валфрмт="Ч"+ВалСумДлина+"."+ВалСумТочн+", ";
СумДлина=Метаданные.ДлинаСуммыПроводки; СумТочн=Метаданные.ТочностьСуммыПроводки;
СумФрмт="Ч"+СумДлина+"."+СумТочн+", ";
ПечТЗ.Очистить();
ПечТЗ.НоваяКолонка("Счет","Счет",,,"Счет",7);
тхтКолСубконто=""; Для МаксКвоСубконто=1 По Метаданные.МаксимальноеКоличествоСубконто Цикл
тхтКолСубконто=тхтКолСубконто+"Субконто"+МаксКвоСубконто+",";
ПечТЗ.НоваяКолонка("Субконто"+МаксКвоСубконто,,,,"Субконто#"+МаксКвоСубконто,31);
КонецЦикла; МаксКвоСубконто=МаксКвоСубконто-1;
ПечТЗ.НоваяКолонка("СуммаДт","Число",СумДлина,СумТочн,"Дт-Сальдо",СумДлина+1,СумФрмт,2);
ПечТЗ.НоваяКолонка("СуммаКт","Число",СумДлина,СумТочн,"Кт-Сальдо",СумДлина+1,СумФрмт,2);
ПечТЗ.НоваяКолонка("Валюта","Справочник.Валюты",,,"в Вал.",12);
ПечТЗ.НоваяКолонка("ВалСуммаДт","Число",ВалСумДлина,ВалСумТочн,"=Дт-Сальдо",ВалСумДлина,ВалСумФрмт,2);
ПечТЗ.НоваяКолонка("ВалСуммаКт","Число",ВалСумДлина,ВалСумТочн,"=Кт-Сальдо",ВалСумДлина,ВалСумФрмт,2);
тхтКолСубконто=Лев(тхтКолСубконто,СтрДлина(тхтКолСубконто)-1);
Красивый код!
Процедура ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто=1)
Если ТекВыбСубконто<=тКвоСубконто Тогда
тБухит.ВыбратьСубконто(); Пока тБухит.ПолучитьСубконто()<>0
Цикл ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто+1) КонецЦикла;
ИначеЕсли тБухИт.Счет.Валютный<>0 Тогда
тБухит.ВыбратьВалюты(); Пока тБухит.ПолучитьВалюту()<>0
Цикл ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тБухИт.Валюта) КонецЦикла;
Иначе ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто) КонецЕсли;
КонецПроцедуры //ДоРазвернутьПоСубконто
ИспользоватьСубконто
без указания вида субконто. Для интереса запустил поиск по всей конфе - нет подобного.Прямой запрос по проводкам (для примера (по 3 субконто)):
ВсеСубконто = ""; ВсСкД=""; ВсСкК="";
Для ъ = 1 По 3 Цикл
ВсСкД=ВсСкД+",DTSC"+(ъ-1)+" [СубкД"+ъ+" :Subconto],VDTSC"+(ъ-1)+" СубкД"+ъ+"_вид";
ВсСкК=ВсСкК+",KTSC"+(ъ-1)+" [СубкК"+ъ+" :Subconto],VKTSC"+(ъ-1)+" СубкК"+ъ+"_вид";
КонецЦикла;
ВсеСубконто = ВсСкД+ВсСкК;
запрос = БазаД.НовыйЗапрос();
текст="
|select date ДатаПр,sum [Сум :Number.19.2], amount [Кво :Number.19.3], accdtid [СчД :Счет.Основной], accktid [СчК :Счет.Основной]"+ВсеСубконто+"
|from __1s_entry
|where Date BETWEEN @НачДата AND @КонДата
|and sp4373 = @OurFirm
|and accktid = @СчВД
|and ktsc1 = @пВД" + УслДт +"
|and amount<>0";
запрос.Подготовить(текст);
! | Выделяйте код! |
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua