Имя: Пароль:
1C
1C 7.7
v7: Получить последнее движение по регистру.
0 Andreyyy
 
09.11.12
08:08
Чем можно заменить этот тормозной код выполняющийся в цикле:

ВремЦеныНаСкладах = СоздатьОбъект("Регистр.ЦеныНаСкладах");
           ВремЦеныНаСкладах.УстановитьЗначениеФильтра("Склад", СкладПриемник);
           ВремЦеныНаСкладах.УстановитьЗначениеФильтра("Товар", Товар);
           ВремЦеныНаСкладах.ОбратныйПорядок(1);
           ВремЦеныНаСкладах.ВыбратьДвижения('01.09.2012', ДатаДок);
           Если ВремЦеныНаСкладах.ПолучитьДвижение() > 0 Тогда
               Цена = ВремЦеныНаСкладах.Цена;
           КонецЕсли;
1 zak555
 
09.11.12
08:10
это типа рс периодический ?
2 ДенисЧ
 
09.11.12
08:10
select top 1 * from $Регистр.ЦеныНаСкладах рег
order by рег.date_time_iddoc
3 aka AMIGO
 
09.11.12
08:13
(1)это 7-ка.
(0) выбирай документы поступления черным запросом
авось поможет
4 ДенисЧ
 
09.11.12
08:15
(3) А что, в 7.7.28 появилось в запросе Упорядочить УБЫВ?
5 Andreyyy
 
09.11.12
08:34
(2) Это по всей видимости 1С++ ? так и придется браться за изучение.
6 ДенисЧ
 
09.11.12
08:38
(5) Он. Но можно и простым ADO :-)
7 Andreyyy
 
09.11.12
08:43
(6) Не легче)
8 aka AMIGO
 
09.11.12
08:45
(4)нет, еще 28 пока не появилась :)
9 dk
 
09.11.12
08:50
зависит от цикла и объема данных
можно
1. выбрать в ТЗ все движения по фильтру склад + список номенклатуры
2. отсортировать по дате / документам
3. в цикле искать уже по ТЗ
--
но если много оборотов или список номенклатуры большой, то можно проиграть в скорости
10 Ёпрст
 
гуру
09.11.12
10:15
(4) давно.. по функции можно упорядочить в любом прорядке, почти всё что угодно
11 Andreyyy
 
16.11.12
21:34
Подниму ветку.
(2) Мне удалось одолеть запуск запроса на 1С++ в DBF, вот что получилось:

ТекстЗапроса = "
     |select top 1
     |$рег.Склад as Товар,
   |$рег.Поставщик as Поставщик,
   |$рег.Товар as Товар,
   |$рег.ТипЦеныНаСкладе as ТипЦеныНаСкладе,
   |$рег.Цена as Цена,
   |рег.DATE as Дата
     |from $Регистр.ЦеныНаСкладах as рег
     |WHERE
     |$рег.Склад = :Склад  AND
   |$рег.Поставщик = :Поставщик  AND      
   |$рег.Товар = :Товар
   |order by рег.Date";

Поля "date_time_iddoc" в DBF по видимому нет + выдает первое значение по движению, а не последнее.

Отсюда два вопроса:
1. Как сделать упорядочивание не только по дате, но и по времени.
2. И как получить последнее движение, как в (0).
12 КонецЦикла
 
16.11.12
21:40
Заглянул бы хоть в дбф и dd
Там отдельные поля для даты, времени и иддок
13 Andreyyy
 
16.11.12
21:43
(12) С временем разобрался вроде |order by рег.DATE,рег.TIME
но какая инструкция нужна для сортировки в обратном порядке не знаю.
14 КонецЦикла
 
16.11.12
21:46
ORDER BY ... DESC
15 Andreyyy
 
16.11.12
21:51
(14) При варианте order by рег.DATE,рег.TIME DESC
Выдает первую запись.
А если order by рег.DATE DESC, то не отрабатывает "TOP", но сортирует правильно.
16 Andreyyy
 
16.11.12
21:51
+(15) т.е. выдает все записи
17 Andreyyy
 
16.11.12
21:52
Наверное вот так правильно |order by рег.DATE DESC,рег.TIME DESC ?
Но как избавиться от всех записей, делать подзапрос ?
18 Mikeware
 
16.11.12
21:53
(16) где-то кто-то говорит неправду...
19 Andreyyy
 
16.11.12
21:59
(18)
ТекстЗапроса = "
     |select top 1
     |$рег.Склад as Товар,
   |$рег.Поставщик as Поставщик,
   |$рег.Товар as Товар,
   |$рег.ТипЦеныНаСкладе as ТипЦеныНаСкладе,
   |$рег.Цена as Цена,
   |рег.DATE as Дата,
   |рег.TIME as Время
     |from $Регистр.ЦеныНаСкладах as рег
     |WHERE
     |$рег.Склад = :Склад  AND
   |$рег.Поставщик = :Поставщик  AND      
   |$рег.Товар = :Товар
   |order by рег.DATE DESC,рег.TIME DESC";

Выдает две записи.
20 ВалераОшкин
 
16.11.12
22:00
(0) Максимум(РегистрЦеныНаСкладах.Период)
21 ВалераОшкин
 
16.11.12
22:00
(0) > Чем можно заменить этот тормозной код выполняющийся в цикле

Переходом на платформу 8.2
22 Andreyyy
 
16.11.12
22:00
+(19) Но что интересно, у второй записи поле "DATE" одинаковая с первой.
23 Andreyyy
 
16.11.12
22:09
Дошло ! Последний документ формирует две записи, одна приход, другая расход, оттого и две. Как выбрать только последний приход ?
24 Andreyyy
 
16.11.12
22:14
Всем, спасибо "DEBKRED" спас.
25 КонецЦикла
 
16.11.12
22:14
:)
Быстро сообразил
26 Andreyyy
 
16.11.12
22:23
Блин, беда не приходит одна.

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

ТекстЗапроса = "
     |select top 1
     |$рег.Склад as Товар,
   |$рег.Поставщик as Поставщик,
   |$рег.Товар as Товар,
   |$рег.ТипЦеныНаСкладе as ТипЦеныНаСкладе,
   |$рег.Цена as Цена,
   |рег.DATE as Дата,
   |рег.TIME as Время
     |from $Регистр.ЦеныНаСкладах as рег
     |WHERE
     |$рег.Склад = :Склад  AND
   |$рег.Поставщик = :Поставщик  AND      
//    |$рег.Товар = :Товар AND
   |рег.DEBKRED = 0
   |order by рег.DATE DESC,рег.TIME DESC";
 
   RecordSet.УстановитьТекстовыйПараметр("Склад", ВыбСклад);
//    RecordSet.УстановитьТекстовыйПараметр("Товар", ВыбТовар);
   RecordSet.УстановитьТекстовыйПараметр("Поставщик", ВыбПоставщик);

Это можно как-то побороть и если можно то куда копать ?
27 Andreyyy
 
16.11.12
22:41
Медленно в цикле выполняется, один запрос примерно секунду. Был бы благодарен за подсказку как выйти из положения.
28 Andreyyy
 
17.11.12
11:48
Однако опять подниму.

Не стал париться с (26), все выгружаю в таблицу значений, она уже отсортирована, остается найти первую строку с товаром и все классно.

Возник вопрос как установить условие на позицию документа, в инете нашел только условия на виртуальные таблицы.
29 Mikeware
 
17.11.12
13:45
(28) Если флаг БыстрыеДвижения - она уже есть. если флага нет - джойнь с журналом.
30 Andreyyy
 
17.11.12
14:21
Попробую переписать, поскольку и соединение сделал через ODBC, а там в DBF нельзя метод "УложитьСписокОбъектов" использовать, а нужно в таком случае через OLE DB. И таблицу брать виртуальную. Вобщем чем дальше в лес, тем больше дров. А такая мелочь нужна.
31 Mikeware
 
18.11.12
10:18
(30)"А такая мелочь нужна." тогда давай начинать с задачи, а не с твоего метода ее решения :-)))
32 Andreyyy
 
20.11.12
22:18
(31) Есть регистр "Склад,Товар,Цена - Количество". Когда делают перемещение на склад хотелось бы получить последнюю цену этого товара на этом складе. Периодические реквизиты справочника не рассматриваются. Такая вобщем тривиальная задача.
33 Mikeware
 
21.11.12
08:00
(32) Если у тебя документ при получении цены уже записан - тебе не требуется УложитьСписокбъектов, тебе надо джойнить с табчастью.
Как в запросе к дбф получить последние скопом я не знаю (у драйвера фокса свои фишки), в сиквеле я бы обернул в запрос с Макс(Дата)... гроуп бай  номенклатура
34 Andreyyy
 
21.11.12
11:40
(33) Не вариант соединением делать, поскольку обычно в новом документе требуется выполнять эту процедуру, а записывать заставлять пользователя тоже не гуд, может он передумает создавать документ.
Вобщем выкрутился как мог, спасибо за наводки.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший