Имя: Пароль:
1C
1C 7.7
v7: Подскажите пожалуста (БухИт.ВыполнитьЗапрос() vs БухИт.Рассчитать())
, ,
0 Денисок
 
05.10.11
21:30
Вот так в модуле пишу. Должно происходить следующее, если на счете 41 не хватает товара, то выдается сообщение и операция не проводиться, если же товар есть, то делаем проводку. Проблема в том, что я не знаю как прописать что бы по субконто выбирался товар который я выбрал в табличной части документа, программа же перебирает все товары по которым когда либо составлялись проводки по 41 счету и выдает типо (например я выбрал товар сверла):

По товару Отвертки запрашиваемых 5 шт нет
По товару Гвозди запрашиваемых 5 шт нет
а вот по товару Сверла делает проводку потому что они есть на складе

Если прерывать цикл, то все нормально, но при выборе двух товаров в документе, он проводит только один.

Процедура ОбработкаПроведения()

Дата1 = "01.01.2000";
Дата2 = ТекущаяДата();  
Номерок = НомерДок;  
   
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
       
БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Основной);
БухИтоги.ИспользоватьСубконто("Товары");
БухИтоги.ВыполнитьЗапрос(Дата1,Дата2,"41");

БухИтоги.ВыбратьСчета();
Пока БухИтоги.ПолучитьСчет() = 1 цикл

БухИтоги.ВыбратьСубконто(1);
Пока БухИтоги.ПолучитьСубконто(1) = 1 цикл

Бух = БухИтоги.СКД("К");
Если (Бух - Количество )<0 тогда
Предупреждение("На складе не хватает товара");
Сообщить ("По товару "+БухИтоги.Субконто(1)+" "+"из требующихся "+Количество+" "+"шт. на складе только "+строка(БухИтоги.СКД("К"))+" "+"шт.");

иначе  

ПривязыватьСтроку(1);
Операция.СуммаОперации = Итог("Сумма");
Операция.Содержание = "Реализация";
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("62");  
Операция.Дебет.Контрагенты = Контрагент;        Операция.Дебет.Субконто(ВидыСубконто.Контрагенты,Контрагент);
Операция.Кредит.Счет = СчетПоКоду("41");
Операция.Кредит.Товары = Товар;  
Операция.Количество = Количество;  
Сообщить("Запись проводки: Дебет 62 (Субконто: "+Контрагент+") "+"Кредит 41 (Субконто: "+Товар+")");
Операция.Сумма = Сумма;        
Операция.Записать();  
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;  
КонецПроцедуры
1 Rie
 
05.10.11
21:34
(0) Открой для себя, что у ИспользоватьСубконто есть второй параметр (например, в качестве него можно указать товар) и третий параметр (его можно, к примеру, задать равным 2).
2 Эльниньо
 
05.10.11
21:34
БухИтоги.Рассчитать(<НачалоПериода>,<КонецПериода>,<ФильтрПоСчетам>,<ТолькоСинтетика>,<ПланСчетов>,<РазделительУчета>)
//
БухИтоги.ДО(<Счет>,<ТипСуммы>,<Валюта>,<Субконто1...>)
3 Эльниньо
 
05.10.11
21:36
(1) Не то советуешь.
4 Денисок
 
05.10.11
21:50
Все ребят спасибо. Получилось. Больше не ругается на товар, к который я ему даже не указываю :) Дело на самом дел было в использование субконто. Rie отдельное спасибо!
5 Денисок
 
05.10.11
21:51
Вот только не понял, что значит можно задать двум?
6 Денисок
 
05.10.11
21:54
Эльниньо, он у меня ругается на Рассчитать, но все равно спасибо. А то мучаюсь второй день, все вроде норм, но немного не работает. У самого идей нет, а спросить не у кого :)
7 Эльниньо
 
05.10.11
22:30
БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
   БухИтоги.Рассчитать(, ТекущийДокумент, "41",, ПланыСчетов.Основной);
   ВыбратьСтроки();
   Пока ПолучитьСтроку()=1 Цикл
       Бух = БухИтоги.СКД("41", "К",, Товар);
       Если (Бух - Количество )<0 тогда
           //Предупреждение("На складе не хватает товара"); //Вот за это бьют больно
           Сообщить("На складе не хватает товара" + Товар);
...
8 NS
 
05.10.11
22:42
Вопрос на засыпку, во сколько раз сочетание бух. функций и рассчитать() медленней чем выполнитьзапрос()?
9 Эльниньо
 
05.10.11
22:52
(8) На каждую строку дока (а если их тысячи):

ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
       
БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Основной);
БухИтоги.ИспользоватьСубконто("Товары");
БухИтоги.ВыполнитьЗапрос(Дата1,Дата2,"41");

БухИтоги.ВыбратьСчета();
Пока БухИтоги.ПолучитьСчет() = 1 цикл

БухИтоги.ВыбратьСубконто(1);
Пока БухИтоги.ПолучитьСубконто(1) = 1 цикл
...
по-любому будет гораздо медленнее временных БИ.
10 NS
 
05.10.11
22:54
(9) Что за глупость? Кто так пишет? Кто БИ в цикле считает?
У ПолучитьСубконто() и других методов есть параметры.
11 Денисок
 
05.10.11
22:57
Так работает, а как нужно по хорошему написать этот модуль?
12 Guk
 
05.10.11
22:58
(11) по хорошему можно обойтись одним запросом...
13 Денисок
 
05.10.11
22:58
У меня документ реализация, как мне просмотреть что находиться в табличной части, если не делать цикл?
14 Азат
 
05.10.11
22:58
ВыгрузитьТабличнуюЧасть()
15 Денисок
 
05.10.11
22:58
а запросом :) Ну эт я еще не очень умею
16 Азат
 
05.10.11
22:59
(15) а зачем запросом? в чем принципиальность?
17 Guk
 
05.10.11
22:59
(15) одним бухзапросом...
18 Попытка1С
 
05.10.11
22:59
Что ты тут придумываешь, типовую бухню открой и посмотри как там сделано. Запрос идет по списку товара.
19 Попытка1С
 
05.10.11
23:00
СписокТоваров = СоздатьОбъект("СписокЗначений");
   ВыгрузитьТабличнуюЧасть(СписокТоваров, "Товар");
   БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
   БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклатура, СписокТоваров, 2);
   БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХранения);
   БухИт.ВыполнитьЗапрос(,ТекущийДокумент(),"21, 43, 41.1, 41.2, 41.3, 41.4",,,,,"СК");
20 Сияющий Асинхраль
 
05.10.11
23:00
(9) чушь сморозил, так хоть не настаивай на ней. Загляни в код типовой бухи
21 Денисок
 
05.10.11
23:09
Здорово конечно, намного меньше писать, да и проще. А как мне потом с Запросом сделать сравнение есть у меня на этом счете столько или нет?
22 NS
 
05.10.11
23:09
(16) см. (8)
23 NS
 
05.10.11
23:10
(21) Получитьсчет, получитьсубконто - у обоих методов есть параметры.
24 Денисок
 
05.10.11
23:14
Всё, более менее понял, всем спасибо парни, помогли и на будущее знать буду.
25 Эльниньо
 
05.10.11
23:15
(20) Ну ... видел я типовую. Писанно-переписанно на бухкомпоненте.
Никогда не было тормозов на временных БИ. Даже, кода в форме списка выводились остатки.
Ну ежели наносекундами меряться - тады да.
26 NS
 
05.10.11
23:21
(25) Не было по твою душу более-менее крупных фирм.
Там разница в скорости - в многие разы.
27 Эльниньо
 
05.10.11
23:22
Кстати о типовой. В УСН 21 раз встречается Ит.Рассчитать()
28 Денисок
 
05.10.11
23:38
Разница только в скорости? Или еще какие нибудь нюансы есть?
29 NS
 
05.10.11
23:39
(27) В каком контексте?
(28) Разница в скорости, при этом огромная.
ИМХО нужно себя сразу приучать писать быстроработающий код.
30 Эльниньо
 
05.10.11
23:41
(28) Думаю ты разницы в скорости не почувствуешь.

А по-правильному - вынеси эту проверку в модуль формы
31 Эльниньо
 
05.10.11
23:43
(29) Быстроработание от многих факторов зависит.
Часто выборка с условими бывает быстрее запроса.
Часто Рег.ВыгрузитьИтоги() с фильтром бывает быстрее запроса.
32 NS
 
05.10.11
23:45
(30) Ну-ну, разницу в 10 раз не почувствуешь...
33 Эльниньо
 
