Имя: Пароль:
1C
1С v8
Максимальный элемент в запросе
,
0 reznik911
 
24.01.17
06:35
Добрый день! Есть нетиповая конфигурация. Платформа 8.3. Спр Банки и Банковские счета (Бс). Нужно пометить на удаление те банки, по которым меньше ссылок(каждый банк существует по разным городам и у них обще только БИК) или иначе сказать отставить те, по которым много ссылок на Бс.

Получить запросом max либо не max, после получу объект, сравниваю если получаю не max, то помечу на удаление, если получаю max то сравниваю, если не равно то пометить на удаление справочник.

ВЫБРАТЬ
    Банки.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТаблицаБанк
ИЗ
    Справочник.Банки КАК Банки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    БанковскиеСчета.Банк,
    СУММА(1) КАК Количество
ПОМЕСТИТЬ ТаблицаБС
ИЗ
    Справочник.БанковскиеСчета КАК БанковскиеСчета

СГРУППИРОВАТЬ ПО
    БанковскиеСчета.Банк
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаБанк.Ссылка,
    МАКСИМУМ(ТаблицаБС.Количество) КАК Количество
ИЗ
    ТаблицаБанк КАК ТаблицаБанк
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаБС КАК ТаблицаБС
        ПО ТаблицаБанк.Ссылка.БИК = ТаблицаБС.Банк.БИК

СГРУППИРОВАТЬ ПО
    ТаблицаБанк.Ссылка
Так я получаю каждому банку значение max
Пробовал делать без ВТ,получаю количество ссылок но как отбросить или выбрать только максимум не получается
1 reznik911
 
24.01.17
06:38
или получить запросом кол-во ссылок и циклом определить мак или не макс исходя из этого пемечать на удаление
2 youalex
 
24.01.17
06:54
в первой вт : Банк, БИК, КоличествоСчетов
во второй: БИК, МАКС(КоличествоСчетов)
первую вт - цепляешь со второй по БИК и Количеству
3 Sem0709
 
24.01.17
07:03
(2) Что по МАКС вы получите во второй таблице ?
4 Sem0709
 
24.01.17
07:06
(2) Я к тому, может вы КОЛИЧЕСТВО() имели ввиду ?
5 reznik911
 
24.01.17
07:08
че то не пошло

ВЫБРАТЬ
    БанковскиеСчета.Банк,
    БанковскиеСчета.Банк.БИК КАК БИК,
    1 КАК КоличествоСчетов
ПОМЕСТИТЬ ВТББС
ИЗ
    Справочник.БанковскиеСчета КАК БанковскиеСчета
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    БанковскиеСчета.Банк.БИК КАК БИК,
    МАКСИМУМ(1) КАК КоличествоСчетов
ПОМЕСТИТЬ ВТБК
ИЗ
    Справочник.БанковскиеСчета КАК БанковскиеСчета

СГРУППИРОВАТЬ ПО
    БанковскиеСчета.Банк.БИК
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТББС.Банк,
    ВТББС.БИК,
    ВТББС.КоличествоСчетов
ИЗ
    ВТББС КАК ВТББС
        ЛЕВОЕ СОЕДИНЕНИЕ ВТБК КАК ВТБК
        ПО ВТББС.БИК = ВТБК.БИК
            И ВТББС.КоличествоСчетов = ВТБК.КоличествоСчетов
6 Sem0709
 
24.01.17
07:09
(0) В банковских счетах нет ссылки на Банк ? Только на БИК ? Странно, наверное, сам не знаю)
7 reznik911
 
24.01.17
07:11
(6) есть ))) К тому что первый ВТ не имеет смысла, т.к. с БС можно вытащить ссылку об этом идет речь?
8 Sem0709
 
24.01.17
07:15
(6) ... соедините таблицы по банк.ссылка, сгруппируйте по этой ссылке, а к БанковскиеСчета примените КОЛИЧЕСТВО(БанковскиеСчета)

Далее можете отсортировать прям в запросе. В зависимости от сортировки (ВОЗР или УБЫВ) в верху таблицы будет максимальное или минимальное клоичество счетов по баку...
9 Sem0709
 
24.01.17
07:17
Просто потом не понятно, что вы собираетесь определять. Макс. или мин. количество счетов ? Все или больше какого то значения ?
10 reznik911
 
24.01.17
07:23
(9) в зависимости от того что получиться вытащить. Пометить на удаление банки на которых меньше ссылок. Допустим сбербанк по 10 городам, по одному из них самое большее количетство БС, его оставляем остальные помечаем и так по всем остальным банкам
11 youalex
 
24.01.17
07:24

ВЫБРАТЬ
    БС.Банк,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ БС.Ссылка) КАК Количество,
    БС.Банк.Код КАК БИК
ПОМЕСТИТЬ вт_ЧислоСчетов
ИЗ
    Справочник.БанковскиеСчета КАК БС

СГРУППИРОВАТЬ ПО
    БС.Банк,
    БС.Банк.Код
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    вт_ЧислоСчетов.БИК,
    МАКСИМУМ(вт_ЧислоСчетов.Количество) КАК Количество
ПОМЕСТИТЬ вт_Макс
ИЗ
    вт_ЧислоСчетов КАК вт_ЧислоСчетов

СГРУППИРОВАТЬ ПО
    вт_ЧислоСчетов.БИК
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    вт_ЧислоСчетов.БИК,
    МАКСИМУМ(вт_ЧислоСчетов.Банк) КАК Банк
ИЗ
    вт_ЧислоСчетов КАК вт_ЧислоСчетов
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_Макс КАК вт_Макс
        ПО вт_ЧислоСчетов.БИК = вт_Макс.БИК
            И вт_ЧислоСчетов.Количество = вт_Макс.Количество

СГРУППИРОВАТЬ ПО
    вт_ЧислоСчетов.БИК
12 reznik911
 
24.01.17
07:34
(8) это на счет (0) или (5) ?
13 reznik911
 
24.01.17
07:51
(8) не пошло. По всем показал
ВЫБРАТЬ
    Банки.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТаблицаБанк
ИЗ
    Справочник.Банки КАК Банки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    БанковскиеСчета.Банк,
    1 КАК Количество
ПОМЕСТИТЬ ТаблицаБС
ИЗ
    Справочник.БанковскиеСчета КАК БанковскиеСчета
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаБанк.Ссылка,
    КОЛИЧЕСТВО(ТаблицаБС.Количество) КАК Количество
ИЗ
    ТаблицаБанк КАК ТаблицаБанк
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаБС КАК ТаблицаБС
        ПО ТаблицаБанк.Ссылка = ТаблицаБС.Банк.Ссылка

СГРУППИРОВАТЬ ПО
    ТаблицаБанк.Ссылка

УПОРЯДОЧИТЬ ПО
    Количество УБЫВ
14 reznik911
 
24.01.17
07:52
(11) также просто по всем показал
15 ILM
 
гуру
24.01.17
07:55
А теперь вопрос в студию: "Если по БИК у двух банков одинаковое количество счетов, то какой удалять будете уже решили?"
16 reznik911
 
24.01.17
07:57
(14) исправил на Код на БИк
17 reznik911
 
24.01.17
07:59
(15) Ответ: таких будет не один, удалять те по которым меньше ссылок
18 НЕА123
 
24.01.17
08:05
>каждый банк существует по разным городам и у них обще только БИК
это насчет "общее БИК" - правда так?
19 1dvd
 
24.01.17
08:06
Задача объединить банки?
20 reznik911
 
24.01.17
08:07
(18) да именно
21 Sem0709
 
24.01.17
08:07
ВЫБРАТЬ
    Банки.Ссылка КАК Ссылка,
    КОЛИЧЕСТВО(ТаблицаБС.Количество) КАК КоличествоСчетов
ИЗ
    Справочник.Банки КАК Банки
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БанковскиеСчета КАК БанковскиеСчета
        ПО Банки.Ссылка = Справочник.Банк.Ссылка

СГРУППИРОВАТЬ ПО
    Банки.Ссылка

УПОРЯДОЧИТЬ ПО
    КОЛИЧЕСТВО(ТаблицаБС.Количество) УБЫВ

Вроде правильно... получаем таблицу с количеством счетов по банкам сверху вних... далее определяемся какие банки надо убить...
22 reznik911
 
24.01.17
08:08
(19) задача подчистить спр банки. яхотел вручную пометить на удаление лишние, но сказали чтоб автоматом он выбрал. После пометки я уже своей обработкой перебью все ссылки на не помеченные банки
23 Sem0709
 
24.01.17
08:09
(21) ПО Банки.Ссылка = БанковскиеСчета.Банк.Ссылка
24 Sem0709
 
24.01.17
08:11
(22) Только список и всё ? Тогда (21) то что нужно... пробуй
25 НЕА123
 
24.01.17
08:20
>  КОЛИЧЕСТВО(ТаблицаБС.Количество) КАК Количество
надо  КОЛИЧЕСТВО(*), ну Сумма(1)
26 d546
 
24.01.17
08:21
// выбираем количество счетов по ссылке банк
ВЫБРАТЬ
    БанковскиеСчета.Банк,
    СУММА(1) КАК Количество
ПОМЕСТИТЬ ВТКолБанк
ИЗ
    Справочник.БанковскиеСчета КАК БанковскиеСчета

СГРУППИРОВАТЬ ПО
    БанковскиеСчета.Банк
;

// находим максимальное количество по БИК
ВЫБРАТЬ
    КолБанк.Банк.БИК БИК,
    МАКСИМУМ(КолБанк.Количество) КАК Количество
ПОМЕСТИТЬ ВТМаксБик
ИЗ
    ВТКолБанк КАК КолБанк

СГРУППИРОВАТЬ ПО
    ТаблицаБанк.Ссылка
;

// находим ссылки банк с максимум счетов
ВЫБРАТЬ
    МАКС(ВТКолБанк.Банк) КАК Банк
ПОМЕСТИТЬ ВТМаксБанк
ИЗ
    ВТМаксБик
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        ВТКолБанк КАК КолБанк
        ПО ВТМаксБик.БИК = ВТКолБанк.БИК
        И ВТМаксБик.Количество = ВТМаксБик.Количество
СГРУППИРОВАТЬ
    ВТМаксБик.БИК
;

// выбираем банки за исключением максимальных банков
ВЫБРАТЬ
    Банки.Ссылка
ИЗ
    Справочник.Банки КАК Банки
ГДЕ
    НЕ Банки.Ссылка В (ВЫБОР ВТМаксБанк.Банк ИЗ ВТМаксБанк)
27 d546
 
24.01.17
08:22
делал в блокноте, может есть ошибки :)
28 НЕА123
 
24.01.17
08:34
(20)
врешь.
29 reznik911
 
24.01.17
08:44
(11) Спасибо помогло
30 d546
 
24.01.17
08:52
не заметил решения в 11 :) ну ладно мозг размял
31 reznik911
 
24.01.17
08:59
только вот не понятно как пометить на у3даление остальные?

Если так
Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ОбъектБанк = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();

<<Какое условие ставить не понятно?>>
        ОбъектБанк.ПометкаУдаления = Истина;


        ОбъектБанк.Записать();
        
    КонецЦикла;
32 reznik911
 
24.01.17
09:00
Если объектБанк <> ВыборкаДетальныеЗаписи.Ссылка?
33 d546
 
24.01.17
09:17
(32) бери мой вариант из (26)
34 d546
 
24.01.17
09:20
там в запросе выберешь, те которые надо пометить
35 reznik911
 
24.01.17
10:20
(34) Ожидается выражение "КОГДА"
НЕ Банки.Ссылка В (ВЫБОР ВТМаксБанк.Банк <<?>>ИЗ ВТМаксБанк)
36 d546
 
24.01.17
10:29
заменить на ВЫБРАТЬ :) блокнот это блокнот
37 reznik911
 
24.01.17
10:29
(36) уже
38 d546
 
24.01.17
10:30
и лучше бы я поспал подольше
39 reznik911
 
24.01.17
10:39
(38) и на том спасибо. Да, синтаксические ошибки исправил)))
40 youalex
 
24.01.17
12:55
(30) Решение НЕ В()
41 youalex
 
24.01.17
12:57
(40) + или
вт_ЧислоСчетов.БИК < вт_Макс.БИК
42 reznik911
 
24.01.17
13:11
(40) Не в неправильно тоже
43 reznik911
 
24.01.17
13:11
(40) при таком условии он оказывается выбирает минимум отбрасывая все значения больше него
44 reznik911
 
24.01.17
13:18
(41) так тоже не пашет
45 youalex
 
24.01.17
13:29
(44) МАКСИМУМ(вт_ЧислоСчетов.Банк) - Максимум убери
46 reznik911
 
24.01.17
13:39
(45) увы не пашет
47 reznik911
 
25.01.17
08:54
Такая схема правильно идет

Запрос = Новый Запрос;
    Запрос.Текст =
    
    "ВЫБРАТЬ
    |    БанковскиеСчета.Банк,
    |    БанковскиеСчета.Банк.БИК,
    |    БанковскиеСчета.Банк.Город,
    |    СУММА(1) КАК Количество
    |ИЗ
    |    Справочник.БанковскиеСчета КАК БанковскиеСчета
    |ГДЕ
    |    НЕ БанковскиеСчета.Банк.ПометкаУдаления
    |
    |СГРУППИРОВАТЬ ПО
    |    БанковскиеСчета.Банк,
    |    БанковскиеСчета.Банк.БИК";
    
    ЧастотаБанков = Запрос.Выполнить().Выгрузить();
    ЧастотаБанков.Сортировать("БанкБИК,Количество Убыв");
    
    СписокПопулярныхБанков = Новый Соответствие;
    ПопулярныеБанки = Новый Соответствие;
    
    Для каждого Строка Из ЧастотаБанков Цикл
        Если Не ПустаяСтрока(Строка.БанкБИК) И ПопулярныеБанки[Строка.БанкБИК] = Неопределено Тогда
            ПопулярныеБанки.Вставить(Строка.БанкБИК, Строка.Банк);
            СписокПопулярныхБанков.Вставить(Строка.Банк, Строка.БанкБИК);
        КонецЕсли;
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Банки.Ссылка,
    |    Банки.БИК
    |ИЗ
    |    Справочник.Банки КАК Банки
    |ГДЕ
    |    НЕ Банки.ПометкаУдаления";
    Выборка = Запрос.Выполнить().Выбрать();
    
    КолЭл = 0;
    Пока Выборка.Следующий() Цикл
        Если Не ПустаяСтрока(Выборка.БИК) И СписокПопулярныхБанков[Выборка.Ссылка] = Неопределено Тогда
            ОбъектБанк = Выборка.Ссылка.ПолучитьОбъект();
            ОбъектБанк.ПометкаУдаления = Истина;
            ОбъектБанк.Записать();
            Сообщить("Банк помечен на удаление : " + ОбъектБанк + "; Город: " + ОбъектБанк.Город);
            КолЭл = КолЭл + 1;
        КонецЕсли;
    КонецЦикла;
    Сообщить("Помечено на удаление банков: " + КолЭл);

Сразу запросом неправильно берет. В чем разница?
48 d546
 
25.01.17
09:34
используй обработку поиск и удаление дублей :) хватит мучатся с запросом
49 reznik911
 
25.01.17
10:12
(48) там же не получится или все равно там же писать запрос))