ОБСУЖДЕНИЕ

Бухгалтерский запрос

17 ответов 8,1 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Мне нужно узнать все субконто(номенклатура) проводок счета 41.2 за период.
Те нужны все проводки где в д*цензура*е или кредите фигурирует счет 41.2
Код:
би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос(ДатаН,ДатаК,"41.2",,,2,,"СК"); 
би.ВыбратьСубконто(1); 
Пока би.ПолучитьСубконто(1)=1 Цикл
Сообщить(би.Субконто(1));
КонецЦикла;

но я получаю только номенклатуру из проводок 41.2 : **
проводки **:41.2 получается не попадают в результат бухзапроса, или может я что-то напутал.

Перечитал еще раз о бухгалтерских итогах/запросах не нашел ответа как сделать. Получается надо выполнить еще 1 бухзапрос би.ВыполнитьЗапрос(ДатаН,ДатаК,,"41.2",,2,,"СК"); ?? Чото я сомневаюсь что так... Смотрю как в карточке счета реализовано, но пока не понимаю как )

И еще как сделать чтобы не учитывать(или наоборот учитавать) проводки 41.2:41.2

Заранее примного благодарен, тк с этими вопросами постоянно путаюсь..., пробел в знаниях(
 
Для начала можно в цикле проверять ДО() и КО() и выводить разные сообщения

И я бы делал би.ВыполнитьЗапрос(ДатаН,ДатаК,"41.2",,,1,,"СК");

Правда тогда полезут еще остатки, но их можно отбросить в теле цикла

Можно еще попробовать разворачивать не по субконто, а по периоду "проводка"

Не совсем просто понятно для какой цели, поэтому трудно дать конкретный совет
 
Цель: получить список всех товаров которые участвовали в розничной торговле(участвовали в проводках со счетом 41.2) за определенный период (в моем случае с начала текущего года). Те по сути мне нужно тоже, что показывает карточка счета 41.2 с "показывать обороты за период"
 
би.ВыполнитьЗапрос(ДатаН,ДатаК,"41.2",,,1,,"СК");
Programmer_Hard, это вполне приемлимый вариант - попробуй причем 1 можно даже не ставить - оно по умолчанию равно 1 и не забудь также про
проверять ДО() и КО() и выводить разные сообщения
 
Код:
	би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос("01.01.09","02.01.09","41.2",,,1,,"СК"); 
би.ВыбратьСубконто(1); 
Пока би.ПолучитьСубконто(1)=1 Цикл
ИспользуемыеТовары.ДобавитьЗначение(би.Субконто(1),би.Субконто(1));
Сообщить (би.Субконто(1));  // показывает нужную мне номенклатуру
КонецЦикла;

в этом случае он расчитывает все остатки по счету, а это куча номенклатуры используемой еще до 01.01.09.
и мне выводится весь список номенклату, а не тот что участвует в период "01.01.09","02.01.09".

ПС: запрос би.ВыполнитьЗапрос("01.01.09","02.01.09","41.2",,,2,,"СК"); выполняется как надо, но только наполовину, он берет проводки 41.2:xx за указанный период и не берет xx:41.2.
 
смотри
ВыполнитьЗапрос(<НачалоПериода>,<КонецПериода>,<Счет>,<КоррСчет>,<Валюта>,<ТипИтогов>,<Периодичность>,<ТипСуммы>)

<ТипИтогов> - число - тип отбираемых итогов. Может принимать следующие значения: 1 - остатки и обороты по счету в целом; 2 - обороты между счетами; 3 - первое и второе вместе. По умолчанию: 1.
если ты устанавливаешь 2 - то он и выдает тебе операции между считами. так как счет ты указал, а коррСчет - нет - вот он и выдал тебе "половину" Если и там и там укажешь "41.2" - соотвественно выдаст только обороты по ДТ41.2-КТ41.2
Соотвественно тебе либо нужно выполнить 2 запроса и результаты слить куда-нить в табличку, либо же не указывать счета и написать условия типа
если (би.счет.код = 41.2) или (би.коррсчет.код = 41.2) тогда
ИспользуемыеТовары.ДобавитьЗначение(би.Субконто(1),би.Субконто(1));
Сообщить (би.Субконто(1)); // показывает нужную мне номенклатуру
конецЕсли;
 
Код:
	би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос("01.01.09","02.01.09","41.2",,,1,,"СК"); 
би.ВыбратьСубконто(1); 
Пока би.ПолучитьСубконто(1)=1 Цикл
ИспользуемыеТовары.ДобавитьЗначение(би.Субконто(1),би.Субконто(1));
Сообщить (би.Субконто(1));  // показывает нужную мне номенклатуру
КонецЦикла;

в этом случае он расчитывает все остатки по счету, а это куча номенклатуры используемой еще до 01.01.09.
и мне выводится весь список номенклату, а не тот что участвует в период "01.01.09","02.01.09".

ПС: запрос би.ВыполнитьЗапрос("01.01.09","02.01.09","41.2",,,2,,"СК"); выполняется как надо, но только наполовину, он берет проводки 41.2:xx за указанный период и не берет xx:41.2.

Я же про это писал
Остатки нужно отфильтровать
Например перед ИспользуемыеТовары.ДобавитьЗначение написать:
Код:
Если (би.ДО("С")=0) и (би.КО("С")=0) и (би.ДО("К")=0) и (би.КО("К")=0) Тогда
Продолжить;
КонецЕсли;
 
Я чтото запутался....
Код:
	би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос("01.01.09","05.01.09",,,,2,,"СК");  //
би.ВыбратьСубконто(1); 		
Пока би.ПолучитьСубконто(1)=1 Цикл	
Сообщить (строка(би.счет.код) + " _ " + строка(би.корсчет.код));
Если (би.счет.код = 41.2) или (би.корсчет.код = 41.2) Тогда 		
ИспользуемыеТовары.ДобавитьЗначение(би.Субконто(1),би.Субконто(1)); 
Сообщить (би.Субконто(1)); 
КонецЕсли	
КонецЦикла;

Чтото нето, выводит строки "41 _ ",
 
а попробуй так: вместо Сообщить (строка(би.счет.код) + " _ " + строка(би.корсчет.код));
Код:
Стр = строка(би.счет.код) + " _ " + строка(би.коРРсчет.код);
Сообщить(Стр);
 
если честно читал читал, ни чего не понял:
би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
би.ВыполнитьЗапрос("01.01.09","02.01.09","41.2");
би.ВыбратьСубконто(1);
Пока би.ПолучитьСубконто(1)=1 Цикл

Сообщить (би.Субконто(1)+" Д*цензура*:"+би.ДО("С")+" Кредит:"+би.КО("С"));
КонецЦикла;

И все должно работать. Это с суммами. Аналогично с количеством если ведется количественный учет на счете по субконто
 
Можно еще и так. Если не требуются начальные и конечные сальдо, а также сворачивание по субконто, будет работать быстрее бухитогов.

Код:
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(НачДата,КонДата,"41.2");
Пока Опер.ПолучитьПроводку() = 1 Цикл
...
КонецЦикла;
 
Отличный вариант предложил vitfil
Тем более внутри цикла можно заполнить ТЗ и потом сортировать/сворачивать ее как угодно

Единственный минус - нет остатков, но они в этом случае похоже и не нужны
 
Можно еще и так. Если не требуются начальные и конечные сальдо, а также сворачивание по субконто, будет работать быстрее бухитогов.

Опер = СоздатьОбъект("Операция");Опер.ВыбратьОперацииСПроводками(НачДата,КонДата,"41.2");
Пока Опер.ПолучитьПроводку() = 1 Цикл ...КонецЦикла;
Более того, в таком варианте можно выбрать проводки только по д*цензура*у или кредиту
 
Более того, в таком варианте можно выбрать проводки только по д*цензура*у или кредиту
Ну, задача как раз стояла, чтобы выбрать и те, и другие...
А еще, конечно же, можно прямым запросом из таблицы проводок это дело вытянуть. Будет еще быстрее.
 
Спасибо всем! вывели таки на путь истинный )
Итоговый скрипт который дает мне то, что надо:
Код:
	Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками("01.01.09","01.09.09","41.2");
Пока Опер.ПолучитьПроводку() = 1 Цикл	
Если Опер.Кредит.Счет=счетпокоду("41.2") Тогда 
Если ПустоеЗначение(Опер.Кредит.Номенклатура)=1 тогда продолжить; КонецЕсли; 
ИспользуемыеТовары.ДобавитьЗначение(Опер.Кредит.Номенклатура,Опер.Кредит.Номенклатура);
Иначе 
Если ПустоеЗначение(Опер.Д*цензура*.Номенклатура)=1 тогда продолжить; КонецЕсли;			 
ИспользуемыеТовары.ДобавитьЗначение(Опер.Д*цензура*.Номенклатура,Опер.Д*цензура*.Номенклатура);
КонецЕсли;
КонецЦикла;
 
Programmer_Hard, замечательственно!
 
Статус
Закрыто для дальнейших ответов.