БСП 2.3 и БСП 3.0: Просто про выполнение внешней обработки в фоне (c индикацией прогресса выполнения)
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Не секрет, что после запуска "тяжелой" обработки хочется продолжать работать в программе, а также "видеть" время от времени сам процесс выполнения. Для простого пояснения, как это реализовано, и предназначена эта статья. Если ваша конфигурация не на БСП 2.3.2, можно сразу перейти, например, на эту статью //infostart.ru/public/157706/
Важно! Обработка должна использоваться только через штатный механизм БСП "Дополнительные отчеты и обработки".
Код модуля обработки
Примечание: обработку можно запустить как из формы (см. представление команды "Открыть форму и выполнить в фоне с индикацией") так и сразу на сервере (см представление команды "Выполняем на сервере"). Запуск непосредственно на сервере можно сделать по расписанию.
// Возвращает сведения о внешней обработке. Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); ПараметрыРегистрации.Версия = "2.1"; ПараметрыРегистрации.БезопасныйРежим = Истина; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Выполняем на сервере'"); НоваяКоманда.Идентификатор = "ВыполнениеНаСервереОбработку"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Истина; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Открыть форму и выполнить в фоне с индикацией'"); НоваяКоманда.Идентификатор = "ОткрытьФормуОбработку"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); НоваяКоманда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции // Интерфейс для выполнения команд обработки. Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000*10; Попытка СтандартныеПодсистемыКлиентСервер.ВывестиОповещение( ПараметрыВыполнения.РезультатВыполнения, НСтр("ru = 'Выполнена длит. операция!'"),, БиблиотекаКартинок.Успешно32); Исключение СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке( ПараметрыВыполнения.РезультатВыполнения, СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды), ИнформацияОбОшибке()); Возврат; КонецПопытки; //Имитация длительной операции - вместо этого вставте свой код который будет выполняться на сервере в фоне Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл КонецЦикла; КонецПроцедуры
Код модуля формы обработки
Важно добавить в форму эти параметры:
- ДополнительнаяОбработкаСсылка (тип "СправочникСсылка.ДополнительныеОтчетыИОбработки").
- ИдентификаторКоманды (тип "Строка")
.. и эти реквизиты:
- ОбъектСсылка (тип "СправочникСсылка.ДополнительныеОтчетыИОбработки")
- ИдентификаторКоманды (тип "Строка")
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбъектСсылка = Параметры.ДополнительнаяОбработкаСсылка; ИдентификаторКоманды = Параметры.ИдентификаторКоманды; КонецПроцедуры &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Если ИсточникВыбора.ИмяФормы = ДополнительныеОтчетыИОбработкиКлиент.ИмяФормыДлительнойОперации() Тогда ЗагрузитьРезультат(ВыбранноеЗначение); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Фигачить(Команда) ПараметрыКоманды = Новый Структура("ДополнительнаяОбработкаСсылка, СопровождающийТекст"); ПараметрыКоманды.ДополнительнаяОбработкаСсылка = ОбъектСсылка; ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняем из формы в фоне...'"); Состояние(ПараметрыКоманды.СопровождающийТекст); ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); КонецПроцедуры &НаКлиенте Процедура ЗагрузитьРезультат(РезультатВыполнения) Если Открыта() Тогда Закрыть(); КонецЕсли; ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ВладелецФормы, РезультатВыполнения); КонецПроцедуры &НаСервере Функция ВыполнитьКомандуНапрямую(ИдентификаторКоманды, ПараметрыКоманды) Возврат ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); КонецФункции
Примечание: для формы нужно назначить обработчики событий для процедур "ПриСозданииНаСервере" и "ОбработкаВыбора".
Вот, собственно, и все...
З.Ы. Для тех, кому недостаточно "простого" описания и кто хочет подробно разобраться в предмете - см. описание с ИТС
UPDATE 20/09/19: добавил вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.
Немного тут подсмотрел
Модуль обработки:
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
Если ИмяКоманды = "ОткрытьФормуОбработку" Тогда
ВремяФиниша = ТекущаяДатаСеанса() + 100;
Пока ТекущаяДатаСеанса() < ВремяФиниша Цикл
Процент = 100 - (ВремяФиниша - ТекущаяДатаСеанса());
Если НЕ (Процент % 10) Тогда
ДлительныеОперации.СообщитьПрогресс(Процент, СтрШаблон("Выполнено %1 процентов: пример параметра команды = %2", Процент,ПараметрыВыполнения.СвойПараметр));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Модуль формы:
&НаСервере
Функция ФигачитьВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, СвойПараметр");
ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыПроцедуры.СвойПараметр = ВыполняемаяКоманда.СвойПараметр;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьВФоне("ДополнительныеОтчетыИОбработки.ВыполнитьКоманду", ПараметрыПроцедуры, ПараметрыВыполнения);
КонецФункции
&НаКлиенте
Процедура Фигачить(Команда)
СопровождающийТекст = НСтр("ru = 'Выполняется обработка данных'");
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) Тогда
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
НастройкиОжидания.ВыводитьСообщения = Истина;
НастройкиОжидания.ТекстСообщения = НСтр("ru = 'Выполняется обработка данных...'");
ВыполняемаяКоманда = Новый Структура("Ссылка, Идентификатор, СвойПараметр", Параметры.ДополнительнаяОбработкаСсылка, Параметры.ИдентификаторКоманды, "это мой параметр (фоновое)");
ОперацияВФоне = ФигачитьВФоне(ВыполняемаяКоманда, УникальныйИдентификатор);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ОперацияВФоне, Обработчик, НастройкиОжидания);
Иначе
Параметры.ИдентификаторКоманды = "ОткрытьФормуОбработку";
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = СопровождающийТекст + "...";
ПараметрыКоманды.Вставить("СвойПараметр","это мой параметр");
Операция = ВыполнитьКомандуНапрямую(ПараметрыКоманды);
ВыполнитьОбработкуОповещения(Обработчик, Операция);
КонецЕсли;
КонецПроцедуры
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция ВыполнитьКомандуНапрямую(ПараметрыКоманды)
Операция = Новый Структура("Статус, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки");
Попытка
ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(
Параметры.ИдентификаторКоманды,
ПараметрыКоманды,
ЭтотОбъект);
Операция.Статус = "Выполнено";
Исключение
Операция.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Операция.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Возврат Операция;
КонецФункции
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
Если Операция.Статус = "Выполнено" Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст, БиблиотекаКартинок.Успешно32);
Иначе
ПоказатьПредупреждение(, Операция.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Вступайте в нашу телеграмм-группу Инфостарт
фоновое выполнение внешняя обработка длительная операция БСП
См. также
Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)
Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.
50000 руб.
10.09.2026 13320 115 0
Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Разработчик Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)
Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.
24900 руб.
20.08.2024 83200 432 171
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 285570 1606 423
Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Разработчик Аналитик Руководитель проекта 1С 8.3 Платные (руб)
Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.
14000 руб.
17.04.2026 16719 63 62
Пакетная печать Печатные формы Инструментарий разработчика Разработчик 1С:Предприятие 8 Платные (руб)
Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26
22570 руб.
06.10.2023 44150 122 54
Инструментарий разработчика Нейросети Платные (руб)
Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.
15250 руб.
25.08.2025 76799 147 41
Разработка Инструментарий разработчика Разработчик Руководитель проекта 1С 8.3 Платные (руб)
Pilot 1C превращает задачу, поставленную обычными словами, в техническое задание, код на встроенном языке и сценарии проверки. Прежде чем что-то предложить, он сверяется с устройством вашей конфигурации через граф Analyzer 1C: существует ли объект, из чего он состоит, кто его вызывает, какие роли дают права. Чего найти не удалось – спрашивает, а не выдумывает. Готовый код проходит более полутора сотен проверок по справочнику языка и стандартам разработки, который приезжает вместе с продуктом. Модель – ваша: любой сервер, совместимый с программным интерфейсом OpenAI, в том числе локальный. Правки в конфигурацию Pilot не вносит – их применяет разработчик.
18300 руб.
11.09.2026 3690 5 0
Инструменты администратора БД Инструментарий разработчика Роли и права Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)
Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.
17000 руб.
10.11.2023 28710 103 46
Дело в том что нет возможности получить "ИдентификаторЗадания" для использования
ДлительныеОперации.ПрочитатьПрогресс(ФоновоеЗаданиеИдентификатор)Вот если используется "ДлительныеОперации.ЗапуститьВыполнениеВФоне" тогда да это получиться:
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"МойМодуль.МояФоноваяПроцедура",
ПараметрыЗадания,
ПараметрыЗадания.НаименованиеЗадания);
ФоновоеЗаданиеИдентификатор = РезультатФоновогоЗадания.ИдентификаторЗадания;Но это не для внешних обработок - остается только как в самому запускать фоновое оповещать через "СообщениеПользователю" и "ловить" в форме в "обработчике ожидания".
например:
ПараметрыКоманды .Вставить("струкНастроек", РеквизитФормыВЗначение("Объект").ПолучитьСтруктуруНастроекСервер());
и получать в ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения)
например:
ПараметрыНастроекВФорме=ПараметрыВыполненияКоманды.струкНастроек;
Пробовал передать данные через ПоместитьВоВременноеХранилище. Но именно при фоновом запуске данные уже не получить.
PS: Пробовал использовать все три Варианта помещения данных, но ни один не заработал. Т.е на сервере ПолучитьИзВременногоХранилища всегда получается значение = неопределено.
А можешь поподробней про способ через параметр сеанса? типа помещать в какой-то из параметров данные и потом их оттуда забирать?
Результат = ВыполнитьЗапускВФонеНаСервере();
ИдентификаторЗадания = Результат.ИдентификаторЗадания;И
Функция ВыполнитьЗапускВФонеНаСервере()
НаименованиеЗадания = "Любое название";
ПараметрыЗапуска = Новый Структура;
ПараметрыЗапуска.Вставить("Режим", Объект.Режим);
//тут еще параметры
Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
Новый УникальныйИдентификатор,
"Модуль.Процедура",
ПараметрыЗапуска,
НаименованиеЗадания);
Лог="";
Возврат Результат;
КонецФункции ПоказатьДальше для прогресс бара нам понадобится из запущенного сеанса выводить сообщения нужного нам формата, например "Прогресс=32". в основной обработке получаем эти сообщения и интерпретируем(парсим) через ПолучитьСообщенияПользователю() так:
ПодключитьОбработчикОжидания("ВыводСообщений",1,Ложь);И
&НаКлиенте
Процедура ВыводСообщений()
Рез=ВыводСообщенийНаСервере();
Если Рез=Ложь Тогда
ОтключитьОбработчикОжидания("ВыводСообщений");
ПоказатьПредупреждение(,"Процесс завершен");
КонецЕсли;
Состояние("Наш процесс",Прогресс);
КонецПроцедуры
&НаСервере
Функция ВыводСообщенийНаСервере()
ДлинаЛога = 50000;
Задание=ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание=Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Сообщения=Задание.ПолучитьСообщенияПользователю(Истина);
Для Каждого Сообщение ИЗ Сообщения Цикл
Если Лев(Сообщение.Текст,8)="Прогресс" Тогда
Прогресс=Число(Сообщение.Текст,2);
Иначе
Лог=Строка(ТекущаяДата())+": "+Сообщение.Текст+Символы.ПС+Лев(Лог,ДлинаЛога);
КонецЕсли;
КонецЦикла;
Если Задание.Состояние=СостояниеФоновогоЗадания.Активно Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции ПоказатьНа форме у меня Переменные ИдентификаторЗадания, Прогресс и Лог(многострочное текстовое поле для вывода прочих служебных сообщений).
И похоже чтобы регламентное задание разделило процедуру на куски нужна "Модуль.Процедура". Если нет модуля и процедуры, то ничего не выйдет я так понял!
Попытка
СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
ПараметрыВыполнения.РезультатВыполнения,
НСтр("ru = 'Выполнена длит. операция!'"),,
БиблиотекаКартинок.Успешно32);
Исключение
СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке(
ПараметрыВыполнения.РезультатВыполнения,
СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды),
ИнформацияОбОшибке());
Возврат;
КонецПопытки; ПоказатьЭтот код в версии БСП 2.3.5.65 не работает, просто его удалил!
И дописал свой код выполнения задания:
УдалитьДокументыНаСервере(ПараметрыВыполнения.СписокДокументов);Передав в параметры выполнения список значения интеграция прошла на ура!
А в форме распараллеливание потоков написал:
&НаКлиенте
Процедура УдалитьДокументыВПотоке(Команда)
УдалитьДокументыВПотокеНаСервере();
Кратность = Цел(Объект.ТаблицаПисем.Количество() / Объект.КоличествоПотоков);
СписокДокументов = Новый СписокЗначений;
Счетчик = 1;
Для Каждого Строка Из Объект.ТаблицаПисем Цикл
СписокДокументов.Добавить(Строка.Документ);
Если СписокДокументов.Количество() % Кратность = 0 Тогда
ПараметрыКоманды = Новый Структура();
ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", Объект.ОбъектСсылка);
ПараметрыКоманды.Вставить("СопровождающийТекст", НСтр("ru = 'Регламентное удаление входящих электронных писем в фоне потока " + Счетчик + "...'"));
ПараметрыКоманды.Вставить("СписокДокументов", СписокДокументов);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Объект.ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма);
СписокДокументов.Очистить();
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
//Состояние(ПараметрыКоманды.СопровождающийТекст);
КонецПроцедуры
ПоказатьПравда такой метод делает при не целом делении на 1 поток больше, но зато результат на лицо!
А если без подключения, то вам придется сохранить обработку, передать на сервер и вызвать метод из переданной обработки, что согласитесь треш! Но если очень нужно, то можно.
или заполнить реквизит обработки/табличную часть?
Выполняю запрос, и через Сообщить() видно что запрос отрабатывает и идёт обход выборки, но заполнение не происходит
стр = тч.Добавить();
Сообщить(ВыборкаДетальныеЗаписи.Партнер);
ЗаполнитьЗначенияСвойств(Стр,ВыборкаДетальныеЗаписи);
КонецЦикла;
В фоне отрабатывает запрос, все партнеры через сообщить выводятся, но таб часть
на форме остается пустой
Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт
ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000*10;
Попытка
Сообщить("Успешно");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//Имитация длительной операции - вместо этого вставте свой код который будет выполняться на сервере в фоне
Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Партнеры.Ссылка КАК Партнер,
| Партнеры.ДатаРождения КАК ДатаРождения
|ИЗ
| Справочник.Партнеры КАК Партнеры
|ГДЕ
| Партнеры.Ссылка = &ссылка";
Запрос.УстановитьПараметр("Ссылка",ПараметрыВыполнения.ПараметрПартнёр);
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
стр = тч.Добавить();
стр.Партнер = ВыборкаДетальныеЗаписи.Партнер;
стр.ДатаРождения = Дата("20180101");
Сообщить(ВыборкаДетальныеЗаписи.Партнер);
КонецЦикла;
КонецПроцедуры ПоказатьНа форме есть данные формы коллекция. Через серверный вызов преобразовываю в ТЗ и помещаю во временное хранилище.
Как получить потом ТЗ в фоновом задании?
У меня не получилось! Передал адрес ТЗ на клиенте, а когда к нему обратилось фоновое задание, то там ничего не было.
Я так понимаю это особенность работы 1С. Был ли опыт такой работы?
Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Фоновое задание - это и есть другой сеанс. А ТЗ осталась во ВХ клиентского сеанса.
Я сохранял данные во временном файле и передавал в фоновое путь к временному файлу на сервере.
Интересно какая минимальная версия для работы этого метода?
>>Немного тут подсмотрел
но в дополнение показал как доп. параметры передавать ну и использовал типовые приемы из внешней обработки "ЗаполнениеКонтрагентов" из БСП 3.0.3.
#include
class string
{ private:
int size;
char *ptr;
public:
string() : size(0), ptr(new char('*')) {}
string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}
~string()
{
delete [] ptr;
}
friend ostream &operator << (ostream &, const string &);
string &operator = (const char *);
};
ostream &operator << (ostream &stream, const tring &s)
{
return(stream << s.ptr);
}
string &string::operator = (const char *chrs)
{
if(this != &chr)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chr);
}
return(*this);
}
int main()
{
string str;
str = 'Hello World';
cout << str << endl;
return(0);
}
ПоказатьДля себя сделал несколько изменений.
1. Параметр ДополнительнаяОбработкаСсылка отметил как ключевой, ИдентификаторКоманды так и не понял зачем нужен. Событие ПриСозданииНаСервере убрал.
2. Не понял зачем сначала создавать структуру ВыполняемаяКоманда, передавать её на сервер. С таким же успехом можно прямо в серверной функции получить все то же самое. С ИдентификаторомКоманды совсем ничего не понял, у меня заполняется в зависимости от того какую кнопку на форме нажму.
1. Не понятно по коду приведенному здесь, что значит переменная "ВладелецФормы"?
2. В интернетах прочитал следующее, там советуют создать реквизит формы с типом строка и поместить в него адрес временного хранилища в которое помещается пустое значение. Делаю данное действие, когда на форме внешней доп. обработки запускаю команду выполнения фоном и всё это дело передаю в параметры фон. задания. На сервере в модуле обработки (в режиме фонового выполнения) выполняются необходимые действия и В САМОМ КОНЦЕ все логи и массив с ссылками помещаются в структуру, которая в свою очередь помещается во врем. хран - ПоместитьВоВременноеХранилище(Данные, РанееПереданныйПутьВременногоХранилища).
Где я только не отслеживал эти параметры и пытался получить из временного хранилища - всегда получаю неопределено. Что я не так делаю? В сп написано:
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.
Исходя из последнего обзаца сп, возникает следующий вопрос, где тогда в модуле формы обработки ловить эти данные для дальнейшего получения из хранилища?
Вот фрагменты кода:
Форма:
&НаКлиенте
Процедура СоздатьКомплектацииФоном(Команда)
РезультатВыполненияВХранилище = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
ПараметрыКоманды = Новый Структура("ДополнительнаяОбработкаСсылка, СопровождающийТекст, ПараметрыВыполненияПроцедуры");
ПараметрыКоманды.ДополнительнаяОбработкаСсылка = ОбъектСсылка;
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняем из формы в фоне...'");
ПараметрыВыполненияПроцедуры = Новый Структура("ДатаДокумента, ТМЦКПереводу, Склад, АдресРезультата");
ПараметрыВыполненияПроцедуры.ДатаДокумента = ДатаДокумента;
ПараметрыВыполненияПроцедуры.ТМЦКПереводу = ТМЦКПереводуИзОборудованияВТовар(Объект.ТМЦПодбор);
ПараметрыВыполненияПроцедуры.Склад = Склад;
ПараметрыВыполненияПроцедуры.АдресРезультата = РезультатВыполненияВХранилище;
ПараметрыКоманды.ПараметрыВыполненияПроцедуры = ПараметрыВыполненияПроцедуры;
Состояние(ПараметрыКоманды.СопровождающийТекст);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект);
// Вот тут соттветственно не реботает, не понимаю, куда это нужнно переместить
Результат = ПолучитьИзВременногоХранилища(РезультатВыполненияВХранилище);
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Лог = Результат.Лог;
Для каждого ТекКомплектация Из Результат.КомплектацииПоПереводу Цикл
НоваяСтрока = Комплектации.Добавить();
НоваяСтрока.Комплектация = ТекКомплектация;
КонецЦикла;
КонецЕсли;
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаКомплектации;
КонецПроцедуры
ПоказатьМодуль обработки:
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
ДатаДокумента = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.ДатаДокумента;
Склад = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.Склад;
АдресРезультата = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.АдресРезультата;
*** Выполнение необходимых действий ***
ТМЦНаСкладе = Запрос.Выполнить().Выгрузить();
КомплектацииПоПереводу = Новый Массив;
Лог = "";
Для каждого ТекСтрТМЦ Из ТМЦКПереводу Цикл
*** опять какие то действия **
КонецЦикла;
Результат = Новый Структура("КомплектацииПоПереводу, Лог", КомплектацииПоПереводу, Лог);
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
Попытка
СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
ПараметрыВыполнения.РезультатВыполнения,
НСтр("ru = 'Выполнена длит. операция!'"),,
БиблиотекаКартинок.Успешно32);
Исключение
СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке(
ПараметрыВыполнения.РезультатВыполнения,
СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды),
ИнформацияОбОшибке());
Возврат;
КонецПопытки;
КонецПроцедуры ПоказатьЗаранее спасибо за помощь.
Какие то дополнительное описание написано. Я скачал обработку и должен еще разбираться что и куда вставить в скачанной обработке Если автор пишет это в описании публикации не проще ли сразу это в обработке что за стармани выложена это все сделать и не парить мозг.
Как то не комильфо немного конечно же.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 525648
Создание 18.05.16 14:20
Обновление 20.09.19 15:32
Просмотры 105919
Загрузки 298
Рейтинг
229
Комментарии 80
Код открыт Да
Рубрики Инструментарий разработчика
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)