Имя: Пароль:
1C
1C 7.7
v7: Как получить данные по оборотному регистру за неполный период в модуле проведени
0 Birmingem
 
30.03.15
15:19
В модуле проведения документа нужно получить данные из оборотного регистра за неполный период, например с 07.01.2015 по ТекущийДокумент() (при этом на момент до проведения документа).
Как это сделать?
Как я понял ИспользоватьПериод() и Итог() дают данные только за полный период?
А если черным запросом, возникает проблема, как правильно указать конец периода, с учетом сравнения с ТА? Чтобы запрос правильно давал данные и при интерактивном вводе документа, и при перепроведении документов за период.
1 Ёпрст
 
гуру
30.03.15
15:39
лучше прямым запросом..
2 Ёпрст
 
гуру
30.03.15
15:40
можно и чорным - указывай позицию документа, можешь сформировать предыдущую позицию дока
3 Birmingem
 
30.03.15
16:22
(1)прямыми запросами не владею
(2)так и сделал:
Кон=СформироватьПозициюДокумента(ТекущийДокумент(),-1)
Но тут засада. Эта полученная позиция, может оказаться позже позиции ТА, т.е. дата документа = дате ТА, а вот позиция позже, и соответственно запрос не работает.
4 Birmingem
 
30.03.15
17:36
Опытным путем определил, что черный запрос криво дает итоги по позицию документа. Дает на конец дня.
Придется определять предыдущий документ, и его подсовывать в запрос в качестве конечной даты периода.
Есть ли быстрый метод получить предыдущий документ, кроме как выборкой?
ОбратныйПорядок(<?>);
ВыбратьДокументы(<Дата1>,<Дата2>)
ПолучитьДокумент()
5 Ёпрст
 
гуру
30.03.15
17:39
сравнитьТа
6 Ёпрст
 
гуру
30.03.15
17:39
и им подобные методы.. делов то
7 Ёпрст
 
гуру
30.03.15
17:40
>>> Эта полученная позиция, может оказаться позже позиции ТА

Не может
8 Ёпрст
 
гуру
30.03.15
17:40
У вас чего, монопольно ТА назад ручонками двигают ?
9 Birmingem
 
30.03.15
17:46
(7)Не поверишь. Может.
Например, ТА на утреннем документе Списание. Я в модуле проведения вечернего документа Списание, сравниваю его позицию с позицией ТА. Так как ТА раньше, беру позицию -1. А это вполне может оказаться документ не относящийся к оперативному учету, например кассовый приходник, позиция которого тоже позже ТА.
10 Остап Сулейманович
 
30.03.15
17:50
(3) Кон = МИН(СформироватьПозициюДокумента(ТекущийДокумент(),-1), ПолучитьДатуТА());
11 Birmingem
 
30.03.15
17:50
Теперь задача получить быстро предыдущий (от текущего) документ.
Попытался так:

ПредПоз=СформироватьПозициюДокумента(ТекущийДокумент(),-1);
ПредДок="";
РазобратьПозициюДокумента(,,,,,ПредДок);

Но ПредДок оказывается пустым значением. Или не так делаю?
12 Birmingem
 
30.03.15
17:51
(11)РазобратьПозициюДокумента(ПредПоз,,,,,ПредДок);
13 Birmingem
 
30.03.15
17:53
(10) Не пойдет. Нужны данные до момента проведения текущего документа. ПолучитьДатуТА() даст на конец дня.
14 Остап Сулейманович
 
30.03.15
17:54
(13) Ни в коем случае. Получить либо позицию твоего документа, либо (если он еще не проведен по регистрам) позициюТА. То есть по любому до твоего документа.
15 Ёпрст
 
гуру
30.03.15
17:57
Херь какая то..
Если позиция дока > ТА то просто не указывай дату, или ставь дату ТА..
Всё.
16 Ёпрст
 
гуру
30.03.15
17:58
(13) И ? в твоём случае это и надо
17 Birmingem
 
30.03.15
17:59
Еще раз уточняю. Нужно в модуле проведения документа, черным запросом получить данные до проведения этого документа.
18 Остап Сулейманович
 
30.03.15
18:01
(17) Если Документ после ТА то и так все движения будут до документа. Других не будет.
Если Документ до ТА - код из (3) вполне годен.
19 Birmingem
 
30.03.15
18:03
(14) С получением позиции проблем нет. Проблема в том, что черный запрос в этом случае не дает данные до проведения документа, а вместе с движениями документа.
(15)именно херь. Дата ТА и дата документа совпадают. Поставив в запрос просто дату ТА, получаю данные на конец дня.
20 Birmingem
 
30.03.15
18:04
(18) так в запросе тогда, конечную дату какую указывать?
21 Ёпрст
 
гуру
30.03.15
18:05
(19) И ? если документ впереди позиции ТА, то это означает только, что он не проведен (или проведен, но без движений)

И брать итоги нужно на ТА.. всё
22 Ёпрст
 
гуру
30.03.15
18:05
(20) дату ТА или ничего (он сам возьмет её на ТА)
23 Birmingem
 
30.03.15
18:14
Кон=СформироватьПозициюДокумента(ТекущийДокумент());
Если Кон>ПолучитьПозициюТА() Тогда
Кон=ПолучитьДатуТА();
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Нач по Кон;
|Контр = Регистр.Реализация.Контрагент;
|СуммаБезСкидки = Регистр.Реализация.СуммаБезСкидки;
|Функция Сум = Сумма(СуммаБезСкидки);
|Условие(Контр = Контрагент);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Сум=Запрос.Сум;

Сделал. Запрос дает цифры вместе с движениями текущего документа.
Это происходит при штатном групповом перепроведении документов.
24 Остап Сулейманович
 
30.03.15
18:20
(23) Изначально было
Кон=СформироватьПозициюДокумента(ТекущийДокумент(), -1);
Зачем поменял на
Кон=СформироватьПозициюДокумента(ТекущийДокумент());
?
25 Birmingem
 
30.03.15
18:21
При этом в отладчике вот что показывает:
ПолучитьПозициюТА() = "#20150305         0         0   "
Что это значит? ТА не спозиционирована на документе?
26 Ёпрст
 
гуру
30.03.15
18:22
а так ?
Если Кон>ПолучитьПозициюТА() Тогда
  Кон=ПолучитьПозициюТА();
КонецЕсли;
27 Ёпрст
 
гуру
30.03.15
18:24
и.. в групповом перепроведении, та летит в потоке, там тоже были свои заморочки, а чорные запросы - зло :)
28 Birmingem
 
30.03.15
18:25
(24) Да, изначально так было. И так, и так пробовал. Результат тот же. Я подумал, может между ТА и предыдущим документом еще документы есть. Но даже если и так, запрос должен был дать цифры без учета текущего документа. А он зараза, все равно с этим документом дает. Выходит запрос с позицией документа криво работает.
29 Ёпрст
 
гуру
30.03.15
18:30
(28) свой запрос в какой момент вызываешь хоть ?
ДО записи движений в регистр ?
30 Ёпрст
 
гуру
30.03.15
18:30
или после ?
31 Birmingem
 
30.03.15
18:30
(26) Попробовал. Результат тот же
(27) Понимаю что запросом в модуле проведения не есть хорошо. А как по другому то с оборотным регистром быть?
ИспользоватьПериод() и Итог() не дают данных за произвольный период
32 Ёпрст
 
гуру
30.03.15
18:30
можешь и принудительно, очистить все движения по доку по этому регистру.
33 Ёпрст
 
гуру
30.03.15
18:32
ну и..примитив, |Условие Док<> ВыбДок воткнуть в текст запроса
34 Ёпрст
 
гуру
30.03.15
18:32
в ВыбДок - текущийДокумент()
35 Ёпрст
 
гуру
30.03.15
18:32
Док = регистр.Вася.ТекущийДокумент
36 Ёпрст
 
гуру
30.03.15
18:32
и передавай хоть конец дня
37 Birmingem
 
30.03.15
18:35
(29) ДРУГ, ты ГЕНИЙ!!!!!!!!
Запрос то у меня был после движений регистра. Воткнул его до движений, и получил что надо
38 Ёпрст
 
гуру
30.03.15
18:37
(37) есть такое, могла ТА на документ встать ужо
39 Birmingem
 
30.03.15
18:39
Но все равно не понятно, если в запрос передавать позицию, раньше текущего документа, то по идее этот документ в запрос не должен был попадать. Вот это меня и смутило и направило по ложному пути.
40 Birmingem
 
30.03.15
18:42
Да и хрен с ним. Заработало главное.
(38) Огромное тебе спасибо!!!
Пол дня с этим сегодня провозился. Уже крыша поехала. Вроде простейшая вещь, а никак ...