|
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
|
Хорошо, спасибо за помощь и разъяснения, буду учиться :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |