|
Управляемые формы - как выполнить процедуру формы | ☑ | ||
---|---|---|---|---|
0
ketonija
18.04.18
✎
22:47
|
Подскажите пожалуйста, какой есть способ выполнить процедуру из формы произвольного документа с целью пересчета показателей этого документа?
Более конкретно задача такая - есть складской ордер на товары, нужно чтоб когда он проводился, в распоряжении, на основании которого он создан, выполнялась процедура ПерезаполнитьПоОтгрузке() из модуля формы документа РеализацияТоваровУслуг, на основании которого он создан. В обычных формах достаточно было написать: Расходная = Распоряжение.ПолучитьОбъект(); Расходная.ПолучитьФорму("ФормаДокумента").ПерезаполнитьПоОтгрузке(); Расходная.Записать(РежимЗаписиДокумента.Проведение); А как этот процесс сделать в управляемых формах? |
|||
1
shuhard
18.04.18
✎
22:50
|
(0) перенеси код в менеджер документа =)
|
|||
2
ketonija
18.04.18
✎
22:58
|
ПерезаполнитьПоОтгрузке() Это типовая процедура в типовой конфигурации, я не могу ее перенести в менеджер документа.
|
|||
3
Мигрень
18.04.18
✎
23:04
|
(1) Ему статический метод не подойдет, поскольку ему нужно работать с данными конкретного объекта.
(2) Создай свой общий модуль, передавай в него ссылку на распоряжение. |
|||
4
Мимохожий Однако
18.04.18
✎
23:06
|
(2) копи-паста есть
|
|||
5
ketonija
18.04.18
✎
23:11
|
Мне что, копировать в модуль формы Расходного ордера все процедуры и функции, которые вызываются из ПерезаполнитьПоОтгрузке() в документе РеализацияТоваровИУслуг &НаКлиенте и &НаСервере?
|
|||
6
shuhard
18.04.18
✎
23:19
|
(5) какие-то проблемы ?
|
|||
7
ketonija
18.04.18
✎
23:21
|
Да, их много, не хотелось сидеть и ковыряться еще в десятке других процедур и функций и засорять расходный ордер лишним кодом.
|
|||
8
Asmody
18.04.18
✎
23:23
|
(5) А ты хочешь при проведении документа вызывать что-то у другого документа на клиенте?
|
|||
9
ketonija
18.04.18
✎
23:31
|
Да, т.к. Кнопка находится на форме другого документа, вызывает команду, которая выполняется на клиенте. Я пробовал скопировать весь этот код в такую же процедуру на клиенте в расходный ордер, но возникли проблемы с вызовом функций, которые исполняются &НаСервере в модуле формы расходной накладной. Копировать все функции я не стал, т.к. подумал что это уже извращение, к которому можно прибегать только в безвыходной ситуации, должен быть способ по проще.
|
|||
10
Sam1C
18.04.18
✎
23:53
|
(9) Так не получится, Модуль объекта где процедура проведения твоя, выполняется на сервере. Это как сервак гугла должен у тебя в браузере выполнить какой либо клиентский код на jscript. Выполняя код на сервере забудь про клиента. В твоем случаи выход серверные методы, о которых ты пишешь в (9) перенести в общий модуль! и в проведении обращаться к этому общему модулю, передовая объект туда для обработки
|
|||
11
Sam1C
18.04.18
✎
23:56
|
(10) Наверняка в процедуре модуля формы ПерезаполнитьПоОтгрузке()- обработка события, а основная логика заполнения происходит на сервере.
|
|||
12
Sam1C
19.04.18
✎
00:06
|
(0) Более того на обычных формах это тоже не совсем удачное решение. Из модуля проведения вызывать методы формы... А если групповое проведение это какое будет ресурсоемкое решение. ПолучитьФорму это создается вся форма со всеми табличными полями, реквизитами формы и т.п.
Даже на обычных формах либо общий модуль, либо в модуле документа "Распоряжение" |
|||
13
ketonija
19.04.18
✎
00:50
|
(11) Основная логика заполнения происходит в процедуре, размещенной в модуле формы документа Реализация ТоваровИУслуг
&НаСервере Функция ЗаполнитьПоОтгрузкеСервер(СостояниеОтгрузки, ЗаполнятьНесобраннымиТоварами=Ложь) Экспорт СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(Объект); СтруктураДействийСИзмененнымиСтроками = Новый Структура; СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы); СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы); СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСумму"); СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь)); СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина)); СтруктураДействийСИзмененнымиСтроками.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты()); СтруктураДействийСИзмененнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов"); СтруктураДействийСИзмененнымиСтроками.Вставить("ЗаполнитьПризнакБезВозвратнойТары", Объект.ВернутьМногооборотнуюТару); СтруктураДействийСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСверхЗаказа", Новый Структура("РеализацияПоступлениеПоЗаказу, ТребуетсяЗалогЗаТару", Объект.РеализацияПоЗаказам, Объект.ТребуетсяЗалогЗаТару)); СтруктураДействийСДобавленнымиСтроками = Новый Структура; Если ИспользоватьСоглашенияСКлиентами И ЗначениеЗаполнено(Объект.Соглашение) Тогда СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьУсловияПродаж", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийПродажВСтрокеТЧ(Объект)); Иначе СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныВСтрокеТЧ(Объект)); КонецЕсли; СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры")); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакБезВозвратнойТары", Объект.ВернутьМногооборотнуюТару); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", НалогообложениеНДСПоУмолчанию); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДСВозвратнойТары", Объект.ВернутьМногооборотнуюТару); СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы); СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы); СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСумму"); СтруктураДействийСДобавленнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов"); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты()); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются")); СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул")); СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСуммуСверхЗаказа", Новый Структура("РеализацияПоступлениеПоЗаказу, ТребуетсяЗалогЗаТару", Объект.РеализацияПоЗаказам, Объект.ТребуетсяЗалогЗаТару)); СтруктураПараметров = ПродажиСервер.СтруктураДокументаДляЗаполненияПоФактическойОтгрузке(); ЗаполнитьЗначенияСвойств(СтруктураПараметров, Объект); ЗаполнитьЗначенияСвойств(СтруктураПараметров, СостояниеОтгрузки); СтруктураПараметров.Вставить("СтруктураДействийСИзмененнымиСтроками", СтруктураДействийСИзмененнымиСтроками); СтруктураПараметров.Вставить("СтруктураДействийСДобавленнымиСтроками", СтруктураДействийСДобавленнымиСтроками); СтруктураПараметров.Вставить("СкладВТабличнойЧасти", Истина); СтруктураПараметров.Вставить("ДокументРезерваСерийВТабличнойЧасти", Истина); СтруктураПараметров.Вставить("ДополнятьСтроки", Не Объект.РеализацияПоЗаказам ИЛИ РеализацияСверхЗаказа); СтруктураПараметров.Вставить("ПараметрыУказанияСерий", НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.РеализацияТоваровУслуг)); СтруктураПараметров.Вставить("ЗаполнятьНесобраннымиТоварами", ЗаполнятьНесобраннымиТоварами); СтруктураПараметров.Вставить("РеализацияСверхЗаказа", РеализацияСверхЗаказа); ЕстьИзменения = ПродажиСервер.ЗаполнитьПоФактическойОтгрузке(Объект, СтруктураПараметров); ОбновитьОтклоненияОтЗаказа(); ОбойтиТаблицуОбновитьЗависимыеРеквизиты(); УстановитьВидимостьРеквизитовОплаты(ЭтаФорма); РассчитатьИтоговыеПоказателиРеализации(ЭтаФорма); РассчитатьСуммуПредоплаты(ЭтаФорма); Возврат ЕстьИзменения; КонецФункции А каждая процедура, что вызывается в конце функции ОбновитьОтклоненияОтЗаказа(); ОбойтиТаблицуОбновитьЗависимыеРеквизиты(); УстановитьВидимостьРеквизитовОплаты(ЭтаФорма); РассчитатьИтоговыеПоказателиРеализации(ЭтаФорма); РассчитатьСуммуПредоплаты(ЭтаФорма); обращается к другим процедурам и функциям формы документа. В итоге чтоб сделать вроде бы элементарное действие, которое можно сделать в обычных формах 3-мя простыми строчками кода, нужно сидеть и лопатить весь код процедур и функций документа, чтоб слепить из него свой код, который будет выполняться на сервере? |
|||
14
VladZ
19.04.18
✎
06:26
|
(0) "А как этот процесс сделать в управляемых формах?" - вопрос неверный. В УФ код должен быть разнесен на "на сервере" и "на клиенте". Т.е. в связи с новой идеологией код нужно переписать.
|
|||
15
b_ru
19.04.18
✎
06:30
|
Постановка задачи и общее проектирование системы - огонь.
Я бы в этой ситуации зашел с другой стороны. Пусть при проведении ордера ничего не происходит, зато при открытии распоряжения проверяется - проведен ли ордер, и если да, тогда выполняются действия по перезаполнению при отгрузке. |
|||
16
Мимохожий Однако
19.04.18
✎
07:12
|
(7) Лень - двигатель прогресса. Но не в данном случае. Разберись как работает. Тогда копировать придётся на порядок вместе. Но мне не нравится сама задача. Не должно проведения или запись одного документа влиять на реквизиты другого. Это чревато.
|
|||
17
Мимохожий Однако
19.04.18
✎
07:13
|
*на порядок меньше
|
|||
18
DrZombi
гуру
19.04.18
✎
07:26
|
(0) Проще переписать форму и вынести перерасчет в общий модуль, либо на крайняк в модуль объекта :)
|
|||
19
shuhard
19.04.18
✎
07:48
|
(7)[не хотелось сидеть и ковыряться еще в десятке других процедур и функций и засорять расходный ордер лишним кодом.]
не хоти |
|||
20
ketonija
19.04.18
✎
09:31
|
(15) наверно это будем самый простой путь, т.к. пересчет конечно нужен не при каждом проведении ордера, а только в случае изменения его статуса на "к отгрузке"(я этот ньюанс изначально не писал чтоб не усложнять суть задачи). Поэтому если при смене статуса будет открываться форма распоряжения и выполняться пересчет, вполне нормально. Правда при очередной смене статуса ордера на "отгружен", нужно будет опять менять статус распоряжения на "реализовано" и проводить его в новом статусе. Выходит каждый раз надо открывать форму распоряжения.
|
|||
21
Любопытная
19.04.18
✎
09:47
|
(20) зачем каждый раз открывать форму при смене статуса? Не проще ли при открытии формы узнавать статус и выполнять какие-то действия в зависимости от статуса?
З.Ы. Откуда вы берете слово "ньюанс"( |
|||
22
ketonija
19.04.18
✎
09:54
|
(21) открывать форму нужно т.к. если этого не сделать, ее никто не откроет и тот кто создавал распоряжение не узнает что оно изменится. Вкратце это нужно знать менеджеру, чтоб оповестить клиента о неполной отгрузке, в случае если кладовщик не может выполнить распоряжение в полном объеме.
|
|||
23
Любопытная
19.04.18
✎
09:56
|
Что-то вы явно не с того угла за задачу взялись.
|
|||
24
Мигрень
19.04.18
✎
12:57
|
Ньюанс - сложное слово, состоящие из двух частей. Нью - новый, анс- ансамбль. Под ансамблем здесь подразумеваются три сущности: менеджер, одинесник и собственно программа 1С.
|
|||
25
ketonija
21.04.18
✎
14:40
|
Решил вопрос таким способом:
В форме документа РеализацияТоваровУслуг добавил реквизит Перезаполнять тип Булево и добавил код в процедуре &НаКлиенте Процедура ПриОткрытии(Отказ) Если Перезаполнять Тогда ПерезаполнитьПоОтгрузке(""); Записать(); Закрыть(); КонецЕсли; КонецПроцедуры; В форме документа Расходный ордер вставил в процедуре &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) П = Новый Структура; П.Вставить("Ключ", Объект.Распоряжение); Форма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", П); Форма.Перезаполнять = Истина; Форма.Открыть(); КонецПроцедуры; |
|||
26
jsmith82
21.04.18
✎
14:56
|
А помните была тема, что можно неэкспортные процедуры функции выполнять с клиента?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |