Имя: Пароль:
1C
 
Гуру тест про удаление контрагентов в браузере, можно задавать на собесах.
🠗 (Волшебник 08.04.2020 16:20)
0 Гений 1С
 
гуру
08.04.20
15:54
Итак, задача.
В базе есть неизвестное количество контрагентов.
К базе можно выполнять только один вид запроса:
Показать страницу номер N контрагентов (на каждой странице показывается 25 контрагентов).

Запрос выдает количество контрагентов на странице.

Можно выполнить команду "Удалить контрагентов на текущей странице".

Есть один момент - некоторые контрагенты не могут быть удалены. Соответственно, при выдаче команды удаления они останутся и не будут удалены.

Вопрос: Как оптимально выполнить удаление тех контрагентов, которых можно удалить.
1 Ёпрст
 
08.04.20
16:00
(0) выполнить  команду удалитьВсехКогоМожно же..
2 Aleksey
 
08.04.20
16:01
в браузере нет контрагентов
3 ДенисЧ
 
08.04.20
16:01
Если мне такой вопрос зададут на собеседовании - я поинтересуюсь, давно ли вопрошающий был у врача.

ЗЫ. Это же относится и к ТС.
4 Гений 1С
 
гуру
08.04.20
16:02
(1) (2) (3)  че, салабоны, не работает соображалка? ;-)
5 Гений 1С
 
гуру
08.04.20
16:03
(2) это я счас как раз решал проблему удаления всех контрагентов в базе books.zoho.com, столкнулся, там аккурат по 25 можно удалять и опять же некоторые не удаляются. ггг.
7 ДенисЧ
 
08.04.20
16:05
(5) В какой-то интернет-помойке решать проблему, которая в 1с решается 3мя строчками кода - как-то фу.
8 1Снеговик
 
гуру
08.04.20
16:07
(0) если ты не можешь проверить сколько на странице осталось после удаления, то никак.
А так, удаляешь всех на 1 странице, как только количество перестает уменьшаться переходишь на следующую.
9 PR
 
08.04.20
16:08
Большинство таких специалыстов базовых вещей не умеет (даже не технического плана), зато думают, что их супергуру делает то, что они знают, как в запросе строку превратить в число
Удивляются потом, почему им больше сотки никто не предлагает и кроме как в ларек не берут
10 PR
 
08.04.20
16:10
(4) Даже вопрос "Как сделать внешнюю печатную форму минимальной кровью, чтобы она не отваливалась при изменении типовой конфы" и то более насущный, чем твой
11 PR
 
08.04.20
16:12
Это не гуру-тест, это тест на бесполезных задротов, оторванных от жизни
12 Мимохожий Однако
 
08.04.20
16:13
Один дурак может задать столько вопросов, что и сто мудрецов не ответят.
13 dezss
 
08.04.20
16:23
Ну кто же еще мог подобный вопрос задать на мисте. Конечно же наш ТС.
14 Lama12
 
08.04.20
16:35
(0) Так, с конца. Нет?
15 Garikk
 
08.04.20
16:39
(0)
если это обычный rest, у него скорее всего на запрос несуществующей страницы - отдается последняя - геморрой что надо вычислять макс-число страниц
есть ли в выдаче списка контрагентов сортировка - если нет - задача решаема за просто адское количество времени потому что всевремя будет непредсказуемо менятся список контрагентов на страницах и невозмодно узнать - удалился ли контрагент или нет
16 Garikk
 
08.04.20
16:39
(15) +не перебирая все страницы
17 Гений 1С
 
гуру
08.04.20
17:13
(14) подробнее. Как.
(15) количество страниц получить нельзя, собес не прошел, не умеешь читать условие.
(8) можно, прикинь
18 Гений 1С
 
гуру
08.04.20
17:13
(16) есть красивое решение
19 Гений 1С
 
гуру
08.04.20
17:14
(11) в микрософт любят такое давать. Типа сколько бензозаправок в москве
20 Ботаник Гарден Меран
 
08.04.20
17:17
(19)
Москва в США маленький город, 23700 жителей.
От 5 до 10 заправок.
Не умеешь ты, гуру, правильные задачи находить, всё г из ларьков тащишь.
21 Гений 1С
 
гуру
08.04.20
17:24
(20) да норм задача, чисто на алгоритмику. Нехай думают, корифеи.. А то не верят, что я Гений 1С
22 Ns33
 
08.04.20
17:26
Бесконечно гонять цикл: удалять контрагентов, начиная с последней страницы и до первой.
Условие выхода: за всю переборку (от конца до начала) не поменялся номер последней страницы и кво контрагентов на ней; ибо будут копиться неудаляемые контрагенты, и удаление такой страницы ничего не изменит.
23 Ns33
 
08.04.20
17:52
(22) Дополнение: т.к. начиная с первой страницы будут копиться страницы, заполненные неудаляемыми контрагентами, то вводим счетчик, хранящий номер последней забитой неудаляемыми контрагентами страницы, и цикл по страницам будет идти от конца до этого счетчика.
24 Гений 1С
 
гуру
08.04.20
18:00
(22) что такое "последняя страница", как ты ее найдешь.
25 Гений 1С
 
гуру
08.04.20
18:01
(23) что такое неудаляемые контрагенты? Ты можешь получить только количество контрагентов на странице.
26 experimentator76
 
08.04.20
18:12
(7) а в фузине вообще - одной строкой :)
27 Ns33
 
08.04.20
18:14
(24) ну получается перебором всех страниц, до тех пор, пока кво контрагентов на этой странице будет равно 0.
(25) "некоторые контрагенты не могут быть удалены". Такие контрагенты постепенно будут скапливаться, начиная с 0-й страницы и вся страница будет забита ими. При удалении контрагентов на такой странице, ничего не изменится, а именно: последняя страница останется последней и кво контрагентов на ней (последней) не изменится.
28 experimentator76
 
08.04.20
18:16
(0) Хитрый способ. Стать путиным. Приказать контрагентам и они удалятся.
29 experimentator76
 
08.04.20
18:18
(28) ой. этот способ уже кто-то использует.
30 Гений 1С
 
гуру
08.04.20
18:31
(27) подробнее... дьявол в деталях
31 Гений 1С
 
гуру
08.04.20
19:49
32 Garykom
 
гуру
08.04.20
20:50
(0)

НомерСтраницы = 0;
КоличествоКонтрагентов = 25;
Пока КоличествоКонтрагентов>0 Цикл
    НомерСтраницы = НомерСтраницы + 1;
    КоличествоКонтрагентов = ПоказатьСтраницу(НомерСтраницы);
    УдалитьКонтрагентовНаТекущейСтранице(НомерСтраницы);
КонецЦикла;
Пока НомерСтраницы>=1 Цикл
    НомерСтраницы = НомерСтраницы - 1;
    КоличествоКонтрагентов = ПоказатьСтраницу(НомерСтраницы);
    УдалитьКонтрагентовНаТекущейСтранице(НомерСтраницы);
КонецЦикла;
33 Гений 1С
 
гуру
08.04.20
22:17
(32) умница. Метод туда-обратно или хоббит. Именно в этом фишка задачи
34 Гений 1С
 
гуру
09.04.20
17:57
(32) Хотя в походе назад ты идешь до первой страницы, а в идеале если после удаления текущей страницы осталось столько же сколько и было, прерываем.
35 Гений 1С
 
гуру
09.04.20
18:02
Что-то типа этого:

НомерСтраницы = 0;

Пока истина Цикл
    НомерСтраницы = НомерСтраницы + 1;
    КоличествоКонтрагентов = ПоказатьСтраницу(НомерСтраницы);
    Если КоличествоКонтрагентов = 0 Тогда
        Прервать;
    КонецЕсли;
    УдалитьКонтрагентовНаТекущейСтранице(НомерСтраницы);
КонецЦикла;

Пока истина Цикл
    ПредКоличествоКонтрагентов = КоличествоКонтрагентов;
    КоличествоКонтрагентов = ПоказатьСтраницу(НомерСтраницы);
    Если ПредКоличествоКонтрагентов = КоличествоКонтрагентов И КоличествоКонтрагентов <> 0 Тогда
        Прервать;
    КонецЕсли;
    Если КоличествоКонтрагентов = 0 Тогда
        НомерСтраницы = НомерСтраницы - 1;
        Если НомерСтраницы = 0 Тогда
            Прервать;
        КонецЕсли;
        Продолжить;
    КонецЕсли;
    УдалитьКонтрагентовНаТекущейСтранице(НомерСтраницы);
КонецЦикла;