Решил запрограммировать свою задачку

Как то раньше публиковал задачку.

Задача такая:

В базе данных есть заранее неизвестное количество контрагентов.

К базе можно выполнять только один вид запроса: спросить сколько контрагентов находится в выдаче на странице номер 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 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *