|
Общий модуль на УФ Клиент и Сервер возможен? | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
22.03.17
✎
03:34
|
Дорабатываю уже доработанную конфигурацию на УТ11.2 обнаружил добавленный общий модуль с галочками Клиент, Сервер и Внешнее соединение, на Вызов с сервера - птицы нет. Однако мои функции вызываемые из процедур &НаСервере выполнялись. Понадобилось мою функцию вызвать из процедуры &НаКлиенте - ошибку выкинуло, типа метод не обнаружен!? Переписал ее вызов &НаСервере (дополнительную функцию пришлось вставить) - заработало!
Хочу снять галку с Клиент, поставить Вызов с сервера, но опасаюсь как бы что-то у моего предшественника (создавшего этот общий модуль) не сломалось? |
|||
1
Web00001
22.03.17
✎
03:59
|
http://курсы-по-1с.рф/news/2017-03-09-how-server-call-works
Невозможно может быть почему? Открой типовую на УФ набери в поиске метаданных КлментСервер и удивись сколько общих модулей с такими свойствами. |
|||
2
Mikhail Volkov
22.03.17
✎
04:20
|
(1) Вызов из процедуры &НаКлиенте должен работать? Я что-то не так вызываю?
|
|||
3
Web00001
22.03.17
✎
04:46
|
||||
4
Mikhail Volkov
22.03.17
✎
05:03
|
(3) Этот пример написан &НаКлиенте?
Бегло смотрел функции общих модулей КлментСервер, все вызываются также из общих модулей. Примеров из вызовов из документов &НаКлиенте пока не нашел... Значит с общим модулем все нормально, только его процедуры нельзя вызывать из документов &НаКлиенте? |
|||
5
Web00001
22.03.17
✎
08:57
|
(4)Я красной линией тебе подчеркнул, что код выполняется на клиенте! Вызывать эти функции можно на клиенте. Вот тебе пример вызова этой функции на клиенте https://yadi.sk/d/uLvL7F9m3GEHN6
|
|||
6
aleks_default
22.03.17
✎
09:16
|
Не "Вызов с сервера" а "Вызов сервера", что как раз наоборот.
|
|||
7
Mikhail Volkov
22.03.17
✎
10:48
|
(4) Да, так оно. Кстати, в общем модуле СтроковыеФункцииКлиентСервер нет &НаКлиенте и &НаСервере. У меня вызаемая функция &НаСервере. Может из-за этого у меня ошибку выкинуло (0)?
Что-то с этим у меня пробел в 1С, не задумывался, пока в чужой модуль не влез (много доработок не планирую). (6) А галка "Вызов с сервера" для чего тогда? |
|||
8
aleks_default
22.03.17
✎
10:51
|
(7)Вот как ты программируешь, если читаешь даже с ошибками?
|
|||
9
Mikhail Volkov
22.03.17
✎
11:00
|
(8) Где ошибка?
|
|||
10
Вафель
22.03.17
✎
11:02
|
в клиентсерверном модуле нужно размещать процедуры, которые можно вызывать как на клиент, так и на сервере, а ля
х = а+б; |
|||
11
aleks_default
22.03.17
✎
11:02
|
Открой свойства общего модуля и перечитай заголовки у галок
|
|||
12
Aleksandr N
22.03.17
✎
11:04
|
(11) Скорее всего стоит галочка только на толстом клиенте.
|
|||
13
aleks_default
22.03.17
✎
11:06
|
ОбъектМетаданных: ОбщийМодуль (MetadataObject: CommonModule)
ВызовСервера (ServerCall) Использование: Только чтение. Описание: Тип: Булево. Если свойство установлено в значение Истина, то экспортные процедуры и функции модуля могут быть использованы на клиенте. Если свойство не установлены, то процедуры и функции данного модуля доступны только на сервере. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Может быть установлено только, если для общего модуля установлен признак "Сервер". |
|||
14
Aleksandr N
22.03.17
✎
11:12
|
(13) Там два клиента. Если конечно это не 8.1 и, прости господи, 8.0.
|
|||
15
Mikhail Volkov
22.03.17
✎
11:23
|
(11) Такие же как у СтроковыеФункцииКлиентСервер, в (0) написал.
(12) Такой вовсе нет!? (13) Ее надо ставить? В примере (3) ее нет!? (14) УФ 8.3.8.2197 |
|||
16
h-sp
22.03.17
✎
11:30
|
(15) вот эти штуки
&НаКлиенте и &НаСервере не ставь. Здесь это не нужно. |
|||
17
Mikhail Volkov
22.03.17
✎
12:12
|
(16) Убрал &НаСервере, стало ругаться:
Переменная не определена (Константы) Переменная не определена (Перечисления) |
|||
18
Feunoir
22.03.17
✎
12:15
|
(17) Конечно. "Константы" и "Перечисления" на тонком клиенте не существуют.
|
|||
19
h-sp
22.03.17
✎
12:29
|
(17) вот. Это уже правильное поведение. Работаешь на клиенте, значит не нужно туда совать Константы.
|
|||
20
Mikhail Volkov
22.03.17
✎
12:36
|
(18) В общих модулях КлиентСервер Константы, Перечисления и прочие, которые выполняются только &НаСервере не применяют?
|
|||
21
Feunoir
22.03.17
✎
12:47
|
Да. В общих модулях, у которых стоят галки Клиент и Сервер нельзя применять то, что доступно только в контексте только сервера (или только клиента). То есть теоретически оно может и проскользнуть, но работать нормально не будет точно.
|
|||
22
h-sp
22.03.17
✎
12:47
|
(20) нет, конечно. Здесь собраны процедуры, которые легко могут запуститься и на клиенте и на сервере. Все другие процедуры кладите в другое место.
|
|||
23
Mikhail Volkov
22.03.17
✎
12:56
|
(22) Да, в другое место. Не разобравшись сунул в чужой модуль.
|
|||
24
Мимохожий Однако
22.03.17
✎
12:59
|
Добавь свой модуль и в нём твори, выдумывай, пробуй
|
|||
25
Web00001
22.03.17
✎
16:56
|
(23)Сувать не разобравшись, всегда было плохой идеей.
|
|||
26
Mikhail Volkov
23.03.17
✎
08:30
|
(25) Да, плохая, всего-то одну функцию надо было добавить...
В 2010 когда начал осваивать УФ казалось это все условностями: клиентские, серверные модули. Но мне нравилось раскидывать свои функции по разным модулям, порядка больше... Ушел в АК, сел на Альфа-Авто, с УФ редко сталкиваюсь. Где почитать про все это: вроде какая разница откуда вызывать свою функцию? Ладно сейчас подомною вроде все работает. А под обычным пользователем (без полных прав) - нет: "Нарушение прав доступа!". Что в ней крамольного? &НаСервере Функция ИспользоватьПривязкуСкладовКВидуОрганизации(Форма, Проверка = Ложь, СкладПоОрганизации = Неопределено) Экспорт Документ = Форма.Объект; Если Не (ЗначениеЗаполнено(Документ.Организация) И Константы.ИспользоватьПривязкуСкладовКВидуОрганизации.Получить()) Тогда Возврат Истина; КонецЕсли; ВидОрганизации = Документ.Организация.ЮридическоеФизическоеЛицо; Если Документ.Организация.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо Тогда СкладПоОрганизации = Константы.СкладДляОрганизацийЮрЛиц.Получить(); НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС; Иначе СкладПоОрганизации = Константы.СкладДляОрганизацийФизЛиц.Получить(); НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС; КонецЕсли; Если Не ЗначениеЗаполнено(СкладПоОрганизации) Тогда Возврат Истина; КонецЕсли; Доступность = РольДоступна(Метаданные.Роли.ПолныеПрава); Если Документ.Склад = СкладПоОрганизации И Документ.НалогообложениеНДС = НалогообложениеНДС Тогда Если Форма.Элементы.Склад.Доступность Или Форма.Элементы.НалогообложениеНДС.Доступность Тогда Форма.Элементы.Склад.Доступность = Доступность; Форма.Элементы.НалогообложениеНДС.Доступность = Доступность; КонецЕсли; Возврат Истина; ИначеЕсли Проверка Тогда Возврат Ложь; КонецЕсли; Документ.Склад = СкладПоОрганизации; Документ.НалогообложениеНДС = НалогообложениеНДС; Форма.Элементы.Склад.Доступность = Доступность; Форма.Элементы.НалогообложениеНДС.Доступность = Доступность; Возврат Истина; КонецФункции |
|||
27
FIXXXL
23.03.17
✎
08:59
|
(26) в журнал смотри, на что прав не хватает
|
|||
28
Mikhail Volkov
23.03.17
✎
11:28
|
(27) В ЖР нет ничего
|
|||
29
FIXXXL
23.03.17
✎
11:29
|
(28) остановка по ошибке что говорит?
|
|||
30
Web00001
23.03.17
✎
11:46
|
(26)>>Да, плохая, всего-то одну функцию надо было добавить
Это был юмор, так между делом... >>Что в ней крамольного? Ты трогаешь объекты на которые у юзера нет прав доступа. Надо проверить все используемые объекты, что бы они были доступны пользователю в том контексте в котором трогаются(если объект пишется юзер должен иметь право его писать, если только читается, то должно быть право читать). Либо использовать УстановитьПривилегированныйРежим, либо функция должна быть в привилегированном модуле |
|||
31
Mikhail Volkov
23.03.17
✎
17:12
|
(30) Да, права забыл дать обычным пользователям на новые константы настроек.
Обычному пользователю дал полные права, чтобы открыть конфигуратор, поставил точку останова на вызове своей функции. Снял полные права, запустил отладчик, и дошел до чтения константы. Есть проще способ? |
|||
32
Вафель
23.03.17
✎
17:22
|
(31) дай права на чтение констант
|
|||
33
mikeA
23.03.17
✎
17:41
|
(31) Конфигуратор запускать под собой с полными правами. В конфигураторе в параметрах запуска указать пользователя, под которым будет запускаться предприятие.
Если я правильно понял проблему. |
|||
34
Mikhail Volkov
23.03.17
✎
17:44
|
(33) Спс
|
|||
35
Mikhail Volkov
25.03.17
✎
05:41
|
Напомню, тема возникла из-за того, что свою функцию (26) разместил в чужом общем модуле с галочками Клиент, Сервер и Внешнее соединение. Поэтому не мог ее вызывать из процедур &НаКлиенте форм документов. Приходилось в формах документов писать дополнительные функции &НаСервере.
Теперь, когда переделал - создал свой чисто серверный модуль хотел убрать эти дополнительные функции &НаСервере, вызывать свою функцию на прямую из процедур &НаКлиенте. Но при этом стала возникать такая ошибка: {Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(266)}: Ошибка при вызове метода контекста (ИспользоватьПривязкуСкладовКВидуОрганизации) Если Не мвДоработки.ИспользоватьПривязкуСкладовКВидуОрганизации(ЭтаФорма, Истина, СкладПоОрганизации) Тогда по причине: Ошибка при вызове серверного метода. по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: Запись значения свойства 'param': форма: Элемент имя: {http://v8.1c.ru/8.2/managed-application/modules}param по причине: Ошибка отображения типов: Отсутствует отображение для типа 'УправляемаяФорма' Как ее понимать, и исправить? |
|||
36
Мимохожий Однако
25.03.17
✎
07:09
|
Попробуй в 1 параметр своей функции передавать ссылку и уже из неё получать объект в переменную Документ. Или &НаКлиентеНаСервере попробуй
|
|||
37
bodri
25.03.17
✎
08:07
|
(35) с процедурины &НаКлиенте не надо вызывать процедурину серверного модуля
|
|||
38
Mikhail Volkov
25.03.17
✎
08:24
|
(36) Если &НаКлиентеНаСервере, то ошибка: Процедура или функция с указанным именем не определена
(37) Вернуть дополнительные промежуточные функции &НаСервере, на прямую никак? |
|||
39
bodri
25.03.17
✎
09:07
|
(38) Вернуть дополнительные промежуточные функции &НаСервере, на прямую никак?
Никак. |
|||
40
bodri
25.03.17
✎
09:10
|
(38) Если &НаКлиентеНаСервере, то ошибка: Процедура или функция с указанным именем не определена
Процедуры с директивой &НаКлиентеНаСервере живут на сервере и на клиенте и для них доступны модули с галками Клиент и Сервер, следовательно если модуль только серверный, то он не доступен т.к. он не даступен на клиенте |
|||
41
bodri
25.03.17
✎
09:17
|
Не сочтите за рекламу, недавно пришло на почту с курсов-по-1С:
http://курсы-по-1с.рф/news/2017-03-09-how-server-call-works/?utm_source=mailchimp&utm_campaign=articles-2017-03-09-server-call&utm_medium=email&utm_content=2017-03-09 |
|||
42
bodri
25.03.17
✎
09:18
|
к (41) [ Наглядно о непонятном ] - Как работает серверный вызов в 1С Источник: ©Курсы-по-1С.рф
|
|||
43
Мимохожий Однако
25.03.17
✎
10:31
|
(38) А что скажешь по поводу ссылки?
|
|||
44
Mikhail Volkov
25.03.17
✎
12:26
|
(43) Одной ссылки мало, форма нужна, что Доступность некоторых элементов формы закрыть. Хотя в данном случае форма не нужна, лишь проверяется соответствие установленного склада. Может для таких случаев еще упрощенную функцию написать? Все же проще, чем добавлять дополнительные промежуточные функции в формах документов.
|
|||
45
Mikhail Volkov
25.03.17
✎
14:41
|
(43) Дык, Объект.Ссылка примерно ту же ошибку (35) дает!?
|
|||
46
Mikhail Volkov
26.03.17
✎
06:31
|
+ (44) Не, не единственный случай, когда &НаКлиенте нужно вызывать мою функцию.
(40) Да, пришлось вернуть дополнительную промежуточную функцию &НаСервере в форме документа. Ее можно вынести в общий клиент-серверный модуль, если понадобится в других документах. И вообще не вижу смысла создавать общие раздельные клиентские и серверные модули!? |
|||
47
Мимохожий Однако
26.03.17
✎
08:27
|
(44) (45) Полагаю, что ошибка всё-таки из-за передаваемой формы в параметр, хотя в функции эти лишние данные не используются.
|
|||
48
Mikhail Volkov
26.03.17
✎
10:15
|
(47) В одном случае да, для проверки соответствия склада организации нужно передать только склад и организацию. В другом случае, когда пользователь разрешает поменять склад (отвечает на вопрос положительно) нужно не только склад поменять, еще доступ на изменение склада закрыть, т.е. элемент формы Склад.
|
|||
49
Мимохожий Однако
26.03.17
✎
12:00
|
(48) Лучше две аккуратных функции, чем одну мешанину.
|
|||
50
Mikhail Volkov
26.03.17
✎
17:37
|
(49) Для 1-го случая проверки написал отдельную функцию, а для 2-го - нужно элементы формы устанавливать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |