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


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

Управляемые формы - как выполнить процедуру формы

Управляемые формы - как выполнить процедуру формы
Я
   ketonija
 
18.04.18 - 22:47
Подскажите пожалуйста, какой есть способ выполнить процедуру из формы произвольного документа с целью пересчета показателей этого документа?
    Более конкретно задача такая - есть складской ордер на товары, нужно чтоб когда он проводился, в распоряжении, на основании которого он создан, выполнялась процедура ПерезаполнитьПоОтгрузке() из модуля формы документа РеализацияТоваровУслуг, на основании которого он создан. В обычных формах достаточно было написать:
Расходная = Распоряжение.ПолучитьОбъект();
Расходная.ПолучитьФорму("ФормаДокумента").ПерезаполнитьПоОтгрузке();
Расходная.Записать(РежимЗаписиДокумента.Проведение);

А как этот процесс сделать в управляемых формах?
 
 
   shuhard
 
1 - 18.04.18 - 22:50
(0) перенеси код в менеджер документа =)
   ketonija
 
2 - 18.04.18 - 22:58
ПерезаполнитьПоОтгрузке() Это типовая процедура в типовой конфигурации, я не могу ее перенести в менеджер документа.
   Мигрень
 
3 - 18.04.18 - 23:04
(1) Ему статический метод не подойдет, поскольку ему нужно работать с данными конкретного объекта.
(2) Создай свой общий модуль, передавай в него ссылку на распоряжение.
   МимохожийОднако
 
4 - 18.04.18 - 23:06
(2) копи-паста есть
   ketonija
 
5 - 18.04.18 - 23:11
Мне что, копировать в модуль формы Расходного ордера все процедуры и функции, которые вызываются из ПерезаполнитьПоОтгрузке() в документе РеализацияТоваровИУслуг &НаКлиенте и &НаСервере?
   shuhard
 
6 - 18.04.18 - 23:19
(5) какие-то проблемы ?
   ketonija
 
7 - 18.04.18 - 23:21
Да, их много, не хотелось сидеть и ковыряться еще в десятке других процедур и функций и засорять расходный ордер лишним кодом.
   Asmody
 
8 - 18.04.18 - 23:23
(5) А ты хочешь при проведении документа вызывать что-то у другого документа на клиенте?
   ketonija
 
9 - 18.04.18 - 23:31
Да, т.к. Кнопка находится на форме другого документа, вызывает команду, которая выполняется на клиенте. Я пробовал скопировать весь этот код в такую же процедуру на клиенте в расходный ордер, но возникли проблемы с вызовом функций, которые исполняются &НаСервере в модуле формы расходной накладной. Копировать все функции я не стал, т.к. подумал что это уже извращение, к которому можно прибегать только в безвыходной ситуации, должен быть способ по проще.
   Sam1C
 
10 - 18.04.18 - 23:53
(9) Так не получится, Модуль объекта где процедура проведения твоя,  выполняется на сервере. Это как сервак гугла должен у тебя в браузере выполнить какой либо клиентский код на jscript. Выполняя код на сервере забудь про клиента. В твоем случаи выход серверные методы, о которых ты пишешь в (9) перенести в  общий модуль! и в проведении обращаться к этому общему модулю, передовая объект туда для обработки
 
 Рекламное место пустует
   Sam1C
 
11 - 18.04.18 - 23:56
(10) Наверняка в процедуре модуля формы ПерезаполнитьПоОтгрузке()- обработка события, а основная логика заполнения происходит на сервере.
   Sam1C
 
12 - 19.04.18 - 00:06
(0) Более того на обычных формах это тоже не совсем удачное решение. Из модуля проведения вызывать методы формы... А если групповое проведение это какое будет ресурсоемкое решение. ПолучитьФорму это создается вся форма со всеми табличными полями, реквизитами формы и т.п.
Даже на обычных формах либо общий модуль, либо в модуле документа "Распоряжение"
   ketonija
 
13 - 19.04.18 - 00:50
(11) Основная логика заполнения происходит в процедуре, размещенной в модуле формы документа Реализация ТоваровИУслуг

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

А каждая процедура, что вызывается в конце функции
    ОбновитьОтклоненияОтЗаказа();
    ОбойтиТаблицуОбновитьЗависимыеРеквизиты();
    УстановитьВидимостьРеквизитовОплаты(ЭтаФорма);
    РассчитатьИтоговыеПоказателиРеализации(ЭтаФорма);
    РассчитатьСуммуПредоплаты(ЭтаФорма);
обращается к другим процедурам и функциям формы документа. В итоге чтоб сделать вроде бы элементарное действие, которое можно сделать в обычных формах 3-мя простыми строчками кода, нужно сидеть и лопатить весь код процедур и функций документа, чтоб слепить из него свой код, который будет выполняться на сервере?
   VladZ
 
14 - 19.04.18 - 06:26
(0) "А как этот процесс сделать в управляемых формах?" - вопрос неверный. В УФ код должен быть разнесен на "на сервере" и "на клиенте".  Т.е. в связи с новой идеологией  код нужно переписать.
   b_ru
 
15 - 19.04.18 - 06:30
Постановка задачи и общее проектирование системы - огонь.

Я бы в этой ситуации зашел с другой стороны. Пусть при проведении ордера ничего не происходит, зато при открытии распоряжения проверяется - проведен ли ордер, и если да, тогда выполняются действия по перезаполнению при отгрузке.
   МимохожийОднако
 
16 - 19.04.18 - 07:12
(7) Лень - двигатель прогресса. Но не в данном случае. Разберись как работает. Тогда копировать придётся на порядок вместе. Но мне не нравится сама задача. Не должно проведения или запись одного документа влиять на реквизиты другого. Это чревато.
   МимохожийОднако
 
17 - 19.04.18 - 07:13
*на порядок меньше
   DrZombi
 
18 - 19.04.18 - 07:26
(0) Проще переписать форму и вынести перерасчет в общий модуль, либо на крайняк в модуль объекта :)
   shuhard
 
19 - 19.04.18 - 07:48
(7)[не хотелось сидеть и ковыряться еще в десятке других процедур и функций и засорять расходный ордер лишним кодом.]
не хоти
   ketonija
 
20 - 19.04.18 - 09:31
(15) наверно это будем самый простой путь, т.к. пересчет конечно нужен не при каждом проведении ордера, а только в случае изменения его статуса на "к отгрузке"(я этот ньюанс изначально не писал чтоб не усложнять суть задачи). Поэтому если при смене статуса будет открываться форма распоряжения и выполняться пересчет, вполне нормально. Правда при очередной смене статуса ордера на "отгружен", нужно будет опять менять статус распоряжения на "реализовано" и проводить его в новом статусе. Выходит каждый раз надо открывать форму распоряжения.
   Любопытная
 
21 - 19.04.18 - 09:47
(20) зачем каждый раз открывать форму при смене статуса? Не проще ли при открытии формы узнавать статус и выполнять какие-то действия в зависимости от статуса?
З.Ы. Откуда вы берете слово "ньюанс"(
   ketonija
 
22 - 19.04.18 - 09:54
(21) открывать форму нужно т.к. если этого не сделать, ее никто не откроет и тот кто создавал распоряжение не узнает что оно изменится. Вкратце это нужно знать менеджеру, чтоб оповестить клиента о неполной отгрузке, в случае если кладовщик не может выполнить распоряжение в полном объеме.
   Любопытная
 
23 - 19.04.18 - 09:56
Что-то вы явно не с того угла за задачу взялись.
   Мигрень
 
24 - 19.04.18 - 12:57
Ньюанс - сложное слово, состоящие из двух частей. Нью - новый, анс- ансамбль. Под ансамблем здесь подразумеваются три сущности: менеджер, одинесник и собственно программа 1С.
   ketonija
 
25 - 21.04.18 - 14:40
Решил вопрос таким способом:

В форме документа РеализацияТоваровУслуг добавил реквизит Перезаполнять тип Булево и добавил код в процедуре

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Перезаполнять Тогда
    ПерезаполнитьПоОтгрузке("");
    Записать();
    Закрыть();
    КонецЕсли;
КонецПроцедуры;

В форме документа Расходный ордер вставил в процедуре 

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
П = Новый Структура;
П.Вставить("Ключ", Объект.Распоряжение);
Форма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", П);
Форма.Перезаполнять = Истина;
Форма.Открыть();
КонецПроцедуры;
   jsmith82
 
26 - 21.04.18 - 14:56
А помните была тема, что можно неэкспортные процедуры функции выполнять с клиента?


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