Имя: Пароль:
1C
1C 7.7
v7: Число фильтров субконто превысило допустимое значение
0 toshen
 
20.03.13
13:09
Бух.учет, редакция 4.5(7.70.547)
Процедура выгружает итоги по всем счетам в xml-Файл.
дойдя до счета 10.7 возникает ошибка "Число фильтров субконто превысило допустимое значение!". Где я ошибся?

Процедура Сформировать()
   ДатаНач = "01.01.1900";
   счетч = 0; //счетчик для отладки
   
   //открытие хмл файла
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1    Тогда
       Предупреждение("Компонента v7plus.dll не найдена!");
       Возврат;
   КонецЕсли;
   
   XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
   XMLКорневойРаздел = XMLАнализатор.СоздатьДокумент();
   ДанныеXML = XMLКорневойРаздел.СоздатьПодчиненныйЭлемент("root");
   //***
   
   Счета = СоздатьОбъект("Счет.Основной");
   Счета.ВыбратьСчета();
   Пока Счета.ПолучитьСчет()=1 Цикл

//фрагмет кода для отладки        
счетч = счетч +1;
Если счетч=36 Тогда // в данной итерации возникает ошибка (счет 10.7 "Материалы, переданные в переработку на сторону". данный счет содержит 3 субконто, метод ИспользоватьСубконто также будет вызван 3 раза)
   Предупреждение(Строка(счетч));
Конецесли;
//***
       
       ТекСчет = Счета.ТекущийСчет();
       ТЗ = СоздатьОбъект("ТаблицаЗначений");
       БИ = СоздатьОбъект("БухгалтерскиеИтоги");
       Для Сч=1 По ТекСчет.КоличествоСубконто() Цикл
           БИ.ИспользоватьСубконто(ТекСчет.ВидСубконто(Сч),,1);
           ТЗ.НоваяКолонка(СтрЗаменить(СтрЗаменить(ТекСчет.ВидСубконто(Сч),".","")," ",""));  
       Конеццикла;
       ТЗ.НоваяКолонка("Счет");
       ТЗ.НоваяКолонка("ДтКолво");
       ТЗ.НоваяКолонка("ДтСумма");
       ТЗ.НоваяКолонка("КтКолво");
       ТЗ.НоваяКолонка("КтСумма");
               
       БИ.ИСпользоватьсубконто(); //тут возникает ошибка
       Если БИ.ВыполнитьЗапрос(ДатаНач,ДатаКонца,,,1,1,) = 0 Тогда
           Продолжить;
       КонецЕсли;
               
       БИ.ВыбратьСубконто();
       Пока БИ.ПолучитьСубконто() = 1 Цикл
           Счет  = БИ.Счет.Код;
           ДтСум = БИ.СКД();
           ДтКол = БИ.СКД("К");
           КтСум = БИ.СКК();
           КтКол = БИ.СКК("К");
   
           Если (ДтСум <> 0) ИЛИ (КтСум <> 0) Тогда
               ТЗ.НоваяСтрока();
               ТЗ.Счет = ТекСчет;
               Для Сч=1 По ТекСчет.КоличествоСубконто() Цикл
                   ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,СтрЗаменить(СтрЗаменить(ТекСчет.ВидСубконто(Сч),".","")," ",""), БИ.Субконто(Сч));
               КонецЦикла;
               ТЗ.ДтКолво = ДтКол;
               ТЗ.ДтСумма = ДтСум;
               ТЗ.КтКолво = КтКол;
               ТЗ.КтСумма = КтСум;
           КонецЕсли;
       КонецЦикла;
       //доавить итоги по счету в хмл файл
       Для НС = 1 По ТЗ.КоличествоСтрок() Цикл
           ТЗ.ПолучитьСтрокуПоНомеру(НС);
           Ветка = ДанныеXML.СоздатьПодчиненныйЭлемент("Данные" + НС);
           Для НК = 1 По ТЗ.КоличествоКолонок() Цикл
               Ветка.УстановитьАтрибут(ТЗ.ПолучитьПараметрыКолонки(НК), Строка(ТЗ.ПолучитьЗначение(НС,НК)));
           КонецЦикла;
       КонецЦикла;
       //***
   КонецЦикла;    
//запись в хмл файл
XMLКорневойРаздел.Записать(ФормИмяФайлаДанных);
Предупреждение("ОК");
//****
КонецПроцедуры
1 KishMish
 
20.03.13
13:10
ну ты выбираешь один раз ВЫБРАТЬ СУБКОНТО а птыаешься получить ВСЕ СУБКОНТО НА СЧЕТЕ
2 1Сергей
 
20.03.13
13:11
Вот это зачем?

БИ.ИСпользоватьсубконто(); //тут возникает ошибка
3 toshen
 
20.03.13
13:31
(1) ошибка возникает раньше вызова ВыбратьСубконто
(2) пытался без данной строки - ошибка возникает при вызове ВыбратьСубконто "Данная операция допустима только в режиме запроса по аналитике". Хотя в ранее в цикле было БИ.ИспользоватьСубконто(ТекСчет.ВидСубконто(Сч),,1). Не пойму в чём дело.
4 zak555
 
20.03.13
13:33
на счете ТекСчет.КоличествоСубконто(), а ты пытаешься использовать ТекСчет.КоличествоСубконто() + 1

=)
5 zak555
 
20.03.13
13:34
функцию рекурсии напиши по обходу аналитики
6 zak555
 
20.03.13
13:34
+ исключай аналитику по которой нет остатков
7 KishMish
 
20.03.13
14:05
сделай проверку, если у счета нет субконто, то его продолжить
8 zak555
 
20.03.13
14:06
(7) в цикл с 1 по 0 не зайдёт
9 KishMish
 
20.03.13
14:08
зато не сработают вот жти строки
10 KishMish
 
20.03.13
14:08
БИ.ИСпользоватьсубконто(); //тут возникает ошибка

       Если БИ.ВыполнитьЗапрос(ДатаНач,ДатаКонца,,,1,1,) = 0 Тогда
           Продолжить;
       КонецЕсли;
               
       БИ.ВыбратьСубконто();
11 KishMish
 
20.03.13
14:08
я имел ввиду вот этот цикл
Счета = СоздатьОбъект("Счет.Основной");
   Счета.ВыбратьСчета();
   Пока Счета.ПолучитьСчет()=1 Цикл
12 zak555
 
20.03.13
14:10
я даже не посмотрел, что он запрос по всем счетам выполняет

только автора нет и обясзнить зачем он это делает -- некому
13 toshen
 
20.03.13
14:12
Необходимо перенести итоги на определённый месяц в 8. Конечно, есть стандартный механизм, но необходимо сделать своей обработкой.
14 zak555
 
20.03.13
14:40
(13) зачем своей ?
15 toshen
 
20.03.13
15:46
(14) Если я воспользуюсь стандартным механизмом, то не задержусь на работе и по возвращению домой застану жену с любовником. В состоянии аффекта схвачу нож и после нескольких минут ужаснусь сделанному. А после решу, что нет смысла дальше жить, сяду в автомобиль, сдавлю педаль на полную, что бы разбиться, но меня остановят работники ГАИ за превышение скорости и мне придётся платить штраф. Вот что бы не платить штраф, нужно писать обработку=)

По теме. Спасибо за советы, кажется понял куда двигаться. Если что, ещё спрошу.
16 toshen
 
21.03.13
12:26
Для тех, кто будет интересоваться данным вопросом.
Далее предоставлен исправленный код. Результатом обработки является выгрузка итогов на указанный месяц в xml файл. Пример структуры файла:
<Данные172 Счет="62" ИмяСубконто1="Контрагенты" Субконто1="Наш контрагент номер 24" ИмяСубконто2="Договоры" Субконто2="Договор поставки №08/11-11Н от 08.11.11" ДтКолво="0" ДтСумма="59553.15" КтКолво="0" КтСумма="0" />
(количество субконто в строке файла зависит от счета)

Процедура ОбходПоСубконто(БИ, ТЗ, КоличествоСубконто, НомерСубконто = 1)
   Если НомерСубконто<=КоличествоСубконто Тогда
       БИ.ВыбратьСубконто(НомерСубконто);
       Пока БИ.ПолучитьСубконто(НомерСубконто) = 1 Цикл
           ОбходПоСубконто(БИ, ТЗ, КоличествоСубконто, НомерСубконто + 1);
       КонецЦикла;
   Иначе
       ДтСум = БИ.СКД();
       ДтКол = БИ.СКД("К");
       КтСум = БИ.СКК();
       КтКол = БИ.СКК("К");
       Если (ДтСум <> 0) ИЛИ (КтСум <> 0) Тогда
           ТЗ.НоваяСтрока();
           ТЗ.Счет = БИ.Счет.Код;
           Для Сч=1 По КоличествоСубконто Цикл
               ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,"ИмяСубконто"+Сч, БИ.Счет.ВидСубконто(Сч));
               ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,"Субконто"+Сч, БИ.Субконто(Сч));
           КонецЦикла;
           ТЗ.ДтКолво = ДтКол;
           ТЗ.ДтСумма = ДтСум;
           ТЗ.КтКолво = КтКол;
           ТЗ.КтСумма = КтСум;
       КонецЕсли;
   КонецЕсли;    
КонецПроцедуры
//******************************************************************************************
Процедура Сформировать()
   ДатаНач = "01.01.1900";
   
   //открытие xml файла
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1    Тогда
       Предупреждение("Компонента v7plus.dll не найдена!");
       Возврат;
   КонецЕсли;
   
   XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
   XMLКорневойРаздел = XMLАнализатор.СоздатьДокумент();
   ДанныеXML = XMLКорневойРаздел.СоздатьПодчиненныйЭлемент("root");
   //конец открытие xml файла
   
   Счета = СоздатьОбъект("Счет.Основной");
   Счета.ВыбратьСчета();
   Пока Счета.ПолучитьСчет()=1 Цикл
       ТекСчет = Счета.ТекущийСчет();
       Сообщить("Обрабатывается счет " + ТекСчет);
       ТЗ = СоздатьОбъект("ТаблицаЗначений");
       БИ = СоздатьОбъект("БухгалтерскиеИтоги");
       ТЗ.НоваяКолонка("Счет");
       Для Сч=1 По ТекСчет.КоличествоСубконто() Цикл
           БИ.ИспользоватьСубконто(ТекСчет.ВидСубконто(Сч),,1);
           ТЗ.НоваяКолонка("ИмяСубконто"+Сч);
           ТЗ.НоваяКолонка("Субконто"+Сч);
       Конеццикла;
       ТЗ.НоваяКолонка("ДтКолво");
       ТЗ.НоваяКолонка("ДтСумма");
       ТЗ.НоваяКолонка("КтКолво");
       ТЗ.НоваяКолонка("КтСумма");
               
       Если БИ.ВыполнитьЗапрос(ДатаНач,ДатаКонца,,,1,1,) = 0 Тогда
           Продолжить;
       КонецЕсли;
                   
       ОбходПоСубконто(БИ, ТЗ, ТекСчет.КоличествоСубконто());
                       
       //добавить итоги по счету в xml файл
       Для НС = 1 По ТЗ.КоличествоСтрок() Цикл
           ТЗ.ПолучитьСтрокуПоНомеру(НС);
           Ветка = ДанныеXML.СоздатьПодчиненныйЭлемент("Данные" + НС);
           Для НК = 1 По ТЗ.КоличествоКолонок() Цикл
               Ветка.УстановитьАтрибут(ТЗ.ПолучитьПараметрыКолонки(НК), Строка(ТЗ.ПолучитьЗначение(НС,НК)));
           КонецЦикла;
       КонецЦикла;
       //конец добавить итоги по счету в xml файл
   КонецЦикла;    
//запись в хмл файл
XMLКорневойРаздел.Записать(ФормИмяФайлаДанных);
Предупреждение("ОК");
//конец запись в хмл файл
КонецПроцедуры
17 zak555
 
21.03.13
12:26
(15) сколько раз падал на голову ?
18 toshen
 
21.03.13
12:27
сильно только 1 раз=)
19 zak555
 
21.03.13
12:28
(16) ты не учёл (6) -- ниЗачёт
20 zak555
 
21.03.13
12:28
(18) думаю, что больше
21 toshen
 
21.03.13
12:37
(19) есть отбор Если (ДтСум <> 0) ИЛИ (КтСум <> 0) Тогда

а исключать аналитику по которой нет остатков не для всех счетов нужно, насколько я понимаю. Проверку на товарный/взаиморасчётный счёт планирую делать при загрузке данных, хотя можно и при выгрузке.
22 zak555
 
21.03.13
12:38
(21) я просто помню, что в бухии для бюджета из 5 аналитик 2 была оборотной и если её не исключить, то остатков по 3,4,5 не будет
23 toshen
 
21.03.13
12:46
(22) Не понял о чём речь, я в бухгалтерии всего несколько дней. В любом случае попробую загрузить данные и проверю оборотно-сальдовой ведомостью. Если будут расхождения, пойду в гости к Гуглу.