Имя: Пароль:
1C
1C 7.7
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
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) днем не штырит...
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан