![]() |
![]() |
![]() |
|
v7: БухЗапрос - не получается вытащить даннные | ☑ | ||
---|---|---|---|---|
0
Злопчинский
28.07.11
✎
21:35
|
.
Суть: 41.1 Субконто1 = Номенклатура, учет по сумме и количеству, Субконто2 - Места хранения, учет только по количеству. . Задача: есть документ, с СчетДт = 41.1, рассчитать сумму по 41.1 и подставить в документ. . Проблема в получении количества на конкретном складе.. . ПозицияИтогов = СформироватьПозициюДокумента(Докум.ТекущийДокумент (),-1); БухИт = СоздатьОбъект("БухгалтерскиеИтоги"); БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 1); //сз - список значений с номенклатурйо документа БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХране ния, , 1); БухИт.ВыполнитьЗапрос(ПозицияИтогов,ПозицияИтогов, "41.1",,,1,,"СК"); Докум.ВыбратьСтроки(); Пока Докум.ПолучитьСтроку() = 1 Цикл СальдоСум = 0; КоличествоНаСкладах = 0; Если БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1)<>1 Тогда ТекстСообщения = "Строка "+Докум.НомерСтроки+": "+Докум.СубконтоДт1.Код+" "+Докум.СубконтоДт1+": нулевой остаток по счету 41.1, нет возможности определить сумму оприходования: требуется вмешательство оператора..."; глСообщениеПроведения(ТекстСообщения, Докум.ТекущийДОкумент(), -1); Иначе СальдоСум = БухИт.СКД("С"); КоличествоНаСкладах = БухИт.СКД("К"); КонецЕсли; ТекстСообщения = "Строка "+Докум.НомерСтроки+": "+Докум.СубконтоДт1.Код+" "+Докум.СубконтоДт1; Сообщить(ТекстСообщения+РазделительСтрок+СальдоСум + " "+КоличествоНаСкладах); // КоличествоНаСкладе = 0; // Если БухИт.ПолучитьСубконто(2,,Докум.СубконтоДт2)=1 // Тогда // КоличествоНаСкладе = БухИт.СКД("К"); // КонецЕсли; КонецЦикла; . если закоментарено - то СальдоСум = все как надо, . если расскомментарить - то СальдоСум - начиная с какой-то строки выдает нули.... . Резюмируюя: как в одном БухЗапросе получить СальдоСум по товару, Количество на всех складах и количество на конкретном складе? . спсб! |
|||
1
Злопчинский
28.07.11
✎
21:38
|
можно перефразировать вопрос:
. ПозицияИтогов = СформироватьПозициюДокумента(Докум.ТекущийДокумент (),-1); БухИт = СоздатьОбъект("БухгалтерскиеИтоги"); БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 1); //сз - список значений с номенклатурйо документа БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХране ния, , 1); БухИт.ВыполнитьЗапрос(ПозицияИтогов,ПозицияИтогов, "41.1",,,1,,"СК"); Докум.ВыбратьСтроки(); Пока Докум.ПолучитьСтроку() = 1 Цикл //1. как получить сальдо конечное дебетовое по сумме по текущему товару (субконтоДт1 в документе) //2. как получить сальдо конечное дебетовое по количеству на всех складах по текущему товару //3. как получить сальдо конечное дебетовое по конкретному складу (субконтоДт2 в документе) по текущему товару КонецЦикла; |
|||
2
Злопчинский
28.07.11
✎
22:06
|
.
вот так будет. . ПозицияИтогов = СформироватьПозициюДокумента(Докум.ТекущийДокумент (),-1); БухИт = СоздатьОбъект("БухгалтерскиеИтоги"); БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 1); БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХране ния, , 1); БухИт.ВыполнитьЗапрос(ПозицияИтогов,ПозицияИтогов, "41.1",,,1,,"СК"); Докум.ВыбратьСтроки(); Пока Докум.ПолучитьСтроку() = 1 Цикл БухИт.ПолучитьСубконто(2,,""); БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1); КоличествоНаСкладах = БухИт.СКД("К"); СуммаНаСкладах = БухИт.СКД("С"); БухИт.ПолучитьСубконто(2,,Докум.СубконтоДт2); КоличествоНаСкладе = БухИт.СКД("К"); КонецЦикла; . вот так вроде как будет верно...? |
|||
3
Cthulhu
28.07.11
✎
23:17
|
что за пляс4ки с позицией?
Задай интервал с документа по документ и дергай начальные (аккурад перед ним) и конечные (аккурат после него) сальды - ну и "между", сиречь полученные запросом проводки самого документа - в виде оборотов. |
|||
4
Guk
28.07.11
✎
23:22
|
да уж. задача выеденного яйца не стоит, а решение какое-то усугубленное...
|
|||
5
Cthulhu
28.07.11
✎
23:23
|
//(4): не-а.
БухИт.ВыбратьСубконто(ВидыСубконто.Номенклатура); Пока БухИт.ПолучитьСубконто(ВидыСубконто.Номенклатура)=1 Цикл <ЧоЧоТмц>=БухИт.Субконто(ВидыСубконто.Номенклатура); <ЧоЧоСумНачПоТмц>=БухИт.СНД("С"); <ЧоЧоКвоНачТмц>=БухИт.СНД("К"); <ЧоЧоСумКонПоТмц>=БухИт.СКД("С"); <ЧоЧоКвоКонТмц>=БухИт.СКД("К"); БухИт.ВыбратьСубконто(ВидыСубконто.МестаХранения); Пока БухИт.ПолучитьСубконто(ВидыСубконто.МестаХранения)=1 Цикл <ЧоЧоСклад>=БухИт.Субконто(ВидыСубконто.МестаХранения); <ЧоЧоКвоНачТмцНаСкладе>=БухИт.СНД("К"); <ЧоЧоКвоКонТмцНаСкладе>=БухИт.СНД("К"); КонецЦикла; КонеЦикла; //(5): а вот глумиться - излишне. дворники мы с ним. злые! |
|||
6
zak555
28.07.11
✎
23:56
|
про позиции : БИ на 00:00:02 от первых чисел каждого месяца
|
|||
7
Злопчинский
29.07.11
✎
00:00
|
Вы все - дятлы! причем дубовые конкретено.
интересует конкретный вопрос как по имеющимся значениям субконто выьащить итоги по ним из запроса, СМОТРИ П.1 |
|||
8
zak555
29.07.11
✎
00:01
|
БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 2);
|
|||
9
zak555
29.07.11
✎
00:03
|
БухИт.ВыполнитьЗапрос(,ТекущийДокумент(),"41.1",,,,,"СК")
|
|||
10
Злопчинский
29.07.11
✎
00:05
|
(8,9) спсаибо, это все у меня есть, вопрос не в этом.
|
|||
11
Злопчинский
29.07.11
✎
00:07
|
упрощеное решение нужной мне задачи (1) изложено в (2).
. суть в том, что если не делать БухИт.ПолучитьСубконто(2,,""); . то цифры будут не те, которые нужны... |
|||
12
Злопчинский
29.07.11
✎
00:07
|
(11) смутно я понимаю в чем дело, но хотелось бы послушать внятное объяснение...
|
|||
13
zak555
29.07.11
✎
00:08
|
(11) движения текДока учитывать ?
|
|||
14
zak555
29.07.11
✎
00:09
|
Если БухИт.ПолучитьСубконто(ВидыСубконто.Номенклатура,,ТаблицаДокумента.Товар) = 1 Тогда
СуммаНаСкладах = Макс(БухИт.СКД("С"), 0); КоличествоНаСкладах = БухИт.СКД("К"); Если БухИт.ПолучитьСубконто(ВидыСубконто.МестаХранения,,МестоХранения) = 1 Тогда КоличествоНаСкладе = БухИт.СКД("К"); Если СчетУчета = Сч41_2 Тогда СуммаНаСкладах = Макс(БухИт.СКД("С"), 0); КоличествоНаСкладах = БухИт.СКД("К"); КонецЕсли; КонецЕсли; КонецЕсли; |
|||
15
Сияющий Асинхраль
29.07.11
✎
00:10
|
А в чем проблема - запрос с использованием в виде субконто конкретной номры и складов по всем складам, а при выборке сначала получаешь выборку по опр номенклатуре и всем складам со своими остатками, а затем уже получаешь данные по опр складу
|
|||
16
Злопчинский
29.07.11
✎
00:10
|
(13) нет
|
|||
17
zak555
29.07.11
✎
00:11
|
так чем не нравится решение модуля расходной накладной из типовой бухии ?
|
|||
18
Злопчинский
29.07.11
✎
00:12
|
(14) неверный код, на "следующей" итерации цикла внутри которго это если - СальдоНаСкладах даст неверную цифру...
. курите бамбук |
|||
19
Злопчинский
29.07.11
✎
00:14
|
(15) см.1
|
|||
20
zak555
29.07.11
✎
00:15
|
(18) у тебя в ТЧ один и тот же товар несколько раз ?
|
|||
21
Злопчинский
29.07.11
✎
00:17
|
(14) заяву в (18) отзываю, поторопился...
|
|||
22
Злопчинский
29.07.11
✎
00:17
|
(20) нет
|
|||
23
zak555
29.07.11
✎
00:18
|
Злопчинский ты бы написал по-человечески :
1. что хочешь получить 2. почему тебя стандартный код, который сделан в том веку не устраивает |
|||
24
zak555
29.07.11
✎
00:19
|
+ какие исходные данные
|
|||
25
zak555
29.07.11
✎
00:19
|
если учесть (20) - то открывай бюджетку 77
там и это учитывается |
|||
26
Сияющий Асинхраль
29.07.11
✎
00:20
|
(19) пост (15) это описание (14) и это работает уже не первый год во всех типовых от 1с не выдавая никаких ошибок
|
|||
27
Злопчинский
29.07.11
✎
00:20
|
(23) все написано в (1)
|
|||
28
Guk
29.07.11
✎
00:21
|
(7) спокойнее пожалуйста. я пока кроме автора, дятлов в ветке не вижу. если такой опыт под ником и при этом не решить такую элементарнейшую задачу, то надо уходить из профессии...
|
|||
29
Злопчинский
29.07.11
✎
00:25
|
ok.
код в (14) по всей видимости будет правильные данные давать... . трабла моя скорее всего связана с неаккуратным кодом. . вот такой код - будет давать неверные данные.. . Докум.ВыбратьСтроки(); Пока Докум.ПолучитьСтроку() = 1 Цикл СуммаНаСкладах = 0; КоличествоНаСкладах = 0; Если БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1)=0 Тогда Сообщить("траляля"); Иначе СуммаНаСкладах = БухИт.СКД("С"); КоличествоНаСкладах = БухИт.СКД("К"); КонецЕсли; КоличествоНаСкладе = 0; Если БухИт.ПолучитьСубконто(2,,Докум.СубконтоДт2)=1 Тогда КоличествоНаСкладе = БухИт.СКД("К"); КонецЕсли; КонецЦикла; |
|||
30
zak555
29.07.11
✎
00:25
|
ТаблицаДокумента = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТаблицаДокумента, "Товар,Количество,НДС,НП,Всего"); ТаблицаДокумента.НоваяКолонка("СтавкаНДС"); ТаблицаДокумента.НоваяКолонка("СтавкаНП"); ТаблицаДокумента.НоваяКолонка("Комитент", "Справочник.Контрагенты"); ТаблицаДокумента.НоваяКолонка("ДоговорКомиссии", "Справочник.Договоры"); ВыбратьСтроки(); Пока ПолучитьСтроку() = 1 Цикл Если Товар.Выбран() = 0 Тогда ТекстСообщения = "В строке "+НомерСтроки+" не указан товар."; глНеПроводить(Контекст, ТекстСообщения); Возврат; ИначеЕсли КодВидаОтгрузки >= 3 Тогда // // возврат поставщику товара Если Товар.ТипНоменклатуры <> Перечисление.ТипыНоменклатуры.Товар Тогда ТекстСообщения = "В строке "+НомерСтроки+" указан не покупной товар."; глНеПроводить(Контекст, ТекстСообщения); Возврат; КонецЕсли; КонецЕсли; ТаблицаДокумента.ПолучитьСтрокуПоНомеру(НомерСтроки); ТаблицаДокумента.СтавкаНДС = глСтавкаНалога(Контекст, "НДС"); ТаблицаДокумента.СтавкаНП = глСтавкаНалога(Контекст, "НП"); // Для расчета аванса необходимо разделить выручку от // продукции (работ, услуг) и выручку от покупных товаров. Если Товар.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар Тогда Если Товар.ТипТовара <> Перечисление.ТипыТоваров.НаКомиссии Тогда ВыделенныйНДС = ВыделенныйНДС + НДС; // необходимо учесть при возврате товара поставщику Иначе Если КодВидаОтгрузки >= 3 Тогда // возврат поставщику товара, принятого на комиссию ТаблицаДокумента.Комитент = Контрагент; ТаблицаДокумента.ДоговорКомиссии = Договор; Иначе ТаблицаДокумента.Комитент = Комитент; ТаблицаДокумента.ДоговорКомиссии = ДоговорКомиссии; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; БухИт = СоздатьОбъект("БухгалтерскиеИтоги"); БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклатура, СписокТоваров, 2); БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХранения); БухИт.ВыполнитьЗапрос(,ТекущийДокумент()," 41.1",,,,,"СК"); ТаблицаДокумента.Свернуть("Товар,Комитент,ДоговорКомиссии,СтавкаНДС,СтавкаНП","Количество,НДС,НП,Всего"); ТаблицаДокумента.Свернуть("Товар,Комитент,ДоговорКомиссии,СтавкаНДС,СтавкаНП","Количество,НДС,НП,Всего"); ТаблицаДокумента.ВыбратьСтроки(); Пока ТаблицаДокумента.ПолучитьСтроку() = 1 Цикл Если БухИт.ПолучитьСубконто(ВидыСубконто.Номенклатура,,ТаблицаДокумента.Товар) = 1 Тогда СуммаНаСкладах = Макс(БухИт.СКД("С"), 0); КоличествоНаСкладах = БухИт.СКД("К"); Если БухИт.ПолучитьСубконто(ВидыСубконто.МестаХранения,,МестоХранения) = 1 Тогда КоличествоНаСкладе = БухИт.СКД("К"); КонецЕсли; КонецЕсли; КонецЦикла% |
|||
31
Злопчинский
29.07.11
✎
00:27
|
(28) вы главное тоже не волнуйтесь... а то в (4 и 5) по существу ничего не сказано... ;-)
. |
|||
32
zak555
29.07.11
✎
00:27
|
почему ты пишешь ?
БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 1); вместо БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклату ра, СЗ, 2); ??? |
|||
33
zak555
29.07.11
✎
00:28
|
(31) в (5) ответ дан, только по нет получения остатка по конкретному складу
|
|||
34
Злопчинский
29.07.11
✎
00:28
|
(30) угумс...
а вот (29) - кривые данные будет давать.. |
|||
35
viktor_vv
29.07.11
✎
00:29
|
Если БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1)=0
Тогда Сообщить("траляля"); Продолжить ; Иначе |
|||
36
Злопчинский
29.07.11
✎
00:29
|
(33) в (5) фигня написана (по существу вопроса). Меня не интересовало
БИ.ВЫБРАТЬСУБКОНТО(1) Пока БИ.ПОЛУЧИТЬСУБКОНТО(1)=1 . меня интересовало позиционирование на конкретное субконто без открытия выборки |
|||
37
Сияющий Асинхраль
29.07.11
✎
00:31
|
(32) прикольно, твой код вижу весь, а код тс - ни строчки. Я с мобильника :-(
|
|||
38
Злопчинский
29.07.11
✎
00:31
|
(35) это, наверное "плохое" решение... потому что количество на всех складах=0, а если развернуть
то склад1=10, склад2 = -10, .. поэтому желательно идти дальше, арне уходить на следующий товар.. ??? |
|||
39
zak555
29.07.11
✎
00:32
|
Злопчинский а как на счёт (32) ?
|
|||
40
Злопчинский
29.07.11
✎
00:33
|
(39) одновалентно - итак работает и так..
|
|||
41
viktor_vv
29.07.11
✎
00:35
|
(38) Нет.
Если БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1)=0 Тогда Это значит в этой выборке вообще нет требуемого товара. Соотвественно и выполнение дальнейшего кода смысла не имеет. |
|||
42
Злопчинский
29.07.11
✎
00:36
|
(39) в чем конкретная причина что в (29) - код дает кривые данные..?
. в том, что БухИт.ПолучитьСубконто(2,,Докум.СубконтоДт2) выполняется независимо от результата получения БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1)...? |
|||
43
Злопчинский
29.07.11
✎
00:38
|
(41) согласен, так и есть..., это я обкатал, когда траблу вылавливал...
|
|||
44
viktor_vv
29.07.11
✎
00:40
|
(42) Скорее всего в таком варианте выборка по Субконто1 остается на предыдущем значении и соотвественно дальнейший код выполняется для предыдущего успешного выполнения
БухИт.ПолучитьСубконто(1,,Докум.СубконтоДт1) |
|||
45
Сияющий Асинхраль
29.07.11
✎
00:41
|
(40) это не одновалентный код
|
|||
46
Злопчинский
29.07.11
✎
00:43
|
(44) да, там получается как раз на нулевой выборке первого субконто - тогда второе субконто отрабатывает как установка конкретного склада, и на следующей итерации (строке документа с тем же самым складом но другой номенклатурйо) сумма на всех складах равна 0....
|
|||
47
Злопчинский
29.07.11
✎
00:44
|
(45) в части получения сумм и количеств на всех складах + количество на конкретном складе - вроде получается одинакоково...
|
|||
48
Злопчинский
29.07.11
✎
00:46
|
(47).. хотя настаивать на этом не буду, ввиду несильности в бухкомпоненте.
|
|||
49
Сияющий Асинхраль
29.07.11
✎
00:48
|
А в части оптимальности запроса далеко не одновалентны. Пиши красиво, а не как попало
|
|||
50
Злопчинский
29.07.11
✎
00:49
|
(49) а данном случае как правильно юзать - 1 = разворачивать или 2 - отбирать, если СЗ - списокзначений.?
|
|||
51
Злопчинский
29.07.11
✎
00:50
|
(49) насчет писать "красиво, ане как попало" - это согласен.
вот надысь "написал" красиво - по деньгам это вышло раза в 2 с половиной больше... - посмотрм как оплатят.. ;-) |
|||
52
Сияющий Асинхраль
29.07.11
✎
00:52
|
2 - отбирать
|
|||
53
Злопчинский
29.07.11
✎
00:59
|
(52) Если возможно пояснить - почему?
|
|||
54
Злопчинский
29.07.11
✎
02:04
|
Всем спасибо, мозги прочистились немножко.
|
|||
55
zak555
29.07.11
✎
07:43
|
заходи ещё =)
|
|||
56
Cthulhu
29.07.11
✎
19:23
|
(36): Код в (5) достаточен для понимания ответа, дятел ты, Цугундер. Достаточно в синтаксис на ПолучитьСубконто глянуть, и вместо цикла заюзать "Если". Перед твоими ПолучитьСубконто стоит ВыбратьСубконто?
"тя не ето интересовало" - готовый код как для попки-дурака штоль??? огорчил ты мя вопчем. |
|||
57
Злопчинский
30.07.11
✎
00:10
|
(56) я свои ошибки осознал уже!.
. "огорчил ты мя вопчем." - нельзя тебе с таким подходом в дворники.. никак нельзя.. весь дом с ритма сбивать будешь.. |
|||
58
Злопчинский
30.07.11
✎
00:14
|
кстати, с прямым позиционированием на значение субконто - вообщем-то работает и без ВыбратьСубконто().
. и если в цикле по товарам/складам нужно прямо позиционироваться на значения субконто1 и субконто2 - ВыбратьСубконто(1) и выбратьСубконто(2) - где стоять должно - перед циклом по товарам или перед каждым получитьсубконто()...? - непонятно.. не клеится... |
|||
59
Сияющий Асинхраль
30.07.11
✎
00:39
|
Ты прав, при позиционировании на конкретное значение выбрать субконто не обязательно. Проверено не одной тысячей строчек кода. При наличии циклов - соответствующая выборка делается перед соответствующим циклом. Да и кстати поглядел я твой код - твоя ошибка была в том, что ты выбирал второе субконто, когда выборка первого оказывалась пуста, обрати внимание, что в рабочем коде идет либо цикл в цикле, либо если в если, а не так как у тебя - независимо друг от друга
|
|||
60
Злопчинский
30.07.11
✎
00:41
|
(59) угу, именно так... даже не так.. когда выборка первого оказывалась пуста, выборка второго срабатывала как выборка первого и на следующем итерации цикла - выборка первого получалась как выборка второго.. со всеми вытекающими последствиями...
|
|||
61
ДенисЧ
30.07.11
✎
01:09
|
хм....
Такой длинный хвостик и так эффектно сел в лужу :-)) |
|||
62
Злопчинский
30.07.11
✎
01:45
|
В лужу надо садиться весело, с шутками-прибаутками и с чувством собственного достоинства.. или с чувством пофигизма.. ;-)
|
|||
63
chief accountant
30.07.11
✎
07:52
|
(62) Спать надо по ночам. А то как полночь - тебя на бухию тянет...
|
|||
64
Злопчинский
30.07.11
✎
13:25
|
(63) днем не штырит...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |