Имя: Пароль:
1C
1С v8
Выполнить серверные методы модуля формы из вне
0 Gregor09
 
29.08.19
13:16
Есть веб-сервис, который должен создавать программно документ. В документе куча логики описана в коде модуля формы, который автоматически заполняет различные реквизиты документа. Соответственно это все выполняется только при интерактивном заполнении документа. Если бы у меня что-то выполнялось на клиенте, я бы мог создать документ, получить его форму и вызвать эти процедуры\функции формы.
Как можно решить эту задачу, подскажите? Переписывать в свой веб-сервис еще эти методы, которые выполняются в форме не хотелось бы, с очередным обновлением поменяется логика и все, либо каждый раз проверять после обновления.
1 Timon1405
 
29.08.19
13:21
и правильно что не дает выполнить. ваш веб-сервис - потенциальный зловред для системы.
2 Gregor09
 
29.08.19
13:33
(1) Суть не в том, что веб-сервис потенциальный зловред. Суть вопроса в том, как программно создать документ и выполнить все обработчики, которые описаны в модуле формы, имея при этом только доступ на выполнение кода &НаСервере. Пусть это не веб-сервис будет, а регламентное задание.
3 palsergeich
 
29.08.19
13:35
(2) UГарантировано - никак.
Но если бизнес логика в форме - ошибка архитектуры.
По хорошему в форме должны быть только обработчики событий, сама логика проверок, заполнений и прочего должна быть по минимуму реализвана на форме
4 palsergeich
 
29.08.19
13:36
Возьми любую современную УТ, при изменении строки - вызов общего модуля, а не лапша на форме
5 FIXXXL
 
29.08.19
13:40
(4) да ну? а сбор стопиццот элементов структуры для пересчета строки?
и это хня может потенциально изменится
из последнего - новый расчет НДС...
6 Gregor09
 
29.08.19
13:45
(3) К сожалению, в ЗУПе куча документов, у которых логика описана в форме, либо в общем модуле, куда, правда, передается опять же форма.
7 FIXXXL
 
29.08.19
13:46
(6) в ЗУПе под такое дело, говорят, специальные обработки есть, которые делают расчет
8 palsergeich
 
29.08.19
13:47
(5) и что?
9 palsergeich
 
29.08.19
13:48
(5) Как правило на вход подаешь строку ТЗ или ДФК и получаешь результат, а реализация скрыта в ОМ. В том то вся и прелесть такого подхода
10 catena
 
29.08.19
13:48
(4)Ха! Любой УТ нет, но вот есть любой ЗУП. В итоге, конечно, можно докопаться до серверных процедур, но их вызов через такую лапшу на форме, что использование - те же самые заложенные грабли, что и перенос всего кода в обработку: логика может измениться в любой момент. Каждая попытка автоматизированного заполнения - боль.
11 palsergeich
 
29.08.19
13:49
(10) Так и начинайте с этого.
ЗУП это другая история совершенно.
Как я должен об этом догадаться?
А может документ самописный?
12 palsergeich
 
29.08.19
13:51
(11) Это не отменяет того, что так делают нехорошие люди. И вообще ЗУП - это наказание(
13 FIXXXL
 
29.08.19
13:51
(8) на вход куда? "лапша" параметров собирается на форме
14 Gregor09
 
29.08.19
13:54
(6) Нашел топик, человек столкнулся с аналогичной проблемой в ЗУПе - Получить форму на сервере 1с
Придется пилить костыли и надеяться, что после очередного обновления ничего не сломается.
15 palsergeich
 
29.08.19
13:57
(13) Правда что ли?
Как там в 2007?
https://yadi.sk/i/8LRHsf9zSh7lzw
16 palsergeich
 
29.08.19
13:58
(14) С ЗУПом сочувствую
17 Loli_pop
 
29.08.19
14:07
Странно, что передать форму в серверную процедуру можно и там работать с ней, а получить на сервере нельзя. В чем логика? Почему нельзя сделать, чтобы на сервере можно было бы получить такую же форму по ссылке, как и переданная на сервер форма?
18 palsergeich
 
29.08.19
14:10
(17) форму как параметр в серверную процедуру передать нельзя.
19 palsergeich
 
29.08.19
14:11
(18) будет ошибка - отсутствует отображение типа.
20 Gregor09
 
29.08.19
14:23
(18) Как это? В той же УТхе, форма документа Заказ, например, в модуле формы ctrl+f "(ЭтаФорма" - столько серверных процедур вызывается, куда в качестве параметра передается ЭтаФорма
21 Gregor09
 
29.08.19
14:24
(14) Кому интересно и на будущее, может кому-то пригодиться. Решил создавать документы без расчетных данных, а расширением при открытии формы проверяю, если данных нет, сообщаю пользователю, что документ не рассчитан и его желательно пересчитать (Да\Нет).
22 palsergeich
 
29.08.19
14:29
(20) Увы но нет. Ни в одном вызове с ЭтаФорма нет смены контекста.
Или с сервера сервер или с клиента клиент.
Но с клиента -> сервер нет.
23 palsergeich
 
29.08.19
14:33
Убедись сам, что передача формы через параметр с клиента на сервер вызываает ошибку, и не важно, контекстый вызов или нет
https://yadi.sk/d/4ddQJJ_cbWxoBQ
24 FIXXXL
 
29.08.19
14:38
(20) Сервер-Сервер
Клиент-Сервер только в контексте
25 palsergeich
 
29.08.19
14:39
(24) Ну да, речь то шла о передаче через параметр)
26 Gregor09
 
29.08.19
14:39
(22) Ну вот почему, кстати, не получать бы форму через ПолучитьФорму() вызванную в серверном общем модуле, аналогичную той, которая имеется в модуле формы в контексте &НаСервере
27 FIXXXL
 
29.08.19
14:43
(15) не могу посмотреть, сорри

1С:ERP Управление предприятием 2 (2.4.6.230.82)
ЗаказКлиента.ФормаДокумента

&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    СтруктураДействий = Новый Структура;
    ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект);    
    
    ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
    
    РассчитатьИтоговыеПоказателиЗаказа(ЭтаФорма);
    
    СкидкиНаценкиКлиент.СброситьФлагСкидкиРассчитаны(ЭтаФорма);
    
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект)
    
    СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект);
    СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСумму");
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
    СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты());
    
КонецПроцедуры


и эта борода параметров индивидуальна в каждом документе...
28 palsergeich
 
29.08.19
14:44
(26) Потому что с определения - форма это способ общения с юзером.
Да есть КлиентСерверное взаимодействие. Но УФ на клиенте и УФ на сервере по факту это 2 разных объекта у них частично схожий, и частично различный состав свойств в методов, которые как то там через сериализацию и передачу контекста синхронизируются.
Архитектурно форма без клиента не нужна.
А так как основная парадигма 1С - с сервера нельзя вызвать клиент - то то что ты просишь - не возможно.
29 palsergeich
 
29.08.19
14:46
(27) Это не та борода параметров, которые былим раньше, по факту они сейчас в таком виде реализовали флажки что тиенно пересчитать при том или ином изменении поля. Может быть еще немного посидят и дойдут до того что бы и это в ОМ убрать)
30 palsergeich
 
29.08.19
14:48
(29) Следующий шаг это реализация процедуры ОМ которая будет генерировать эти параметры на основании типа объекта и имени поля, но это же 1С, они редко когда сразу делают как надо)
31 olegves
 
29.08.19
15:36
(26) а кто мешает из МФ перенести нужную логику в модуль менеджера или в ОМ, после чего уже она быдет доступна не только из МФ
32 Timon1405
 
29.08.19
15:41
(31) мешает отсутствие уверенности, что завтра в обновлении от поставщика код в модуле формы поменяется(например, появятся новые обработчки), а в перенесенном вами куске останется старая логика.
33 olegves
 
29.08.19
16:23
(32) а ты обновляешься всегда механически, без анализа изменений?
34 FIXXXL
 
30.08.19
11:02
(30) вот это как раз напрашивается
тогда и вопросов не будет, отдал строку и Вася :)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.