Проблема с получением оборотов по субконто. Ситуевина следующая: Делаю запрос по бухитогам, в параметры подаю список счетов. И применяю метод: Ит.ИспользоватьСубконто(,, 1); Ит.ИспользоватьСубконто(,, 1); (2 раза потому, что в тех счетах, которые включены в запрос нет больше 2-х субконто) Так вот, если среди попавшихся субконто есть только оборотные, не могу получить ДО() и КО() по ним. Т.е. обход итогов по этому субконто выдает общие ДО() и КО(), а затем значения оборотных субконто но уже без сумм ДО и КО. Оборотно-сальдовая по конкретному счету разворачивается по оборотному субконто со всеми цифрами, т.е. данные есть. Уже голову сломал где какую опцию или метод использовать, чтобы получить данные по оборотному субконто. |
Оборотные потому называются "оборотными", потому что у них нет ДО и КО. Счета, которые имеют ДО и КО, не называются "оборотными". А забалансовые счета называются "забалансовыми", потому что не корреспондируют с "балансовыми". |
(1) А бывают оборотные счета? В смысле только с оборотами и без сальдо? Я-то про оборотные субконто речь веду. Так вот они-то как-раз только дебетовые и кредитовые обороты хранят, без начального и конечного сальдо. Чтобы это проверить достаточно сделать оборотку по 51 счету. А насчет "забалансовых" счетов - смешно. |
2-US1C > Ну да, правильно "аналитика счетов". Сократил :) И что смешного насчет "забалансовых"? |
(3) Причина и следствие поменяно местами. Счета, которые не включены в бухгалтерский баланс, называются забалансовыми. И вследствии этого не могут корреспондировать с балансовыми счетами. |
Ну, коли ситуацию со счетами прояснили, может быть найдется у кого-нибудь конкретный ответ по конкретной проблеме? Что-бы, как говориться, не растекаться мыслью по древу. |
4-US1C > Не совсем. Причина и следствие настолько жестко связаны, что можно и поменять местами. Да, принято наоборот ;) Но я хотел только подчеркнуть прямую связь названия со свойствами. Несколько перевернув связку "причина-следствие". И что за "проблема"? Я как-то не вижу никакой "проблемы". Ну, есть оборотная аналитика. Что, не надо? Есть обоснование? Или как? P.S. По древу (дереву) бежала (тикала) все-таки белка (мысь). |
мысИю по древу Ит.ВыполнитьЗапрос(?,?,?,?,?,???) |
(6) Я к тому, что эта, безусловно интересная, тема не несет в себе ответа на поставленный вопрос. И точно с таким же успехом мы мложем обсуждать здесь "есть ли жизнь на Марсе?". (7) Вот кусок кода с запросом к БИ: Ит = ДБ.CreateObject("БухгалтерскиеИтоги"); Ит.Опции(0,1); Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной); Ит.ИспользоватьСубконто(,, 1); Ит.ИспользоватьСубконто(,, 1); Если Ит.ВыполнитьЗапрос(НачДатаО,КонДатаО,СчетаБУ,,,,"Месяц",3)=0 Тогда Ошибка = "Нет оборотов по счетам: "+СчетаБУ+" ("+ТекущаяДата()+" "+ТекущееВремя()+")"; Таб.ВывестиСекцию("Строка"); ФлагРасчитаныБИ = 0; Возврат; КонецЕсли; |
8-US1C > Еще раз. Введение признака "оборотный" к аналитике счета [u]означает отказ[/u] от начального и конечного сальдо относительно периода. И не надо совать код. Это [u][b]свойство аналитики[/b][/u]. Хочешь получать сальдо на конец периода? Не веди такую аналитику. Но рекомендую перед этим посоветоваться с тем, кто понимает бухучет. Хотя бы на начальном уровне. |
(9) Код, собственно, я для roman-а выложил. В сабже русским по белому написано, что я не могу получить ДО() и КО() по оборотному субконто, то бишь ДебетовыйОборот и КредитовыйОборот. Сейчас с лупой рассматриваю свой пост, чтобы найти хоть слово про сальдо на конец периода. В бухучете я действительно мало что понимаю, и чем больше общаюсь с бухами, тем крепче эта мысль. Но теперь я точно знаю, с кем я не буду советоваться по вопросам бухучета. |
10-US1C > Теперь понял. Был невнимателен, виноват. Со смесью оборотных и необоротных итогов, действительно, есть трудности. |
в ВыполнитьЗапрос(..) параметр <ТипИтогов> Необязательный параметр. Число — тип отбирае*мых итогов. Может принимать следующие значе*ния: 1 — остатки и обороты по счету в целом; 2 — обороты между счетами; 3 - первое и второе вместе. [u]По умолчанию — 1[/u] зы в оле желательно необходимо следует указывать все необязательные параметры... |
+11 А можно узнать, какие счета скрываются за списком [em]СчетаБУ[/em]? |
2US1C - неправильно использовать такую конструкцию [em]Ит.ИспользоватьСубконто(,, 1); Ит.ИспользоватьСубконто(,, 1);[/em] Правильным будет в качестве периода использовать проводку, и при выборке определять счет с субконто. А оборот складировать из сумм этой проводки. Вот пример не соображу дать :( |
(12) Дело в том, что выполняя этот же код в локальной базе, я получаю такие же траблы. Т.е. проблема не зависит от выставленного параметра "ТипИтогов". (13) Счета и все субсчета 50, 51, 52, 55, 57, 58, 60, 62, 66, 67, 76 счетов. (14) Дело в том, что запрос я делаю по списку счетов, поэтому не могу указывать конкретные значения видов субконто. Когда я делал запрос по каждому из перечисленных выше счетов, я указывал в ИспользоватьСубконто() персональные значения для каждого счета и в этом случае все отрабатывалось на раз. Но обработка сбора данных с 200 баз выполнялась около суток при получении данных за квартал. Потому что приходилось в цикле счетов выполнять бухзапросы, делая запрос сразу по всем нужным счетам она (обработка) справляется на порядок быстрее. Может быть, как вариант, использовать периодичность запроса - проводку. Но мне не нужна такая детализация. Поэтому это как крайний случай. То, что именно метод ИспользовтатьСубконто() здесь накосячил я понимаю. Как его образумить, вот в чем вопрос? Ведь он скрупулезно обошел все значения оборотного субконто (по которым были движения), но не выдал их засранец. |
(15)Ведь он скрупулезно обошел все значения оборотного субконто (по которым были движения) - как выполняете обход запроса? |
15-US1C > Нене... Именно, что список счетов. Т.е. примерно так: [em]Ит = ДБ.CreateObject("БухгалтерскиеИтоги"); Ит.Опции(0,1); Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной); Если Ит.ВыполнитьЗапрос(НачДатаО,КонДатаО,СчетаБУ,,,, "Месяц",3)=0 Тогда Ошибка = "Нет оборотов по счетам: "+СчетаБУ+" ("+ТекущаяДата()+" "+ТекущееВремя()+")"; КонецЕсли; Ит.ВыбратьСчета(); Пока Ит.ПолучитьСчет()=1 Цикл Если Ит.Счет = "ХХХ" Тогда ИначеЕслиИт.Счет = "YYY" тогда ....... КонецЕсли; КонецЦикла;[/em] Т.е. вот так, вручную почти. И использовать ТЗ для сбора оборотов, да. Потом ТЗ свернуть, отсортировать по вкусу. |
16-Write > Если посмотришь на таблицы, которые содержат итоги и обороты... Да представишь многообразие задумок [живого] конструктора этих запросов, и что их надо движку как-то превратить в правильный запрос уже на уровне БД, то... Не всегда у движка выходит это дело блестяще, я бы сказал :D |
(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); КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; |
+(15)Субсчета в списке СчетаБУ передаете? Если Ит.ВыполнитьЗапрос НачДатаО,КонДатаО,СчетаБУ,,,, "Месяц",3)=0 Тогда - в конце 3, выбираете с валютными суммами? (19)Выборка вроде правильно идет. |
(20) Да, все счета и субсчета в СЗ и параметром в Запрос. Выбираю с валютными суммами, поскольку там есть и валютные счета. Хочу также отметить, что сбор данных в разрезе период/счет/субконто1/субконто2 идет без проблем по всем необоротным субконто. Т.е. данные, например по 60 и 62 счету в разрезе контагентов и договоров собираются. А вот по 51 получаю общие обороты по БС и пустые обороты по сумме, но не по значениям ДДС (их он-запрос все перечисляет, которые были в проводках за период). |
21-US1C > Однако попробуй по схеме (17) Здесь будет использоваться таблица проводок, а не итогов и оборотов, что даже выйдет быстрее. Да, суммировать обороты самому надо прописать, но обороты точно получишь. Кстати, чего субконто по столбцам ТЗ не распределишь? |
(21)А вот по 51 получаю общие обороты по БС и пустые обороты по сумме, но не по значениям ДДС (их он-запрос все перечисляет, которые были в проводках за период). - немного сумбурно, но я так понимаю как вы писали выше нулевые обороты по ДДС. Есть у меня похожий отчет, отличие только, субсчета не указываю, а использую Ит.ВключатьСубсчета(1), и выборка идет только по сумме, обороты по всем субконто присутствуют. |
разбить счета на две группы и два запроса - общие счета и оборотный счет и не париться |
(22) Попробую конечно, но боюсь увеличится время обработки. Все-таки сводную сумму получить сразу или все детальные записи, которые потом опять надо консолидировать. По столбцам мне не надо, ибо потом я получаю готовую проводку из ЗначениеИзСтроки. (23) Да, все правильно - нулевые обороты. А ИспользоватьСубконто() как выглядит в отчете? Попробую применить ВключатьСубсчета(), но боюсь погоды это не сделает, ведь с обработкой субсчетов проблем не возникает. |
(24) Боюсь, громоздко будет выглядеть: двойные процедуры сбора данных в ТЗ, загрузки в ИБ из этих ТЗ. Нет конечно, если нет способа побороть этот парасик с помощью какой-нибудь опции/метода, тогда замутю с двойным запросом или детальным сбором по проводкам. Но хочется красивого и лаконичного решения. Уже вроде бы вышел из того возраста, когда делаешь лишь бы работало. Хочется некой изящности в коде, которая вызывает чувстово глубокого удовлетворения от проделанной работы. |
вместо одного запроса сбора данных - два. остальное без изменений |
(27) Согласен. |
(27) Хотя нет, три запроса. Счета с разным набором субконто в моем списке. |
(14) Попробовал использовать период - Проводку. Все классно, все дебетовые/кредитовые обороты по оборотным субконто выводит. Одна только ложка дегтя - обработка стала собирать данные в 6 раз дольше. Буду думать дальше. |
30-US1C > "По проводкам" всегда проигрыш в скорострельности против "по периоду". Особенно когда период опирается на границы месяцев... Таблица проводок не содержит же промежуточных итогов. Попробуй разбить запрос на два/три: по "сальдовым" и "оборотным" отдельно. Зато "по проводкам" - универсально для любых заморочек ;) |
(31) Да, похоже единственный вариант остался в несколько запросов. Никакие методы/опции не помогли. |
(32)Попробуйте передать в списке только счета группы, и добавить перед ВыполнитьЗапрос(), ВключатьСубсчета(1), а ненужные субсчета можно отсеить проверяя их присутствие в еще одном списке значений. |
Текущее время: 16:06. Часовой пояс GMT +3. |