1с как передать переменную с клиента на сервер
Гуууу! Сколько уже вожусь и никак не получается. перерыл везде, где мог и ничего не нашел, как сделать следующее:Допустим есть справочник: "ОБЪЕКТ". И нужно, что бы из формы этого справочника по указанному адресу был найден указанный код реквизита на сервере, но в другом справочнике, на пример в списке справочника "ТОЧКА". Для чего есть команда: "НайтиПоКоду". И вроде бы с этим все получилось по вот такой схеме:
Сразу скажу, что с 1С подружился совсем недавно, и поэтому обращаюсь за помощьКак видно из выше указанного кода. "ТекстКода" задан на клиенте и передан на сервер.И система вроде нормально реагирует и находит. Но как только сам адрес поиска: "Справочники.ТОЧКА" указываешь на клиенте. На пример так:
тут еще надо обработать и вывести возвращенное значение:
Спасибо за ответ!
Разумное и логичное решение!
И даже смешно то, что я сам не догадался что можно и так сделать. Легко и просто.
Процедура Тест_Пойск(Команда) ТекстКода="000000001"; текзначение=ПолучитьКод("СпрТочки", ТекстКода); сообщить(текзначение); КонецПроцедуры [/pre]
&НаСервере Функция ПолучитьКод(Путь, ТекстПойска) Если Путь="СпрТочки" Тогда ПутьСпр = Справочники.ТОЧКА; Возврат ПутьСпр.НайтиПоКоду(ТекстПойска); Иначе Возврат неопределено; конецесли; //Сообщить(Строка.Наименование); КонецФункции [/pre]
Только к сожалению этого мало.
Дело в том, что в таким путем будет работать, но это все равно не удовлетворяет цель. которая в следующем:
Создать функцию для сервера с параметром адреса указанного на Клиенте.
В противно случае функция и не нужна. Она и нужна для того, что бы для каждого случая не писать ее отдельно.
Т.е. суть вопроса в том, что бы код функции оставался неизменным. И что бы ее было в ней прописано то, что она должна сделать.
А все необходимые параметры, что бы можно было задавать на клиенте.
К сожалению данный вариант годиться для индивидуального случая. Т.е. когда адрес поиска: Справочники.ТОЧКА;
А если другой адрес? Тогда его опять нужно указывать на сервере.
Вообще, нельзя ли сделать так, что бы на клиенте можно было указать любой адрес поиска.
И это для параметра одной и той же общей функции на сервере. Просто передать ЛЮБОЙ адрес. Который может меняться.
Вот в чем вопрос!
Опять буду очень признателен за ответ и за помощь!
Я уже сам поспрашивал и разобрался:
Просто не знал, что есть одна очень полезная команда: "выполнить". В которую можно вогнать все что угодно.
Теперь все уже будет выглядеть вот так:
&НаКлиенте
Процедура Тест_Пойск(Команда)
ТекстКода="000000001";
АдреСпр ="Справочники.ТОЧКА";
ТекЗначение=ПолучитьКод(АдреСпр, ТекстКода);
сообщить(ТекЗначение);
КонецПроцедуры
Vofka @ 19.06.18, 16:57 ,
а как передать всю строку
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". ed.kharkov --> ed.kharkov
Petre @ Сегодня, 15:25 ,
ТекущиеДанные недоступны на сервере.
На сервере можно получить так:
lolmatrix --> lolmatrixed.kharkov @ Сегодня, 15:38 ,
ed.kharkov @ Сегодня, 15:38 ,
теперь вопрос цена попала в оттладчике она есть, но на форме не отразилась
lolmatrix @ Сегодня, 15:55 ,
огромное спасибо, за помощь вопрос решен ответом Ed. kharkov
НаСервере
Процедура СписокЗЧНаименованиеПриИзмененииНаСервере()
СтрокаТЧ = Объект.СписокЗЧ[Элементы.СписокЗЧ.ТекущаяСтрока];
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Реализовано в версии 8.3.11.2867.
Во время длительной серверной операции пользователь всегда хочет видеть на клиенте ход её выполнения. Для того чтобы оценить, сколько времени осталось до её завершения, или насколько быстро она выполняется. Чтобы это реализовать, необходимо каким-то образом передавать информацию с сервера на клиента. Но и раньше, и сейчас взаимодействие между клиентской и серверной частью 1С:Предприятия происходит только по инициативе клиента. Сервер 1С:Предприятия сам, по своему желанию, не может вызвать какое-либо клиентское приложение и передать ему информацию.
Основные возможности и сценарии
В клиентское приложение вы можете передавать данные, имеющие XDTO-сериализацию. Естественно типы передаваемых данных должны быть доступны на клиенте. Вы можете использовать передачу информации с сервера в клиентское приложение в самых разных сценариях. Например:
- Для отображения прогресса длительной серверной операции;
- Для уведомления пользователей о перезагрузке сервера и принудительного завершения клиентских приложений;
- Для уведомления пользователя о входящем SIP-звонке;
- Для поддержки прохождения бизнес-процессов;
- Для реализации «напоминалок», уведомлений и пр.
Пример использования
Проще всего объяснить новый механизм на конкретном примере, когда длительная операция, выполняемая на сервере, состоит из нескольких этапов. По мере выполнения очередного этапа вы хотите извещать клиентское приложение об этом. Чтобы клиентское приложение некоторым образом показывало пользователю ход выполнения этой операции.
Но если ваша задача состоит в том, чтобы информацию с сервера передавать именно тому приложению, которое инициировало длительную серверную операцию, то в этом случае лучше создать несколько служебных обсуждений, для каждого пользователя своё.
Если же в обсуждении участвует один пользователь, то будет задействовано одно соединение с его клиентским приложением.
Правды ради нужно сказать, что от имени одного пользователя может быть запущено несколько приложений. Но сути дела это не меняет. Если информацию с сервера нужно передать в то приложение, которое инициировало серверную операцию, эффективнее использовать отдельные служебные обсуждения для каждого пользователя, чем «пулять» по всем клиентам в одном общем служебном обсуждении. В этом случае ресурсы сервера взаимодействия будут использоваться бережнее, а нагрузка на него будет меньше.
Итак, для каждого пользователя нужно создать своё служебное обсуждение. Это можно представить следующей схемой:
Приятным моментом является то, что сделать это нужно всего лишь один раз. Удобнее всего это делать в том месте прикладного решения, в котором создаются новые пользователи. Для идентификации обсуждения можно использовать новое свойство Ключ.
Ещё одно новое свойство обсуждения будет вам полезно – Отображаемое. Для служебных обсуждений его лучше устанавливать в Ложь, тогда они не будут показаны в пользовательском интерфейсе.
В настоящее время в Библиотеке стандартных подсистем (БСП) реализован механизм выполнения длительных операций на сервере, который использует фоновые задания. Это позволяет распараллелить исполнение прикладного кода на сервере и освободить пользовательский сеанс.
В этом примере необходимо использовать ту же самую механику.
Запуск фонового задания может выглядеть таким образом:
А длительная операция, выполняемая на сервере, может выглядеть так:
Сначала вы определяете, «ваше» ли это фоновое задание (его идентификатор сохранён в глобальном массиве), затем смотрите, как нужно обработать переданное значение. В одном случае, для примера, вы передвигаете индикатор, а в другом удаляете идентификатор из массива отслеживаемых заданий, потому что задание завершилось.
Заключение
Как вы видите механизм довольно гибкий. И это позволяет использовать его для самых разных задач. Приведённый пример это лишь один из сценариев, как говорится, «в лоб».
Существуют и другие, более изощрённые сценарии. Например, когда длительная операция (загрузка данных) инициируется одним из пользователей, а известить о ходе её выполнения нужно группу пользователей, которые с этими данными работают.
Другая область задач связана с тем, что информация не просто доставляется в клиентское приложение, а сервер некоторым образом «отдаёт команды» приложениям, заставляя их выполнить те или иные действия. Например, обновить итоговые данные, отображаемые в отдельном окне, или схему выполнения некоторого глобального прикладного процесса. Или корректно завершить работу клиентского приложения, если администратору системы нужно перезагрузить сервер, а пользователя нет на рабочем месте.
Поэтому после выпуска этого функционала мы с интересом познакомимся с примерами его реального использования и будем готовы рассматривать и обсуждать ваши пожелания и замечания к этому механизму.
1С 8.3 Передача Таблицы Значений с сервера на клиент
Процедура ПередатьТаблицуЗначенийНаКлиент ( Элемент ) Экспорт
ОбщегоНазначения . ТаблицаЗначенийВМассив ( ТаблицаЗначений );
Пример 2. Передать ТЗ на клиент с сервера (через Временное хранилище) в 1С 8.3:Процедура ПередатьТаблицуЗначенийНаКлиент ( ТаблицаЗначений ) Экспорт
АдресХранилищаСТЗ = ПоместитьВоВременноеХранилище ( ТаблицаЗначений , ЭтаФорма . УникальныйИдентификатор );
ПереносТЗ = ПолучитьИзВременногоХранилища ( АдресХранилищаСТЗ );
&НаКлиенте
Процедура ПолучитьТаблицуНаСервере ( Команда )
ТЗ_Стр = ПолучитьТЗНаСервере (); // Получаем данные на сервере
ТаблицаЗначений = ЗначениеИзСтрокиВнутр ( ТЗ_Стр );
&НаСервере
Функция ПолучитьТЗНаСервере ( ТЗ )
Возврат ЗначениеВСтрокуВнутр ( ТЗ );
Пример 4. Передать ТЗ на клиент с сервера (через реквизит формы в 1С 8.3:&НаСервере
Функция ПередатьТаблицуЗначенийНаКлиент ( ОбъектСсылка , ИмяТабличнойЧасти )
ОбъектЗначение = ОбъектСсылка . ПолучитьОбъект ();
ОбъектТЧ = ОбъектЗначение [ ИмяТабличнойЧасти ]. Выгрузить ();
МассивРеквизитов = Новый Массив ;
МассивСтарыхРеквизитов = Новый Массив ;
МассивКолонок = Новый Массив ;
ИдКоллекции = "РеквизитФормыТЗ" ; // Реквизит формы с типом Табл.Значений
ТаблицаФормы = РеквизитФормыВЗначение ( ИдКоллекции );
Для Каждого Колонка Из ТаблицаФормы . Колонки Цикл
МассивСтарыхРеквизитов . Добавить ( ИдКоллекции + "." + Колонка . Имя );
КонецЦикла;
Для Каждого Колонка Из ОбъектТЧ . Колонки Цикл
МассивРеквизитов . Добавить ( Новый РеквизитФормы ( Колонка . Имя , Колонка . ТипЗначения , ИдКоллекции ));
МассивКолонок . Добавить ( Колонка . Имя );
КонецЦикла;
// Добвляем новые и удаляем старые колонки
ЭтаФорма . ИзменитьРеквизиты ( МассивРеквизитов , МассивСтарыхРеквизитов );
// Помещаем значение в реквизит формы
ЗначениеВРеквизитФормы ( ОбъектТЧ , ИдКоллекции );
// Преобразуем ТаблицуЗначений в Массив из структур.
Функция ПреобразоватьТЗвМассив ( ТЗ ) Экспорт
МассивТЗ = Новый Массив ;
Для Каждого СтрокаТЗ Из ТЗ Цикл
СтруктураТЗ = Новый Структура ;
Для Каждого ИмяКолонки Из ТЗ . Колонки Цикл
СтруктураТЗ . Вставить ( ИмяКолонки . Имя , СтрокаТЗ [ ИмяКолонки . Имя ]);
КонецЦикла;
МассивТЗ . Добавить ( СтруктураТЗ );
// Преобразуем Массив из структур в ТаблицуЗначений
Функция ПреобразоватьМассивВТЗ ( МассивТЗ ) Экспорт
ТЗ = Новый ТаблицаЗначений ;
Для Каждого ЭлементМассива Из МассивТЗ Цикл
// Колонки для таблицы значений
Если ТЗ . Колонки . Количество () = 0 Тогда
Для Каждого ЗнМассив Из ЭлементМассива Цикл
ТЗ . Колонки . Добавить ( ЗнМассив . Ключ );
КонецЦикла;
КонецЕсли;
// Заполняем таблицу значений данными
НоваяСтрока = ТЗ . Добавить ();
Для Каждого ЗнМассив Из ЭлементМассива Цикл
НоваяСтрока [ ЗнМассив . Ключ ] = ЗнМассив . Значение ;
КонецЦикла;
КонецЦикла;
Читайте также: