Как передать com объект с клиента на сервер 1с
Перейти к содержимому

Как передать com объект с клиента на сервер 1с

  • автор:

Передача данных между клиентом и сервером 1с 8.2.

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

1. Из документа я вызываю форму обработки кодом:

&НаКлиенте Процедура ВыбратьДокументы(Команда) //ВыбратьДокиНаСервере(); Форма = ПолучитьФорму("Обработка.СозданиеПриходаИзНесколькихДокументов.Форма",,ЭтаФорма); Форма.ОткрытьМодально(); КонецПроцедуры

и открываю форму модально, что значит что она перекрывает все остальные окна для работы пока не будет закрыта.

2. В обработке есть кнопка заполнить документы это ее код на сервере:

&НаСервере Процедура ЗаполнитьНаСервере() ТЧ = Объект.Документы; ТЧ.Очистить(); // // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ |ПредПриход.Ссылка КАК Док |ИЗ |Документ.ПредПриход КАК ПредПриход |ГДЕ |ПредПриход.Показывать = Истина"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ТЧ = Объект.Документы.Добавить(); ТЧ.ПриходнаяНакладная = ВыборкаДетальныеЗаписи.Док; ТЧ.Выбрать = Истина; КонецЦикла; //>>КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры

3. И самая интересная часть, тут мы поговорим подробнее:

&НаКлиенте Процедура ПеренестиВТЧ(Команда) ОчиститьСообщения(); ТЧ = Объект.Документы; Для каждого Стр из ТЧ Цикл Доки = Стр.ПриходнаяНакладная; Если Стр.Выбрать = Ложь Тогда Иначе Режим = РежимДиалогаВопрос.ДаНет; Ответ = Вопрос(Нстр ("ru = 'Выполнить операцию заполнения?'"),Режим, 0); Если Ответ = КодВозвратаДиалога.Да Тогда м = ПолучитьДанные(Доки); Для каждого строка из м Цикл ТЧ = ВладелецФормы.Объект.Товары.Добавить(); ТЧ.Имей = строка.Имей; ТЧ.Номенклатура = строка.Номенклатура; ТЧ.Количество = 1; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; ЭтаФорма.Закрыть(); КонецПроцедуры

Не обращайте внимания на переменные, интересовать вас должен сам код. Суть На клиенте

Вызов функции «м = ПолучитьДанные(Доки);», которая и возвращает нам результат наших табличных частей. Что же происходит на сервере?

&НаСервере Функция ПолучитьДанные(Доки) Массив = Новый Массив; Док = Доки; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ |ПредПриход.Ссылка КАК СсылкаДока, |ПредПриходТовары.Ссылка КАК СсылкаТЧ, |ПредПриходТовары.НомерСтроки, |ПредПриходТовары.Номенклатура, |ПредПриходТовары.Имей, |ПредПриходТовары.Количество |ИЗ |Документ.ПредПриход.Товары КАК ПредПриходТовары |ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПредПриход КАК ПредПриход |ПО ПредПриходТовары.Ссылка = ПредПриход.Ссылка |ГДЕ |ПредПриход.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", Док); РезультатЗапроса = Запрос.Выполнить(); м = Новый Массив(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл СтруктураДанных = Новый Структура("Номенклатура,Имей,Количество"); ЗаполнитьЗначенияСвойств(СтруктураДанных,ВыборкаДетальныеЗаписи); м.Добавить(СтруктураДанных); КонецЦикла; Док = ВыборкаДетальныеЗаписи.СсылкаДока.ПолучитьОбъект(); Док.Показывать = Ложь; Док.Записать(); Возврат м; КонецФункции

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

Мы засовываем данные в структуру

СтруктураДанных = Новый Структура("Номенклатура,Имей,Количество"); ЗаполнитьЗначенияСвойств(СтруктураДанных,ВыборкаДетальныеЗаписи);

А структуру пихаем в массив

м.Добавить(СтруктураДанных);

Контекстная и внеконтекстная передача управления на сервер

Область применения: управляемое приложение, мобильное приложение.

1. Платформа 1С:Предприятие позволяет передавать управление из клиентского в серверный код модуля формы двумя способами: контекстно и внеконтекстно.

При внеконтекстной передаче управления на сервер передаются только те данные, которые явно специфицированы разработчиком в параметрах процедуры (функции) с директивой компиляции &НаСервереБезКонтекста .

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

2.1. Контекстную передачу управления следует использовать в случаях когда:

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

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

Для устранения контекстного серверного вызова есть несколько способов:

  • Сделать вызываемую серверную процедуру или функцию в обработчике неконтекстной, то есть использовать директиву компиляции &НаСервереБезКонтекста . При этом следует передавать на сервер минимально необходимый объем данных, а не данные формы или табличной части целиком.
  • Перенести выполняемый в обработчике серверный код на клиент.
  • Внутри клиентского обработчика использовать обработчик ожидания, который выполнит контекстный серверный вызов или действие, приводящее к неявному серверному вызову после завершения выполнения обработчика.

&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
.
КонецПроцедуры

2.2. В случае, если на форме размещена таблица, при активизации строки которой необходимо обновлять содержимое формы (например, выводить подробности к выделенной строке), то в обработчике таблицы ПриАктивизацииСтроки следует подключать однократный обработчик ожидания. В нем выполнять действия, которые приводят к перестроению формы: контекстные серверные вызовы, изменение свойств элементов формы и т.п. При этом чтобы избежать повторных вызовов ПриАктивизацииСтроки , необходимо запоминать текущую строку ( ИдентификаторТекущейСтроки ) и не выполнять обновление формы, если она не изменилась.

В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.

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

// Общий серверный модуль ОбщийМодульВызовСервера

Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура(«Отменено», Истина));
Возврат НайденныеСтроки.Количество();
КонецФункции

// Общий серверный модуль ОбщийМодульВызовСервера

Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура(«Отменено», Истина));
Возврат НайденныеСтроки.Количество()
КонецФункции

Приложение

При контекстной передаче управления на сервер в платформе 1С:Предприятие действуют следующие правила передачи измененных данных формы между клиентом и сервером:

  • значения реквизитов формы типа ДанныеФормыСтуктура передается целиком, в случае если изменился хотя бы один из его реквизитов;
  • для объектов, представленных типами ДанныеФормыКоллекция ( ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево ) изменения учитываются с «точностью» до каждого элемента коллекции – передаются только измененные элементы. При этом измененные элементы коллекций передаются целиком. См. также: Использование объекта ДанныеФормыКоллекция .
  • для объектов типа ТабличныйДокумент передаются только измененные области;
  • объекты типа ДинамическийСписок не передаются.

См. также

Как передать com объект с клиента на сервер 1с

Привет всем. Как передать данные с клиента на сервер?

На сервере в переменной Док должен оказаться ДокументОбъект из открытой формы

Ересь
На форме нет объекта.
Конкретизируй задачу. Кто на ком сидел и чем погонял

&НаСервере
Процедура ЗаполнитьДобавленныеКолонкиТаблиц(Док)

Для Каждого СтрокаТаблицы Из Док.Услуги Цикл
ЗаполнитьДобавленныеКолонкиТаблицыУслуги(СтрокаТаблицы);
КонецЦикла;

Как в переменной Док передать ДокументОбъект на сервер?

(1) Вообще вот зачем это надо
Программно создается и заполняется документ в Бух ред.3 ОтчетПроизводстваЗаСмену.
После создания документ открывается. Но для ТЧ Услуги нужно выполнить процедуру

как это сделать?

(4) для начала — учить азы. На клиенте нет объектов. Вообще.
А то, что ты хочешь, делается через оповещения.

(2) Кто такой «Док»?

(0) Не надо передавать объект в качестве параметра. Если ты находишься в контексте модуля формы, доступен (Объект) — это «легкий» тип данных. Для того, чтобы получить полноценный ДокументОбъект

В серверной процедуре:

Док = РевизитФормыВЗначение(«Объект»); // Преобразует реквизит формы в объект прикладного типа
.
Действия с документом
.
ЗначениеВРеквизитФормы(Док , «Объект»); // Преобразует объект прикладного типа в реквизит управляемой формы (данные формы)

(5) Зачем оповещения?

(8)Если бы он находился в контексте модуля формы то наврятли у ТС хватило бы длины рук переименовать основной объект формы «Объект» в Док, наверняка это реквизит с именем «Док» и типом «ДокументСсылка.Какойто-там»

(9)опечатка вместо
>>основной объект формы

основной реквизит формы

(9) Кэп изо всех сил символизирует, что ссылки легко и непринужденно передаются с клиента на сервер и туда-сюда

Как передать com объект с клиента на сервер 1с

Привет. Как передать СОМ-объект с клиента на сервер?
Пробовал так:

V8 = Новый COMОбъект(«V83.Application»);
РезультатПодключения = V8.Connect(ПараметрыСоединения);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(V8, Новый УникальныйИдентификатор());
//где Объект.АдресВХ — реквизит типа Строка неограниченной длины

V8 = Новый COMОбъект(«V83.Application»);
РезультатПодключения = V8.Connect(ПараметрыСоединения);
СтруктураСОМ = Новый Структура(«СОМ», V8);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(СтруктураСОМ, Новый УникальныйИдентификатор());

в обоих случаях одна ошибка:

Ошибка помещения значения во временное хранилище
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘request’:

Процедуры по переносу находятся в модуле объекта. Туда и нужно передать V8

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *