Имя: Пароль:
1C
1C 7.7
v7: Как выбрать дату последней операции? (бухгалтерия)
,
0 tassman
 
02.10.12
09:10
ВыбСч = СчетПоКоду("10");
ВыбКорСч = СчетПоКоду("60");

Запрос = СоздатьОбъект("Запрос");    
   ТекстЗапроса = "
|Период с '01.01.2011' по ВыбКонПериода;
|ОбрабатыватьОперации Все;
|Док = Операция.ТекущийДокумент;
|Сч = Операция.Дебет.Счет;
|КорСч = Операция.Кредит.Счет;
|МХ = Операция.Дебет.МестаХранения;
|НомНомер = Операция.Дебет.Материалы.Код;
|СумСтор = Операция.Сумма;
|Группировка День;
|Группировка МХ упорядочить по МХ.Код;
|Группировка НомНомер;
|Условие (Сч в ВыбСч);
|Условие (КорСч в ВыбКорСч);
|Условие (СумСтор > 0);";

Заполняю в таблицу значений все операции (Д10 - К60) фильтрую по убыванию и беру (через цикл) первые записи (по МХ и НомНомер) соответственно.
Время затраченное на всё это 5 минут. А нужно анализировать с 2005 года, что увеличит время выполнения до 25 минут! Это долго!

Подскажите как можно ещё найти дату последней операции с минимальными временными затратами соответственно? спс!
1 PuhUfa
 
02.10.12
09:19
(0) если тебе нужно просто дату последней операции то зачем вообще запрос?
2 tassman
 
02.10.12
09:26
Через запрос и смотрю дату последней операции! т.е. получаю все даты всех операций, а потом через цикл и условие сам нахожу дату последней!

Ну можно ещё так:
би = СоздатьОбъект("БухгалтерскиеИтоги");
би.ИспользоватьСубконто(ВидыСубконто.МестаХранения,,1);
би.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
би.ВыполнитьЗапрос('01.01.2011', ВыбКонПериода, "10","6",,2,"День","СК");
и т.п.
Но время обработки такое-же как и с Запросом!

Можно ли найти каким другим способом дату последней операции? (с минимально затраченным временем). Какие ещё есть способы!?
3 tassman
 
02.10.12
09:29
*не 6 а 60 сч. Опечатался!

у Документов есть метод:
ОбратныйПорядок(<Режим>)
Назначение:
Установить порядок выборки документов во времени.
Возвращает значение порядка выборки до вызова:   1 - выборка документов в порядке убывания даты и времени;  0 - в порядке возрастания.

Можно ли что-то аналогичное с проводками сделать или нет?!
4 PuhUfa
 
02.10.12
09:36
5 tassman
 
02.10.12
10:02
"Операция - тоже документ, только маленький сапсем!" - согласен.
а вот анализировать придется:
видДокумента, Номенклатуру и МестаХранения!
и всё это выливается в сложную (и скорее всего долгую) выборку по указанным параметрам, ничем не уступающую запросу...
или?
6 BlackSeaCat
 
02.10.12
10:11
По любому, выбирать запросом ВСЕ операции за период лишь для того, чтобы найти среди них ОДНУ - глупо.

Перебор прервется как только будет найдена нужная операция. По продолжительности это сработает ОДИНАКОВО с запросом лишь в одном случае - если искомая операция была ПЕРВОЙ в периоде, во всех остальных будет быстрее.

Хотя, при способности 1Сников наворотить неоптимальный код лично я ни за что не поручусь.
7 zak555
 
02.10.12
10:13
что ты из этой операции хочешь получить ?
8 tassman
 
02.10.12
10:18
Задача такая!
На склады приходят материалы. (Д10 - К60). Нужно выбрать дату последнего поступления КАЖДОГО материала с учетом Склада на который он поступил. (т.е. выборка по "ключам" Материал + МестоХранения.
1-ин и тотже материал может поступать в разные периоды на разные склады, а выводить нужно только последние поступления (а точнее их Даты)
9 zak555
 
02.10.12
10:27
ну узнаешь ты дату последнего прихода материала
дальше что ?
10 Classic
 
02.10.12
10:31
Забудь про черный запрос по счетам. Юзай бухитоги.
11 tassman
 
02.10.12
10:36
Это часть отчета! (небольшая часть) Где анализируется неликвидность материала.
Смысл такой, что есть Центральные склад на них приходит материала, эти склады передают материал в обычные склад(кладовки), а уже с этих "кладовок" анализируется расход и отпуск материала. Вот и нужно узнать когда была последняя поставка материала, для статистики, а то засем его закупать, если он заляживается и становится неликвидным в "кладовке". (п.с. может не совсем верно объяснил, но всё равно вопрос в силе) "Как выбрать дату последней операции?"

Если возможно с использованием 1сpp тоже можно... (сам с запросами просто мало работал)
Спасибо всем кто поможет!!!
12 BlackSeaCat
 
02.10.12
10:39
Помогаю: если не можешь выстроить быстрый алгоритм - делай запросом. А на вопросы: "Почему так долго работает?" важно надувай щеки и закатывай глаза.
13 Mikeware
 
02.10.12
10:43
"заляживается в кладовке" - неплохо...
-------
(11) "спасибо" - мало...
14 tassman
 
02.10.12
10:46
"заляживается в кладовке" - неплохо...
:) можно ещё к пунктуации придраться ...

Пробую пока через доки делать.
15 Mikeware
 
02.10.12
10:47
(14) делай прямым запросом
16 BlackSeaCat
 
02.10.12
10:56
(13) "заляживается" - а перед этим "засем закупать", так и просится: "насяльника..."
17 zak555
 
02.10.12
15:21
(11) сделай забалансовый счёт с аналитикой датой
18 tassman
 
02.10.12
18:49
(11) сделай забалансовый счёт с аналитикой датой
Нет прав на такое! Нужен аналитический отчет по изложенной выше теме. Используя текущий счет 60. И ещё учитывая операции вводимые вручную. Т.Е. от операций тут не уйти.
19 Эльниньо
 
02.10.12
19:13
(18) Нет прав на забалансовый - сделай на справочнике
20 tassman
 
02.10.12
19:18
(18) Нет прав на забалансовый - сделай на справочнике
Может в виду своего небольшого опыта, задам вопрос, а как мне это поможет анализировать множество проводок, начиная с 2005 года? Если создать забалансовый счет. это поможет только с новыми проводками? или я не прав. поправьте пожалуйста!
21 zak555
 
02.10.12
19:43
(18) и что тут ?
при записи операции добавляй соответствующую проводку по забалансовому счёту
22 tassman
 
02.10.12
19:48
(18) и что тут ?
при записи операции добавляй соответствующую проводку по забалансовому счёту
Какой записи? мне не надо ничего записывать, мне нужно анализировать уже выполненные операции! Те которые накопились с 2005 года, а не новые. Вот )
23 zak555
 
02.10.12
19:56
(22) написать обработку, которая сама пройдёт по операциям и где нужно добавит нужные проводки
24 Смотрящий от 1С
 
02.10.12
20:15
что то типа этого прямым запросом попробуй
Перем тз; //:ТаблицаЗначений
   
   рс = СоздатьОбъект("ODBCRecordset");
   //Данный фрагмент построен конструктором.
   //При повторном использовании конструктора внесенные вручную изменения будут потеряны!!!
   ТекстЗапроса = "-- qryMaker:Отчет1.2012.10.02.20.06.31
       |SELECT TOP 1 Операции.DOCID [Документ $Документ]
       |    , Операции.DATE_TIME_DOCID ДатаВремяИдДок
       |FROM _1SOPER AS Операции
       |ORDER BY Операции.DATE_TIME_DOCID
       |";
   тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
   тз.ВыбратьСтроку();
25 tassman
 
08.10.12
14:13
(24) СПС! А как обратиться к реквизиту выбранного документа?