Имя: Пароль:
1C
1С v8
Управляемые формы - как выполнить процедуру формы
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
А помните была тема, что можно неэкспортные процедуры функции выполнять с клиента?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан