К статье
Практический материал

Разработка и Конфигурация · 10 мин

Что такое ПДС в 1С и как работает подсистема длительных операций

ПДС в 1С — подсистема длительных операций из БСП. Разбираем, как работают фоновые задания, ДлительныеОперации.ВыполнитьВФоне, ожидание результата и типичные ошибки.

ПДС в 1С — это сокращение от «подсистема длительных операций», входящая в состав Библиотеки стандартных подсистем (БСП). Она решает одну практическую задачу: позволяет запускать тяжёлые процедуры — обмены данными, формирование больших отчётов, загрузку прайсов, групповое проведение документов — в фоновом задании, не блокируя сеанс пользователя. Пользователь нажимает кнопку, видит индикатор выполнения и продолжает работать, а результат появляется, когда операция завершится.

Без ПДС любая длительная процедура выполняется прямо в клиентском сеансе: форма «зависает», пользователь не может ничего нажать, а при обрыве соединения с сервером операция прерывается без сохранения результата. Подсистема убирает эти проблемы за счёт стандартного механизма: вызов процедуры в фоне, отслеживание её состояния, передача результата обратно в форму и обработка ошибок.

ПДС встроена во все типовые конфигурации на базе БСП — «Управление торговлей», «ERP», «Бухгалтерия предприятия», «Зарплата и управление персоналом» и другие. Если конфигурация разработана на основе БСП, подсистема уже доступна, и программисту достаточно вызвать несколько методов общего модуля ДлительныеОперации и ДлительныеОперацииКлиент.

Из чего состоит подсистема длительных операций

Ядро ПДС — общие модули БСП. Основной программный интерфейс сосредоточен в модуле ДлительныеОперации (серверный) и ДлительныеОперацииКлиент (клиентский). Первый отвечает за постановку процедуры в фоновое задание и получение её результата, второй — за ожидание завершения на клиенте с отображением индикатора.

Дополнительно подсистема использует стандартный механизм платформы «Фоновые задания» и, при необходимости, механизм сообщений пользователю для вывода прогресса. В типовых формах обработок БСП уже предусмотрены переопределяемые процедуры, поэтому разработчику часто достаточно описать свою серверную процедуру и подключить ожидание.

Результат длительной операции передаётся через временное хранилище: серверная процедура помещает данные по адресу, а клиент после завершения забирает их и обрабатывает. Это важно учитывать при проектировании: объёмные результаты разумно возвращать не целиком, а в виде ссылки на данные в базе.

Как устроен цикл выполнения операции

Типовой сценарий работы с ПДС состоит из четырёх этапов. Сначала клиентская процедура формирует параметры и вызывает серверный метод запуска. Затем сервер ставит процедуру в очередь фоновых заданий и возвращает структуру с идентификатором задания и статусом. После этого клиент подключает обработчик ожидания, который периодически опрашивает сервер. Наконец, по завершении вызывается оповещение, в котором разработчик забирает результат и обновляет форму.

Порядок действий при внедрении ПДС
  1. 1
    Создайте экспортную серверную процедуру в общем модуле с параметрами: структура параметров и адрес временного хранилища результата
  2. 2
    В клиентской процедуре вызовите ДлительныеОперации.ВыполнитьВФоне с именем процедуры и параметрами
  3. 3
    Настройте параметры ожидания через ДлительныеОперацииКлиент.ПараметрыОжидания: интервал опроса, вывод окна ожидания, текст пояснения
  4. 4
    Вызовите ДлительныеОперацииКлиент.ОжидатьЗавершение с описанием оповещения о завершении
  5. 5
    В обработчике оповещения проверьте статус, получите результат из временного хранилища и обработайте ошибки

Как запустить процедуру в фоне: практический пример

Минимальный каркас вызова выглядит так. Серверная процедура размещается в общем модуле с признаками «Сервер» и «Вызов сервера» не требуется — достаточно обычного серверного модуля. Процедура принимает два параметра: произвольную структуру параметров и адрес временного хранилища, куда нужно поместить результат.

&НаКлиенте

Процедура СформироватьОтчет(Команда)

ПараметрыПроцедуры = Новый Структура("Период, Организация", Период, Организация);

Длительность = ДлительныеОперации.ВыполнитьВФоне(

"Обработки.МойОтчет.СформироватьДанные",

ПараметрыПроцедуры,

ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор));

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);

Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияФоновогоЗадания", ЭтотОбъект);

ДлительныеОперацииКлиент.ОжидатьЗавершение(Длительность, Оповещение, ПараметрыОжидания);

КонецПроцедуры

В обработчике ПослеЗавершенияФоновогоЗадания первым делом проверяется статус: если он равен «Выполнено», результат забирается через ПолучитьИзВременногоХранилища(Результат.АдресРезультата). Если статус «Ошибка», текст ошибки доступен в свойстве КраткоеПредставлениеОшибки и ПодробноеПредставлениеОшибки — его нужно показать пользователю и записать в журнал регистрации.

Как показать прогресс и сообщения пользователю

По умолчанию ПДС показывает модальное окно ожидания с текстом «Пожалуйста, подождите». Его можно настроить через ПараметрыОжидания: задать свой текст пояснения, отключить окно и выводить прогресс в элемент формы, изменить интервал опроса. Для операций, где пользователь должен видеть этапы, окно ожидания часто заменяют собственным индикатором в форме.

Из фоновой процедуры можно отправлять сообщения через ДлительныеОперации.СообщитьПрогресс — например, «Обработано 1200 из 5000 документов». Клиент получит эти сообщения при очередном опросе и сможет обновить полосу прогресса. Это заметно улучшает восприятие: пользователь видит, что процесс идёт, а не завис.

Когда ПДС нужна, а когда избыточна

Маршрут решения

Как выбрать действие

Операция занимает больше нескольких секунд и запускается из интерактивной формыИспользуйте ПДС с окном ожидания или индикатором в форме
Операция выполняется мгновенно (чтение одного объекта, простой расчёт)Вызывайте серверную процедуру напрямую — ПДС только добавит задержку на постановку фонового задания
Операция должна выполняться по расписанию без участия пользователяИспользуйте регламентное задание вместо ПДС
Нужно выполнять операцию только в файловой базеУчтите: в файловом режиме фоновые задания выполняются в том же процессе, выигрыш по отзывчивости ограничен

Важное ограничение файлового режима: фоновое задание там не даёт настоящей параллельности, оно выполняется в отдельном сеансе на том же компьютере. Тем не менее ПДС в файловой базе всё равно полезна — интерфейс остаётся отзывчивым, а логика кода не отличается от клиент-серверного варианта, что упрощает сопровождение.

Типичные ошибки при работе с ПДС

Типичные ошибки
01
Попытка вернуть через результат мутабельные объекты (ДокументОбъект, СправочникОбъект) — фоновое задание работает в другом сеансе, передавать нужно ссылки и простые типы данных
02
Отсутствие проверки статуса в обработчике завершения — при ошибке задания пользователь не видит ничего, а результат остаётся пустым
03
Запуск фонового задания в транзакции записи — фоновое задание не увидит незафиксированные данные, сначала завершите транзакцию
04
Слишком частый опрос сервера (интервал меньше секунды) — лишняя нагрузка на сервер при длительных операциях
05
Игнорирование отмены задания при закрытии формы — задание продолжает работать и грузить сервер, хотя результат уже никому не нужен

Отдельная группа проблем — права доступа. Фоновое задание выполняется от имени пользователя, который его запустил, поэтому все проверки прав применяются как обычно. Если процедура обращается к данным, недоступным пользователю, задание завершится ошибкой. Для обхода в строго обоснованных случаях используют установку привилегированного режима внутри серверной процедуры, но это должно быть осознанным решением, а не способом «починить» ошибку прав.

Как проверить, что операция отработала корректно

Контрольные точки

Как проверить результат

Статус в обработчике завершения
Норма

Статус равен «Выполнено», адрес результата заполнен

Тревожный признак

Статус «Ошибка» или «Отменено» — читайте представление ошибки и журнал регистрации

Содержимое временного хранилища
Норма

По адресу результата лежит структура с ожидаемыми полями

Тревожный признак

Неопределено или пустая структура — процедура не поместила результат

Журнал регистрации
Норма

Есть записи о начале и завершении задания без ошибок

Тревожный признак

Записи об ошибках фонового задания с текстом исключения

Данные в базе после операции
Норма

Изменения соответствуют параметрам запуска (период, организация, отбор)

Тревожный признак

Данные обработаны частично или с неверными отборами

Для отладки фоновых процедур удобно временно вызывать серверную процедуру напрямую, минуя ПДС: так ошибка всплывёт сразу с полным стеком. Когда логика отлажена, вызов возвращают в фоновый режим. В конфигураторе также доступна отладка фоновых заданий — нужно включить в параметрах отладки пункт «Фоновые задания» и подключиться к нужному сеансу.

Если операция запускается из формы обработки, передавайте в ПараметрыВыполненияВФоне уникальный идентификатор формы — тогда временное хранилище результата будет жить, пока открыта форма, и результат не пропадёт раньше времени.
ПЗ
Практическое замечание

Частые вопросы о ПДС в 1С

Чем ПДС отличается от регламентного задания?

Регламентное задание запускается по расписанию без участия пользователя и не связано с формой. ПДС — это интерактивный запуск: пользователь нажимает кнопку, видит прогресс и получает результат в свою форму. Под капотом оба механизма используют фоновые задания платформы.

Можно ли отменить запущенную длительную операцию?

Да, у фонового задания есть метод отмены, но серверная процедура прервётся только в точках, где платформа может безопасно остановить выполнение. В параметрах ожидания можно включить кнопку отмены в окне ожидания. После отмены в обработчик завершения придёт статус «Отменено», и это нужно обработать.

Работает ли ПДС в файловой базе?

Работает, но фоновое задание выполняется в отдельном сеансе на том же компьютере, поэтому реального распараллеливания нет. Интерфейс при этом остаётся отзывчивым, и код не нужно менять при переходе на клиент-серверный вариант.

Почему результат из временного хранилища пустой?

Чаще всего серверная процедура не поместила результат по переданному адресу или поместила его в хранилище с другим идентификатором. Проверьте, что процедура принимает адрес вторым параметром и вызывает ПоместитьВоВременноеХранилище именно с ним, а также что форма не была закрыта до завершения задания.

Нужно ли что-то внедрять, чтобы использовать ПДС в своей конфигурации?

В типовых конфигурациях на БСП подсистема уже есть. В самостоятельной разработке нужно внедрить БСП или как минимум подсистему «Длительные операции» вместе с её зависимостями — проще всего это сделать при создании конфигурации на основе БСП, чем переносить модули вручную.

Итог

Что важно запомнить

ПДС — подсистема длительных операций БСП, которая запускает тяжёлые процедуры в фоне и возвращает результат в форму. Ключевые точки: серверная экспортная процедура, вызов ВыполнитьВФоне, ожидание через ДлительныеОперацииКлиент, обязательная проверка статуса и обработка ошибок. Передавайте в фон только простые типы и ссылки, а ошибки фиксируйте в журнале регистрации.