Имя: Пароль:
1C
1С v8
Слишком много фактических параметров
,
0 SavageRoman
 
12.02.18
21:28
#Область СлужебныеПроцедурыИФункции

Процедура КонтрольДлительныхОпераций() Экспорт
    
    АктивныеДлительныеОперации = ДлительныеОперацииКлиент.АктивныеДлительныеОперации();
    Если АктивныеДлительныеОперации.Обработка Тогда
        Возврат;
    КонецЕсли;
    
    АктивныеДлительныеОперации.Обработка = Истина;
    Попытка
        ПроконтролироватьДлительныеОперации(АктивныеДлительныеОперации.Список);
        
        АктивныеДлительныеОперации.Обработка = Ложь;
    Исключение
        АктивныеДлительныеОперации.Обработка = Ложь;
        ВызватьИсключение;
    КонецПопытки;
    
КонецПроцедуры

Процедура ПроконтролироватьДлительныеОперации(АктивныеДлительныеОперации)
    
    ТекущаяДата = ТекущаяДата(); // дата сеанса не используется
    
    КонтролируемыеОперации = Новый Соответствие;
    ЗаданияДляПроверки = Новый Массив;
    ЗаданияДляОтмены = Новый Массив;
    
    Для каждого ДлительнаяОперация Из АктивныеДлительныеОперации Цикл
        
        ДлительнаяОперация = ДлительнаяОперация.Значение;
        
        ОперацияОтменена = Ложь;
        Если ДлительнаяОперация.ФормаВладелец <> Неопределено И Не ДлительнаяОперация.ФормаВладелец.Открыта() Тогда
            ОперацияОтменена = Истина;
        КонецЕсли;
        Если ДлительнаяОперация.ОповещениеОЗавершении <> Неопределено И ТипЗнч(ДлительнаяОперация.ОповещениеОЗавершении.Модуль) = Тип("УправляемаяФорма")
            И Не ДлительнаяОперация.ОповещениеОЗавершении.Модуль.Открыта() Тогда
            ОперацияОтменена = Истина;
        КонецЕсли;
        
        Если ОперацияОтменена Тогда
            
            КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
            ЗаданияДляОтмены.Добавить(ДлительнаяОперация.ИдентификаторЗадания);
            
        ИначеЕсли ДлительнаяОперация.Контроль <= ТекущаяДата Тогда
            
            КонтролируемыеОперации.Вставить(ДлительнаяОперация.ИдентификаторЗадания, ДлительнаяОперация);
            
            ЗаданиеДляПроверки = Новый Структура("ИдентификаторЗадания,ВыводитьПрогрессВыполнения,ВыводитьСообщения");
            ЗаполнитьЗначенияСвойств(ЗаданиеДляПроверки, ДлительнаяОперация);
            ЗаданияДляПроверки.Добавить(ЗаданиеДляПроверки);
            
        КонецЕсли;
        
    КонецЦикла;
    
    Статусы = Новый Соответствие;
    Статусы = ДлительныеОперацииВызовСервера.ОперацииВыполнены(ЗаданияДляПроверки, ЗаданияДляОтмены);
    Для каждого СтатусОперации Из Статусы Цикл
        Операция = КонтролируемыеОперации[СтатусОперации.Ключ];
        Статус = СтатусОперации.Значение;
        Попытка
            Если ПроконтролироватьДлительнуюОперацию(Операция, Статус) Тогда
                АктивныеДлительныеОперации.Удалить(СтатусОперации.Ключ);
            КонецЕсли;
        Исключение
            // далее не отслеживаем
            АктивныеДлительныеОперации.Удалить(СтатусОперации.Ключ);
            ВызватьИсключение;
        КонецПопытки;
    КонецЦикла;

    Если АктивныеДлительныеОперации.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ТекущаяДата = ТекущаяДата(); // дата сеанса не используется
    Интервал = 120;
    Для каждого Операция Из АктивныеДлительныеОперации Цикл
        Интервал = Макс(Мин(Интервал, Операция.Значение.Контроль - ТекущаяДата), 1);
        ЕстьАктивныеОперации = Истина;
    КонецЦикла;
    
    ПодключитьОбработчикОжидания("КонтрольДлительныхОпераций", Интервал, Истина);
    
КонецПроцедуры

Функция ПроконтролироватьДлительнуюОперацию(ДлительнаяОперация, Статус)
    
    Если Статус.Статус <> "Отменено" И ДлительнаяОперация.ОповещениеОПрогрессеВыполнения <> Неопределено Тогда
        Прогресс = Новый Структура;
        Прогресс.Вставить("Статус", Статус.Статус);
        Прогресс.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания);
        Прогресс.Вставить("Прогресс", Статус.Прогресс);
        Прогресс.Вставить("Сообщения", Статус.Сообщения);
        ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОПрогрессеВыполнения, Прогресс);
    КонецЕсли;
        
    Если Статус.Статус = "Выполнено" Тогда
        
        ПоказатьОповещение(ДлительнаяОперация);
        ВыполнитьОповещение(ДлительнаяОперация, Статус);
        Возврат Истина;
        
    ИначеЕсли Статус.Статус = "Ошибка" Тогда
        
        ВыполнитьОповещение(ДлительнаяОперация, Статус);
        Возврат Истина;
        
    ИначеЕсли Статус.Статус = "Отменено" Тогда
        
        Возврат Истина;
        
    КонецЕсли;
    
    ИнтервалОжидания = ДлительнаяОперация.ТекущийИнтервал;
    Если ДлительнаяОперация.Интервал = 0 Тогда
        ИнтервалОжидания = ИнтервалОжидания * 1.4;
        Если ИнтервалОжидания > 15 Тогда
            ИнтервалОжидания = 15;
        КонецЕсли;
        ДлительнаяОперация.ТекущийИнтервал = ИнтервалОжидания;
    КонецЕсли;
    ДлительнаяОперация.Контроль = ТекущаяДата() + ИнтервалОжидания;  // дата сеанса не используется
    Возврат Ложь;
        
КонецФункции

Процедура ПоказатьОповещение(ДлительнаяОперация)
    
    Оповещение = ДлительнаяОперация.ОповещениеПользователя;
    Если Не Оповещение.Показать Тогда
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

    
Процедура ПоказатьОповещениеПользователя(ДлительнаяОперация)

    ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
        Оповещение.НавигационнаяСсылка, Оповещение.Пояснение);

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

Процедура ВыполнитьОповещение(Знач ДлительнаяОперация, Знач Статус)
    
    Если ДлительнаяОперация.ОповещениеОЗавершении = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("Статус",    Статус.Статус);
    Результат.Вставить("АдресРезультата", ДлительнаяОперация.АдресРезультата);
    Результат.Вставить("АдресДополнительногоРезультата", ДлительнаяОперация.АдресДополнительногоРезультата);
    Результат.Вставить("КраткоеПредставлениеОшибки", Статус.КраткоеПредставлениеОшибки);
    Результат.Вставить("ПодробноеПредставлениеОшибки", Статус.ПодробноеПредставлениеОшибки);
    Результат.Вставить("Сообщения", Статус.Сообщения);
    ВыполнитьОбработкуОповещения(ДлительнаяОперация.ОповещениеОЗавершении, Результат);

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

#КонецОбласти



Ошибка сдесь https://drive.google.com/open?id=11tgyuKLZeG3bbvzTbUlDr6vyiM3T9pGv
1 Cyberhawk
 
12.02.18
22:04
Бывает, да
2 Kigo_Kigo
 
12.02.18
22:59
Или я что то пропустил, но ПоказатьОповещениеПользователя в ПоказатьОповещениеПользователя ?
Процедура ПоказатьОповещениеПользователя(ДлительнаяОперация)

    ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
        Оповещение.НавигационнаяСсылка, Оповещение.Пояснение);

КонецПроцедуры
3 h-sp
 
12.02.18
23:26
(2) ну и что? человек рекурсию осваивает.
4 SavageRoman
 
13.02.18
13:38
И как ето исправить?
Вот что было, оо ошибок больше https://drive.google.com/open?id=1Z8grQZcLw15lxsOzwQzsD_UI_37CTGL-
5 catena
 
13.02.18
13:53
(4)Определиться, сколько все-таки должно быть параметров у ПоказатьОповещениеПользователя
6 George Wheels
 
13.02.18
14:01
(5) После того как определится сначала долго будет что-то выполняться, потом неизбежен вылет. А так хоть с ошибкой останавливается.
7 1Сергей
 
13.02.18
14:10
Для начала, думаю, надо уяснить что не следует использовать зарезервированные слова в именах переменных, процедур, функций
8 1Сергей
 
13.02.18
14:13
Вот тоже красота:
ТекущаяДата = ТекущаяДата();

Оно работать будет, но не надо так делать
9 vde69
 
13.02.18
14:16
(8) почему?
10 1Сергей
 
13.02.18
14:18
(9) Слово зарезервированное
11 SavageRoman
 
13.02.18
14:23
Помогите решить
Где и как опредилить "ПоказатьОповещениеПользователя"
12 SavageRoman
 
13.02.18
14:23
{ОбщийМодуль.ДлительныеОперацииГлобальный.Модуль(145,2)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
    <<?>>ПоказатьОповещениеПользователя(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
{ОбщийМодуль.ОбменДаннымиГлобальный.Модуль(32,3)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
        <<?>>ПоказатьОповещениеПользователя(НСтр("ru = 'Установить обновление'"), "e1cib/app/Обработка.ВыполнениеОбменаДанными",
{ОбщийМодуль.СоединенияИБГлобальный.Модуль(85,3)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
        <<?>>ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
{ОбщийМодуль.СоединенияИБГлобальный.Модуль(117,4)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
            <<?>>ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
{ОбщийМодуль.СоединенияИБГлобальный.Модуль(127,2)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
    <<?>>ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"),
{ОбщийМодуль.СтандартныеПодсистемыГлобальный.Модуль(59,2)}: Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя)
    <<?>>ПоказатьОповещениеПользователя(, "e1cib/command/ОбщаяКоманда.ПредупрежденияПриЗавершенииРаботы",
Мобильное приложение содержит синтаксические ошибки.
13 Волшебник
 
модератор
13.02.18
14:27
нужно поставить 8.3 и/или снять режим совместимости
или используй СообщениеПользователю
14 1Сергей
 
13.02.18
14:27
(12) Мобильное приложение?
15 SavageRoman
 
13.02.18
14:32
Да
16 Волшебник
 
модератор
13.02.18
14:34
(15) Используй Сообщить

Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
17 SavageRoman
 
13.02.18
14:55
Процедура ПоказатьОповещение(ДлительнаяОперация)
    
    Оповещение = ДлительнаяОперация.ОповещениеПользователя;
    Если Не Оповещение.Показать Тогда
        Возврат;
    КонецЕсли;
    
    Сообщить(?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'")),
        Оповещение.НавигационнаяСсылка, Оповещение.Пояснение);

КонецПроцедуры
..............................................
{ОбщийМодуль.ДлительныеОперацииГлобальный.Модуль(146,35)}: Слишком много фактических параметров (Сообщить)
        Оповещение.НавигационнаяСсылка, <<?>>Оповещение.Пояснение); (Проверка: Тонкий клиент)
18 Mankubus
 
13.02.18
15:22
(17) почитай в СП про сообщить
Ошибка? Это не ошибка, это системная функция.