Вход | Регистрация

  1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Внешняя обработка. Методы, которые необходимо исполнить НаСервере

Внешняя обработка. Методы, которые необходимо исполнить НаСервере
Я
   PiotrLoginov
 
15.10.18 - 18:15
Часто замечаю, что разработчики сейчас, реализуя во внешней обработке какой-то функционал, которого нет в конфигурации, и который никак нельзя туда вставить, обходятся модулем формы этой внешней обработки.

Даже самые сложные куски кода, которые исполняются на сервере (потому что в этих кусках есть методы платформы, доступные лишь НаСервере (даже не в толстом клиенте) или потому, что там идет обращение к сторонним механизмам, доступным лишь на серверной машине) пихают в модуль формы, заполняя его (модуль формы) хитросплетениями функций и процедур.

Казалось бы, мучайте вы модуль ОБЪЕКТА вашей внешней обработки! А в модуле формы оставьте лишь код, обслуживающий интерактивные "дела".


НО! С другой стороны, обработку ведь можно открыть в толстом клиенте. И если в модуле объекта был расчет, что код будет исполняться на серверной машине, произойдет мерзкий пшик. А вот в модуле формы пшик не произойдет, потому что в модуле формы есть директивы компиляции.

Какие есть рекомендации вендора по этой части? Ткните меня, плз.
И вообще, стоит ли страховаться в начале модуля объекта так, как страхуется вендор в модулях менеджеров (#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда)   ??

Спасибо всем, кого этот принципиальный теоретический вопрос не оставит равнодушным.
 
 
   Cyberhawk
 
101 - 17.10.18 - 07:58
(88) Хз о чем ты
   Cyberhawk
 
102 - 17.10.18 - 08:00
(87) Это не серверный вызов, это с сервера на сервер. Ну т.е. как Я и говорил ты называешь вещи не своими именами.
   Rovan
 
103 - 17.10.18 - 09:18
(0) "что разработчики сейчас,"...кто ???
- Это сама 1С ?
- Известные партнеры 1С
- просто обычные франчи
- какие-то НоНэйм программисты ?
- студенты-практиканты ?
   PiotrLoginov
 
104 - 17.10.18 - 14:09
(103) думал, тут уже все успокоились :)

>>- Это сама 1С ?
>>
>>- Известные партнеры 1С
>>- просто обычные франчи
>>
>>- какие-то НоНэйм программисты ?
>>- студенты-практиканты ?

Кажется, примеры внешних обработок с кучей серверного функционала прямо в модуле формы валяются на каждом углу. Но дабы не быть голословным, я могу сейчас скачать первую попавшуюся крутую обработину с инфостарта и возопить победоносно "а что я говорил?".
   PiotrLoginov
 
105 - 17.10.18 - 14:15
Тут еще, оказывается, затронули вопрос вызова экспортного серверного метода формы. В общем-то, рабочий способ давно активно практикуется в типовых: создаем форму на клиенте, а затем на сервере из формы вызываем нужный метод БСП. В качестве параметра передаем в метод БСП саму форму. И всё.
БСП может долго делать что-то, непосредственно связанное с интерактивом нашей формы, или вообще обрабатывать какие-то сторонние данные, держа переданную ч/з параметр форму под боком и пользуясь, при необходимости, её экспортными серверными методами.
   Franchiser
 
106 - 17.10.18 - 15:52
(105)
"создаем форму на клиенте, а затем на сервере из формы вызываем нужный метод БСП"
Вроде как пришли к выводу, что передать на сервер форму с клиента нельзя, форму можно передать с клиента на клиент и с сервера на сервер.
   Cyberhawk
 
107 - 17.10.18 - 17:17
1. "затронули вопрос вызова экспортного серверного метода формы"
2. "на сервере из формы вызываем нужный метод БСП"

Ты что-то напутал, неужели для тебя не очевидно, что ты говоришь о каких-то разных вещах?
   Cyberhawk
 
108 - 17.10.18 - 17:18
(106) "передать на сервер форму с клиента нельзя" // Можно если серверный вызов контекстный, т.е. в "пределах" одной и той же формы
   Cyberhawk
 
109 - 17.10.18 - 17:20
+(107) А, не дочитал до конца, пардон.
3. "БСП ... держа переданную ч/з параметр форму под боком и пользуясь, при необходимости, её экспортными серверными методами"// Можешь показать пример код в БСП, который так делает?
   Franchiser
 
110 - 17.10.18 - 23:09
(108) речь о внеконтекстном вызове и когда  форма не текущая, т.е. получена методом ПолучитьФорму() (не ЭтаФорма())
 
 Рекламное место пустует
   Franchiser
 
111 - 17.10.18 - 23:12
3. "БСП ... держа переданную ч/з параметр форму под боком и пользуясь, при необходимости, её экспортными серверными методами"
Есть такие примеры, но не на сервере, а передается форма с клиента в клиентский общий модуль или в экспортную клиентскую процедуру, откуда-то уже дёргаются клиентские или серверные методы экспортные текущей формы. Пример выгрузка и формирование регламентированной отчётности.
   PiotrLoginov
 
112 - 18.10.18 - 18:30
(107) 1. "затронули вопрос вызова экспортного серверного метода формы"
2. "на сервере из формы вызываем нужный метод БСП"

это разные вещи, кто ж спорит.

>>"затронули вопрос вызова экспортного серверного метода формы"
>>...  и пользуясь, при необходимости, её экспортными серверными методами

- вот вещи совсем не разные.  Прекрасный пример использования экспортных серверных методов формы.


(109) , (111) ну почему же не на сервере. Вот пример - использование на сервере экспортных методов ЗаполнитьНастройкамиПоУмолчанию() и ЗаполнитьНастройкамиПоУмолчанию() формы бухгалтерского отчета  Отчеты.АнализСубконто.ФормаОтчета:



//В модуле формы


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    БухгалтерскиеОтчетыВызовСервера.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
    
    <...>

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

//<...>


&НаСервере
Процедура ИзменениеСхемыКомпоновкиДанныхНаСервере() Экспорт
    
    Схема = ПолучитьИзВременногоХранилища(СхемаКомпоновкиДанных);
    
    ПараметрыОС      = Новый Структура("ИндексСубконто, ЗаголовокСубконто", 0, "");
    ПараметрыНМА     = Новый Структура("ИндексСубконто, ЗаголовокСубконто", 0, "");
    ПараметрыФизЛица = Новый Структура("ИндексСубконто, ЗаголовокСубконто", 0, "");
    
    // Изменение представления и наложения ограничения типа значения. "Отчет" - это реквизит формы

    Для Каждого ВидСубконто Из Отчет.СписокВидовСубконто Цикл
        <...>
    КонецЦикла;
    
    <...>
    
КонецПроцедуры

//<...>


&НаСервере
Процедура ЗаполнитьНастройкамиПоУмолчанию(ЗаполняемыеНастройки) Экспорт
    
    Перем ЗаполнятьКоллекцию;
    
    //<...>

    
    Если ЗаполняемыеНастройки.Свойство("Показатели", ЗаполнятьКоллекцию) И ЗаполнятьКоллекцию Тогда
        // Управление показателями.


        //<..>


    КонецЕсли;

    Если ЗаполняемыеНастройки.Свойство("Группировка", ЗаполнятьКоллекцию) И ЗаполнятьКоллекцию Тогда
        // Добавление группировок с соответствии с выбранным счетом.


        //<...>

        
    КонецЕсли;
    
    Если ЗаполняемыеНастройки.Свойство("Отбор", ЗаполнятьКоллекцию) И ЗаполнятьКоллекцию Тогда
        // Добавление неактивных отборов по субконто в соответствии с выбранным счетом.


        //<...>

        

    КонецЕсли;
    
    //<...>

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




//в модуле БухгалтерскиеОтчетыВызовСервера


Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
        
    Отчет     = Форма.Отчет;
    Параметры = Форма.Параметры;
    РеквизитыФормы = РеквизитыФормы(Форма);
    
    ИнициализацияФормыОтчета(Отчет, РеквизитыФормы, Форма);
    
    Если Параметры.Свойство("ОткрытьРасшифровку") И Параметры.ОткрытьРасшифровку Тогда
        СтандартнаяОбработка = Ложь;
        ИнициализацияРасшифровкиПоНастройкам(Отчет, Параметры, РеквизитыФормы, Форма);
    ИначеЕсли Параметры.Свойство("ВидРасшифровки") Тогда
        СтандартнаяОбработка = Ложь;
        ИнициализацияРасшифровкиПоВиду(Отчет, Параметры, РеквизитыФормы, Форма);
    КонецЕсли;
    
КонецПроцедуры

//<...>


Процедура ИнициализацияРасшифровкиПоНастройкам(Отчет, Параметры, РеквизитыФормы, Форма)
    
    Отчет.РежимРасшифровки     = Истина;
    ИмяОтчета               = БухгалтерскиеОтчеты.ИмяОтчета(Форма);
    
    //<...>

    
    Если БухгалтерскиеОтчетыКлиентСервер.ОтчетПоддерживаетУниверсальныеНастройки(ИмяОтчета) Тогда
        
        Форма.ИзменениеСхемыКомпоновкиДанныхНаСервере();
        
        НастройкиКоторыеНужноЗаполнитьПоУмолчанию = БухгалтерскиеОтчетыКлиентСервер.РазделыНастроекСтандартногоОтчета();
        
        <...>
        
        Форма.ЗаполнитьНастройкамиПоУмолчанию(НастройкиКоторыеНужноЗаполнитьПоУмолчанию);
        
    КонецЕсли;

    <...>
    
КонецПроцедуры
   PiotrLoginov
 
113 - 18.10.18 - 18:35
Другое дело, что в этих примерах, чтобы передать в качестве параметра форму, содержащую экспортные серверные методы, процедуры, использующие эти методы, вызываются, собственно, из этой формы.
но возможен другой сценарий, когда форма создается на клиенте (на сервере управляемую форму не создашь, тут уж без вариантов), а потом управление (и форма) передается на сервер, где совершаются необходимые действия, в том числе с использованием экспортных серверных методов переданной формы. Доводилось использовать такой сценарий в моих поделках. Работает.
   Cyberhawk
 
114 - 18.10.18 - 19:00
(112) А, ну ясно - в самой форме, экспортные серверные методы которой хотим дергать, должна быть в серверном контекстом методе предусмотрена передача объекта формы вовне.
Универсально - т.е. "полностью" извне - нельзя вызвать любой экспортный серверный метод произвольной управляемой формы.
   Franchiser
 
115 - 18.10.18 - 19:33
(113) "управление (и форма) передается на сервер, где совершаются необходимые действия, в том числе с использованием экспортных серверных методов переданной формы. Доводилось использовать такой сценарий в моих поделках. Работает."
Ну покажи пример с использованием на клиенте ПолучитьФорму() и передачи формы на сервер.
   Franchiser
 
116 - 18.10.18 - 19:34
(112) с ЭтаФорма все понятно, пример без ЭтаФорма покажи
   Cyberhawk
 
117 - 18.10.18 - 19:47
(116) Да нет такого примера, что-то ты докопался :) См. (114)
   Сергиус
 
118 - 18.10.18 - 20:22
(0)[НО! С другой стороны, обработку ведь можно открыть в толстом клиенте]

Можно, но тут вопрос - а зачем так делать? Обычно, каждая конфа используется в своем режиме - УФ или по-старинке ОФ(обычные толстые формы). Соответственно, ты для конкретной конфы пишешь свою обработку. Зачем закладывать что-то общее и универсальное для, по сути, разнонаправленных решений?
   Franchiser
 
119 - 18.10.18 - 22:58
(117) не ну может человек способ знает. Раньше ведь может и было можно, пока дыру не прикрыли. Сейчас пробовал форму запихать в структуру, в ней ещё структура и т.д. аналогично с массивом. Может есть какой ещё баг который не известен.
   tesseract
 
120 - 19.10.18 - 00:36
>>Универсально - т.е. "полностью" извне - нельзя вызвать любой экспортный серверный метод произвольной управляемой формы.

Серверные методы формы давно пора удалить к хренам. Только путают контекст.

Вызвать таки можно, но только если упрформа имеет обработчики и сама запустила ПодклчитьОбработчикОжидания/ПодключитьОбработчикОповещения.

В толстом клиенте кстати можно было через шаманство с событиями от оборудования.
   Cyberhawk
 
121 - 19.10.18 - 10:21
(120) Еще к требованию "универсально" можно добавить, что изначально с сервера нельзя в принципе поиметь форму и любые ее методы, даже если в этой форме предусмотреть интерфейс для передачи самой себя куда-то вовне.
Ну т.е. если какой-то алгоритм есть _только_ в серверном метдоде формы (ЗУП таким славится?), и путь он экспортный, и пусть удалось получить форму на сервере (форма предоставляет такую возможность), а мы не имеем возможность вернуться на клиента, то ждет нас облом.
   bvb
 
122 - 19.10.18 - 11:45
Можно я вброшу поутру :

Я  вот не могу своим разумом осилить почему Сообщить() может спокойно вызываться на сервере.
   Вафель
 
123 - 19.10.18 - 11:50
(122) ибо сообщить - это не только вывод текста на экран, то и передача между процессами
   bvb
 
124 - 19.10.18 - 12:31
Стеснюсь спросить : а предупреждения так нельзя было сделать ?

А то приходится ваять вот такую красоту :

&НаКлиенте
Процедура ПредупреждениеОбОшибках(ТекстПредупреждения)
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияПредупреждение",
    ЭтотОбъект);    
    
    ПоказатьПредупреждение(
    Оповещение,
    ТекстПредупреждения,// предупреждение

    0,// (необ.) таймаут в секундах

    "Это предупреждение."// (необ.) заголовок

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


&НаКлиенте
Процедура ЗаполнитьСводнуюСпецификацию(Команда)
    
    ЕстьОшибки = ЛОЖЬ;
    ТекстПредупреждения = "";
    
    ЧетТамНаСервере(ЕстьОшибки, ТекстПредупреждения);
    
    Если ЕстьОшибки Тогда
        ПредупреждениеОбОшибках(ТекстПредупреждения);
   Cyberhawk
 
125 - 19.10.18 - 12:38
(124) Сообщения после серверного вызова всплывают все сплошняком и особо не мешают.
Представь что было бы если бы предупреждения все разом вываливались и пользователь жмакал бы "ОК" тыщу раз.
   bvb
 
126 - 19.10.18 - 12:43
(125) Ну так не делай предупреждения же в цикле !

Я о том что :
если можно передавать сообщения между процессами то можно передавать и текст предупреждения с вызовом модального окна предупреждения  В КОНЦЕ серверной процедцуры на клиенте.
   bvb
 
127 - 19.10.18 - 12:48
Еще жутко не хватает ОбработкапрыванияПользователя() циклы обработки данных крутятся на сервере.
   Cyberhawk
 
128 - 19.10.18 - 12:54
(126) Могу только порекомендовать перечитать написнное в моем предыдущем сообщении
   bvb
 
129 - 19.10.18 - 13:14
(128)Перечитал.

Предупреждение - это исключительная ситуация зачем
его вызывать сотни раз ?
Мы же непишем предупреждение в модуле проведения.
   RomanYS
 
130 - 19.10.18 - 13:31
(124) Есть программа, есть документация. Зачем спрашивать "зачем", если ПО работает как положено?
У 1С есть реально бредовые решения. Пример? "Ошибка целостности" - почему просто не написать "нарушение условий лицензирования..."?
   Вафель
 
131 - 19.10.18 - 13:34
(129) у тебя проблемы с пониманием клиент-серверного взаимодействия.
   bvb
 
132 - 19.10.18 - 13:44
(130) Чтобы пользователь обосрался что у него база грохнулась а не бежал искать эмулятор


(131) Я думаю врядли
Упрощенно на пальцах что придумали в УФ:

туда сюда гоняется контекст по сути в XML
На клиенте и и сервере его нужно запарсить/распарсить
пока серверная обработка процедуры - запроса не закончится на клиенте результата не получишь


НО Особенность работы 1С не в УФ.
Что нужны всякие хохряшки вызываемые в процессе обработки данных на рантайме а с этим в УФ таки проблемы.

Допустим иду я обработкой по стокам ТЗ и после обработки КАЖДОЙ строки нужно что то визуализировать и такое нужно тоже
   Вафель
 
133 - 19.10.18 - 13:45
(132) но он же в гугл побежит, а там все разжевано.
Это работало только первую неделю
 
 
   Cyberhawk
 
134 - 19.10.18 - 13:49
(129) Хз почему ты меня об этом спрашиваешь
   bvb
 
135 - 19.10.18 - 13:54
(133) Может запаниковать

Вы мне лучше объясни чем думали разработчики конф на УФ если открыв форму дока ты не знаешь проведен он или нет ?
или удален ?

Нет , я знаю что нужно вытащить на форму кнопку отмены проведения и если она неакитивна - то таки документ не проведен.

Но работают с доками не я а юзеры
   Cyberhawk
 
136 - 19.10.18 - 14:29
А зачем им это знать?
   RomanYS
 
137 - 19.10.18 - 14:30
(135) В БП3 вижу пиктограмму рядом с датой, а ты про какие типовые?
   Cyberhawk
 
138 - 19.10.18 - 14:32
(137) Так это в форме списка пади. Он про форму объекта.
   Cyberhawk
 
139 - 19.10.18 - 14:33
   RomanYS
 
140 - 19.10.18 - 14:33
(138) я тоже про форму документа
   Cyberhawk
 
141 - 19.10.18 - 14:34
Ну значит разрабы БП такое сделали. В линейке ЕРП такого нет.
   bvb
 
142 - 19.10.18 - 14:41
У меня УТ 11.4.1.261 нет не фига 

Менеджер из открывает движения чтобы понять проведен или нет или в форму списка проваливается
   Cyberhawk
 
143 - 19.10.18 - 14:57
(142) Кажется, проще и в плане отзывчивости / быстроты просто один раз нажать на "Еще"
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует