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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как передать COM-объект с клиента на сервер?

Рекомендовать в новости

Интернет-форум Краснодарского края и Краснодара
г. Краснодар, Краснодарский край 2022г.

Copyright ©, Все права защищены

Наверх Вниз

LinkBack
LinkBack URL
About LinkBacks
Bookmark & Share
Digg this Thread!
Add Thread to del.icio.us
Bookmark in Technorati
Tweet this threadTweet this thread

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приложение

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

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

См. также

Из формы на сервер и обратно

nakliente

Казалось-бы, простая задача – в строке документа есть несколько реквизитов: Артикул, Вес, Размер, при изменении которых они должны сохраняться в реквизитах справочника, элемент которого выбран в этой-же строке. Т.е. получается, что пользователь не редактирует элемент справочника, а система это делает за него. Всё было-бы просто, если бы речь не шла об 1С версии 8.2, и вот почему – в 8.2 операции записи элементов могут выполняться только на сервере и не могут выполняться в форме, открытой на клиенте.

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

zapolnitsvoistvatovara

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

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

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

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