Имя: Пароль:
1C
 
БСП. ДлительныеОперации. Индусский код?
, ,
0 cons74
 
03.03.17
06:55
Добрый день. Вижу в функции: ВыполнитьВФоне() и ЗапуститьВыполнениеВФоне(). Не вижу принципиальных различий в логике выполняемого кода. И там и там возвращается структура, по составу одинаковая.
Может я чего не понимаю?

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

Функция ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, Знач Параметры,
    Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь) Экспорт
    
    АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы);
    
    Результат = Новый Структура;
    Результат.Вставить("АдресХранилища",       АдресХранилища);
    Результат.Вставить("ЗаданиеВыполнено",     Ложь);
    Результат.Вставить("ИдентификаторЗадания", Неопределено);
    
    Если Не ЗначениеЗаполнено(НаименованиеЗадания) Тогда
        НаименованиеЗадания = ИмяЭкспортнойПроцедуры;
    КонецЕсли;
    
    ПараметрыЭкспортнойПроцедуры = Новый Массив;
    ПараметрыЭкспортнойПроцедуры.Добавить(Параметры);
    ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилища);
    
    Если ИспользоватьДополнительноеВременноеХранилище Тогда
        АдресХранилищаДополнительный = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы);
        ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилищаДополнительный);
    КонецЕсли;
    
    ЗапущеноЗаданий = 0;
    Если ОбщегоНазначения.ИнформационнаяБазаФайловая()
        И Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда
        Отбор = Новый Структура;
        Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
        ЗапущеноЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество();
    КонецЕсли;
    
    Если ОбщегоНазначенияКлиентСервер.РежимОтладки()
        Или ЗапущеноЗаданий > 0 Тогда
        РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры);
        Результат.ЗаданиеВыполнено = Истина;
    Иначе
        ВремяОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2);
        Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры,    ПараметрыЭкспортнойПроцедуры,, НаименованиеЗадания);
        Попытка
            Задание.ОжидатьЗавершения(ВремяОжидания);
        Исключение
            // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания.
        КонецПопытки;
        
        Результат.ЗаданиеВыполнено = ЗаданиеВыполнено(Задание.УникальныйИдентификатор);
        Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор;
    КонецЕсли;
    
    Если ИспользоватьДополнительноеВременноеХранилище Тогда
        Результат.Вставить("АдресХранилищаДополнительный", АдресХранилищаДополнительный);
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
1 cons74
 
03.03.17
06:55
Выполнил сравнение/объединение - слова разные, но не вижу разницы в логике.
2 nordbox
 
03.03.17
07:04
ну дык посмотри где они вызываются, может там логика
3 Провинциальный 1сник
 
03.03.17
07:15
Вся БСП - индусский код. Куча "общих" модулей с процедурами узкоспециализированной направленности типа "заполнить данные о рабочем времени в табеле" с использованием контекста. Вот почему это не поместить в модуле объекта или менеджера? А в общем модуле разместить некую универсальную функцию типа "получить рабочее время за период по списку сотрудников", с которой можно работать откуда угодно? И так далее..
4 cons74
 
03.03.17
07:20
Ну не ддолжно быть так. Наверно я чего-то не понимаю. Это один общий модуль "ДлительныеОперации". И в нем 2 похожие (идентичные?!) функции.
5 1dvd
 
03.03.17
07:23
(4) перфекционизм зло
6 xReason
 
03.03.17
07:52
(4) А вы комментарии читать умеете? Там же все написано

Функция ЗапуститьВыполнениеВФоне
// Запускает выполнение процедуры в фоновом задании.
// Является менее функциональным аналогом ВыполнитьВФоне, предусмотрена для обратной совместимости.

Про индусский код обычно пишут писатели нигерийского кода.
7 cons74
 
03.03.17
07:52
(5) хорош стебаться
8 cons74
 
03.03.17
07:54
(6) спасибо. Читать длиннющие комментарии не привык, привык читать только описание переменных.
9 cons74
 
03.03.17
07:58
(6) Кстати, у меня в конфигурации такого комментария нет. Только описание переменных и возвращаемого значения.
10 Фрэнки
 
03.03.17
08:25
так может оказаться, что разные версии доступных для закачки дистрибутивов БСП будут отличаться друг от друга только количеством комментариев
11 Провинциальный 1сник
 
03.03.17
08:28
(6) Если бы оставленная для обратной совместимости менее функциональная процедура была оберткой для вызова более функциональной - никто бы и слова не сказал. А дублирование кода и есть признак индусов.
12 cons74
 
03.03.17
08:49
(11) точно
13 xReason
 
03.03.17
09:18
(11) Ну вы точно нигерийский абориген.
Если функции разные, значит поведение у них разное
14 Jokero
 
03.03.17
09:21
Вы первый раз видите что-ли, что код в 1С внаЧерезИндусов писан?
15 Неверный Параметр И
 
03.03.17
09:21
(13) Провинциальный же =)
Вернее сказать наоборот - для реализации разного поведения нужны разные функции.
16 Неверный Параметр И
 
03.03.17
09:22
(14) "вна"? Даешь хохлосрач!
17 Windyhead
 
03.03.17
09:33
(3)  "Куча "общих" модулей с процедурами узкоспециализированной направленности типа "заполнить данные о рабочем времени в табеле" "

Это ты явно не БСП смотрел
18 Провинциальный 1сник
 
03.03.17
10:06
(17) Ну я в ЗУП3 это смотрел, а оно на основе БСП. Хотя согласен, напрямую к БСП эти модули отношения не имеют..
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.