Имя: Пароль:
1C
1С v8
Помощь в запросе (выборка)
0 Tanis
 
18.03.13
14:05
Добрый день!
Помогите с запросом...
Нужно выбрать физ.лиц, с 0 датой выдачи паспорта.
Это не проблема.
Проблема, что с 0 датой может быть и всего одна запись в регистре по этому физ.лицу.
А мне надо, что если у физ.лица 2 или более строчки в регистре, и если у одной из строк дата.выдачи 0, тогда вывести.
1 Wobland
 
18.03.13
14:07
выбрать физлицо, минимум(дата)
2 GANR
 
18.03.13
14:07
не понял проблемы
3 cw014
 
18.03.13
14:08
Выбратиь различные физлицо где датавыдачи = 0
4 cw014
 
18.03.13
14:08
В чем трабла то?
5 GANR
 
18.03.13
14:09
(1) +
имеющие количество(*)>=2
6 cw014
 
18.03.13
14:11
(1)(5) Вы чота усложняете
7 Tanis
 
18.03.13
14:12
(5) это в запросе писать, или уже в обработке?
8 cw014
 
18.03.13
14:13
(7) Да :)
9 Tanis
 
18.03.13
14:16
Да. В обработке или запросе?
10 Wobland
 
18.03.13
14:18
(9) это запросные слова
11 Tanis
 
18.03.13
14:22
ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.Период,
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо,
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц

УПОРЯДОЧИТЬ ПО
   ФизЛицо

Где вот здесь это вставить?

Или в консоле такого не сделаешь?
12 Tanis
 
18.03.13
14:26
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПаспортныеДанныеФизЛиц.Период,
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо,
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц

СГРУППИРОВАТЬ ПО
   ПаспортныеДанныеФизЛиц.Период,
   ПаспортныеДанныеФизЛиц.ФизЛицо,
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(ПаспортныеДанныеФизЛиц.ФизЛицо) >= 2

УПОРЯДОЧИТЬ ПО
   ФизЛицо

Так не работает.
13 Rovan
 
гуру
18.03.13
14:26
(11) ВЫБРАТЬ РАЗЛИЧНЫЕ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ГДЕ
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи = ДАТА(1,1,1)
УПОРЯДОЧИТЬ ПО
   ФизЛицо
14 Tanis
 
18.03.13
14:29
ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи = ДАТА(1,1,1)

Не работает.
15 НафНаф
 
18.03.13
14:31
ДАТАВРЕМЯ(1,1,1)
16 Tanis
 
18.03.13
14:33
Спасибо.
Т.е. запрос, не выбирет физ лицо с 0 датой, если строчка в регистре всего одна?
17 Tanis
 
18.03.13
14:36
Не пойдет. Такое мне уже выводил.
Мне надо чтоб если, запись регистра всего одна, то не отбирать.
18 Tanis
 
18.03.13
14:37
(5) где это вписать?
19 cw014
 
18.03.13
14:38
(17) Чо ты хочешь, сформируй по человечески
20 Tanis
 
18.03.13
14:41
Тогда так.
Регистр: Иванов И.И. - ДатаВыдачи - 0,
        Иванов И.И. - ДатаВыдачи - 2,
        Сидоров И.И. - ДатаВыдачи - 0

Нужно чтоб запросе вывелся только Иванов И.И. Дата - 0.
Т.к. у Сидорова, только одна строчка записи...
21 cw014
 
18.03.13
14:43
Что у тебя в (12) не работает?
22 Tanis
 
18.03.13
14:44
Вообще ничего не выводит.
23 Tanis
 
18.03.13
14:45
Видимо

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(ПаспортныеДанныеФизЛиц.ФизЛицо) >= 2

ему не нравится.
24 GANR
 
18.03.13
14:45
ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ИМЕЮЩИЕ
   МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1)
   КОЛИЧЕСТВО(*) >= 2
25 Tanis
 
18.03.13
14:49
Не работает. :-(
База БУХ. Если это имеет значение.
26 GANR
 
18.03.13
14:50
ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
СГРУППИРОВАТЬ ПО
   ПаспортныеДанныеФизЛиц.ФизЛицо
ИМЕЮЩИЕ
   МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1)
   КОЛИЧЕСТВО(*) >= 2
27 cw014
 
18.03.13
14:51
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПаспортныеДанныеФизЛиц.ФизЛицо,
   КОЛИЧЕСТВО(*) КАК Количество
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ГДЕ ПаспортныеДанныеФизЛиц.ФизЛицо В (ВЫБРАТЬ
ПаспортныеДанныеФизЛиц.ФизЛицо
ИЗ
РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ГДЕ
ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи = ДАТАВРЕМЯ(1,1,1))
УПОРЯДОЧИТЬ ПО
   ФизЛицо
28 cw014
 
18.03.13
14:52
Что выведет?
29 GANR
 
18.03.13
14:55
(26) работает? (24) платформа не ест
30 Tanis
 
18.03.13
15:06
(27) при этом выдает ошибку, что поле не входит в группу.
Платформа что ест?
31 GANR
 
18.03.13
15:09
(30) платформа не воспримет (24) (без СГРУППИРОВАТЬ ПО), (26) должен работать.
32 Tanis
 
18.03.13
15:10
Нет. Без этого не дает.
Проблема в консоли может быть?
33 Wobland
 
18.03.13
15:11
(31) имеющие что-то И что-то?
34 GANR
 
18.03.13
15:14
(32) Не в консоли дело - синтаксис запроса один и для консоли и для НЕ консоли. (33) Да, 2 агрегатные функции.
35 GANR
 
18.03.13
15:15
(32) так (26) работает или нет?
36 Tanis
 
18.03.13
15:15
Нет.
37 GANR
 
18.03.13
15:16
(36) а что пишет и на каком этапе? выложи скрин на http://xmage.ru/ и ссылку в ветку
38 GANR
 
18.03.13
15:18
(36) просто данные не выбирает никакие?
39 Tanis
 
18.03.13
15:22
Прошу прощения.
Может, нет так что делал. (26) работает, сейчас до конца проверю.
40 Tanis
 
18.03.13
15:28
Работает, но не доконца. Если 3 строчки, одна Дата - 1, а 2 строчки дата - 0, то выводит одну строчку.
А если всего 2, то не выводит.
41 Tanis
 
18.03.13
15:29
ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо,
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц

СГРУППИРОВАТЬ ПО
   ПаспортныеДанныеФизЛиц.ФизЛицо,
   ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи

ИМЕЮЩИЕ
   МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1) И
   КОЛИЧЕСТВО(*) >= 2
42 GANR
 
18.03.13
15:42
(41) Необходимо убрать ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи из группировок? Это уже совсем те физлица и данные, что в запросе (26).
43 Tanis
 
18.03.13
15:42
Оставил, только физ.лицо. Тогда работает.
Надеюсь лишнего не удалится...
44 GANR
 
18.03.13
15:42
НЕ те физлица
45 Tanis
 
18.03.13
15:43
(42) Уже понял, хотел посмотреть... Правильно ли выводит.
Но методом проверок, понял что правильно
Спасибо!
46 Tanis
 
18.03.13
15:44
Сейчас как и в (26)

ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц

СГРУППИРОВАТЬ ПО
   ПаспортныеДанныеФизЛиц.ФизЛицо
ИМЕЮЩИЕ
   МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1) И
   КОЛИЧЕСТВО(*) >= 2
47 GANR
 
18.03.13
15:44
(45) Да, а если надо какие-то поля помимо физлиц вывести то

ВЫБРАТЬ
   *
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ГДЕ
   ФизЛицо В (ВЫБРАТЬ
   ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
ИЗ
   РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
СГРУППИРОВАТЬ ПО
   ПаспортныеДанныеФизЛиц.ФизЛицо
ИМЕЮЩИЕ
   МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1)
   КОЛИЧЕСТВО(*) >= 2)
48 Tanis
 
18.03.13
15:47
Ок. Спасибо!
49 Tanis
 
18.03.13
15:56
А еще вопросик.
С регистрами так не делал. Какой командой удалить строчку можно?
50 GANR
 
18.03.13
16:11
НаборЗаписей = РегистрыСведений.ТвойРегистрСведений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ТвоеИзмерение1.Установить(ЗначениеИзмерения1);
НаборЗаписей.Отбор.ТвоеИзмерение2.Установить(ЗначениеИзмерения2);
...
НаборЗаписей.Отбор.ТвоеИзмерениеN.Установить(ЗначениеИзмеренияN);
НаборЗаписей.Записать(); // ВСЁ! Регистр в разрезе измерений очищен.

ВНИМАНИЕ!!! Не забудь установить все необходимые отборы - иначе удалятся лишние записи.
например, если сделать так:

НаборЗаписей = РегистрыСведений.ТвойРегистрСведений.СоздатьНаборЗаписей();
НаборЗаписей.Записать();

то очистится ВЕСЬ регистр сведений без остатка
51 Tanis
 
18.03.13
16:14
Мне вот эти найденные записи из запроса надо удалить.
52 Tanis
 
18.03.13
16:15
НаборЗаписей.Отбор.ФизЛицо.Установить(ФизЛицо);

Так? Или как там подвязать, чтоб данные только из запроса попали?
53 GANR
 
18.03.13
16:17
(52) нужно не только в разрезе физлица, но и в разрезе остальных измерений отборы поставить, иначе сотрутся ВСЕ записи по ФизЛицу
54 Tanis
 
18.03.13
16:21
Хм. А где остальные отборы взять?
А как можно посмотреть что он там наотбирал?
55 Tanis
 
18.03.13
16:22
Строка = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       Строка.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);

Значит это не годится. :-(
56 GANR
 
18.03.13
16:26
(54) НаборЗаписей.Прочитать()
57 GANR
 
18.03.13
16:27
(55) Кстати, после этого можно удалить то, что надо и записать набор. Тоже можно удаления лишнего избежать.
58 Tanis
 
18.03.13
16:33
Пока Рез.Следующий() Цикл
       
       //Сообщить(Рез.ФизЛицо);
       Строка = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       Строка.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);
       
       Строка.Прочитать();
       Строка.Удалить();

Так?
59 Tanis
 
18.03.13
16:34
А то что он прочитал, на экран вывести можно?
60 GANR
 
18.03.13
16:39
(58) Это не Строка - это НаборЗаписей, который обходится
Для Каждого Стр Из НаборЗаписей Цикл
...
КонецЦикла
(59) Можно, но я бы это глянул прямо в отладчике.
61 Tanis
 
18.03.13
16:47
Я наборЗаписей Строкой назвал.
А Для каждого Зачем писать?
62 Tanis
 
18.03.13
16:48
Вот при таком, он мне что удалит?

   
   Запрос = Новый Запрос;
   Запрос.Текст= "ВЫБРАТЬ
                  |ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
                  |ИЗ
                  |РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
                  |СГРУППИРОВАТЬ ПО
                  |ПаспортныеДанныеФизЛиц.ФизЛицо
                  |ИМЕЮЩИЕ
                  |МИНИМУМ(ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи) = ДАТАВРЕМЯ(1, 1, 1) И
                  |КОЛИЧЕСТВО(*) >= 2" ;
                 
   //Запрос.УстановитьПараметр("Дата",Дата);
   
   Рез = Запрос.Выполнить().Выбрать();
   Пока Рез.Следующий() Цикл
       
       //Сообщить(Рез.ФизЛицо);
       НаборЗаписей = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);
   
       НаборЗаписей.Удалить();
       
   КонецЦикла;
63 Tanis
 
18.03.13
16:53
Там еще прочитать вставить забыл.
64 GANR
 
18.03.13
16:55
(62) Записи со значениями измерений ФизЛицо, попавшими в Рез. И ещё: это НаборЗаписей.Удалить(); надо заменить на НаборЗаписей.Записать();
(63) Да не... Прочитать не надо. Если нужно более тонко чистить, то можно применить (47) с последующими отборами НаборЗаписей по всем нужным измерениям.
65 Tanis
 
18.03.13
16:58
Пока вроде с таким отбором.
А почему записать, если надо удалить? Или сначала записать а потом удалить? Что-то совсем запутался?
66 Tanis
 
18.03.13
16:58
куда он их запишет?
67 GANR
 
18.03.13
17:02
(65) Потому что запись подразумевает удаление отсутствующих и добавление присутствующих строк в наборе записей по установленным отборам. Удалить() - это в оперативной памяти с набором операцию проводит, на диск не пишет. Ну это в справке прочти про РегистрСведенийНаборЗаписей.
68 Tanis
 
18.03.13
17:16
Стер, но лишнего... Все записи по выбранным физ.лицам.
69 GANR
 
18.03.13
17:22
(68) Значит (47), повторюсь и накладывать перед НаборЗаписей.Записать() отборы не только по физлицу, по всем измерениям, а если стирать не надо - веткой Если обработать в коде ситуацию.
70 Tanis
 
18.03.13
17:52
Запрос = Новый Запрос;
   Запрос.Текст= "ВЫБРАТЬ
                   |    ПаспортныеДанныеФизЛиц.Период,
                   |    ПаспортныеДанныеФизЛиц.ФизЛицо,
                   |    ПаспортныеДанныеФизЛиц.ДокументВид,
                   |    ПаспортныеДанныеФизЛиц.ДокументСерия,
                   |    ПаспортныеДанныеФизЛиц.ДокументНомер,
                   |    ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи,
                   |    ПаспортныеДанныеФизЛиц.ДокументКемВыдан,
                   |    ПаспортныеДанныеФизЛиц.ДокументКодПодразделения,
                   |    ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства
                   |ИЗ
                   |    РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
                   |ГДЕ
                   |    ПаспортныеДанныеФизЛиц.ФизЛицо В
                   |            (ВЫБРАТЬ
                   |                ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
                   |            ИЗ
                   |                РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
                   |            СГРУППИРОВАТЬ ПО
                   |                        ПаспортныеДанныеФизЛиц.ФизЛицо
                   |            ИМЕЮЩИЕ
                   |                КОЛИЧЕСТВО(*) >= 2)
                   |    И ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи = ДАТАВРЕМЯ(1, 1, 1)
                   |    И (ПаспортныеДанныеФизЛиц.Период = ДАТАВРЕМЯ(2012,01,18) ИЛИ ПаспортныеДанныеФизЛиц.Период = ДАТАВРЕМЯ(2012,01,19))";
                 
       
   Рез = Запрос.Выполнить().Выбрать();
   Пока Рез.Следующий() Цикл
       
       //Сообщить(Рез.ФизЛицо);
       НаборЗаписей = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);
       НаборЗаписей.Записать();
       
   КонецЦикла;


Все равно стирает больше чем надо
71 Tanis
 
18.03.13
17:54
Отбирает все нормально, а стирает все записи, по отобранному физ.лицу.
ИЛИ надо еще дописать

НаборЗаписей.Отбор.Дата.Установить(Рез.Дата)
72 Tanis
 
18.03.13
17:57
Написал вот так

       НаборЗаписей = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);
       НаборЗаписей.Отбор.Период.Установить(Рез.Период);
       НаборЗаписей.Отбор.ДокументДатаВыдачи.Установить(Рез.ДокументДатаВыдачи);
73 GANR
 
18.03.13
17:59
(72) Уже лучше! Ключом каждой записи является Период и единственное измерение ФизЛицо. По крайней мере, в Зарплата и Управление Персоналом, редакция 2.5 (2.5.9.2).
74 GANR
 
18.03.13
18:00
Ну, а на то, что не надо удалять - ветки Если поставить можно.
75 Tanis
 
18.03.13
18:17
НаборЗаписей.Отбор.ДокументДатаВыдачи.Установить(Рез.ДокументДатаВыдачи);

Вот на это ругается. Нет такого отбора?
76 GANR
 
18.03.13
18:22
(75) Есть НаборЗаписей.Отбор.Период.Установить(Рез.ДокументДатаВыдачи);Отбор ставится на ключевые поля: Период, Регистратор и Измерение.
77 Tanis
 
18.03.13
18:50
Оставил, вот так... Вроде, правильно удалилось...

   Запрос = Новый Запрос;
   Запрос.Текст= "ВЫБРАТЬ
                   |    ПаспортныеДанныеФизЛиц.Период КАК Период,
                   |    ПаспортныеДанныеФизЛиц.ФизЛицо,
                   |    ПаспортныеДанныеФизЛиц.ДокументВид,
                   |    ПаспортныеДанныеФизЛиц.ДокументСерия,
                   |    ПаспортныеДанныеФизЛиц.ДокументНомер,
                   |    ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи КАК ДокументДатаВыдачи,
                   |    ПаспортныеДанныеФизЛиц.ДокументКемВыдан,
                   |    ПаспортныеДанныеФизЛиц.ДокументКодПодразделения,
                   |    ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства
                   |ИЗ
                   |    РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
                   |ГДЕ
                   |    ПаспортныеДанныеФизЛиц.ФизЛицо В
                   |            (ВЫБРАТЬ
                   |                ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо
                   |            ИЗ
                   |                РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
                   |            СГРУППИРОВАТЬ ПО
                   |                        ПаспортныеДанныеФизЛиц.ФизЛицо
                   |            ИМЕЮЩИЕ
                   |                КОЛИЧЕСТВО(*) >= 2)
                   |    И ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи = ДАТАВРЕМЯ(1, 1, 1)
                   |    И (ПаспортныеДанныеФизЛиц.Период = ДАТАВРЕМЯ(2012,01,18) ИЛИ ПаспортныеДанныеФизЛиц.Период = ДАТАВРЕМЯ(2012,01,19))";
                 
       
   Рез = Запрос.Выполнить().Выбрать();
   Пока Рез.Следующий() Цикл
       
       //Сообщить(Рез.ФизЛицо);
       НаборЗаписей = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.ФизЛицо.Установить(Рез.ФизЛицо);
       НаборЗаписей.Отбор.Период.Установить(Рез.Период);
       
       НаборЗаписей.Записать();
       
   КонецЦикла;