Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Проблема с получением оборотов по субконто. (http://forums.kuban.ru/f1040/problema_s_polucheniem_oborotov_po_subkonto-2481136.html)

US1C 11.04.2012 15:00

Проблема с получением оборотов по субконто.
 
Ситуевина следующая: Делаю запрос по бухитогам, в параметры подаю список счетов. И применяю метод:
Ит.ИспользоватьСубконто(,, 1);
Ит.ИспользоватьСубконто(,, 1);
(2 раза потому, что в тех счетах, которые включены в запрос нет больше 2-х субконто)
Так вот, если среди попавшихся субконто есть только оборотные, не могу получить ДО() и КО() по ним. Т.е. обход итогов по этому субконто выдает общие ДО() и КО(), а затем значения оборотных субконто но уже без сумм ДО и КО. Оборотно-сальдовая по конкретному счету разворачивается по оборотному субконто со всеми цифрами, т.е. данные есть.
Уже голову сломал где какую опцию или метод использовать, чтобы получить данные по оборотному субконто.

VZ 11.04.2012 15:39

Оборотные потому называются "оборотными", потому что у них нет ДО и КО. Счета, которые имеют ДО и КО, не называются "оборотными".
А забалансовые счета называются "забалансовыми", потому что не корреспондируют с "балансовыми".

US1C 11.04.2012 15:48

(1) А бывают оборотные счета? В смысле только с оборотами и без сальдо? Я-то про оборотные субконто речь веду. Так вот они-то как-раз только дебетовые и кредитовые обороты хранят, без начального и конечного сальдо. Чтобы это проверить достаточно сделать оборотку по 51 счету.
А насчет "забалансовых" счетов - смешно.

VZ 11.04.2012 15:57

2-US1C > Ну да, правильно "аналитика счетов". Сократил :)
И что смешного насчет "забалансовых"?

US1C 11.04.2012 16:07

(3) Причина и следствие поменяно местами. Счета, которые не включены в бухгалтерский баланс, называются забалансовыми. И вследствии этого не могут корреспондировать с балансовыми счетами.

US1C 11.04.2012 16:23

Ну, коли ситуацию со счетами прояснили, может быть найдется у кого-нибудь конкретный ответ по конкретной проблеме? Что-бы, как говориться, не растекаться мыслью по древу.

VZ 11.04.2012 16:32

4-US1C > Не совсем. Причина и следствие настолько жестко связаны, что можно и поменять местами. Да, принято наоборот ;) Но я хотел только подчеркнуть прямую связь названия со свойствами. Несколько перевернув связку "причина-следствие".
И что за "проблема"? Я как-то не вижу никакой "проблемы". Ну, есть оборотная аналитика. Что, не надо? Есть обоснование? Или как?
P.S. По древу (дереву) бежала (тикала) все-таки белка (мысь).

roma n 11.04.2012 16:33

мысИю по древу

Ит.ВыполнитьЗапрос(?,?,?,?,?,???)

US1C 11.04.2012 16:39

(6) Я к тому, что эта, безусловно интересная, тема не несет в себе ответа на поставленный вопрос. И точно с таким же успехом мы мложем обсуждать здесь "есть ли жизнь на Марсе?".
(7) Вот кусок кода с запросом к БИ:
Ит = ДБ.CreateObject("БухгалтерскиеИтоги");
Ит.Опции(0,1);
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной);
Ит.ИспользоватьСубконто(,, 1);
Ит.ИспользоватьСубконто(,, 1);

Если Ит.ВыполнитьЗапрос(НачДатаО,КонДатаО,СчетаБУ,,,,"Месяц",3)=0 Тогда
Ошибка = "Нет оборотов по счетам: "+СчетаБУ+" ("+ТекущаяДата()+" "+ТекущееВремя()+")";
Таб.ВывестиСекцию("Строка");
ФлагРасчитаныБИ = 0;
Возврат;
КонецЕсли;

VZ 11.04.2012 16:45

8-US1C > Еще раз. Введение признака "оборотный" к аналитике счета [u]означает отказ[/u] от начального и конечного сальдо относительно периода.
И не надо совать код. Это [u][b]свойство аналитики[/b][/u].
Хочешь получать сальдо на конец периода? Не веди такую аналитику.
Но рекомендую перед этим посоветоваться с тем, кто понимает бухучет. Хотя бы на начальном уровне.

US1C 11.04.2012 16:55

(9) Код, собственно, я для roman-а выложил.
В сабже русским по белому написано, что я не могу получить ДО() и КО() по оборотному субконто, то бишь ДебетовыйОборот и КредитовыйОборот. Сейчас с лупой рассматриваю свой пост, чтобы найти хоть слово про сальдо на конец периода.
В бухучете я действительно мало что понимаю, и чем больше общаюсь с бухами, тем крепче эта мысль.
Но теперь я точно знаю, с кем я не буду советоваться по вопросам бухучета.

VZ 11.04.2012 17:05

10-US1C > Теперь понял. Был невнимателен, виноват.
Со смесью оборотных и необоротных итогов, действительно, есть трудности.

user1C 11.04.2012 17:07

в ВыполнитьЗапрос(..) параметр <ТипИтогов>
Необязательный параметр. Число — тип отбирае*мых итогов. Может принимать следующие значе*ния:

1 — остатки и обороты по счету в целом;
2 — обороты между счетами;
3 - первое и второе вместе.

[u]По умолчанию — 1[/u]
зы
в оле желательно необходимо следует указывать все необязательные параметры...

VZ 11.04.2012 17:18

+11 А можно узнать, какие счета скрываются за списком [em]СчетаБУ[/em]?

VZ 11.04.2012 17:33

2US1C - неправильно использовать такую конструкцию
[em]Ит.ИспользоватьСубконто(,, 1);
Ит.ИспользоватьСубконто(,, 1);[/em]
Правильным будет в качестве периода использовать проводку, и при выборке определять счет с субконто. А оборот складировать из сумм этой проводки.
Вот пример не соображу дать :(

US1C 11.04.2012 19:18

(12) Дело в том, что выполняя этот же код в локальной базе, я получаю такие же траблы. Т.е. проблема не зависит от выставленного параметра "ТипИтогов".
(13) Счета и все субсчета 50, 51, 52, 55, 57, 58, 60, 62, 66, 67, 76 счетов.
(14) Дело в том, что запрос я делаю по списку счетов, поэтому не могу указывать конкретные значения видов субконто. Когда я делал запрос по каждому из перечисленных выше счетов, я указывал в ИспользоватьСубконто() персональные значения для каждого счета и в этом случае все отрабатывалось на раз. Но обработка сбора данных с 200 баз выполнялась около суток при получении данных за квартал. Потому что приходилось в цикле счетов выполнять бухзапросы, делая запрос сразу по всем нужным счетам она (обработка) справляется на порядок быстрее. Может быть, как вариант, использовать периодичность запроса - проводку. Но мне не нужна такая детализация. Поэтому это как крайний случай. То, что именно метод ИспользовтатьСубконто() здесь накосячил я понимаю. Как его образумить, вот в чем вопрос? Ведь он скрупулезно обошел все значения оборотного субконто (по которым были движения), но не выдал их засранец.

Write 11.04.2012 19:32

(15)Ведь он скрупулезно обошел все значения оборотного субконто (по которым были движения) - как выполняете обход запроса?

VZ 11.04.2012 19:37

15-US1C > Нене... Именно, что список счетов.
Т.е. примерно так:
[em]Ит = ДБ.CreateObject("БухгалтерскиеИтоги");
Ит.Опции(0,1);
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной);
Если Ит.ВыполнитьЗапрос(НачДатаО,КонДатаО,СчетаБУ,,,, "Месяц",3)=0 Тогда
Ошибка = "Нет оборотов по счетам: "+СчетаБУ+" ("+ТекущаяДата()+" "+ТекущееВремя()+")";
КонецЕсли;
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
Если Ит.Счет = "ХХХ" Тогда
ИначеЕслиИт.Счет = "YYY" тогда
.......
КонецЕсли;
КонецЦикла;[/em]
Т.е. вот так, вручную почти. И использовать ТЗ для сбора оборотов, да.
Потом ТЗ свернуть, отсортировать по вкусу.

VZ 11.04.2012 19:42

16-Write > Если посмотришь на таблицы, которые содержат итоги и обороты... Да представишь многообразие задумок [живого] конструктора этих запросов, и что их надо движку как-то превратить в правильный запрос уже на уровне БД, то...
Не всегда у движка выходит это дело блестяще, я бы сказал :D

US1C 11.04.2012 19:45

(16) Вот часть кода обхода результатов запроса (немножко выкинул оттуда, чтобы не загромождать, но алгоритм я думаю понятен):
Пока Ит.ПолучитьПериод() = 1 Цикл
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет() = 1 Цикл
Ит.ВыбратьСубконто(1);
Пока Ит.ПолучитьСубконто(1) = 1 Цикл
Ит.ВыбратьСубконто(2);
Пока Ит.ПолучитьСубконто(2) = 1 Цикл
ТЗ_БИ_С.НоваяСтрока();
ТЗ_БИ_С.Счет = Счет.Код;

СЗ_Субк = СоздатьОбъект("СписокЗначений");
Если Счет.ВидСубконто(1).Идентификатор() = "Контрагенты" Тогда
СЗ_Субк.ДобавитьЗначение("Контрагенты");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).Наименование));
СЗ_Субк.ДобавитьЗначение(Лев(Ит.Субконто(1).ИНН,10));
ИначеЕсли Счет.ВидСубконто(1).Идентификатор() = "ДвиженияДенежныхСредств" Тогда
СЗ_Субк.ДобавитьЗначение("ДвиженияДенежныхСредств");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).Наименование));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).ВидДвижения.Идентификатор()));
ИначеЕсли Счет.ВидСубконто(1).Идентификатор() = "БанковскиеСчета" Тогда
СЗ_Субк.ДобавитьЗначение("БанковскиеСчета");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).Номер));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).Наименование));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).БанкОрганизации.Код));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).БанкОрганизации.Наименование));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(1).ТипСчета.Идентификатор()));
КонецЕсли;
ТЗ_БИ_С.Суб1 = ЗначениеВСтроку(СЗ_Субк);

СЗ_Субк = СоздатьОбъект("СписокЗначений");
Если Счет.ВидСубконто(2).Идентификатор() = "ДвиженияДенежныхСредств" Тогда
СЗ_Субк.ДобавитьЗначение("ДвиженияДенежныхСредств");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(2).Наименование));
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(2).ВидДвижения.Идентификатор()));
ИначеЕсли Счет.ВидСубконто(2).Идентификатор() = "Договоры" Тогда
СЗ_Субк.ДобавитьЗначение("Договоры");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(2).Наименование));
ИначеЕсли Счет.ВидСубконто(2).Идентификатор() = "ЦенныеБумаги" Тогда
СЗ_Субк.ДобавитьЗначение("ЦенныеБумаги");
СЗ_Субк.ДобавитьЗначение(СокрЛП(Ит.Субконто(2).Наименование));
СЗ_Субк.ДобавитьЗначение(Дата(Ит.Субконто(2).ДатаПринятияКУчету));
СЗ_Субк.ДобавитьЗначение(Ит.Субконто(2).НоминальнаяЦена);
КонецЕсли;
ТЗ_БИ_С.Суб2 = ЗначениеВСтроку(СЗ_Субк);

ТЗ_БИ_С.ДО = Ит.ДО(1);
ТЗ_БИ_С.КО = Ит.КО(1);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Write 11.04.2012 19:56

+(15)Субсчета в списке СчетаБУ передаете?
Если Ит.ВыполнитьЗапрос НачДатаО,КонДатаО,СчетаБУ,,,, "Месяц",3)=0 Тогда
- в конце 3, выбираете с валютными суммами?
(19)Выборка вроде правильно идет.

US1C 11.04.2012 20:03

(20) Да, все счета и субсчета в СЗ и параметром в Запрос. Выбираю с валютными суммами, поскольку там есть и валютные счета. Хочу также отметить, что сбор данных в разрезе период/счет/субконто1/субконто2 идет без проблем по всем необоротным субконто. Т.е. данные, например по 60 и 62 счету в разрезе контагентов и договоров собираются. А вот по 51 получаю общие обороты по БС и пустые обороты по сумме, но не по значениям ДДС (их он-запрос все перечисляет, которые были в проводках за период).

VZ 11.04.2012 20:17

21-US1C > Однако попробуй по схеме (17) Здесь будет использоваться таблица проводок, а не итогов и оборотов, что даже выйдет быстрее. Да, суммировать обороты самому надо прописать, но обороты точно получишь.
Кстати, чего субконто по столбцам ТЗ не распределишь?

Write 11.04.2012 20:20

(21)А вот по 51 получаю общие обороты по БС и пустые обороты по сумме, но не по значениям ДДС (их он-запрос все перечисляет, которые были в проводках за период). - немного сумбурно, но я так понимаю как вы писали выше нулевые обороты по ДДС.
Есть у меня похожий отчет, отличие только, субсчета не указываю, а использую Ит.ВключатьСубсчета(1), и выборка идет только по сумме, обороты по всем субконто присутствуют.

Helen 1986 11.04.2012 20:55

разбить счета на две группы и два запроса - общие счета и оборотный счет
и не париться

US1C 11.04.2012 20:57

(22) Попробую конечно, но боюсь увеличится время обработки. Все-таки сводную сумму получить сразу или все детальные записи, которые потом опять надо консолидировать. По столбцам мне не надо, ибо потом я получаю готовую проводку из ЗначениеИзСтроки.
(23) Да, все правильно - нулевые обороты. А ИспользоватьСубконто() как выглядит в отчете? Попробую применить ВключатьСубсчета(), но боюсь погоды это не сделает, ведь с обработкой субсчетов проблем не возникает.

US1C 11.04.2012 21:06

(24) Боюсь, громоздко будет выглядеть: двойные процедуры сбора данных в ТЗ, загрузки в ИБ из этих ТЗ. Нет конечно, если нет способа побороть этот парасик с помощью какой-нибудь опции/метода, тогда замутю с двойным запросом или детальным сбором по проводкам. Но хочется красивого и лаконичного решения. Уже вроде бы вышел из того возраста, когда делаешь лишь бы работало. Хочется некой изящности в коде, которая вызывает чувстово глубокого удовлетворения от проделанной работы.

Helen 1986 11.04.2012 21:11

вместо одного запроса сбора данных - два.
остальное без изменений

US1C 11.04.2012 21:15

(27) Согласен.

US1C 11.04.2012 21:22

(27) Хотя нет, три запроса. Счета с разным набором субконто в моем списке.

US1C 13.04.2012 15:26

(14) Попробовал использовать период - Проводку. Все классно, все дебетовые/кредитовые обороты по оборотным субконто выводит. Одна только ложка дегтя - обработка стала собирать данные в 6 раз дольше. Буду думать дальше.

VZ 13.04.2012 16:37

30-US1C > "По проводкам" всегда проигрыш в скорострельности против "по периоду". Особенно когда период опирается на границы месяцев... Таблица проводок не содержит же промежуточных итогов.
Попробуй разбить запрос на два/три: по "сальдовым" и "оборотным" отдельно.
Зато "по проводкам" - универсально для любых заморочек ;)

US1C 14.04.2012 23:45

(31) Да, похоже единственный вариант остался в несколько запросов. Никакие методы/опции не помогли.

Write 15.04.2012 16:33

(32)Попробуйте передать в списке только счета группы, и добавить перед ВыполнитьЗапрос(), ВключатьСубсчета(1), а ненужные субсчета можно отсеить проверяя их присутствие в еще одном списке значений.


Текущее время: 16:06. Часовой пояс GMT +3.