• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Programmer_Hard
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Programmer_Hard

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

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

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

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

Заранее примного благодарен, тк с этими вопросами постоянно путаюсь..., пробел в знаниях(
 
H

Hryv

Для начала можно в цикле проверять ДО() и КО() и выводить разные сообщения

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

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

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

Не совсем просто понятно для какой цели, поэтому трудно дать конкретный совет
 
P

Programmer_Hard

Цель: получить список всех товаров которые участвовали в розничной торговле(участвовали в проводках со счетом 41.2) за определенный период (в моем случае с начала текущего года). Те по сути мне нужно тоже, что показывает карточка счета 41.2 с "показывать обороты за период"
 
K

KiR

би.ВыполнитьЗапрос(ДатаН,ДатаК,"41.2",,,1,,"СК");
Programmer_Hard, это вполне приемлимый вариант - попробуй причем 1 можно даже не ставить - оно по умолчанию равно 1 и не забудь также про
проверять ДО() и КО() и выводить разные сообщения
 
P

Programmer_Hard

Код:
	би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос("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.
 
K

KiR

смотри
ВыполнитьЗапрос(<НачалоПериода>,<КонецПериода>,<Счет>,<КоррСчет>,<Валюта>,<ТипИтогов>,<Периодичность>,<ТипСуммы>)

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

Hryv

Код:
	би=СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.Номенклатура);					 
би.ВыполнитьЗапрос("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) Тогда
Продолжить;
КонецЕсли;
 
P

Programmer_Hard

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

Чтото нето, выводит строки "41 _ ",
 
K

KiR

а попробуй так: вместо Сообщить (строка(би.счет.код) + " _ " + строка(би.корсчет.код));
Код:
Стр = строка(би.счет.код) + " _ " + строка(би.коРРсчет.код);
Сообщить(Стр);
 
K

kaa

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

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

И все должно работать. Это с суммами. Аналогично с количеством если ведется количественный учет на счете по субконто
 
V

vitfil

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

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

Hryv

Отличный вариант предложил vitfil
Тем более внутри цикла можно заполнить ТЗ и потом сортировать/сворачивать ее как угодно

Единственный минус - нет остатков, но они в этом случае похоже и не нужны
 
V

vbs

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

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

vitfil

Более того, в таком варианте можно выбрать проводки только по д*цензура*у или кредиту
Ну, задача как раз стояла, чтобы выбрать и те, и другие...
А еще, конечно же, можно прямым запросом из таблицы проводок это дело вытянуть. Будет еще быстрее.
 
P

Programmer_Hard

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!