Имя: Пароль:
1C
1С v8
Почему с клиентской функции не вызывается серверная?
0 D_Pavel
 
30.03.12
07:45
&НаКлиенте
Функция Команда1() Экспорт
   Перем стрИмя, стрАдрес;
   стрАдрес = "";
   Если НЕ ПоместитьФайл(стрАдрес, "C:\Temp\tmp.epf", , Ложь) Тогда
       Возврат (Неопределено);
   КонецЕсли;
   стрИмя = ПодключитьВнешнююОбработку(стрАдрес);
КонецФункции

&НаСервере
Функция ПодключитьВнешнююОбработку(Знач стрАдрес)
   Возврат ВнешниеОбработки.Подключить(стрАдрес);
КонецФункции


Выдается ошибка:


{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(790,11)}: Процедура или функция с указанным именем не определена (ПодключитьВнешнююОбработку)
   стрИмя = <<?>>ПодключитьВнешнююОбработку(стрАдрес);
1 Omskdizel
 
30.03.12
07:50
Попробуй ее выше клиентской процедуры воткнуть.
2 Omskdizel
 
30.03.12
07:51
А кстати, в каком модуле у тебя этот код?
3 D_Pavel
 
30.03.12
07:56
В общем модуле. Галочки в свойствах стоят 4 штуки.
4 D_Pavel
 
30.03.12
07:57
Поменял местами, то же самое
5 D_Pavel
 
30.03.12
07:59
Управляемое приложение
6 Defender aka LINN
 
30.03.12
08:03
Разноси по разным модулям.
7 spock
 
30.03.12
08:05
и вновь продолжается бой..
8 D_Pavel
 
30.03.12
08:07
(6) разносил. Не работает. Метод не обнаружен пишет.
9 ShoGUN
 
30.03.12
08:09
Галка "вызов сервера" стоит в свойствах модуля?
10 vicof
 
30.03.12
08:11
(8) Экспорт писал?
11 D_Pavel
 
30.03.12
08:16
(9) Поставил, никакой разницы
(10) Писал:

&НаСервере
Функция ПодключитьВнешнююОбработку(Знач стрАдрес) Экспорт
   Сообщить("Золупа");
КонецФункции

&НаКлиенте
Функция Команда1()
   стрАдрес = "";
   УниверсальныеМеханизмы.ПодключитьВнешнююОбработку(стрАдрес);
КонецФункции

Ошибка: Метод объекта не обнаружен (ПодключитьВнешнююОбработку)
12 bake
 
30.03.12
08:19
&НаСервере
Функция ПодключитьВнешнююОбработку(Знач стрАдрес) Экспорт
   Сообщить("Золупа");
КонецФункции
В отдельный модуль с галками Сервер и Вызов с севрера
13 Stepa86
 
30.03.12
08:23
директивы компиляции работают только в модуле формы и в модуле команды (в СП написано, что и в общем модуле, но у меня ни разу нормально не получилось заюзать их и не вижу смысла их там использовать).

Если нужно разделить работу методов на клиентские и на серверные, то надо или юзать инструкции препроцессору или (что правильнее) разнести по разным модулям
14 D_Pavel
 
30.03.12
08:28
(13) Спасибо.
15 Ненавижу 1С
 
гуру
30.03.12
08:28
потому что архитекторы 1С такие
16 ll13
 
30.03.12
10:55
(13) Не ври.

(0) А ты читай документацию внимательно и вдумчиво.
Если у общего модуля стоят галки и "клиент" и "сервер", то будет скомпилировано 2(!) экземпляра этого модуля - один на стороне сервера, другой на стороне клиента.
- В серверный экземпляр попадут все процедуры и функции объявленные с директивой &НаСервере, а так же без дериктив(что равнозначно &НаСервере)
- В клиентский - те что объявлены &НаКлиенте.
Если при этом у модуля стоит галка "вызов сервера", то вызов процедур серверного модуля доступен с клиента.

При вызове процедуры, работает правило "ближнего вызова", т.е. если вызов идет с клиента то вызывается процедура из КЛИЕНТСКОГО экземпляра модуля, если с сервера - то СЕРВЕРНОГО.

Улавливаешь в чем твоя ошибка ?

&НаКлиенте
Функция Команда1() Экспорт
  .....
  стрИмя = ПодключитьВнешнююОбработку(стрАдрес);
КонецФункции

Это вызов функции из КЛИЕНТСКОГО экземпляра модуля(!), а её там нет ))
Потому что она объявлена с директивой &НаСервере и находится разумеется в СЕРВЕРНОМ экземпляре модуля.
17 Stepa86
 
30.03.12
11:04
(16) хде?
18 D_Pavel
 
30.03.12
11:05
(16) И что? Есть возможность вызвать серверный экземпляр модуля из клиентского экземпляра того же модуля?
19 D_Pavel
 
30.03.12
13:00
А? А то пришлось сделать копию общего модуля с другим именем.
20 ll13
 
30.03.12
14:20
(18, 19) Нет, нельзя.
Но ты можешь вызвать метод серверного модуля из формы
Пример:

// В общем клиент-серверном модуле с галкой вызов сервера
&НаСервере
Процедура Тест() Экспорт
   Сообщить("Это сервер");
КонецПроцедуры

&НаКлиенте
Процедура Тест() Экспорт
   Сообщить("Это клиент");
КонецПроцедуры

// Модуль формы

&НаКлиенте
Процедура Команда1(Команда)
   МодульКлиентСервер.Тест(); // КЛИЕНТСКИЙ ЭКЗЕМПЛЯР МОДУЛЯ
   ВызовСервера();    
КонецПроцедуры

&Насервере
Процедура ВызовСервера()
   МодульКлиентСервер.Тест(); // СЕРВЕРНЫЙ ЭКЗЕМПЛЯР МОДУЛЯ
КонецПроцедуры
21 D_Pavel
 
02.04.12
08:01
С формами понятно.
22 ll13
 
02.04.12
08:21
(16) + точнее процедура объявленная без директив &наклиенте или &насервере будет скомпилирована и тат и там
23 AlexNew
 
02.04.12
08:44
(0) А сервер то есть? Или ты пытаешься отладить на локальной?
24 vmv
 
02.04.12
08:45
чиать (16) - думать.

хватит переливать их пустого в порожнее, думал уже все поменяли психологию со времен корявой 7.7
25 D_Pavel
 
02.04.12
09:13
(23) Конечно есть. На локальном бы такой проблемы не возникало.
(24) это ты кому?
26 5 Элемент
 
02.04.12
10:26
(3) в общих модулях нельзя использовать директивы, учи матчасть студент
27 D_Pavel
 
02.04.12
12:52
(26) Проверка синтаксиса однако звисит от директив в общих модулях!
28 ll13
 
02.04.12
12:56
(26) Вот блин...
Ты это разработчикам типовых расскажи, и тем кто документацию пишет, а то они видимо не в курсе ...
29 5 Элемент
 
02.04.12
13:00
(28) где ты в типовых это видел?
30 ll13
 
02.04.12
13:05
(29) УТ 11
Закон Брукера: Даже маленькая практика стоит большой теории.