Решил запрограммировать свою задачку
Как то раньше публиковал задачку.
Задача такая:
В базе данных есть заранее неизвестное количество контрагентов.
К базе можно выполнять только один вид запроса: спросить сколько контрагентов находится в выдаче на странице номер N.
При этом на странице выдается по X контрагентов и контрагенты всегда упорядочены одинаково. На последней странице может быть меньше контрагентов.
К запросу можно выполнить только одно действие: удалить контрагентов, выданных на странице.
При этом будут удалены только те контрагенты, по которым в базе не проходит никаких операций.
Пока что вот такая версия файла, но она удаляет не все:
Я иду с начала вверх и потом назад к началу. Процесс асинхронный, интерактивный. Можно прервать и продолжить.
Протокол выглядит так:
Со страницы: 1 удалено: 4 объектов
На странице: 1 находится: 10 объектов
Со страницы: 2 удалено: 6 объектов
На странице: 2 находится: 10 объектов
Со страницы: 3 удалено: 5 объектов
На странице: 3 находится: 5 объектов
Со страницы: 2 удалено: 6 объектов
На странице: 2 находится: 9 объектов
Со страницы: 1 удалено: 4 объектов
На странице: 1 находится: 10 объектов
Со страницы: 0 удалено: 3 объектов
На странице: 0 находится: 10 объектов
Алгоритм завершен за 7 итераций
Но этого не достаточно, нужно контролировать размер последней страницы. Допишите, если есть желание.
UPD: поправил ошибки и действительно алгоритм подъема вверх и спуска назад работает.
Вот обновленный файл:
Образец протокола:
Итерация: 1 Страничный курсор: 1 Направление курсора: 1
Со страницы: 1 удалено: 3 объектов
На странице: 1 находится: 10 объектов
Итерация: 2 Страничный курсор: 2 Направление курсора: 1
Со страницы: 2 удалено: 6 объектов
На странице: 2 находится: 10 объектов
Итерация: 3 Страничный курсор: 3 Направление курсора: 1
Со страницы: 3 удалено: 7 объектов
На странице: 3 находится: 10 объектов
Итерация: 4 Страничный курсор: 4 Направление курсора: 1
Со страницы: 4 удалено: 1 объектов
На странице: 4 находится: 3 объектов
Итерация: 5 Страничный курсор: 3 Направление курсора: -1
Со страницы: 3 удалено: 3 объектов
На странице: 3 находится: 10 объектов
Итерация: 6 Страничный курсор: 2 Направление курсора: -1
Со страницы: 2 удалено: 2 объектов
На странице: 2 находится: 10 объектов
Итерация: 7 Страничный курсор: 1 Направление курсора: -1
Со страницы: 1 удалено: 2 объектов
На странице: 1 находится: 10 объектов
Итерация: 8 Страничный курсор: 0 Направление курсора: -1
Алгоритм завершен за 8 итераций
Код шага такой:
Процедура Шаг() Экспорт Итерация = Итерация + 1; Курсор = Курсор + НаправлениеКурсора; Сообщить("Итерация: " + Итерация + " Страничный курсор: " + Курсор + " Направление курсора: " + НаправлениеКурсора); Если Курсор < 1 Тогда //Если курсор указывает на страницу меньше чем 1 Сообщить("Алгоритм завершен за " + Итерация + " итераций"); Стоп(Неопределено); Возврат; КонецЕсли; КомандаУдалить(Курсор); Записей = КомандаСпросить(Курсор); //Разворачиваемся если достигли конца страницы Если Записей < РазмерСтраницы Тогда НаправлениеКурсора = -1; КонецЕсли; Статистика(); КонецПроцедуры
Думаю, можно удалить процедуру Шаг и давать соискателям возможность решать задачу в каркасе обработки для экономии времени.
Объем: 1.5 час.
Свежие комментарии