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

Вопрос по азам . Общие модули

Автор andron81_81, 30 янв 2018, 12:57

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

andron81_81

Испытываю большие проблемы с теорией . Столкнулся с такой неприятностью.
Описываю:
1. Есть общий модуль Модуль1. В нем процедура серверная "тест_с" , а так же клиентовская "тест_к"
делаю их "экспорт"

2. Создал документ "документ1" . в нем пытаюсь в модуле формы в клиентовской процедуре (она является командой) сделал
Модуль1.тест_с();    , а потом
Модуль1.тест_к();

В результате отругивает:
"Переменная не определена (Модуль1)
   <<?>>Модуль1.Тест_с(); (Проверка: Тонкий клиент)

аналогичные сообщения с процедурой Тест_к

MuI_I_Ika

1. Почему у вас в одном общем модули расположены процедуры для разных контекстов?

2. У модуля стоит галочка Вызов сервера?

oleg-x

В свойствах модуля стоят  галки Клиент, Сервер?
У вас в модуле процедуры или функции?
Когда пишите ИмяМодуля процедура функция определяется через точку?
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

andron81_81

Цитата: MuI_I_Ika от 30 янв 2018, 13:10
1. Почему у вас в одном общем модули расположены процедуры для разных контекстов?

не знал, что это запрещено.
Цитата: MuI_I_Ika от 30 янв 2018, 13:10
2. У модуля стоит галочка Вызов сервера?

Супер , работает. Большое спасибо !  :zebzdr::zebzdr:

MuI_I_Ika

Цитата: andron81_81 от 30 янв 2018, 13:17не знал, что это запрещено.

Это не запрещено. Просто логика подсказывает, что их нужно разносить в разные модули.

andron81_81

Цитата: MuI_I_Ika от 30 янв 2018, 13:18Просто логика подсказывает

логика ли ? может всё-таки опыт ?


oleg-x

Цитата: andron81_81 от 30 янв 2018, 13:22
Цитата: MuI_I_Ika от 30 янв 2018, 13:18Просто логика подсказывает

логика ли ? может всё-таки опыт ?
Когда у тебя парочка процедур в общем модуле, это не проблема. А вот когда у тебя их сотни, то если процедура/функция не содержит названия клиент/сервер, то где она выполняется можно запутаться.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

MuI_I_Ika

На мой взгляд все намного проще. Когда модуль клиент/серверный, то все процедуры находящие в нем компилируются и на сервере и на клиенте. А если разработчик предполагает исполнение процедуры только в одном контексте, то такое размещение получается избыточным. Действительно, когда таких процедур 1-2, то это существенно не влияет на работоспособность программы, но когда таких процедур тысячи, то это лишний раз нагружает и клиента и сервера. В результате получаем медленно работающую программу, недовольных пользователей, ругающих медленную 1с. А казалось бы вопрос стоит просто в изначально "чистому" подходе к разработке программы.

andron81_81

А ещё тут конфликт возник :
в модуле формы есть команда

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


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


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

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

Возврат 1;

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




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

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


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

КонецЦикла;
КонецЕсли;

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

КонецЦикла;
КонецЕсли;

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


когда команда выполняется получаю вот так:
{Документ.БЗ_Заказ.Форма.ФормаДокумента.Форма(1103)}: Ошибка при установке значения атрибута контекста (Объект)
л =  БЗ_ОбщийМодуль_Расчеты.ПроцедураРасчетЛистов(Объект, ВыбраннаяДетальВФормеРасчетаЛистов);
по причине:
Нельзя изменять поле, содержащее объект данных формы
Нельзя изменять поле, содержащее объект данных формы

причем обратил внимание при помощи отладчика , что ошибка происходит на выходе из функции ПроцедураРасчетЛистов. То есть на строчке возврат 1


Добавлено: 30 янв 2018, 16:17


может так ?

Об=Объект ;
Тест = БЗ_ОбщийМодуль_Расчеты.ПроцедураРасчетЛистов(Об, ВыбраннаяДетальВФормеРасчетаЛистов);


оно работает, но может это не по феншую ?

Norfolk

У вас Объект является реквизитом формы. Делайте все расчеты на сервере, там объект переведите в значение и обратно, используя конструкцию РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы.

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

Рейтинг@Mail.ru

Поиск