Имя: Пароль:
1C
1С v8
Как с запроса убрать лишние записи?
0 SherifSP
 
12.07.12
21:23
Есть такой запрос и цикл

Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    ПродажиСебестоимость.Регистратор,
   |    ПродажиСебестоимость.Номенклатура,
   |    ПродажиСебестоимость.Стоимость
   |ИЗ
   |    РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
   |ГДЕ
   |    ПродажиСебестоимость.Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах" ;
   
   Выборка = Запрос.Выполнить().Выгрузить();
   
   Сч = 0;
   Пока Сч < ТаблицаДвижений.Количество() Цикл
       
       Для Каждого Стр Из Выборка Цикл
           
           СтрокаТаблицы = ТаблицаДвижений.Получить(Сч);
           
           Если СтрокаТаблицы.Номенклатура = Стр.Номенклатура Тогда
               
               СтрокаТаблицы.СуммаУчета = Стр.Стоимость;
               
           Иначе        
               
               Возврат;
               
           КонецЕсли;
           
           Сч = Сч + 1;
           
       КонецЦикла;
       
   КонецЦикла;
Когда в регистре запись одна отрабатывает нормально, когда 2 и больше не отрабатывает нормально цикл, нужно как то удалить старые записи
1 Rie
 
12.07.12
21:25
ВЫБРАТЬ ПЕРВЫЕ 1
...
УПОРЯДОЧИТЬ ПО ...
2 SherifSP
 
12.07.12
21:26
(1) Упорядочить по номенклатуре?
3 SherifSP
 
12.07.12
21:27
Я по дате по убыванию попробую
4 Mort
 
12.07.12
21:27
Хрень какая-то. Так из какого документа надо брать-то если их несколько? Рандомом?
5 SherifSP
 
12.07.12
21:29
(4) Я условие на регистратор поставил
6 Rie
 
12.07.12
21:29
(2) По номенклатуре - отобрать. Иначе получите запись для непонятно какой номенклатуры.
7 SherifSP
 
12.07.12
21:29
Все разобрался отрабатывает норм
8 SherifSP
 
12.07.12
21:30
Нет хреново отрабатывает)
9 SherifSP
 
12.07.12
21:41
(6)Не отрабатывает, только последнюю запись видить(
10 SherifSP
 
12.07.12
21:43
Есть еще варианты?
11 Rie
 
12.07.12
21:46
(9) А нужна первая? См. ключевые слова ВОЗР и УБЫВ.
12 SherifSP
 
12.07.12
21:57
Нужно выбрать ту запись которая на данный момент создалась
13 SherifSP
 
12.07.12
21:58
Их может быть и не 1, так как в табличной части может быть пару номенклатур
14 sapphire
 
12.07.12
21:59
(0) редкий бред
15 SherifSP
 
12.07.12
22:01
У меня документ делает движение сразу по нескольким регистрам, когда транзакция прошла по регистру ПродажиСебестоимость, я пытаюсь выбрать записи по регистратору
16 SherifSP
 
12.07.12
22:01
(14) Как можно лучше?
17 SherifSP
 
12.07.12
22:03
Можно таким способом?

"ВЫБРАТЬ
   |    ВремТабДвижений.Номенклатура,
   |    СУММА(ВремТабДвижений.СуммаУчета) КАК СуммаУчета,
   |    СУММА(ВремТабСписания.Стоимость) КАК Стоимость
   |ИЗ
   |    &ВремТабДвижений КАК ВремТабДвижений
   |        ПОЛНОЕ СОЕДИНЕНИЕ &ВремТабСписания КАК ВремТабСписания
   |        ПО ВремТабДвижений.Номенклатура = ВремТабСписания.Номенклатура
   |
   |СГРУППИРОВАТЬ ПО
   |    ВремТабДвижений.Номенклатура";
18 SherifSP
 
12.07.12
22:03
Но пишет ошибку когда Соединяю эти 2 таблицы
Ожидается имя таблицы ПОЛНОЕ СОЕДИНЕНИЕ <<?>>&ВремТабСписания КАК ВремТабСписания
19 andrewks
 
12.07.12
22:05
из таблицы-параметра можно выбрать только в ВТ
20 SherifSP
 
12.07.12
22:05
Тоесть мне нужно 2 виртуальные и 2 параметра таблицы?
21 andrewks
 
12.07.12
22:07
я не знаю, что тебе нужно. я объясняю, почему выдаёт ошибку
22 SherifSP
 
12.07.12
22:09
(21)А по теме есть какие предложения?
23 andrewks
 
12.07.12
22:10
(22) не совсем понятна задача. ты приводишь два абсолютно разных запроса. озвучь чётко суть задачи
24 Ctyd
 
12.07.12
22:10
вопрос: С какой целью это нужно?

или дай полный код, что ты с чем сравниваешь..
25 SherifSP
 
12.07.12
22:12
Документ делает движения по регистрам. В одном регистре запись Стоимость =34, во втором 13, суть задачи такова чтобы Стоимость второго регистра была равна стоимости первого
26 AlexNew
 
12.07.12
22:12
Хароший код, давно такого не видел, все остатки с полным соединением.
27 AlexNew
 
12.07.12
22:13
А даже не остатки, просмотрел.
28 SherifSP
 
12.07.12
22:14
// ТОВАРЫ ПО РЕГИСТРУ Продажи.
   
   НаборДвижений   = Движения.Продажи;
   ТаблицаДвижений = НаборДвижений.Выгрузить();
   ТаблицаПоТоварамПродажи = ТаблицаПоТоварам.Скопировать();
   ТаблицаПоТоварамПродажи.Колонки.НДС.Имя = "НДСРегл";
   ТаблицаПоТоварамПродажи.Колонки.НДСУпр.Имя = "НДС";
   
   Если СтруктураШапкиДокумента.ВедениеУчетаПоПроектам Тогда
       УправлениеПроектами.ОтразитьДвиженияПоПроектам(ТаблицаПоТоварамПродажи, ТаблицаДвижений, Проект, Дата, "Продажи");
   Иначе
       ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварамПродажи, ТаблицаДвижений);
   КонецЕсли;
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    ПродажиСебестоимость.Регистратор,
   |    ПродажиСебестоимость.Номенклатура КАК Номенклатура,
   |    ПродажиСебестоимость.Стоимость
   |ИЗ
   |    РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
   |ГДЕ
   |    ПродажиСебестоимость.Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах
   |
   |УПОРЯДОЧИТЬ ПО
   |    Номенклатура,
   |    ПродажиСебестоимость.Период УБЫВ" ;
   
   Выборка = Запрос.Выполнить().Выгрузить();
   
   Сч = 0;
   Пока Сч < ТаблицаДвижений.Количество() Цикл
       
       Для Каждого Стр Из Выборка Цикл
           
           СтрокаТаблицы = ТаблицаДвижений.Получить(Сч);
           
           Если СтрокаТаблицы.Номенклатура = Стр.Номенклатура Тогда
               
               СтрокаТаблицы.СуммаУчета = Стр.Стоимость;
               
           Иначе        
               
               Возврат;
               
           КонецЕсли;
           
           Сч = Сч + 1;
           
       КонецЦикла;
       
   КонецЦикла;
   
   ТаблицаДвижений.ЗаполнитьЗначения(Ссылка       , "ДокументПродажи");
   ТаблицаДвижений.ЗаполнитьЗначения(Подразделение, "Подразделение");
   ТаблицаДвижений.ЗаполнитьЗначения(Организация  , "Организация");


   НаборДвижений.мПериод          = Дата;
   НаборДвижений.мТаблицаДвижений = ТаблицаДвижений;

   Если Не Отказ Тогда
       Движения.Продажи.ВыполнитьДвижения();
   КонецЕсли;
29 SherifSP
 
12.07.12
22:16
Движения по регистру продажи выполняются после движения по регистру ПродажиСебестоимость, я пытался запросом вытянуть движения и в цыкле перебором этих движений подставить Стоимость первого регистра в стоимость второго
30 Ctyd
 
12.07.12
22:16
Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    ПродажиСебестоимость.Номенклатура,
   |    ПродажиСебестоимость.Стоимость
   |ИЗ
   |    РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
   |ГДЕ
   |    ПродажиСебестоимость.Регистратор =&ссылка и ПродажиСебестоимость.Номенклатура=&ном" ;
   запрос.установитьпараметр("ссылка",ссылка);
 
   
   Сч = 0;
   Пока Сч < ТаблицаДвижений.Количество() Цикл
       
     
           
           СтрокаТаблицы = ТаблицаДвижений.Получить(Сч);
запрос.установитьпараметр("ном",СтрокаТаблицы.Номенклатура);
           Выборка = Запрос.Выполнить().Выполнить();
           Если выборка.следующий() Тогда
               
               СтрокаТаблицы.СуммаУчета = выборка.Стоимость;
               
               
           КонецЕсли;
           
           Сч = Сч + 1;
           
       КонецЦикла;
       
   КонецЦикла;
31 Ctyd
 
12.07.12
22:17
пробуй так
32 Ctyd
 
12.07.12
22:18
"конецЦикла" убери только
33 SherifSP
 
12.07.12
22:20
Убрал)
34 Ctyd
 
12.07.12
22:21
получилось?
35 SherifSP
 
12.07.12
22:23
(30)Да большое спс)
36 SherifSP
 
12.07.12
22:24
Сейчас буду разбераться как этот механизм работает, будут завтра спрашивать)
37 AlexNew
 
12.07.12
22:25
Что получилось? Есть Движения, возьми оттуда таблицу, сверни ее сделай что надо, если не понимаешь запросы.
Разбераться не надо, надо разбИраться.
38 SherifSP
 
12.07.12
22:26
Ctyd - ПродажиСебестоимость.Регистратор =&ссылка и ПродажиСебестоимость.Номенклатура=&ном"//// Это выбирается вся номенклатура по регистраторам?
39 SherifSP
 
12.07.12
22:28
(37)А если таблица после движения пустая?
40 Ctyd
 
12.07.12
22:28
главное он достиг своей цели =)
41 AlexNew
 
12.07.12
22:29
(40) Он не достиг своей цели, а такие советы только сбивают.
42 SherifSP
 
12.07.12
22:29
(40) Да)
43 Ctyd
 
12.07.12
22:30
тогда пускай берет Мускл и учит запросы, а особенно часть про условия.
44 SherifSP
 
12.07.12
22:31
Сtyd см (38)
45 Ctyd
 
12.07.12
22:34
это выбираеться только 1 номенклатура по конкретному регистартору
46 AlexNew
 
12.07.12
22:35
(45) Что?
47 AlexNew
 
12.07.12
22:37
(45) Хотя да, там еще условие, но он же это в цикле делает. Очень криво.
48 SherifSP
 
12.07.12
22:37
Не красиво только запрос.установитьпараметр("ном",СтрокаТаблицы.Номенклатура);
В цыкле)
49 AlexNew
 
12.07.12
22:38
В общем это вообще не код.
50 SherifSP
 
12.07.12
22:41
AlexNew Как бы сделал ты?
51 Ctyd
 
12.07.12
22:41
да, мне тоже интересно...
52 Stim
 
12.07.12
22:43
запрос в цикле. чему вы детей учите?
53 Ctyd
 
12.07.12
22:46
Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    ПродажиСебестоимость.Номенклатура,
   |    ПродажиСебестоимость.Стоимость
   |ИЗ
   |    РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
   |ГДЕ
   |    ПродажиСебестоимость.Регистратор=&Ссылка" ;
   
   Выборка = Запрос.Выполнить().выгрузить();
   
   Сч = 0;
   Пока Сч < ТаблицаДвижений.Количество() Цикл
СтрокаТаблицы = ТаблицаДвижений.Получить(Сч);
  строк=Выборка.Найти(СтрокаТаблицы.Номенклатура,"номенклатура");
Если строк<>неопределено тогда
СтрокаТаблицы.СуммаУчета = строк.Стоимость;
КонецЕсли;
           Сч = Сч + 1;
           
 
       
   КонецЦикла;

ок, а такой вариант?
54 AlexNew
 
12.07.12
22:46
Если ТаблицаДвижений возвращается с Себестоимостью, то 2 таблицы в запрос, левое соединение с наименованием полей как мне надо, загрузить в таблицу, или выгрузить движения в таблицу загрузить в запрос, или перебирать и заполнять таблицу - как кому нравится.
55 Ctyd
 
12.07.12
22:48
о.. меня всегда интересовало: Как в запрос передать таблицу значений?
56 Stim
 
12.07.12
22:49
всем читать радченко и Габца. срочно
57 AlexNew
 
12.07.12
22:50
(53) Типа 2-го варианта, что я описал. Для меня - кода много. И запрос лишний - таблицу можно из Движений получить.
(55)
ВЫБРАТЬ
...
ПОМЕСТИТЬ втТаб
ИЗ &Таб
;
ВЫБРАТЬ
...
ИЗ втТаб
58 Stim
 
12.07.12
22:51
(57) только во втором пакете нужно указать имя таблицы, а то не взлетит)
59 AlexNew
 
12.07.12
22:52
Только таблица должна быть типизирована.
60 Ctyd
 
12.07.12
23:06
грубо говоря:

   Запрос.Текст =
   "ВЫБРАТЬ
   |   таб.*
   |поместить ВТтаб
   |ИЗ
   |    &Таб КАК таб
   |;
   |ВЫБрать
   |//поля необходимые для загрузки регистра
   |Из ВТТАБ как таблица
   |ЛЕВОЕ Соединение (ВЫБРАТЬ ПродажиСебестоимость.номенклатура, ПродажиСебестоимость.стоимость из  РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
   |ГДЕ
   |    ПродажиСебестоимость.Регистратор=&Ссылка) как себестоимость
   |по себестоимость.номенклатура=таблица.номенклатура
   |" ;
61 SherifSP
 
12.07.12
23:11
(60)А дальше?)
62 Ctyd
 
12.07.12
23:12
сам не знаю...
точнее даже не знаю или он сработает..
63 SherifSP
 
12.07.12
23:12
(62)Второй код лучше 1?))
64 Ctyd
 
12.07.12
23:13
однозначно.. он хоть каждый раз не отправляет запрос в бд
65 SherifSP
 
12.07.12
23:16
(53)  Ошибка при вызове метода контекста (Выполнить): {(7, 38)}: Не задано значение параметра "Ссылка"
ПродажиСебестоимость.Регистратор=<<?>>&Ссылка
66 Ctyd
 
12.07.12
23:17
добавь перед запрос.выполнить.выгрузить()
 запрос.установитьпараметр("ссылка",ссылка);
67 Ctyd
 
12.07.12
23:24
сделал?
68 SherifSP
 
12.07.12
23:29
Да
69 SherifSP
 
12.07.12
23:29
В итоге

   Если СтруктураШапкиДокумента.ВедениеУчетаПоПроектам Тогда
       УправлениеПроектами.ОтразитьДвиженияПоПроектам(ТаблицаПоТоварамПродажи, ТаблицаДвижений, Проект, Дата, "Продажи");
   Иначе
       ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварамПродажи, ТаблицаДвижений);
   КонецЕсли;
   
     Запрос = Новый Запрос;
     Запрос.Текст =
     "ВЫБРАТЬ РАЗРЕШЕННЫЕ
     |    ПродажиСебестоимость.Номенклатура,
     |    ПродажиСебестоимость.Стоимость
     |ИЗ
     |    РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
     |ГДЕ
     |    ПродажиСебестоимость.Регистратор=&Ссылка" ;
     
     Запрос.УстановитьПараметр("Ссылка",Ссылка);
     
     Выборка = Запрос.Выполнить().Выгрузить();
     
     Сч = 0;
     Пока Сч < ТаблицаДвижений.Количество() Цикл
         СтрокаТаблицы = ТаблицаДвижений.Получить(Сч);
         Стр=Выборка.Найти(СтрокаТаблицы.Номенклатура,"Номенклатура");
         Если Стр <> Неопределено Тогда
             СтрокаТаблицы.СуммаУчета = Стр.Стоимость;
         КонецЕсли;
         Сч = Сч + 1;
     КонецЦикла;
     
   ТаблицаДвижений.ЗаполнитьЗначения(Ссылка       , "ДокументПродажи");
   ТаблицаДвижений.ЗаполнитьЗначения(Подразделение, "Подразделение");
   ТаблицаДвижений.ЗаполнитьЗначения(Организация  , "Организация");
70 Ctyd
 
12.07.12
23:30
хоть ты доволен... удачи..
71 SherifSP
 
12.07.12
23:32
Спс за помощь)
72 Ctyd
 
12.07.12
23:35
Если надо завтра напишу вариант 3-й. тот что только на запрос. Сегодня уже спать
73 SherifSP
 
12.07.12
23:36
(72) Ок
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан