Имя: Пароль:
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-го - нужно элементы формы устанавливать.