ПолучитьИзВременногоХранилища(ПоместитьВоВременноеХранилище) - возврашает неопределено. Что не так?
Здравствуйте! Выполняю фоновое задание, хочу поместить процент выполнения во временное хранилище и получить на своей форме процент, который до этого положил в структуру. А мне возвращается неопределенно.
Даже в таком случае вернется НЕОПРЕДЕЛЕННО.
Значения параметров - РезультатВыполнения - Структура, АдресХранилища - строка со значением "e1cib/tempstorage/eba197f0-47bc-4a8b-a522-e9ea5aa775a6?seanceId=90082eec-908a-4cc7-8d95-26e8137ef73a"
Посдкажите, где косяк7 Что не так?
Что самое интересное, в результате окончания задания я получаю из хранилища свои значения, но уже с процентами 100))
Даже в таком случае вернется НЕОПРЕДЕЛЕННО.
ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища);
ПолучитьИзВременногоХранилища(АдресХранилища) - ВОТ ТУТ У МЕНЯ ПУСТО
Значения параметров - РезультатВыполнения - Структура, АдресХранилища - строка со значением "e1cib/tempstorage/eba197f0-47bc-4a8b-a522-e9ea5aa775a6?seanceId=90082eec-908a-4cc7-8d95-26e8137ef73a"
Посдкажите, где косяк7 Что не так?
Что самое интересное, в результате окончания задания я получаю из хранилища свои значения, но уже с процентами 100))
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Вызываю фоновое задание таким образом.
И уже в мою процедуру приходит
РезультатВыполнения = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,
"УправлениеНебольшойФирмойСервер.ОбновитьОстатокВНоменклатуре",
СтруктураПараметров,
"Наименование фонового задания", Истина);
ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
АдресХранилища = РезультатВыполнения.АдресХранилища;
И уже в мою процедуру приходит
ОбновитьОстатокВНоменклатуре(СтруктураПараметров, АдресХранилища)
Неправильно.
АдресХранилища = ПоместитьВоВременноеХранилище(КакиеТоДанные);
Если ЭтоАдресВременногоХранилища(АдресХранилища) Тогда
РезультатРаботыФоновогоЗадания = ПолучитьИзВременногоХранилища(АдресХранилища);
КонецЕсли;
(5) Нашел в интернете такую цитату:
"У них просто временное хранилище разделено на сеансы, данные временного хранилища каждого сеанса изолированы, на сколько я понимаю это для того чтобы доступ к ним не синхронизировать. Единственный случай когда данные врем хранилища переходят из одного сеанса в другой, это при завершение фонового данные переходят в вызвавший его сеанс. "
"У них просто временное хранилище разделено на сеансы, данные временного хранилища каждого сеанса изолированы, на сколько я понимаю это для того чтобы доступ к ним не синхронизировать. Единственный случай когда данные врем хранилища переходят из одного сеанса в другой, это при завершение фонового данные переходят в вызвавший его сеанс. "
а как отображаете процент выполнения?
для варианта с внешней подключаемой обработкой у меня в модуле объекта прописано
а возвращаю на форму уже массив ссылок сформированных документов
для варианта с внешней подключаемой обработкой у меня в модуле объекта прописано
Пока Выборка.Следующий() Цикл
Процент = 100 - ЦЕЛ((ВсегоДокументов - НомерДокумента)/ВсегоДокументов*100);
Если Процент % 10 = 0 Тогда
ДлительныеОперации.СообщитьПрогресс(Процент,Нстр("ru='Создание документов'"));
КонецЕсли;
а возвращаю на форму уже массив ссылок сформированных документов
(9)У меня ничего не происходит с выводом этой процедуры
Если Цел(ТекущийПроцентВыполнения) <> ПроцентВыполнения Тогда
ПроцентВыполнения = Цел(ТекущийПроцентВыполнения);
РезультатВыполнения.ПроцентВыполнения = ПроцентВыполнения;
//ПоместитьВоВременноеХранилище(РезультатВыполнения, СтруктураПараметров.УникальныйИдентификаторОстатков);
ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,Нстр("ru='Обновление остатков'"));
КонецЕсли;
(16)
&НаКлиенте
Процедура ОбновитьОстаток(Команда)
//По-новому через фоновые задания
ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
Сообщить(СтрШаблон("НАЧАЛО: %1", ПолучитьВремяСервера()));
РезультатВыполнения = ВыполнитьОбновлениеОстатковФоновое();
Если РезультатВыполнения.ЗаданиеВыполнено Тогда
Сообщить(СтрШаблон("КОНЕЦ: %1", ПолучитьВремяСервера()));
Иначе
ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина);
КонецЕсли;
//КОНЕЦ:По-новому через фоновые задания
//ОбновитьОстатокНаСервере();
КонецПроцедуры
Показать
Функция ВыполнитьОбновлениеОстатковФоновое()
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
ИдентификаторЗадания = Неопределено;
УникальныйИдентификаторОстатков = Новый УникальныйИдентификатор();
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Запасы", Объект.Запасы.Выгрузить());
СтруктураПараметров.Вставить("ИдентификаторЗадания", ИдентификаторЗадания);
СтруктураПараметров.Вставить("УникальныйИдентификаторОстатков", УникальныйИдентификаторОстатков);
РезультатВыполнения = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,
"УправлениеНебольшойФирмойСервер.ОбновитьОстатокВНоменклатуре",
СтруктураПараметров,
"Наименование фонового задания", Истина);
ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
АдресХранилища = РезультатВыполнения.АдресХранилища;
Возврат РезультатВыполнения;
КонецФункции
Показать
(16) и уже основная процедура в фоновом задании
Функция ОбновитьОстатокВНоменклатуре(СтруктураПараметров, АдресХранилища, ЧтоТутЗНАКВОПРОСА) Экспорт
РезультатВыполнения = Новый Структура("Задание, ПроцентВыполнения", "ОбновлениеОстатков", 0);
Запасы = СтруктураПараметров.Запасы;
ПроцентВыполнения = 0;
ТекущийПроцентВыполнения = 0;
НомерПоПорядку = 0;
ОбщееКоличествоВТаблице = Запасы.Количество();
Для Каждого Сч Из Запасы Цикл
НомерПоПорядку = НомерПоПорядку + 1;
ТекущийПроцентВыполнения = НомерПоПорядку / ОбщееКоличествоВТаблице * 100;
Если Цел(ТекущийПроцентВыполнения) <> ПроцентВыполнения Тогда
ПроцентВыполнения = Цел(ТекущийПроцентВыполнения);
РезультатВыполнения.ПроцентВыполнения = ПроцентВыполнения;
//ПоместитьВоВременноеХранилище(РезультатВыполнения, СтруктураПараметров.УникальныйИдентификаторОстатков);
ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,Нстр("ru='Обновление остатков'"));
КонецЕсли;
Если ЗначениеЗаполнено(Сч.Номенклатура) Тогда
ЗначениеСвойства = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ОстатокПоставщика");
ОбъектНоменклатура = Сч.Номенклатура.ПолучитьОбъект();
ДопРеквизиты = ОбъектНоменклатура.ДополнительныеРеквизиты;
НайденныеСтроки = ДопРеквизиты.НайтиСтроки(Новый Структура("Свойство", ЗначениеСвойства));
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаТаблицы = ДопРеквизиты.Добавить();
Иначе
СтрокаТаблицы = НайденныеСтроки[0];
КонецЕсли;
Если СтрокаТаблицы.Значение <> Сч.ОстатокПоставщика Тогда
СтрокаТаблицы.Свойство = ЗначениеСвойства;
СтрокаТаблицы.Значение = Сч.ОстатокПоставщика;
ОбъектНоменклатура.ОбменДанными.Загрузка = Истина;
ОбъектНоменклатура.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
РезультатВыполнения.ПроцентВыполнения = 100;
ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища);
КонецФункции
Показать
ну смотрите основные идеи по построению я черпал из
https://infostart.ru/1c/articles/1106171/
https://infostart.ru/1c/articles/1058914/
https://infostart.ru/1c/articles/842660/
Чтобы шло отображение процентов и вызывать нужно по особенному
Посмотрите ссылки, что я приложил выше, там это все есть.
&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения,ПараметрыФормы");
ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыПроцедуры.ОбъектыНазначения = ВыполняемаяКоманда.ОбъектыНазначения;
ПараметрыПроцедуры.ПараметрыФормы = ВыполняемаяКоманда.ПараметрыФормы;
НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции
&НаКлиенте
Процедура ВыполнитьКомандуВФоне(ИдентификаторКоманды)
//
СопровождающийТекст = НСтр("ru = 'Выполняется обработка данных'");
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
// настройки ожидания
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
НастройкиОжидания.ВыводитьСообщения = Истина;
НастройкиОжидания.ТекстСообщения = НСтр("ru = 'Выполняется обработка данных.'");
// выполнить команду
ВыполняемаяКоманда = Новый Структура("Ссылка, Идентификатор, ОбъектыНазначения,ПараметрыФормы", ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, Новый Массив,ПоместитьПараметрыВСтруктуру());
ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, ЭтаФорма.УникальныйИдентификатор);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Обработчик, НастройкиОжидания);
КонецПроцедуры
ПоказатьПосмотрите ссылки, что я приложил выше, там это все есть.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот