1с как передать результат запроса с сервера на клиент 1с

Обновлено: 05.07.2024

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в версии 8.3.11.2867.

Во время длительной серверной операции пользователь всегда хочет видеть на клиенте ход её выполнения. Для того чтобы оценить, сколько времени осталось до её завершения, или насколько быстро она выполняется. Чтобы это реализовать, необходимо каким-то образом передавать информацию с сервера на клиента. Но и раньше, и сейчас взаимодействие между клиентской и серверной частью 1С:Предприятия происходит только по инициативе клиента. Сервер 1С:Предприятия сам, по своему желанию, не может вызвать какое-либо клиентское приложение и передать ему информацию.

Основные возможности и сценарии

В клиентское приложение вы можете передавать данные, имеющие XDTO-сериализацию. Естественно типы передаваемых данных должны быть доступны на клиенте. Вы можете использовать передачу информации с сервера в клиентское приложение в самых разных сценариях. Например:

  • Для отображения прогресса длительной серверной операции;
  • Для уведомления пользователей о перезагрузке сервера и принудительного завершения клиентских приложений;
  • Для уведомления пользователя о входящем SIP-звонке;
  • Для поддержки прохождения бизнес-процессов;
  • Для реализации «напоминалок», уведомлений и пр.

Пример использования

Проще всего объяснить новый механизм на конкретном примере, когда длительная операция, выполняемая на сервере, состоит из нескольких этапов. По мере выполнения очередного этапа вы хотите извещать клиентское приложение об этом. Чтобы клиентское приложение некоторым образом показывало пользователю ход выполнения этой операции.

Но если ваша задача состоит в том, чтобы информацию с сервера передавать именно тому приложению, которое инициировало длительную серверную операцию, то в этом случае лучше создать несколько служебных обсуждений, для каждого пользователя своё.

5.jpg

Если же в обсуждении участвует один пользователь, то будет задействовано одно соединение с его клиентским приложением.

6.jpg

Правды ради нужно сказать, что от имени одного пользователя может быть запущено несколько приложений. Но сути дела это не меняет. Если информацию с сервера нужно передать в то приложение, которое инициировало серверную операцию, эффективнее использовать отдельные служебные обсуждения для каждого пользователя, чем «пулять» по всем клиентам в одном общем служебном обсуждении. В этом случае ресурсы сервера взаимодействия будут использоваться бережнее, а нагрузка на него будет меньше.

Итак, для каждого пользователя нужно создать своё служебное обсуждение. Это можно представить следующей схемой:

1.jpg

Приятным моментом является то, что сделать это нужно всего лишь один раз. Удобнее всего это делать в том месте прикладного решения, в котором создаются новые пользователи. Для идентификации обсуждения можно использовать новое свойство Ключ.

Ещё одно новое свойство обсуждения будет вам полезно – Отображаемое. Для служебных обсуждений его лучше устанавливать в Ложь, тогда они не будут показаны в пользовательском интерфейсе.

В настоящее время в Библиотеке стандартных подсистем (БСП) реализован механизм выполнения длительных операций на сервере, который использует фоновые задания. Это позволяет распараллелить исполнение прикладного кода на сервере и освободить пользовательский сеанс.

В этом примере необходимо использовать ту же самую механику.

2.jpg

4.jpg

Запуск фонового задания может выглядеть таким образом:

А длительная операция, выполняемая на сервере, может выглядеть так:

Сначала вы определяете, «ваше» ли это фоновое задание (его идентификатор сохранён в глобальном массиве), затем смотрите, как нужно обработать переданное значение. В одном случае, для примера, вы передвигаете индикатор, а в другом удаляете идентификатор из массива отслеживаемых заданий, потому что задание завершилось.

Заключение

Как вы видите механизм довольно гибкий. И это позволяет использовать его для самых разных задач. Приведённый пример это лишь один из сценариев, как говорится, «в лоб».

Существуют и другие, более изощрённые сценарии. Например, когда длительная операция (загрузка данных) инициируется одним из пользователей, а известить о ходе её выполнения нужно группу пользователей, которые с этими данными работают.

Другая область задач связана с тем, что информация не просто доставляется в клиентское приложение, а сервер некоторым образом «отдаёт команды» приложениям, заставляя их выполнить те или иные действия. Например, обновить итоговые данные, отображаемые в отдельном окне, или схему выполнения некоторого глобального прикладного процесса. Или корректно завершить работу клиентского приложения, если администратору системы нужно перезагрузить сервер, а пользователя нет на рабочем месте.

Поэтому после выпуска этого функционала мы с интересом познакомимся с примерами его реального использования и будем готовы рассматривать и обсуждать ваши пожелания и замечания к этому механизму.


Сначала файл помещается во временное хранилище и получается его адрес. Адрес передается на сервер. На сервере файл получается из временного хранилища и записывается на диск компьютера сервера:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПутьКФайлу ) ; Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт Расширение = ОписаниеПомещенногоФайла . СсылкаНаФайл . Файл . Расширение ;

Первый параметр процедуры из описания оповещения имеет тип ОписаниеПомещенногоФайла. Данный объект имеет 3 свойства:

В результате через параметр Адрес можно получить файл из временного хранилища. А через параметр СсылкаНаФайл.Файл можно получить всю необходимую информацию о файле.

По умолчанию файл будет удален из временного хранилища после окончания серверного вызова. Однако, если последним параметром указать уникальный идентификатор формы, то файл будет удален только после закрытия этой формы:

НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПутьКФайлу , УникальныйИдентификатор ) ;

Если до помещения файла в хранилище известен адрес во временном хранилище, куда нужно поместить файл, то его можно указать четвертым параметром:

НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , Адрес , ПутьКФайлу ) ;

Проверка файла до помещения во временное хранилище

Если до помещения файла во временное хранилище нужно выполнить какие-то проверки, то это можно сделать в специальной процедуре, выполняемой до помещения файла во временное хранилище. Имя этой процедуры нужно указать в описании оповещения, которое указывается третьим параметром в методе НачатьПомещениеФайлаНаСервер:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ПередПомещением = Новый ОписаниеОповещения ( "ПередПомещением" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , ПередПомещением , , ПутьКФайлу ) ;

У данной процедуры должно быть 3 параметра:

Например, можно проверить размер файла и если он слишком большой, то отказаться от помещения во временное хранилище:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ПередПомещением = Новый ОписаниеОповещения ( "ПередПомещением" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , ПередПомещением , , ПутьКФайлу ) ; Процедура ПередПомещением ( ПомещаемыйФайл , ОтказОтПомещенияФайла , ДопПараметры ) Экспорт

Помещение файла во временное хранилище с диалогом выбора

Можно предоставить пользователю самому выбрать файл, который нужно поместить во временное хранилище. В этом случае сначала будет открыт диалог выбора файла, пользователь выберет файл и данный файл будет помещен во временное хранилище.

Для открытия диалога выбора файла нужно пятым параметром вместо пути к файлу указать объект ПараметрыДиалогаПомещенияФайлов. Данный объект схож с объектом ДиалогВыбораФайла, но имеет только 4 свойства:

  • Заголовок
  • МножественныйВыбор
  • Фильтр
  • ИндексФильтра
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов ; ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПараметрыДиалога ) ; Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт

В этом случае сначала будет открыто диалоговое окно для выбора файла:


Выбранный файл будет помещен во временное хранилище.

Если пользователь нажмет на кнопку Отмена и откажется от выбора файла, то первый параметр в процедуре, вызываемой после помещения файла во временное хранилище будет равен Неопределено.

Если использовалась процедура, вызываемая до помещения файла во временное хранилище, то она будет вызвана после того как пользователь выберет файл.

Можно вообще не указывать объект ПараметрыДиалогаПомещенияФайлов, в этом случае все равно будет открыт диалог выбора файла:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ;

Прогресс помещения файла во временное хранилище

Если файл большой, то он может долго загружаться во временное хранилище. В этом случае неплохо было бы показать пользователя прогресс помещения файла во временное хранилище. Для этого в метод НачатьПомещениеФайлаНаСервер вторым параметром можно передать описание оповещения с именем процедуры, которая будет периодически вызываться в процессе помещения файла во временное хранилище. У данной процедуры должно быть 4 параметра:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ХодВыполнения = Новый ОписаниеОповещения ( "ХодВыполнения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , ХодВыполнения , , , ПутьКФайлу ) ; Процедура ХодВыполнения ( ПомещаемыйФайл , Помещено , ОтказОтПомещенияФайла , ДопПараметры ) Экспорт Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт

В результате в процессе помещения файла во временное хранилище будет показано окно состояния с прогрессом:


Количество вызовов процедуры ХодВыполнения не определено. Для маленького файла это может быть только 1 раз, для большого даже больше 100.

Если в этой процедуре присвоить параметру ОтказОтПомещенияФайла = Истина, то в процедуре, которая будет вызвана после помещения файла у первого параметра свойство ПомещениеФайлаОтменено тоже будет равно Истина и файл не будет помещен во временное хранилище:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ХодВыполнения = Новый ОписаниеОповещения ( "ХодВыполнения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , ХодВыполнения , , , ПутьКФайлу ) ; Процедура ХодВыполнения ( ПомещаемыйФайл , Помещено , ОтказОтПомещенияФайла , ДопПараметры ) Экспорт Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт Сообщить ( ОписаниеПомещенногоФайла . ПомещениеФайлаОтменено ) ; //Истина

Асинхронный метод через обещание

Есть аналогичный метод ПоместитьФайлНаСерверАсинх. Данный метод тоже является асинхронным, но вместо описания оповещения использует обещание.

Параметры данного метода полностью совпадают с параметрами метода НачатьПомещениеФайлаНаСервер, только здесь не используется первый параметр с описанием оповещения с именем процедуры, которая вызывается после помещения файла во временное хранилище. Вместо этого обещание возвращает объект ОписаниеПомещенногоФайла (или Неопределено, если использовался диалог выбора и пользователь отказался от выбора файла):

Обещание = ПоместитьФайлНаСерверАсинх ( , , , ПутьКФайлу ) ; Расширение = ОписаниеПомещенногоФайла . СсылкаНаФайл . Расширение ;

Помещение во временное хранилище нескольких файлов

Параметры данного метода схожи с параметрами метода НачатьПомещениеФайлаНаСервер, только там где был один файл или объект, здесь будет массив файлов/объектов.

Вместо пути к файлу нужно передать массив объектов ОписаниеПередаваемогоФайла. Данный объект имеет 2 свойства:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайловНаСервер ( ПослеПомещения , , , ПомещаемыеФайлы , УникальныйИдентификатор ) ; Процедура ПослеПомещения ( ПомещенныеФайлы , ДопПараметры ) Экспорт Расширение = ОписаниеФайла . СсылкаНаФайл . Файл . Расширение ;

В данном примере последним параметром был указан уникальный идентификатор формы. Если его не указать, то второй файл не будет записан на сервер. Дело в том, что в данном примере вызов сервера происходит дважды: сначала для первого файла, потом для второго. Если не указан уникальный идентификатор формы, то файл будет удален из временного хранилища после окончания серверного вызова, то есть после записи первого файла. А при втором вызове сервера, для записи второго файла, временное хранилище уже будет пустым.

Поэтому нужно или указывать уникальный идентификатор формы в методе НачатьПомещениеФайловНаСервер или записывать все файлы на сервер за один серверный вызов.

Процедура, которая вызывается до помещения файлов во временное хранилище ничем не отличается от метода НачатьПомещениеФайлаНаСервер. Только в данном случае первым параметром будет не объект СсылкаНаФайл, а массив объектов СсылкаНаФайл, по одному для каждого файла. Второй параметр отменяет помещение во временное хранилище не одного файла, а сразу всех файлов:

Многие спрашиваю, как передать тз с сервера на клиент - ниже несколько вариантов как это можно реализовать:


Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр

Через реквизит Формы

Через Временное хранилище

Через обычный возврат

Пробуйте и пишите в комментариях как делаете это Вы

Разместил: E_Migachev  Версии: | 8.2 УП | 8.3 |  Дата: 09.10.2014   Прочитано: 122131

Распечатать

Похожие FAQ

10060 (0x0000274C): Попытка установить соединение была безуспешной  18
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1С Предприятие что это?  11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое COM-подключение к базе 7.7 из 8.2 1С  6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D:ВашаБаза1с77" ; Пользователь= Cклонения по падежам  6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Посмотреть все результаты поиска похожих

Еще в этой же категории

Как проверить ЭтоНовый() в управляемой форме?  9
Понятие ЭтоНовый() отсутствует в 8.2. Поэтому при необходимости определить, что создается новый элемент можно использовать следующую особенность управляемой формы. Как правило, любая управляемая форма содержит в себе реквизит " Объект" , поэтому Заполнение реквизитов формы и объекта  6
Для реквизитов в документеобработкеотчете: Объект.Реквизит = " значение" ; Для реквизитов на форме: ЭтаФорма.Реквизит = " значение" ; Как получить Макет?  6
НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) ЭтотОбъект=РеквизитФормыВЗначение(" Объект" ); Макет = ЭтотОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции НаСервере Процедура ВывестиМакет(ТД) Макет = Обработки.ОбработкаВ Как заполнить табличную часть формы программно?  6
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Как открыть внешнюю обработку или отчет программно 1С УП?  6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Посмотреть все в категории Управляемое приложение, Тонкий клиент

Ключевые слова и Изображения

Слова упорядочены по частоте использования в тексте

Изображения

Как передать таблицу значений с сервера на клиент?

Для платформы 8.3 будет работать вариант с ЗначениеВРеквизитФормы() и ТЗ на форме

Правильно ли я понимаю, что вернуть выборку на тонкий клиент вообще шансов нет никаких?

Допустим, есть управляемая форма, вызываемая из обработки. Надо заполнить табличную часть на этой форме. Соответственно на сервере запускаем запрос, результат запроса нужно каким-то образом вернуть на форму. Я пытаюсь вернуть таблицу значений.

В итоге получается, что:

1. Обычный возврат не работает, выкидывает ошибку XDTO.

2. ЗначениеИзСтрокиВнутр - на тонком клиенте недоступно.

3. Табличная часть формы на сервере недоступна.

Платформа 8.3 (8.3.5.1383) в режиме 8.2.

Многие спрашиваю, как передать тз с сервера на клиент - ниже несколько вариантов как это можно реализовать:


Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр

Через реквизит Формы

Через Временное хранилище

Через обычный возврат

Пробуйте и пишите в комментариях как делаете это Вы

Разместил: E_Migachev  Версии: | 8.2 УП | 8.3 |  Дата: 09.10.2014   Прочитано: 122132

Распечатать

Похожие FAQ

10060 (0x0000274C): Попытка установить соединение была безуспешной  18
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1С Предприятие что это?  11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое COM-подключение к базе 7.7 из 8.2 1С  6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D:ВашаБаза1с77" ; Пользователь= Cклонения по падежам  6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Посмотреть все результаты поиска похожих

Еще в этой же категории

Как проверить ЭтоНовый() в управляемой форме?  9
Понятие ЭтоНовый() отсутствует в 8.2. Поэтому при необходимости определить, что создается новый элемент можно использовать следующую особенность управляемой формы. Как правило, любая управляемая форма содержит в себе реквизит " Объект" , поэтому Заполнение реквизитов формы и объекта  6
Для реквизитов в документеобработкеотчете: Объект.Реквизит = " значение" ; Для реквизитов на форме: ЭтаФорма.Реквизит = " значение" ; Как получить Макет?  6
НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) ЭтотОбъект=РеквизитФормыВЗначение(" Объект" ); Макет = ЭтотОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции НаСервере Процедура ВывестиМакет(ТД) Макет = Обработки.ОбработкаВ Как заполнить табличную часть формы программно?  6
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Как открыть внешнюю обработку или отчет программно 1С УП?  6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Посмотреть все в категории Управляемое приложение, Тонкий клиент

Ключевые слова и Изображения

Слова упорядочены по частоте использования в тексте

Изображения

Как передать таблицу значений с сервера на клиент?

Для платформы 8.3 будет работать вариант с ЗначениеВРеквизитФормы() и ТЗ на форме

Правильно ли я понимаю, что вернуть выборку на тонкий клиент вообще шансов нет никаких?

Допустим, есть управляемая форма, вызываемая из обработки. Надо заполнить табличную часть на этой форме. Соответственно на сервере запускаем запрос, результат запроса нужно каким-то образом вернуть на форму. Я пытаюсь вернуть таблицу значений.

В итоге получается, что:

1. Обычный возврат не работает, выкидывает ошибку XDTO.

2. ЗначениеИзСтрокиВнутр - на тонком клиенте недоступно.

3. Табличная часть формы на сервере недоступна.

Платформа 8.3 (8.3.5.1383) в режиме 8.2.

Читайте также: