8.3 Массив

  1. 9 г. назад

    Исходные данные:
    - Платформа 8.3
    - Управляемое приложение
    - Тонкий клиент
    - Файловый

    - Есть внешняя обработка, в которой в "Процедуре1" (которая вызывается по "Кнопке 1") на сервере формируется некий массив,
    а в "Процедуре2" (которая вызывается по "Кнопке 2") на сервере этот массив должен обрабатываться.

    Вопрос:
    - Как передать на сервере массив из Процедуры1 в Процедуру2 ?

    Ответы: (2) (48) (55)
  2. вызовы: Клиент-Сервер-сервер

    Ответы: (3)
  3. (0) не помню, но массив запросто можно передать

  4. (1) т.е. каждый раз, когда мне потребуется этот массив вызывать Процедуру1? А его никак на сервере нельзя хранить?

    Ответы: (4) (9)
  5. (3) добавь его как реквизит формы и обращайся к нему в любой процедуре, хоть на клиенте хоть на серве

    Ответы: (5)
  6. (4) а вот хрен

    Ошибка "Тип "Массив" не может использоваться в данных формы"

    Ответы: (8)
  7. &НаСервере
    Процедура Кнопка1НаСервере()
    Объект.А = Новый Массив;
    КонецПроцедуры

    &НаСервере
    Процедура Кнопка2НаСервере()
    Сообщить(ТипЗнч(Объект.А));
    КонецПроцедуры

    Вот этот код выдает ошибку

  8. а если в реквизит обработки запихнуть?

    Ответы: (19)
  9. (5)ну в списке знач знач храни

  10. (3) Можно хранить во временном хранилище

  11. ещё можно объявить переменную в модуле, и использовать её в нескольких процедурах одновременно

    Ответы: (11) (19)
  12. (10) ага. и менять на ходу тип значения переменной, в лучших традициях разработчиков типовых

  13. + объявление переменной в модуле будет доступно только на серве

    Ответы: (13)
  14. (12) так ему и надо НаСервере

    Ответы: (14)
  15. (13) а зачем тогда вызывать все это безобразие из клиента? чтобы погонять сервер, создавая никому не нужный массив?)

    Ответы: (15) (19)
  16. Stim а зачем тогда вызывать все это безобразие из клиента?

    а ты знаешь, как отработать нажатие кнопки на сервере?

    Ответы: (16)
  17. (15) да не про то. нажатие кнопки пользователем - предполагает какое-то действие в ответ на клиенте. а тут - глушняк. все равно, что ты в авто жмешь газ, мотор ревет, а машина как ехала, так и едет. кому такое надо?)

    Ответы: (17)
  18. (16) ну, это ты у автора спрашивай. я лишь помогаю мусье разобраться в извращениях

    Ответы: (18)
  19. (17) автору нужно клиентский массив обработать на сервере и вернуть обратно, либо хранить как-то, чтобы всегда иметь к нему доступ

    Ответы: (20)
  20. (7) Объект.А - это и есть реквизит обработки (не формы)
    (10) "ещё можно объявить переменную в модуле, и использовать её в нескольких процедурах одновременно" - может я чегото не догоняю, но если в одной серверной процедуре сформировать массив то в другой сервеной процедуре его не видно, несмотря на объявление переменной вначале модуля
    (14) "а зачем тогда вызывать все это безобразие из клиента? чтобы погонять сервер, создавая никому не нужный массив?)" - в примере только одна строка, в реале много строк и их можно получить только на сервере

    Ответы: (21)
  21. (18) с чего это массив клиентский, если формируется на сервере?

  22. work но если в одной серверной процедуре сформировать массив то в другой сервеной процедуре его не видно

    да ну? не верю

    Ответы: (22) (24)
  23. (21) щас ещё раз проверю, и приведу код

    Ответы: (23)
  24. (22) ага, давай, проверяй

  25. (21) не будет, если не объявить массив на уровне модуля)

    Ответы: (26)
  26. 25.07.2014 15:42:33 отредактировано work

    Вот код (вариант с переменной модуля)

    Перем а;

    &НаКлиенте
    Процедура Кнопка1(Команда)
    Кнопка1НаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура Кнопка1НаСервере()
    а = Новый Массив;
    КонецПроцедуры

    &НаКлиенте
    Процедура Кнопка2(Команда)
    Кнопка2НаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура Кнопка2НаСервере()
    Сообщить(ТипЗнч(А));
    КонецПроцедуры

    По кнопке 2 выдает "Неопределено"

    Ответы: (27)
  27. (24) я же так и написал, что надо объявить

  28. (25)

    &НаСервере
    Перем а;

    Ответы: (29) (33)
  29. а хз

  30. (27) не поможет

    Ответы: (30)
  31. (29) поспорим?

    Ответы: (31)
  32. (30) давай)

  33. мой код:

    &НаСервере
    перем А экспорт;
    
    
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    	А = "2"
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    	а()
    КонецПроцедуры
    
    процедура а()
    	
    конецПроцедуры
    
    
    	

    отладчик не показывает, что в а() перем А = 2

  34. 25.07.2014 15:55:42 отредактировано work

    (27)
    &НаСервере
    Перем а;

    к сожалению не работает

    Ответы: (34)
  35. (33) ошибся, конечно, на клиенте надо хранить

  36. примерно так:

    &НаКлиенте
    Перем А;
    
    &НаСервере
    Функция ПолучитьМассив()
    	Мас = Новый Массив;
    	Мас.Добавить(100);
    	Мас.Добавить(200);
    	Возврат Мас;
    КонецФункции
    
    &НаКлиенте
    Процедура ВывестиПерем(ЗнПер)
    	Сообщить("Перем = " + ЗнПер);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Команда1(Команда)
    	ВывестиПерем(А);
    	А = ПолучитьМассив();
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Команда2(Команда)
    	ВывестиПерем(А);
    КонецПроцедуры
    
    
    Ответы: (36)
  37. (35) это не то, что нужно автору

  38. ему нужно клиент - сервер-сервер, а у тебя клиент-сервер-клиент

    Ответы: (38) (43)
  39. (37) ему нужно заполнить массив на сервере, а потом обработать его на сервере. в моём примере это всё реализуется, и неважно, что в промежутке массив хранится на клиенте

    Ответы: (39) (43)
  40. (38) извини, а где у тебя массив обрабатывается на сервере?

    Ответы: (42)
  41. у тебя только одна серверная процедура ведь

  42. вернее функция

  43. (39) ну, передай массив в серверную функцию и обрабатывай, в чём проблема?

    Ответы: (44)
  44. andrewks (37) ему нужно заполнить массив на сервере, а потом обработать его на сервере. в моём примере это всё реализуется, и неважно, что в промежутке массив хранится на клиенте

    не вижу в твоем коде две серверные процедуры

  45. (42) ему нужно массив передать с сервера на сервер

    Ответы: (46)
  46. блин, чё такие занудные-то? мне ещё и код за вас писать? :)

    я концепцию показал

  47. (44) передастся

    Ответы: (47)
  48. (46) шас попробую

  49. (0) Надо использовать общий модуль с галочкой "Повторное использование возвращаемых значений"

    Ответы: (49)
  50. (48) К сожалению, в данном случае нет возможности ковырять саму конфу, хотя за идею спасибо

  51. Еще можешь свой массив в менеджер временных таблиц запихнуть

    Ответы: (52)
  52. 25.07.2014 16:48:36 отредактировано work

    Господа Стимыч и Эндрю, большое спасибо за помощь. Благодаря вам есть рабочее решение. Окончательный код (примера) такой (если кому интересно):

    &НаКлиенте
    Перем а;
    
    &НаКлиенте
    Процедура Кнопка1(Команда)
    	а = Кнопка1НаСервере();
    КонецПроцедуры
    &НаСервере
    Функция Кнопка1НаСервере()
    	Возврат Новый Массив;
    КонецФункции
    
    &НаКлиенте
    Процедура Кнопка2(Команда)
    	Кнопка2НаСервере(а);
    КонецПроцедуры
    &НаСервере
    Процедура Кнопка2НаСервере(а)
    	Сообщить(ТипЗнч(а)); 
    КонецПроцедуры
    

    Выдает "Массив", что и требовалось. Ещё раз спасибо.

  53. (50) с менеджером временных таблиц можно только через запрос работать?

  54. Ага. Но запросы - это же прикольно

  55. а можно же запустить фоновое задание и передать ему параметр для обработки и потом вернуть в родительский сеанс то что надо

    Ответы: (56) (58)
  56. (0) Постановка задачи не полная. Так как мы разделили клиента и сервера, то надо уточнить следующее
    1. Один клиент жмет кнопку 1, второй клиент с другого компа жмет кнопку 2, должен ли у второго клиента использоваться массив 1 клиента или для каждого клиента на сервере свой массив?
    Если массив общий, то следующий вопрос.
    2. Один клиент жмет кнопку 1, второй клиент жмет то же почти одновременно кнопку 1, как будет блокироваться массив?
    Если массив раздельный в каждой сессии клиента, то
    2. Клиент нажал кнопку 1, делается массив, потом выключает комп и уходит спать. Должен ли этот массив использоваться в его новой сессии по кнопке 2, как он проснется и загрузит 1с? Если он загружает две сессии под одним пользователем, должен ли в этом случае массив формироваться изолированно для каждой сессии, или общий для пользователя. Если общий, то опять вопрос блоктровки между сессиями одного пользователя.

    Ответы: (58)
  57. (54) за использование этих фоновых заданий нужно рубить руки по самое плечо..
    эту хрень толком ни проверить, ни отладить..

  58. Еще через временное хранилище можно твой массив передать...

    Ответы: (58)
  59. 28.07.2014 17:01:11 отредактировано work

    (54) да тут всё проще, нет смысла фоновым заданием заморачиваться

    (55) Пользователь один, у него в обработке две кнопки, нажав одну, помимо всего прочего формируется массив, нажав другую, с этим массивом чтото делается.

    Твое замечание верное, в следующий раз буду внимательней при описании проблемы.

    (57) добавил в копилку хитростей, спб

или зарегистрируйтесь чтобы ответить!