Имя: Пароль:
1C
1С v8
V8: Помогите с запросом
,
0 astraborz
 
07.03.13
03:40
Запрос.Текст = "ВЫБРАТЬ
                  |    Платежи.СНИЛС,
                  |    Платежи.ФИО,
                  |    Платежи.ППНомер,
                  |    Платежи.ППДата,
                  |    Платежи.Сумма,
                  |    Платежи.Учреждение,
                  |    Платежи.ВидВыплат,
                  |    Платежи.НаименованиеПолучателя,
                  |    Платежи.ИНН,
                  |    Платежи.КПП,
                  |    Платежи.РасчетныйСчет,
                  |    Платежи.НаименованиеБанкаПолучателя,
                  |    Платежи.БИК,
                  |    Платежи.КорреспондентскийСчет,
                  |    Платежи.ВходящийНомер
                  |ИЗ
                  |    РегистрСведений.Платежи КАК Платежи
                  |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
                  |            СУММА(1) КАК Кол,
                  |            Платежи.ФИО КАК ФИО
                  |        ИЗ
                  |            РегистрСведений.Платежи КАК Платежи
                  |        
                  |        СГРУППИРОВАТЬ ПО
                  |            Платежи.ФИО) КАК ВложенныйЗапрос
                  |        ПО Платежи.ФИО = ВложенныйЗапрос.ФИО
                  |ГДЕ
                  |    ВложенныйЗапрос.Кол > 1
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    Платежи.ФИО";



1 Запрашиваю имеющиеся более двух раз с одинаковыми полями ФИО.
Но этого мало. Надо еще отбросить из этого списка строки у которых имеются все одинаковые значение в поле СНИЛС или если у всех одинаковых по ФИО пустые СНИЛС

2. Прогнать этот список и менять сразу значения в регистре сведений Платежи (Если СНИЛС = пусто тогда брать из заполненного, Но если если имеются разные СНИЛСы, не менять а просто вывести в список)

3. В регистре платежей 160000 записей. Через что лучше делать? тем методом что я делаю очень долго выполняется но делает?

Цель = Заполнить оставшиеся измерения с одинаковыми измерениями . Избавиться от дублей и пустых строк.Вообщем я объединил разные списки из экселя и делаю правильный единый список.


1С 8.2  управляемая форма
1 astraborz
 
07.03.13
03:59
Нету никого кто даст совет?
2 Килограмм
 
07.03.13
04:18
(1) жди пока основная масса проснётся и апай тему
3 SeraFim
 
07.03.13
04:23
Сделай внутреннее соединение
ПО Платежи.ФИО = ВложенныйЗапрос.ФИО
И ВложенныйЗапрос.Кол > 1

чуток быстрее получится
4 astraborz
 
07.03.13
09:45
Народ проснулся а сижу тут :(
5 Галахад
 
гуру
07.03.13
09:56
Заменить "левое" на "правое" и убрать "где"
6 ИсчадиеADO
 
07.03.13
10:13
<code>
"ВЫБРАТЬ
|    Платежи.ФИО,
|    количество(*) КАК ОбщееКоличество,
|    количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) КАК КоличествоСНИЛС,
|    МАКСИМУМ(Платежи.СНИЛС) КАК ЛюбойСНИЛС
|ПОМЕСТИТЬ ВТ
|ИЗ
|    РегистрСведений.Платежи КАК Платежи
|СГРУППИРОВАТЬ ПО
|    Платежи.ФИО
|ИМЕЮЩИЕ
|    количество(*) > 1
|    И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """" ИНАЧЕ ИСТИНА КОНЕЦ    
|;
|ВЫБРАТЬ
|    Платежи.СНИЛС,
|    Платежи.ФИО,
|    Платежи.ППНомер,
|    Платежи.ППДата,
|    Платежи.Сумма,
|    Платежи.Учреждение,
|    Платежи.ВидВыплат,
|    Платежи.НаименованиеПолучателя,
|    Платежи.ИНН,
|    Платежи.КПП,
|    Платежи.РасчетныйСчет,
|    Платежи.НаименованиеБанкаПолучателя,
|    Платежи.БИК,
|    Платежи.КорреспондентскийСчет,
|    Платежи.ВходящийНомер
|ИЗ
|    ВТ КАК ВТ
|ЛЕВОЕ СОЕДИНЕНИЕ
|    РегистрСведений.Платежи КАК Платежи
|ПО    
|    ВТ.ФИО = Платежи.ФИО
|УПОРЯДОЧИТЬ ПО
|    Платежи.ФИО    
|";
</code>
как то так... запрос не проверял т.ч. автор, проверь сам
7 ИсчадиеADO
 
07.03.13
10:23
ну и эта...
2. Прогнать этот список и менять сразу значения в регистре сведений Платежи (Если СНИЛС = пусто тогда брать из заполненного, Но если если имеются разные СНИЛСы, не менять а просто вывести в список)

делай так, добавь секцию ИТОГИ ПО. Если рег.св. подчинен регистратору, то по регистратору; иначе по измерениям с основным отбором ну и периоду если он есть и основной отбор. Ну и вперед обходить выборку
8 astraborz
 
07.03.13
10:59
(5) В этом случае выводится полный список, а мне ссуженный надо. Убрать полные по ФИО дубликаты где снилсы одинаковые
9 astraborz
 
07.03.13
11:10
(3) Тоже хороший вариант, но как бы избавится в вложенном запросе сразу от значений с кол = 1 и потом связать с основной
10 astraborz
 
07.03.13
11:24
(6) Это просто отличная версия, но есть одно но :) Из это списка надо убрать еще те строки у которых по одинаковым ФИО если все СНИЛСы совпадают
11 ИсчадиеADO
 
07.03.13
11:33
(10) напутал:
И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """" ИНАЧЕ ИСТИНА КОНЕЦ замени на
И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) = """" ИНАЧЕ ИСТИНА КОНЕЦ
12 ИсчадиеADO
 
07.03.13
11:34
а вообще открой для себя консоль запросов и играйся в ней
13 astraborz
 
07.03.13
12:03
(11) Тогда он и с пустыми выдает. Но огромное спасибо. Я просто давно сним играю и не получалось никак :)
14 ИсчадиеADO
 
07.03.13
12:06
(13) так я по заданию так и понял, что надо и с пустыми выдавать? внимательное чтение задания это не мое :)
15 astraborz
 
07.03.13
13:08
(14) Все равно спасибо. У меня пока что туговато с запросами.
16 astraborz
 
07.03.13
13:14
Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    Платежи.ФИО,
                  |    КОЛИЧЕСТВО(*) КАК ОбщееКоличество,
                  |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Платежи.СНИЛС) КАК КоличествоСНИЛС,
                  |    МАКСИМУМ(Платежи.СНИЛС) КАК ЛюбойСНИЛС
                  |ПОМЕСТИТЬ ВТ
                  |ИЗ
                  |    РегистрСведений.Платежи КАК Платежи
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Платежи.ФИО
                  |
                  |ИМЕЮЩИЕ
                  |    КОЛИЧЕСТВО(*) > 1 И
                  |    ВЫБОР
                  |        КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1
                  |            ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """"
                  |        ИНАЧЕ ИСТИНА
                  |    КОНЕЦ
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Платежи.СНИЛС,
                  |    Платежи.ФИО,
                  |    Платежи.ППНомер,
                  |    Платежи.ППДата,
                  |    Платежи.Сумма,
                  |    Платежи.Учреждение,
                  |    Платежи.ВидВыплат,
                  |    Платежи.НаименованиеПолучателя,
                  |    Платежи.ИНН,
                  |    Платежи.КПП,
                  |    Платежи.РасчетныйСчет,
                  |    Платежи.НаименованиеБанкаПолучателя,
                  |    Платежи.БИК,
                  |    Платежи.КорреспондентскийСчет,
                  |    Платежи.ВходящийНомер
                  |ИЗ
                  |    ВТ КАК ВТ
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Платежи КАК Платежи
                  |        ПО ВТ.ФИО = Платежи.ФИО
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    Платежи.ФИО";
   Выгрузка = Запрос.Выполнить().Выгрузить();
   Выборка = Запрос.Выполнить().Выбрать();    
   Обход = Запрос.Выполнить().Выбрать();    
   Колонки = ПолучитьСтруктуруКолонок();
   
   РегПлатежи = РегистрыСведений.Платежи;
   Пока Выборка.Следующий() Цикл
       ФИО = Выборка.ФИО;
       Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл
           СНИЛС = Неопределено;
           Если НЕ Обход.СНИЛС = "" ТОгда
               Если СНИЛС = Неопределено Тогда
                   СНИЛС = Обход.СНИЛС;
                   Район = Обход.Учреждение;
               КонецЕсли;                        
           КонецЕсли;    
       КонецЦикла;    
       Если Не СНИЛС = Неопределено И Выборка.СНИЛС = "" Тогда
           НаборПоиска = РегПлатежи.СоздатьНаборЗаписей();
           Сч = 0;
           Для Каждого Колонка Из НаборПоиска.Отбор Цикл
               Сч = Сч + 1;
               Колонка.Установить(Выборка[Сч - 1]);
           КонецЦикла;
           НаборПоиска.Прочитать();
           Если НаборПоиска.Количество() > 0 Тогда
               НаборПоиска.Очистить();
               НаборПоиска.Записать();
               Запись = РегПлатежи.СоздатьМенеджерЗаписи();
               Сч = 0;
               Для Каждого Колонка Из Колонки Цикл
                   Сч = Сч + 1;
                   Запись[Колонка.Ключ] = Выборка[Сч - 1];
               КонецЦикла;
               Запись.СНИЛС = СНИЛС;
               Если  Не ЗначениеЗаполнено(Запись.Учреждение) И ЗначениеЗаполнено(Район) Тогда
                   Запись.Учреждение = Район;
               КонецЕсли;    
               Запись.Записать();
               НоваяСтрока = Таблица.Добавить();
               НоваяСтрока.СНИЛС = Запись.СНИЛС;
               НоваяСтрока.ФИО = Запись.ФИО;
               НоваяСтрока.Сумма = Запись.Сумма;                      
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;
17 astraborz
 
07.03.13
13:15
В этом обходе он долго выполняется. как бы упростить. знающие люди помогите пожалуйста
18 butterbean
 
07.03.13
13:17
(16) ппц, нафига 3 раза запрос выполнять??
19 astraborz
 
07.03.13
13:22
(18) Выгрузку забыл убрать просто это я результат сразу смотрел просто. А выборка выбирает весь список, а Обход обходит по одинаковым полям ФИО
20 astraborz
 
07.03.13
13:26
при замере
Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл вызывается    1 053 раз за    55,188835 сек    90,22
21 astraborz
 
07.03.13
13:45
Тема еще актуальна
22 butterbean
 
07.03.13
13:48
сделай в запросе
ИТОГИ ПО ФИО
и обходи результат по группировкам
23 butterbean
 
07.03.13
13:48
(22) + это если я правильно понял что тебе надо...
24 astraborz
 
07.03.13
13:50
(23) Шас гляну
25 astraborz
 
07.03.13
14:05
(22) он тогда обходит только по группировкам, а мне надо перебрать весь список, если СНИЛС пустой то заменять надо измерения, на тот у которого существует СНИЛС. (А вот это скорее всего в запросе надо убрать Если снилсы у всех строк по ФИО одинаковые их вообще не обрабатывать)
26 astraborz
 
07.03.13
21:22
Больше идей нет?
по обходу запроса?
27 Kvestin
 
07.03.13
23:17
Если с запросами пока сложно, то оставьте так, как есть с небольшими дополнениями:
1. Добавить индексирование по полю ФИО временной таблицы (вкладка дополнительно конструктора запроса)
2. Исправить обход следующим образом
<code>
   Пока Выборка.Следующий() Цикл
   Если Выборка.СНИЛС = "" Тогда
       Продолжить;
   КонецЕсли;
       ФИО = Выборка.ФИО;
   СНИЛС = Неопределено;
       Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл            
           Если НЕ Обход.СНИЛС = "" ТОгда
               СНИЛС = Обход.СНИЛС;
               Район = Обход.Учреждение;
       Прервать;
           КонецЕсли;    
       КонецЦикла;    
       Если Не СНИЛС = Неопределено И Выборка.СНИЛС = "" Тогда
           НаборПоиска = РегПлатежи.СоздатьНаборЗаписей();
           Сч = 0;
           Для Каждого Колонка Из НаборПоиска.Отбор Цикл
               Сч = Сч + 1;
               Колонка.Установить(Выборка[Сч - 1]);
           КонецЦикла;
           НаборПоиска.Прочитать();
           Если НаборПоиска.Количество() > 0 Тогда
               НаборПоиска.Очистить();
               НаборПоиска.Записать();
               Запись = РегПлатежи.СоздатьМенеджерЗаписи();
               Сч = 0;
               Для Каждого Колонка Из Колонки Цикл
                   Сч = Сч + 1;
                   Запись[Колонка.Ключ] = Выборка[Сч - 1];
               КонецЦикла;
               Запись.СНИЛС = СНИЛС;
               Если  Не ЗначениеЗаполнено(Запись.Учреждение) И ЗначениеЗаполнено(Район) Тогда
                   Запись.Учреждение = Район;
               КонецЕсли;    
               Запись.Записать();
               НоваяСтрока = Таблица.Добавить();
               НоваяСтрока.СНИЛС = Запись.СНИЛС;
               НоваяСтрока.ФИО = Запись.ФИО;
               НоваяСтрока.Сумма = Запись.Сумма;                      
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;</code>

Если есть желание разобраться, то получите все, что вам надо запросом, а не из еще одной выборки. Сделать это можно так:
1. Вашу последнюю выборку помещаем в еще одну временную таблицу (не забываем индексировать по полям которые потом используем в соединениях и отборах) (пусть будет ВТ2)
2. Из этой временной таблицы выбираем данные которые будем использовать для заполнения (те у которых СНИЛС <> ""). Помещаем их тоже во временную таблицу (пусть будет ВТ3)
При этом группируем по ФИО (по СНИЛС берем Максимум), чтобы не задублить
3. Соединяем ВТ2 и ВТ3 по ФИО ЛЕВЫМ соединением и используем в выборке СНИЛС из присоединенной ВТ3
28 astraborz
 
09.03.13
19:21
(27) Спасибо. Попробую реализовать и напишу что было
AdBlock убивает бесплатный контент. 1Сергей