Консоль запросов 9000 задумана как простой, удобный и эффективный инструмент, который работает на любой операционной системе и любой конфигурации без ее модификации, без возни с расширениями. Пришел, достал из кармана (или яндекс-диска :) - запустил и работаем!
Но, с такими требованиями, все же есть некоторые ограничения. В частности, платформа 1С не позволяет запустить выполнение в фоне кода внешней обработки. Средствами встроенного языка можно запустить только код, находящийся в конфигурации. Поэтому, в консоли запросов было реализовано целых пять вариантов запуска кода, три из которых работают на любой конфигурации, а два, с запуском в фоне требуют наличия в конфигурации БСП версии не ниже 2.3. Стоит отметить, что сейчас довольно сложно найти боле-менее современную конфигурацию не подходящую под это требование.
Сама обработка кодом реализована достаточно просто. Нужно открыть страницу "Алгоритм", разместить код, выбрать метод выполнения и запустить. В зависимости от метода выполнения, может отображаться прогресс-бар внизу или рядом с кнопкой запуска. Или совсем отсутствовать, если выбранный режим не поддерживает отображения прогресса.
Давайте рассмотрим режимы запуска кода в консоли запросов 9000 подробнее.
Простое выполнение
В этом простейшем варианте код просто выполняется на сервере, выполнение происходит один раз. В этом режиме на клиенте нет никакой индикации прогресса выполнения. Обход результата запроса необходимо организовать самостоятельно. В коде можно использовать Сообщить, но сообщения можно будет увидеть только после завершения выполнения. Прерывание обработки в этом режиме невозможно. Можно рекомендовать такой вариант, если обработка выполняется достаточно быстро.
В коде доступна переменная Выборка - выборка из результата запроса.
Пример кода.
Пока Выборка.Следующий() Цикл
Выборка.Ссылка.ПолучитьОбъект().Удалить();
КонецЦикла;
Построчно без индикации
В этом режиме код вызывается для каждой строки результата запроса. Нет необходимости организовывать обход результата запроса. Так же можно использовать Сообщить, сообщения можно будет увидеть только после завершения выполнения. Прерывание обработки в этом режиме так же невозможно.
Доступ к результату запроса так же происходит через переменную Выборка, однако, в отличие от предыдущего варианта, выборка будет уже спозиционирована на обрабатываемую запись.
Пример кода.
Выборка.Ссылка.ПолучитьОбъект().Удалить();
Построчно с индикацией
В отличие от "Построчно без индикации", на клиенте виден прогресс выполнения, прошедшее время выполнения, прогноз на оставшееся время.
При необходимости можно прервать выполнение нажатием Ctrl+Break. Но за удобство есть плата - для каждого обновления прогресса происходит серверный вызов. Это происходит с периодом, установленным в "Опциях", по умолчанию там стоит одна секунда. Для уменьшения потерь времени на индикацию этот период можно увеличить.
Так же можно использовать Сообщить, но сообщения будут отображены только по завершению выполнения. Код алгоритма пишется точно так же, что и в варианте "Построчно без индикации". Это самый удобный вариант, если в конфигурации нет БСП 2.3 и подходит построчный вариант обхода.
Простое в фоне (БСП 2.3)
Этот вариант будет работать, если в конфигурации присутствует БСП с версией не ниже 2.3. Код выполняется в фоновом задании, целиком. Обход результата запроса нужно организовывать самостоятельно. На клиенте отображается только время выполнения. Поскольку выполнение происходит в фоне, на клиенте можно продолжать работу. В этом режиме так же можно прерывать выполнение с помощью нажатия кнопки "Прервать" (Ctrl+F5). И еще одно преимущество - можно использовать Сообщить, и сообщения видны на клиенте почти сразу, с периодом обновления отображения состояния. Период обновления отображения состояния по умолчанию одна секунда, его можно изменить в "Опциях".
Код пишется точно так же, как и в первом варианте, доступна переменная Выборка.
Но, в отличие от первого варианта тут есть бонус - можно организовать прогресс. Для этого нужно использовать вызов процедуры СообщитьПрогресс.
Код с прогрессом в этом варианте выглядит так.
й = 0;
КоличествоВсего = Выборка.Количество();
ВремяНачалаВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Удалить();
й = й + 1;
//Передаём прогресс один раз на 10 записей, что бы меньше тормозить основную обработку.
Если й % 10 = 0 Тогда
СообщитьПрогресс(й, КоличествоВсего, ВремяНачалаВМиллисекундах, ПризнакПрогресса);
КонецЕсли;
КонецЦикла;
Разберем этот код. Для отображения прогресса потребуется счетчик обработанных записей (й), количество записей всего (КоличествоВсего) и время начала выполнения (ВремяНачалаВМиллисекундах). Все эти значения достаточно указать при вызове СообщитьПрогресс, и на клиенте появится прогресс выполнения. Еще для СообщитьПрогресс нужен служебный параметр ПризнакПрогресса, он уже есть в контексте выполнения, его нужно просто передать без изменений. В приведенном примере СообщитьПрогресс вызывается один раз на 10 обработанных записей, что бы отображение прогресса не тормозило основную обработку. Если записи обрабатываются быстро, можно увеличить это значение и вызывать СообщитьПрогресс один раз на 100 или даже 1000 записей.
Это вариант следует использовать, если не устраивает простой построчный обход результата. А если устраивает - тогда используем следующий вариант, где обход и отображение прогресса уже реализовано.
Построчно в фоне с индикацией (БСП 2.3)
Как следует из названия, для этого варианта так же требуется БСП с версией не ниже 2.3. Работает точно так же, как "Построчно с индикацией", но выполнение происходит в фоне. Код вызывается для каждой записи. Прогресс обновляется с периодом, указанном в опциях (по умолчанию одна секунда). Можно использовать Сообщить, сообщения отображаются на клиенте с обновлением прогресса. В момент выполнения обработки на клиенте можно продолжать работу. Так же, как и в предыдущем варианте, возможно прерывание. Это самый удобный вариант, если есть БСП 2.3 и подходит построчный вариант обхода. Отображение прогресса в этом варианте выглядит так:
Ну а что бы не забыть, как работает какой вариант, тут же есть кнопка Справка, где кратко и с примерами описаны все пять режимов работы.
Пример кода.
Объект = Выборка.Ссылка.ПолучитьОбъект();
Сообщить(Объект);
Объект.Удалить();
На этом все, всем быстрых запросов!