Пример функции, выполняемой в фоне, с помощью БСП: ДлительныеОперации.ВыполнитьПроцедуру()

25.06.26

Разработка - Универсальные функции

Статья рассказывает, как написать выполнение в фоновом режиме своей процедуры или функции, используя БСП 3.1.11.392 с применением рекомендуемой на июнь 2026 года процедуры "ДлительныеОперации.ВыполнитьПроцедуру()". 1С рекомендует применять эту новую процедуру вместо устаревшей процедуры "ДлительныеОперации.ВыполнитьВФоне()". Пример полностью рабочий, можно скопировать тексты к себе и получить рабочий результат. Статья рассчитана на пользователя, умеющего создавать/подключать расширения 1С и создавать простейшие внешние обработки. Данные аспекты в статье не описаны и предполагается, что читатель справится с этим самостоятельно.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Пример функции, выполняемой в фоне, с помощью БСП: ДлительныеОперации.ВыполнитьПроцедуру()
.rar 9,16Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Всем добрый день!

В этой заметке хочу кратко рассказать свой опыт написания функции, выполняемой в фоне. Решение пригодно для клиент-серверного варианта работы 1С, с использованием БСП версии 3.1.11.392. Проверяла в конфигурации 1С: УТ 11.5.22.149.

Предыстория: у меня появилась задача выполнять обращение к api методу одного из наших популярных маркетплейсов. Из документации к нужному мне api методу узнала, что за один запрос сервер может вернуть не более 100 000 строк записей. А в 1 минуту можно отправлять не более одного такого запроса. При попытке зациклить обращения по api, на очередной итерации получила ответ сервера с кодом 429, что соответствует ошибке "слишком много запросов в единицу времени". Поэтому стало нужно использовать новый для меня метод  1С ВызватьПаузу(),  доступный на платформе 8.3.25 и выше. При этом оказалось что ВызватьПаузу() возможно использовать только в фоновых заданиях. И тут я потратила достаточно времени для поиска простого примера, как же правильно выполнить мою функцию в фоне.

Как оказалось, сложное вначале оказывается на поверку достаточно простым. Хочу с вами поделиться готовым примером. Пример состоит из двух частей и предназначен для клиент-серверного варианта работы 1С и с использованием БСП: 

  1. Часть 1. Расширение с общим модулем, для описания в нем самой фоновой функции. В архиве для скачивания это файл ТестовоеРасширениеФЗ.cfe
  2. Часть 2. Внешняя обработка,  которая на форму выводит результат работы фоновой функции. В архиве для скачивания это файл ТестированиеФЗ.epf

Расписываю по шагам действия и привожу тексты процедур.

  1. Создать в расширении общий модуль, в свойствах модуля указать "Выполнение на сервере в клиент-серверном варианте".
  2. В этом общем модуле делаем процедуру с признаком "Экспорт". Сама процедура тестовая, смысловой нагрузки не несет. Главное, что она будет выполнена в фоне.
  3. Во внешней обработке, из ее управляемой формы делаем вызов клиентской функции "ВыполнитьФоновуюПроцедуру()", эта процедура делает вызов фоновой функции из моего общего модуля и помещает результат работы на форму. 

И на третьем шаге небольшая 1С магия. Или, как мне встретилось на одном сайте, посвященном 1С, автор это назвал "заклинания 1С", что насмешило и запомнилось. Процедура (или функция), выполняемая в фоне, не может вернуть результат своей работы напрямую. А может только отдать адрес временного хранилища, куда помещает результат своей работы. И чтобы все-таки получить результат, сначала нужно объявить адрес временного хранилища и потом этот адрес передавать в фоновую процедуру или функцию.

Итак, создаем внешнюю обработку, в ней форму обработки, на форме делаем кнопку с вызовом клиентской процедуры "ВыполнитьФоновуюПроцедуру(Команда)", текст процедуры: 

&НаКлиенте
Процедура ВыполнитьФоновуюПроцедуру(Команда)
    
    ПараметрыЗапуска = Новый Структура;
    ПараметрыЗапуска.Вставить("ДатаНач", ДатаОтбора.ДатаНачала );
    ПараметрыЗапуска.Вставить("ДатаКон", ДатаОтбора.ДатаОкончания );
    
    СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);
    ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, ОповещениеОЗавершении, ПараметрыОжидания);    
    
КонецПроцедуры

Процедура вызывает серверную процедуру "ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)", процедура также расположена в модуле формы нашей внешней обработки. Текст: 

&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УИ)

    ТекущееХранилище = ПоместитьВоВременноеХранилище(Неопределено, УИ);         //объявление адреса временнного хранилища
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УИ); //процедура 1с УТ 11
    ПараметрыВыполнения.АдресРезультата = ТекущееХранилище;
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получить тестовые данные'");
    ПараметрыВыполнения.ЗапуститьВФоне = Истина; 
    ПараметрыВыполнения.ОжидатьЗавершение = 0;
    
    СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, 
                                                                     "алФоновыеЗадания.алВыполнитьВВФоне", 
                                                                     ПараметрыЗапуска,    
                                                                     ПараметрыВыполнения ); 
    Возврат СтруктураФоновогоЗадания;

КонецФункции

Также в процедуре "ВыполнитьФоновуюПроцедуру" объявлено оповещение "ОбработатьДанные", которое сработает при окончании выполнения фоновой функции.

Текст процедуры оповещения "ОбработатьДанные": 

&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт

    Если Результат = Неопределено Тогда
        Возврат;
    ИначеЕсли Результат.Статус = "Выполнено" Тогда
        СтруктураРезультат= ПолучитьИзВременногоХранилища(Результат.АдресРезультата); 
        Если СтруктураРезультат<> Неопределено Тогда 
            алЗаписатьДанныеВФорму(СтруктураРезультат); 
        КонецЕсли;    
    КонецЕсли;
    
КонецПроцедуры

В оповещении "ОбработатьДанные" происходит получение из временного хранилища данных от фоновой функции, и вывод результата на форму в алЗаписатьДанныеВФорму(СтруктураРез)

&НаСервере
Процедура алЗаписатьДанныеВФорму(СтруктураРезультат);     

   Переменная_А = СтруктураРезультат.Парам1; 

   Переменная_Б = СтруктураРезультат.Парам2; 

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

И, конечно, сама процедура из общего модуля "алФоновыеЗадания", выполняемая в фоне, и использующая метод ВызватьПаузу(), который мне был нужен. Переменные "Дата1, Дата2" просто обозначила из передачу из обработки, смысла в них в этом примере нет.

 &НаСервере
функция алВыполнитьВФоне(ПараметрыПроцедуры, ПараметрыФоновогоЗадания) экспорт
//Дата1, Дата2 не использую, просто показываю что параметры переданы и доступны.	
	алДатаНачала = ПараметрыПроцедуры.ДатаНач; 
	алДатаОкончания = ПараметрыПроцедуры.ДатаКон;

//на примере с датами удобно увидеть работу функции "ВызватьПаузу()"
	Парам_А = ТекущаяДата(); //получаем текущую дату 
	ВызватьПаузу(3000);      //ждем 3 секунды, работает только в фоновом режиме
    Парам_Б = ТекущаяДата(); //получаем заново тек.дату, должна быть на 3 секунды старше Парам_А
	СтруктураРезультат = новый Структура("Парам1, Парам2", Парам_А , Парам_Б ); 

	ПоместитьВоВременноеХранилище(новый Структура("СтруктураРезультат", СтруктураРезультат), 
                                  ПараметрыФоновогоЗадания.АдресРезультата);    	 
 КонецФункции
 

Вот, собственно, и вся магия. Текст функции алВыполнитьВФоне() заменяете любой своей логикой, главное в её конце поместить результат работы во временное хранилище. А в оповещении получить этот результат из него же.

Внешняя обработка и расширение доступны для скачивания. 

Всё проверяла на 1С:Предприятие 8.3 (8.3.27.1786),  конфигурация Управление торговлей, редакция 11 (11.5.22.149). 

Надеюсь, эта заметка кому-то принесет пользу. 

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.22.149

Вступайте в нашу телеграмм-группу Инфостарт

ДлительныеОперации.ВыполнитьПроцедуру(); ВызватьПаузу(); ДлительныеОперации.ВыполнитьВФоне(); Фоновая процедура

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    5393    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9973    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    60999    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8401    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    76575    atdonya    31    

74

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10578    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Bessome 60 25.06.26 16:41 Сейчас в теме
В процедуре "ОбработатьДанные" на клиенте необходимо добавить обработку отказа или использовать Иначе в конце условия. На данный момент у вас обрабатывается не выполнение задания или результат = успешно. Есть еще результат = Ошибка
Для отправки сообщения требуется регистрация/авторизация