Имя: Пароль:
1C
1С v8
Общий модуль на УФ Клиент и Сервер возможен?
,
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
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-го - нужно элементы формы устанавливать.