"Выполнятор" – как я породил монстра и лишился сна!

10.12.20

Архитектура

Реальная история о разработке, которой не горжусь…

Стал замечать подобные решения давно, но у меня не было особого желания вступать в дискуссию, да и времени особо нет. С другой стороны, вижу, как безжалостно отдают чертежи бомб и с этим что-то надо делать. Затевал написать данную статью 2-3 года назад и вот выдался свободный денек, поэтому каюсь в содеянном… Надеюсь моя история кому-то послужит уроком.

О чем пойдет речь? 

Речь пойдет о связке «Универсальных решений по обмену на http\web-сервисах» и методах «Выполнить\Вычислить». Хотя использование данных методов в файловых вариантах считаю еще большим злом (камень в огород конвертации данных).

Проблема на самом деле не только с интеграцией… Видел статью, к примеру по созданию «Универсального регламента» на доп. обработках, где из анонса было понятно, что редактирование кода выведено на форму, а код естественно хранится в реквизите ХранилищеНастроек(даже из названия реквизита понятно, что он затевался для других целей), а выполнение происходит в методе Выполнить(). Или выкладываются обработки\расширения, дающие возможность пользователям освоить программирование в клиентской части…

Сразу скажу я не против того, что эти методы есть и понимаю, что они позволяют делать. Использую сам, но...

1] Я за то, чтобы подобные решения были созданы как минимум после прочтения вот этой статьи: https://its.1c.ru/db/v8std#content:770:hdoc

Если кратко, то рекомендуется ограничить доступ пользователей к редактору кода, код выполнять в безопасном режиме, а в случае, когда это невозможно создать некий справочник, в котором хранить код, но доступ к этому справочнику на создание и изменение должен быть только у пользователя ответственного за безопасность.

2] Автор должен предупредить о возможных последствиях использования его решения!

Немного истории.

В начале 2017 года устроился в фирму, где очень долго экономили на IT, но поняли, что пора что-то менять, ибо движение пошло не вперед, а назад. Первым делом они решили спрыгнуть с франча(на то было масса причин) и набрать свой отдел 1С программистов и отдел администраторов. До этого момента я успел поучаствовать в двух проектах (УПП+Документооборот и ERP+Документооборот) и присоединился к команде замыкающим. Это была команда «Мечты» (я про отдел программистов имею ввиду), я рад что мне удалось поработать с такими людьми, хоть и всего полтора года. Был выполнен просто сумасшедший объем работы, был обмен опыта, в общем команда «Мечты». Потом вся команда разбежалась и в 2020 году удалось опять собрать часть этой команды на проект внедрения ERP-Общепит в очень сжатые сроки (Но это уже начало другой истории).

Какие были проблемы в 2017 году?

-Денег на расширения хранилища данных не выделяли, что привело к тому, что в основном каждый из команды тащил определенный проект. Грубо говоря 1 рабочая база и 1 тестовая, и так с каждой конфигурацией. Кто бухгалтерию переводил с 2 на 3, кто готовил УТ 10 к переходу на ERP, мне досталась розница для франшизы и написание http-сервисов для себя и вебера (Про свою часть проекта я рассказал на INFOSTART MEETUP Ekaterinburg.Online. 15 мая 2020 г., тема доклада: «Проект, который прошел путь от провала до web-клиента. От web-клиента до мобильного приложения.»).

-От франча достались ХАОС и Разруха… Все базы были сильно перепилены, самая популярная из них была УТ 10. В УТку я добавил универсальный http-сервис (на тот момент я его считал универсальным) и периодически в специально подготовленный модуль добавлял новые методы (принцип работы изложен в статьях из цикла «HTTP Сервисы: Путь к своему сервису»). Коллеги тоже стали использовать данный транспорт.

-Популярность УТ привела к эффекту «Макдональдса».

То и дело веберу или еще кому, был нужен новый http-сервис, а конфигуратор кем-то занят.

Мне пришла в голову мысль «Спасение утопающего дело рук утопающего»…

Реализация или как я изобрел динамит.

Первый вариант «Выполнятора» был накидан минут за 5-10, и я кайфовал, через неделю был добавлен «Выполнятор» второй версии, и я был доволен как удав. Вот оно! Легкое решение, облегчающее жизнь.

Я еще не знал, что через месяц проснусь по средь ночи с мыслями: -Что же ты натворил!!!

Так же как Нобель изобрел динамит и возненавидел свое изобретение, так и я отношусь к «Выполнятору»

Принцип работы.

Собственно, все просто как автомат Калашникова…

Посылаешь код и параметры в определенной структуре JSON и на стороне базы с данной структурой работает Выполнить()…

Плюсы есть, но минусов в разы больше!

Выкладываю код монстра!!! Не нужно его использовать!!!

Шаблон http-сервиса: /{ВхДанные}

Метод: POST

 
 Код обработчика метода:
Функция HTTPServPOST(Запрос)
	//Тут получаем имя метода, в нашем случае "Completer" или "CompleterParam"
	перИмяМетода  = Запрос.ПараметрыURL["ВхДанные"];
	
	//Тут получаем код для выполнения и параметры
	ЗапросОтКлиентаJSON = Запрос.ПолучитьТелоКакСтроку();	
	
	СтруктураОтвет = HTTPСервисыPOST.ОбработкаВходящихДанныхHTTP(ЗапросОтКлиентаJSON,перИмяМетода);
	
	//Готовим ответ
	Ответ = Новый HTTPСервисОтвет(СтруктураОтвет.КодОтвета);

	Если СтруктураОтвет.Отработало Тогда 
	    Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ДанныеОтвета,КодировкаТекста.UTF8);
	Иначе
	    Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ТекстОшибки,КодировкаТекста.UTF8);
	КонецЕсли;	
		
	Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
	Возврат Ответ;
КонецФункции

 Чтение запроса и возврат ответа

 
 Код модуля HTTPСервисыPOST:
Функция ОбработкаВходящихДанныхHTTP(ЗапросОтКлиентаJSON,перИмяМетода) Экспорт
	СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
	
	Если ВРег(перИмяМетода) = ВРег("Completer") Тогда	
		
		ЯВыполнятор(СтруктураОтвет,ЗапросОтКлиентаJSON);
		
	ИначеЕсли ВРег(перИмяМетода) = ВРег("CompleterParam") Тогда  
        
		ЯВыполнятор_Параметры(СтруктураОтвет,ЗапросОтКлиентаJSON);
		

//... еще методы

	Иначе
		
		СтруктураОтвет.КодОтвета 	= 404;
		СтруктураОтвет.ТекстОшибки	= "Неизвестный метод!!!";
		СтруктураОтвет.Отработало	= Ложь;
		СтруктураОтвет.ДанныеОтвета = "";
		
	КонецЕсли;	
		
	Возврат СтруктураОтвет;
	
КонецФункции	

//Сервис Выполнятор предназначен для получения данных, необходимо подавать код всего модуля.
Процедура ЯВыполнятор(СтруктураОтвет,ЗапросОтКлиентаJSON)
	Попытка
		
		//ЗапросОтКлиентаJSON = ЗапросОтКлиентаJSON + "
		//| ЗаполнитьСтруктуруОтвета(СтруктураОтвет,200,"""",Истина,СтрокаJSON);";	
		Выполнить(ЗапросОтКлиентаJSON);
		
	Исключение
		
		перТекстОшибки = "Ошибка: "+ОписаниеОшибки();
		ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,перТекстОшибки,Ложь,"X");
		
	КонецПопытки;
КонецПроцедуры	

//ЯВыполнятор_Параметры
Процедура ЯВыполнятор_Параметры(СтруктураОтвет,ЗапросОтКлиентаJSON)
    //Читаем JSON
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ЗапросОтКлиентаJSON);
    Попытка
        ВХ_Структура = ПрочитатьJSON(ЧтениеJSON);
    Исключение
        ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,"Неудалось получить данные! Возможно не в JSON передаете!",Ложь,"X");
        Возврат;
    КонецПопытки;

    Если ТипЗнч(ВХ_Структура) = Тип("Структура") Тогда 
        Если не ВХ_Структура.Свойство("ТекстКоманды") Тогда 
            ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,"В структуре отсутствует свойство ""ТекстКоманды""!",Ложь,"X");
            Возврат;    
        КонецЕсли;    
        
        Если не ВХ_Структура.Свойство("вхПараметры") Тогда 
            вхПараметры = Новый Структура;
        Иначе
            вхПараметры = ВХ_Структура.вхПараметры;
        КонецЕсли;
    Иначе
        ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,"Передана не структура!",Ложь,"X");
        Возврат;    
    КонецЕсли;    
    
    
    Попытка
        
        Выполнить(ВХ_Структура.ТекстКоманды);
        
    Исключение
        
        перТекстОшибки = "Ошибка: "+ОписаниеОшибки();
        ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,перТекстОшибки,Ложь,"X");
        
    КонецПопытки;
КонецПроцедуры

Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета)
	СтруктураОтвет.КодОтвета 	= КодОтвета;
	СтруктураОтвет.ТекстОшибки	= ТекстОшибки;
	СтруктураОтвет.Отработало	= Отработало;
	СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;	
КонецПроцедуры

 Вот так я лишился сна!

Аргументы за и против.

+ Легко встроить и использовать.

+ Можно дорабатывать, не трогая головную конфигурацию.

- Постоянно пересылаешь весь код и параметры при работе с методом.

- Меняя, добавляя код в куче мест, не трогая главную конфигурацию, создается риск замены кода не везде где нужно.

- Чем больше мест подключения к главной конфигурации через данный костыль, тем больше времени на будущие доработки. Грубо говоря или менять код в главной базе или подстраиваться под изменения везде, где данное решение используется.

- Определенные сложности с оптимизацией процессов.

- Невозможность отладки такого кода
- Невозможность замера производительности такого кода
- Невозможность определять свои методы

- Вы вдруг уволитесь, переедете или не дай бог… Обслуживать будет кто-то другой. Поставьте себя на его место! Представьте, как ему потом разгребать ваш костыль.

- Есть вариант, что кто-то узнает про ваше решение и будет использовать в свое благо. Можно получать данные или передавать бомбы в виде неоптимального кода. А если у вас еще и не защищенное соединение, тогда посмотрите мультик «Трое из Простоквашино» про подмену посылки.

Можно еще нарисовать минусов, с плюсами сложнее…

Итог.

Дом нужно строить на нормальном фундаменте, а не на песке! Можно сделать универсальное решение и спать спокойно, но путь, который предполагает возить код для выполнения через транспорт – может испортить Вам сон!

HTTP-сервис API JSON http web apache сервис Линк PAPI Pretty Безопасность Терминатор Троянский конь Выполнить Вычислить https

См. также

Архитектура решений Программист Платформа 1С v8.3 Бесплатно (free)

В статье расскажу про относительно уникальное явление на рынке. EmplDos - полноценный сервис, который в качестве Backend использует платформу 1С. Речь пойдёт не только о технической и архитектурной стороне вопроса, а ещё и о всех трудностях и граблях, которые пришлось и до сих пор приходится преодолевать на пути к успеху.

14.10.2024    3959    0    comol    28    

28

Кейсы автоматизации Платформа 1С v8.3 1С:Документооборот Бесплатно (free)

Компания «Уралхим» использует 1С:Документооборот не только для хранения и согласования документов, но и для централизованного управления НСИ между 47 системами (не только на 1С); для бэкенда к мобильным приложениям охранников; и в качестве сервиса заказа справок для сотрудников. О деталях реализации нестандартных решений, разработанных в компании «Уралхим» на базе 1С:Документооборот, пойдет речь в статье.

02.08.2024    3449    0    Novattor    1    

16

Кейсы автоматизации Платформа 1С v8.3 Энергетика и ЖКХ Россия Бесплатно (free)

Делимся опытом автоматизации учета башни раздачи воды.

27.12.2023    2190    0    slavik27    7    

15

Отчеты и дашборды Бизнес-аналитик Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Бесплатно (free)

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

11.12.2023    2906    0    Serg_Tangatarov    2    

16

Архитектура решений Программист Бесплатно (free)

Рассмотрим применение архитектурной проверки задач в процессе разработки.

30.10.2023    5596    0    ivanov660    10    

35

Кейсы автоматизации Работа с требованиями Анализ бизнес-процессов Бесплатно (free)

Автоматизировать производственные процессы в 1С:ERP без доработки типовых механизмов очень сложно. А дорабатывать типовые механизмы 1С:ERP не всегда оправданно. Решением может стать технология разработки Рабочих мест, которая позволяет автоматизировать самые сложные участки последовательно – шаг за шагом, процесс за процессом. Расскажем о том, как помочь пользователям вводить большое количество данных, не нарушая порядок ввода и полноту заполнения всех необходимых реквизитов, и как вовлечь сотрудников Заказчика в разработку и тестирование функционала Рабочих мест.

26.10.2023    2935    0    user1754524    15    

17

Кейсы автоматизации Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Когда проект внедрения ERP в крупном холдинге захлебывается в проблемах производительности и в отчаянии пользователей, нужен комплексный подход. Расскажем о битве за производительность и об организационных мероприятиях по наведению порядка в системе и коллективе.

29.08.2023    3517    0    ke_almaty    0    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 10.02.20 09:49
(0) Весь мир борется с выполнением произвольного кода :)
Но не мы! :)))

P.S. Это шутка, конечно. Но проблема выполнения произвольного кода правда очень актуальна.
За труды спасибо.
Irwin; dsdred; Natain14; +3 Ответить
2. for_sale 976 10.02.20 10:00 Сейчас в теме
- Вы вдруг уволитесь, переедете или не дай бог… Обслуживать будет кто-то другой. Поставьте себя на его место! Представьте, как ему потом разгребать ваш костыль.

Это про любой код нужно думать, не только про такой.
crismar24; Sla; 3vs; dsdred; +4 Ответить
3. tormozit 7229 10.02.20 10:00 Сейчас в теме
Еще в минусы стоит добавить врожденные спутники метода Выполнить(Код)
- невозможность отладки такого кода
- невозможность замера производительности такого кода
- невозможность определять свои методы
Irwin; It-developer; Drivingblind; SagittariusA; Natain14; RustIG; Evg-Lylyk; +7 Ответить
7. dsdred 3593 10.02.20 12:14 Сейчас в теме
(3) пытался эти вещи уместить -> Определенные сложности с оптимизацией процессов.

Но Вы правы. С Вашего позволения добавлю к минусам статьи.
4. AlX0id 10.02.20 10:58 Сейчас в теме
- Вы вдруг уволитесь, переедете или не дай бог… Обслуживать будет кто-то другой. Поставьте себя на его место! Представьте, как ему потом разгребать ваш костыль.

Это минус не выполнятора, а отсутствия документации к чему-либо.
lefthander; dsdred; +2 Ответить
5. pm74 203 10.02.20 11:08 Сейчас в теме
(0)
Плюсы есть, но минусов в разы больше!

не пойму я вашей рефлексии по этому поводу
по мне так все удобно
забавно но сегодня как раз залил предрелиз своего "выполнятора" на https://github.com/pm74/_37583

функционал http вовсю используется в проде ( примеры есть на скринах
в https://infostart.ru/public/728511/)
8. dsdred 3593 10.02.20 12:19 Сейчас в теме
(5)Петр к Вашему решению данная статья не относится.
На сколько я помню у Вас был отдельный справочник алгоритмов.

Я против возможности добавлять алгоритмы всеми в подряд и против того чтобы код гоняли транспортом.
10. pm74 203 10.02.20 12:29 Сейчас в теме
(8)
справочник алгоритмов

я думал у вас нечто подобное ,
разве нет ?
тогда сорри не разобрался в теме
13. dsdred 3593 10.02.20 13:06 Сейчас в теме
(10)нет нет, я про запущенные случаи ))
6. RustIG 1747 10.02.20 11:30 Сейчас в теме
для служебных целей точно пойдет, пользователям про такой механизм необязательно знать
9. dsdred 3593 10.02.20 12:20 Сейчас в теме
(6)Вот люблю я те конторы где собственники(пользователи) говорят у нас с IT все отлично.
Посмотришь и поседеешь.
crismar24; +1 Ответить
11. RustIG 1747 10.02.20 12:42 Сейчас в теме
(9) раскройте смысл ответа :) не понял вас :) ...
12. dsdred 3593 10.02.20 13:05 Сейчас в теме
(11)Вот допустим я создал такой механизм. Никому не поведал и ушел.
Пользователь об этом механизме не знает, а он есть. Как суслик в ДМБ.
И все довольны. Но дыра в безопасности есть и ее можно использовать.

Был у меня случай, когда я пришел в малый бизнес где собственники говорили, что у них в плане IT все норм, их два аутсорсера обслуживали. Им нужен человек по 1С и администрированием заниматься не придется.
Я провел аудит и выяснилось, что они сидят на пороховой бочке. Они занимались скоропортом, из вне к ним зайти не может только ленивый... Времени переделать на нормально нет. В итоге взвесив все за и против я ушел даже денег не взял за то время, что отработал и рассказывать не стал. Смысла рассказывать не было, так как не поверили бы, с аутсорсом они работали дольше чем со мной. Старый друг лучше новых двух.
Пару лет назад искал данную контору ради интереса, вроде больше нет их, наверное отучались.
14. RustIG 1747 10.02.20 13:19 Сейчас в теме
(12) ясно,
я другой смысл вложил в свой комментарий - вы по своему его поняли :)
создайте константу, которую всегда можно отключить, включайте доступ по веб-серверу - когда вам нужно - для служебных целей такой подход подойдет - в любом случае занят конфигуратор разработчиками или пользователи работают в базе - конфигурацию не обновить. Поэтому я увидел в вашем решении механизм пригодный для служебных целей. Запустили ряд процессов, отключили доступ к веб-серверу, отключились сами.
Так безопасно.
SirAlex1C; dsdred; +2 Ответить
15. alexsey777 13.02.20 11:13 Сейчас в теме
Основной минус сего механизма - гонять код через сервисы. Так реально запутаешься...

Я писал специально универсальный механизм алгоритмов, чтобы была возможность более гибко расширять функционал без обновлений конфы.
Но я делал специальный справочник с алгоритмами. Который доступен только под админскими правами.
Тут главное в крайность не впадать и не использовать это всегда и везде.
16. dsdred 3593 16.02.20 19:08 Сейчас в теме
(15)
Я писал специально универсальный механизм алгоритмов, чтобы была возможность более гибко расширять функционал без обновлений конфы.
Но я делал специальный справочник с алгоритмами. Который доступен только под админскими правами.

Я думаю почти каждый делал механизм алгоритмов. Метод со справочником правильный.
17. fixin 4273 07.04.21 18:56 Сейчас в теме
(3) Методы можно добавлять через псевдопроцедуры.
18. tormozit 7229 07.04.21 20:36 Сейчас в теме
(17) Стыдно признать, но я в свои почетные годы все еще не знаю что такое "псевдопроцедуры".
It-developer; Cерый; dsdred; +3 Ответить
19. fixin 4273 08.04.21 07:44 Сейчас в теме
(18) что-то типа макросов.
20. tormozit 7229 08.04.21 09:18 Сейчас в теме
(19) Видимо ты и сам пока не знаешь точно. Ладно. Подождем от тебя готового решения.
21. fixin 4273 08.04.21 20:48 Сейчас в теме
(20) Как только завершу написание "убийцы 1С", так и сразу. ;-)
22. It-developer 26 01.07.21 11:55 Сейчас в теме
Капец. Не понятно почему Вы не подумали про эффект когда начинали его разрабатывать.
Думал про такую штуку, но в обратном направлении - в центральной базе даем код, а в узлах мобильного приложения выполняем - тем самым не пересобираем мобильное приложение по пустякам
23. dsdred 3593 01.07.21 12:06 Сейчас в теме
(22)
Капец. Не понятно почему Вы не подумали про эффект когда начинали его разрабатывать.


По той же причине, что и другие люди выкладывают примерно раз в месяц подобные решения.
Нужно быстро, здесь и сейчас что-то универсальное. Я на первый вариант менее 10 минут потратил.

Быстро и без раздумий.

Думал про такую штуку, но в обратном направлении - в центральной базе даем код, а в узлах мобильного приложения выполняем - тем самым не пересобираем мобильное приложение по пустякам


Когда рисовал мобильное приложение использовал уже другой подход.
Оставьте свое сообщение