Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 19:51

Расчете на сервере с формы. Как вы передаёте реквизиты формы .

Автор andron81_81, 30 янв 2018, 20:36

0 Пользователей и 1 гость просматривают эту тему.

andron81_81

Добрый вечер.

в модуле формы есть команда , она выполняется при нажатии на кнопку . вот она :

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


ПроцедураРасчетЛистов это серверная функция , оформленная в общем модуле его код привожу :


&НаСервере
функция ПроцедураРасчетЛистов(Объект,ИДДетали)   экспорт

    Объем = ОпределитьЗначениеРеквизита(Объект,511, ИДДетали);
    Доля = ОпределитьЗначениеРеквизита(Объект,550, ИДДетали );
    Формат = ОпределитьЗначениеРеквизита(Объект,110,  );
    Скрепление = ОпределитьЗначениеРеквизита(Объект,127,  );

Возврат Объем*Доля;

КонецФункции




&НаСервере
Функция ОпределитьЗначениеРеквизита(Объект, КодРеквизита, ИДОбъекта)  экспорт

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

Если Пренадлежность="з" Тогда //если имеем дело с реквизитом заказа
    Для Каждого РеквизитыЗаказа Из Объект.РеквизитыЗаказа Цикл
        Если РеквизитыЗаказа.Код = КодРеквизита тогда
            Результат = РеквизитыЗаказа.Значение;
            Прервать;
        КонецЕсли;
   
КонецЦикла;
КонецЕсли;

Возврат Результат;
КонецФункции


Работает, но всё ли верно делаю ?
Один представитель клуба советовал все вычисления делать на серваке . самое интересное , что был совет использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в данном случае  наверно в серверной "ОпределитьЗначениеРеквизита". Подозреваю, что это правильно !
Но могу ли я использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в модуле ?
ругается

Цитировать
{ОбщийМодуль.БЗ_ОбщийМодуль_Расчеты.Модуль(3,6)}: Процедура или функция с указанным именем не определена (РеквизитФормыВЗначение)
Об = <<?>>РеквизитФормыВЗначение(Объект); (Проверка: Сервер)
наверно потому что в описании функции стоит "УправляемаяФорма" .
Как быть?




andron81_81

ну есть у кого какие мнения ? есть энтузиасты подсказать ?

Norfolk

Я имел ввиду, когда вы делаете вычисления в модуле формы объекта, то все вычисления делайте на сервере, то есть в процедурах с директивой компиляции &НаСервере:

&НаКлиенте
Процедура А(Команда)
    ВычисленияНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВычисленияНаСервере()
    Об = РеквизитФормыВЗначение("Объект");
    //делаете какие либо вычисления в общем модуле, например
    ОбщийМодуль.СделатьРасчеты(Об);
    ЗначениеВРеквизитФормы(Об, "Объект");
КонецПроцедуры


Похожие темы (5)

Рейтинг@Mail.ru

Поиск