Как передать 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 thread |
Контекстная и внеконтекстная передача управления на сервер
Область применения: управляемое приложение, мобильное приложение.
1. Платформа 1С:Предприятие позволяет передавать управление из клиентского в серверный код модуля формы двумя способами: контекстно и внеконтекстно.
При внеконтекстной передаче управления на сервер передаются только те данные, которые явно специфицированы разработчиком в параметрах процедуры (функции) с директивой компиляции &НаСервереБезКонтекста .
При контекстной передаче управления на сервер, помимо параметров процедуры (функции) с директивой компиляции &НаСервере , передаются еще и данные формы, которые были изменены на клиенте за период с момента предыдущего контекстного серверного вызова (см. ниже приложение). При этом на сервере выполняется ряд дополнительных действий по инициализации методов формы и серверной копии данных формы, что может увеличивать общее время, которое сервер затрачивает на обработку вызванной процедуры (функции).
2.1. Контекстную передачу управления следует использовать в случаях когда:
- платформа 1С:Предприятие самостоятельно оптимизирует объем передаваемых данных между клиентом и сервером (в обоих направлениях). Прежде всего, это реквизиты формы с табличными документами и коллекции элементов ( ДанныеФормыКоллекция , ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево ). См. также: Использование объекта ДанныеФормыКоллекция .
- и при этом затраты ресурсов сервера на инициализацию контекста формы оправдываются существенным снижением трафика между клиентом и сервером и снижением числа вызовов сервера.
При этом следует учитывать, что в некоторых клиентских обработчиках событий форм (ПередЗаписью, ПослеЗаписи, ПередЗакрытием, ПриЗакрытии и др.) не допускается вызов контекстных серверных процедур, а также выполнение действий, которые могут привести к неявному серверному вызову. Подробности см. в документации платформы.
Для устранения контекстного серверного вызова есть несколько способов:
- Сделать вызываемую серверную процедуру или функцию в обработчике неконтекстной, то есть использовать директиву компиляции &НаСервереБезКонтекста . При этом следует передавать на сервер минимально необходимый объем данных, а не данные формы или табличной части целиком.
- Перенести выполняемый в обработчике серверный код на клиент.
- Внутри клиентского обработчика использовать обработчик ожидания, который выполнит контекстный серверный вызов или действие, приводящее к неявному серверному вызову после завершения выполнения обработчика.
&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
.
КонецПроцедуры
2.2. В случае, если на форме размещена таблица, при активизации строки которой необходимо обновлять содержимое формы (например, выводить подробности к выделенной строке), то в обработчике таблицы ПриАктивизацииСтроки следует подключать однократный обработчик ожидания. В нем выполнять действия, которые приводят к перестроению формы: контекстные серверные вызовы, изменение свойств элементов формы и т.п. При этом чтобы избежать повторных вызовов ПриАктивизацииСтроки , необходимо запоминать текущую строку ( ИдентификаторТекущейСтроки ) и не выполнять обновление формы, если она не изменилась.
В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.
3. При передаче управления с клиента на сервер недопустимо использовать объекты типов ДанныеФормыСтруктура , ДанныеФормыКоллекция , ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево и ТабличныйДокумент в качестве параметров функции, передаваемых по значению. При передаче таких типов по значению с клиента на сервер всегда передается полная копия объекта, а не только измененные данные.
Вести работу с этими типами следует на сервере, для чего переходить с клиента на сервер с помощью явного контекстного вызова сервера.
Например, неправильно:
// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура(«Отменено», Истина));
Возврат НайденныеСтроки.Количество();
КонецФункции
// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура(«Отменено», Истина));
Возврат НайденныеСтроки.Количество()
КонецФункции
Приложение
При контекстной передаче управления на сервер в платформе 1С:Предприятие действуют следующие правила передачи измененных данных формы между клиентом и сервером:
- значения реквизитов формы типа ДанныеФормыСтуктура передается целиком, в случае если изменился хотя бы один из его реквизитов;
- для объектов, представленных типами ДанныеФормыКоллекция ( ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево ) изменения учитываются с «точностью» до каждого элемента коллекции – передаются только измененные элементы. При этом измененные элементы коллекций передаются целиком. См. также: Использование объекта ДанныеФормыКоллекция .
- для объектов типа ТабличныйДокумент передаются только измененные области;
- объекты типа ДинамическийСписок не передаются.
См. также
Из формы на сервер и обратно
![]()
Казалось-бы, простая задача – в строке документа есть несколько реквизитов: Артикул, Вес, Размер, при изменении которых они должны сохраняться в реквизитах справочника, элемент которого выбран в этой-же строке. Т.е. получается, что пользователь не редактирует элемент справочника, а система это делает за него. Всё было-бы просто, если бы речь не шла об 1С версии 8.2, и вот почему – в 8.2 операции записи элементов могут выполняться только на сервере и не могут выполняться в форме, открытой на клиенте.
Вызов сервера я разделил на два этапа: сначала вызывается серверная процедура, описанная непосредственно в модуле формы, затем в ней вызывается процедура общего модуля для которого установлен признак исполнения на сервере. При передаче управления в модуль на сервере данные формы нельзя просто вставить в переменную и отправить в процедуру, если речь идет про объект, т.е. к примеру контекст текущего документа. Напомню, что сама форма исполняется не в контексте документа, его реквизиты доступны через реквизит формы “Объект”, теперь, если этот контекст нужно передать на сервер его нужно сделать прикладным объектом с помощью функции РеквизитФормыВЗначение(). После обработки этого объекта на сервере его можно вернуть с помощью функции ЗначениеВРеквизитФормы(). Всё это выглядит примерно так:
![]()
Это текст процедуры в модуле формы документа, ФормированиеТоваров – имя общего модуля с установленным признаком “Сервер”. В процедуре СформироватьТоварВПриходе() производятся изменения и запись в элемент справочника Товары, измененный элемент помещается в строку документа.
Для закоренелого “семерочника” выглядит дико, но такая система заставляет понять распределение ролей клиента и сервера. Если вдуматься, то во всех “причудах” новой платформы просматривается логика такой организации работы, когда клиенты становятся всё тоньше и, в конечном итоге, работают через веб, отправляя всю ответственную работу по обработке данных на сервер.
Tweet this thread