06.10.11
10:09
(28) Если решишь остановится на запросе - код в (0) надо переписать полностью.
34 Денисок
 
06.10.11
12:12
Не, именно этот код я оставлю как есть, но запрос штука интересная. У меня еще вопрос, а если циклы поместить между НАчатьТранзакция()и ЗафиксироватьТранзакцию() скорость видь увеличиться в разы тоже? Или транзакция не используется в таких случаях?
35 Rie
 
06.10.11
12:15
(34) В модуле документа? :-) Он и так в транзакции выполняется.

А код из (0) лучше перепиши. Три вложенных цикла - это слишком.
36 Денисок
 
06.10.11
12:19
В транзакции? :) Спасибо, я этого не знал. А что еще в транзакции выполняется, можешь написать если не сложно?
37 Rie
 
06.10.11
12:21
(36) А ещё то, что написано после НачатьТранзакцию до ЗафиксироватьТранзакцию/ОтменитьТранзакцию :-)

Причём транзакция в 1С может быть только одна (вложенных не бывает).
38 Сияющий Асинхраль
 
06.10.11
12:23
(34) Именно этот код в неизменном виде может тебе дать неправильные данные, достаточно в документе встретится двум строкам с одинаковой номенклатурой, так что переписать не просто желательно, а необходимо...
39 Cthulhu
 
06.10.11
12:25
(37): в доке хитрее: не "не бывает", а "не поддерживаются". как говорится, почувствуйте разницу. на своей шкуре чувствовать не рекомендуется, но из встреченных результатов проведения документов в программной тразнакции (НачатьТранзакцию...) очень ярко помнится, например, наличие движений по регистрам у НЕ проведенных документов...
40 Сияющий Асинхраль
 
06.10.11
12:36
(0) Да, только сейчас заметил, прикольный у тебя документ получается, который при проведении в разные дни будет тебе выдавать разные результаты. Сегодня запишешь и проведешь - один результат, через пару дней зайдешь в него проведешь - другой результат, через неделю - третий. Я бы поубивал за такую писанину :-)
41 Денисок
 
06.10.11
12:50
(40) слушай, подскажи пожалуйста в каком месте так происходит? И почему, я этого не вижу просто :(
42 Денисок
 
06.10.11
12:52
Говоря о транзакциях, значит Документ имеет "встроенную" транзакцию, в остальных местах нужно прописывать?
43 Сияющий Асинхраль
 
06.10.11
12:53
:-)
Дата2 = ТекущаяДата();
Каждый новый день, ТекущаяДата() выдает тебе новую дату, естественно и результаты будешь получать разные, на разные даты.
К тому же смотри еще (38)
44 Денисок
 
06.10.11
12:59
(43) Насчет этого (38) понял, правда чертовщина выйдет, спасибо. А вот с этим как быть Дата2=ТекущаяДата();
Я думал в запросе:
БухИтоги.ВыполнитьЗапрос(Дата1,Дата2,"41");
я таким образом укажу весь период с 2000 года по сегодняшний день или я не так в общее понял как этим пользоваться?
45 Сияющий Асинхраль
 
06.10.11
13:03
А что непонятно? Дата2 у тебя не должна меняться в зависимости от того в какой день ты проводишь этот документ, например,
Дата2 = ДатаДок;
Т.е. Дата2 равна дате текущего документа, в какой день не войди в этот документ и, если перепроводишь его без изменения даты, тогда результат не должен поменяться
46 Денисок
 
06.10.11
13:11
аа всё понял :) Спасибо. Я еще сам напутал, у меня примерно похожий код в модуле формы, проверяет товар. А насчет проведения это я не подумал и засунул тоже самое в обработку. :)
47 Денисок
 
06.10.11
13:13
(42) а вот с этим не подскажешь?
48 Сияющий Асинхраль
 
06.10.11
13:20
(47) А зачем прописывать в остальных местах? Лет семь кодил на бухии - за семь лет практически не приходилось использовать транзакции. Если они и нужны реально, то очень редко. Просто учись сразу код оптимально писать. Скажем, код в (0) написан крайне неоптимально и тормозно. Как надо писать тебе показали в (19), а более полно достаточно зайти в типовой документ РасходнаяНакладная в бухии, там очень наглядный пример как это делается, единственное, лишние счета оттуда поубирать...
49 Денисок
 
06.10.11
13:22
Хорошо, спасибо за помощь и разъяснения, буду учиться :)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.