Передача формы с клиента на сервер в общих модулях

14.02.25

Разработка - Механизмы платформы 1С

В данной статье расскажу, как передать форму с клиента на сервер в общем модуле.


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

 
 Код исполнения подключаемых команд БСП формы элемента


Предположим, у нас есть клиентский общий модуль с некой процедурой, где в качестве параметра была передана форма
 

 
 Схема процедуры клиентского общего модуля

 

Согласно описанию библиотеки подключаемых команд, таблица подключаемых команд у нас находится во временном хранилище. Адрес расположен в реквизите формы по пути (Форма.)ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд.

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

В добавляемую строку нужно записать следующие свойства

Обязательными для нас являются следующие свойства: ИмяВФорме, Идентификатор, Обработчик, РежимЗаписи

 
 Пример добавления строки в таблицу команд с заполнением


Далее переходим в наш серверный общий модуль. Процедура вызываемая нами должна иметь 2 параметра. Первый всегда ссылка, второй структура, в свойствах которой есть форма (серверное представление). 
 

 
 Пример вызываемой процедуры серверного общего модуля


Теперь для вызова нашей серверной процедуры из клиентского общего модуля с передачей формы наша клиентская процедура должна принять следующий вид
 

 
 Пример вызова серверной процедуры общего модуля с передачей формы



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

 
 ВАЖНЫЙ НЮАНС РАБОТЫ ПЛАТФОРМЫ


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

Все описанное многократно использовалось мной в реальных проектах (правда, в более усложненном и универсальном виде).

Пример описан для БСП 3.1.10.х.

Передача формы с клиента на сервер БСП Подключаемые команды

См. также

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    6800    dsdred    45    

96

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    10656    bayselonarrend    21    

161

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7524    dsdred    18    

81

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    25044    YA_418728146    32    

73

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    25694    SeiOkami    48    

136
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 157 17.02.25 06:59 Сейчас в теме
Перечитал несколько раз, но так и не понял какую именно проблему решает данный подход.

Что такое "Красный Крест", международный комитет?

"ПодклчюаемыеКомандыКлиент" - опечаточка.
2. tormozit 7261 17.02.25 07:30 Сейчас в теме
(1) С клиента вызывает указанную функцию общего модуля в серверном контексте управляемой формы и возвращает ее результат.
см. ирОбщий.УправляемаяФормаБСП_ВыполнитьНаСервереЛкс
6. PerlAmutor 157 17.02.25 18:48 Сейчас в теме
(2) Т.е. весь смысл сводится к схеме МодульФормы.ПроцедураНаКлиенте (ЭтотОбъект на клиенте) -> ОбщийМодуль.МойМодульКлиент -> МодульФормы.ПроцедураНаСервере (ЭтотОбъект на сервере) (прямой вызов либо оповещение) -> ОбщийМодуль.МойМодульСервер ?
7. user1832003 46 17.02.25 19:53 Сейчас в теме
(6) да. Нужно каким либо образом с клиента вызвать серверную процедуру модуля формы (&НаСервере), чтобы платформа переконвертировала форму с клиентского представления в серверное. Иначе крит.

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

Я же делаю методами из коробки и если форма по умолчанию не подключена к подключаемым командам, то это можно сделать дописав стандартные процедуры БСП
9. tormozit 7261 17.02.25 22:47 Сейчас в теме
(7)
вписываемой в форму с проверкой через попытку

Где такое увидел?
10. user1832003 46 18.02.25 02:11 Сейчас в теме
(9) ирОбщий.УправляемаяФормаБСП_ВыполнитьНаСервереЛкс

Функция УправляемаяФормаБСП_ВыполнитьНаСервереЛкс(Знач Форма, Знач Обработчик, ПараметрКоманды = Неопределено) Экспорт 
	
	ИмяКомандыВФорме = ПоследнийФрагментЛкс(Обработчик);
	ПараметрыВызова = Новый Структура;
	ПараметрыВызова.Вставить("ИмяКомандыВФорме", ИмяКомандыВФорме);
	ПараметрыВызова.Вставить("ПараметрКоманды", ПараметрКоманды);
	ПараметрыВызова.Вставить("Результат", Новый Структура("Текст"));
	Если МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервереЛкс") Тогда 
		Форма.Подключаемый_ВыполнитьКомандуНаСервереЛкс(ПараметрыВызова);
		РезультатВызова = ПараметрыВызова.Результат.Текст;
	ИначеЕсли Истина
..
Показать


В ней
// Надежно проверяет существование у объекта метода с заданным именем
Функция МетодРеализованЛкс(Знач Объект, Знач ИмяМетода) Экспорт
	
	Если Объект = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	Выражение = "Объект." + ИмяМетода + "(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)";
	Попытка
		Выполнить(Выражение);
	Исключение
		Инфо = ИнформацияОбОшибке();
		Описание = Инфо.Описание;
	КонецПопытки;
	Результат = ЛиОшибкаСлишкомМногоПараметровЛкс(Инфо);
	Возврат Результат;
	
КонецФункции
Показать


Не знаю какая версия актуальная. Вчера обработка скачала 7.66.1e
12. tormozit 7261 18.02.25 07:34 Сейчас в теме
(10) Ясно. Разбираться глубоко не стал и остановился на первом фрагменте, не имеющем отношение к БСП, т.е. не связанном с подключаемыми командами. Смотри дальше в ИначеЕсли
13. user1832003 46 18.02.25 08:02 Сейчас в теме
(12) а че тут смотреть? дальше опять проверки костылями
ИначеЕсли Истина
		И ирКэш.НомерВерсииБСПЛкс() > 200
		И (Ложь
			Или МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервере") 
			Или МетодРеализованЛкс(Форма, "Подключаемый_ПродолжитьВыполнениеКомандыНаСервере"))
	Тогда
		Попытка
			ТаблицаКомандБСП = ПолучитьИзВременногоХранилища(Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд);
		Исключение
			ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
			Возврат Неопределено;
		КонецПопытки;
Показать

опять вызывается костыль из костылей МетодРеализованЛкс() на проверку бспшных процедур.

НомерВерсииБСПЛкс() тоже собирается костылем, когда есть бспшные функции на получение версии.

Если это чудом проходит проверки, то далее через попытку берется адрес таблицы команд, что опять же костыльный костыль, ведь есть ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта().

Я понимаю что это все писалось в бородатые года, но функциюОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта() можно реализовать и самому.

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

А теперь вопрос. Зачем нужен этот велосипед со звездой на переднем колесе, если все есть по дефолту из коробки? Конфигураций без бсп щас в принципе не существует, кроме прям совсем домашних.

Я не сомневаюсь что там могут быть полезные функции в целом в этом библе. Но их реализация вызывает боль. К тому что оно явно даже не пыталось переписаться под текущие стандарты написание кода я не придираюсь. Видно что с бородатых времен это даже не пыталось адаптироваться
16. tormozit 7261 18.02.25 08:34 Сейчас в теме
(13)
при этом требует либо самописную серверную процедуру для вызова, либо проверяет наличие бспшных костылями

Повторяю, первая часть условия к БСП не имеет отношения. То, что ты ее снова упомянул да еще и поставил на первое место, наводит на определенные мысли. За это поставил минус.
А вот проверка наличия БСПшных методов уже имеет отношение к рассматриваемому подходу. Модуль формы не требуется дорабатывать, если в нем есть эти БСПшные методы.
Проще будет разобраться, если остановишься отладчиком там при вызове команды "Структура формы" из глобального меню (CTRL+ё) в любой управляемой форме, имеющей эти БСПшные методы.
17. user1832003 46 18.02.25 08:47 Сейчас в теме
(16) ты либо сам не видел свой код, либо это код не твой, сути не меняет. Вот тебе твоя функция целиком
Подписал там то о чем речь, если ты в свой код не заглядывал давно
Функция УправляемаяФормаБСП_ВыполнитьНаСервереЛкс(Знач Форма, Знач Обработчик, ПараметрКоманды = Неопределено) Экспорт 
	
	ИмяКомандыВФорме = ПоследнийФрагментЛкс(Обработчик);
	ПараметрыВызова = Новый Структура;
	ПараметрыВызова.Вставить("ИмяКомандыВФорме", ИмяКомандыВФорме);
	ПараметрыВызова.Вставить("ПараметрКоманды", ПараметрКоманды);
	ПараметрыВызова.Вставить("Результат", Новый Структура("Текст"));


//++
// Если есть "копия" бспшного вызова, то вызываем его
//--
	Если МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервереЛкс") Тогда 
		Форма.Подключаемый_ВыполнитьКомандуНаСервереЛкс(ПараметрыВызова);
		РезультатВызова = ПараметрыВызова.Результат.Текст;
	
//++
// иначе проверяем наличие бспшных процедур для того же вызова. 
//Если они есть то делаем тоже самамое что я описал в статье. 
//Если в эта проверка не проходит то возвращаем неопределено.
//--
         ИначеЕсли Истина
		И ирКэш.НомерВерсииБСПЛкс() > 200
		И (Ложь
			Или МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервере") 
			Или МетодРеализованЛкс(Форма, "Подключаемый_ПродолжитьВыполнениеКомандыНаСервере"))
	Тогда
		Попытка
			ТаблицаКомандБСП = ПолучитьИзВременногоХранилища(Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд);
		Исключение
			ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
			Возврат Неопределено;
		КонецПопытки;
		#Если Сервер И Не Сервер Тогда
			ТаблицаКомандБСП = Новый ТаблицаЗначений;
			УправляемаяФормаБСП_СерверныеМетаданныеЛкс();
		#КонецЕсли
		Если ТаблицаКомандБСП.Найти(ИмяКомандыВФорме, "ИмяВФорме") = Неопределено Тогда
			ОписаниеКоманды = ТаблицаКомандБСП.Добавить();
			ОписаниеКоманды.ИмяВФорме = ИмяКомандыВФорме;
			ОписаниеКоманды.Обработчик = Обработчик;
			АдресТаблицыКомандБСП = ПоместитьВоВременноеХранилище(ТаблицаКомандБСП, Форма.УникальныйИдентификатор);
			Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд = АдресТаблицыКомандБСП;
		КонецЕсли; 
		Если МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервере") Тогда 
			Форма.Подключаемый_ВыполнитьКомандуНаСервере(ПараметрыВызова, );
		ИначеЕсли МетодРеализованЛкс(Форма, "Подключаемый_ПродолжитьВыполнениеКомандыНаСервере") Тогда 
			Форма.Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВызова, );
		КонецЕсли; 
		РезультатВызова = ПараметрыВызова.Результат.Текст;
	КонецЕсли; 
	Возврат РезультатВызова;

КонецФункции

Показать


при этом только за 2 условия имеем 3(2 если МетодРеализованЛкс(Форма, "Подключаемый_ВыполнитьКомандуНаСервере") вернет истину ) попытки, потом еще четвертую(третью) для вытаскивания таблицы команд.

А теперь вопрос. Зачем весь этот костыль нужен в первом Если ,если можно без него все сделать с такой же доработкой формы? Даже самому положить таблицу команд по нужному пути не составит проблем
3. user1832003 46 17.02.25 07:43 Сейчас в теме
(1)
опечатку поправил

в гугле куча вопросов "как передать форму с клиента на сервер в общем модуле". Ответ везде 1 - никак. По факту так оно и есть. Сделать это можно только костылями. В статье описан костыль работающий из коробки.

Если ты просто в коде сделаешь так
Процедура ОбщийМодульКлиент(Форма) Экспорт
       ОбщийМодульСерверный.ПроцедураСерверная(Форма);
КонецПроцедуры


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


Красный крест. Любая ошибка кода или платформы. Когда выпонение действия прерывается и выходит окно с описанием и картинкой с красным крестом в красном круге.
Вот пример
Прикрепленные файлы:
4. cssnavi 17.02.25 14:14 Сейчас в теме
"Вообще с помощью механизма подключаемых команд можно делать универсальные расширения без добавления форм в расширение (как расширяемого объекта), при этом выводя свои элементы на форму, добавляя свои реквизиты, а так же подключать события этим элементам, которые будут отрабатывать через механизм подключаемых команд.

Можете привести пример добавления любого реквизита, с обработчиком на форму документа. Пробовал такой подход, к сожалению не получилось(
5. user1832003 46 17.02.25 17:48 Сейчас в теме
(4) я целую библу под это написал и использую в проектах и задачах.

Если в кратце, то я использую такой вариант.

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

Код писать не буду, все легко гуглится на ctrl+c ctrl +v. Тупо лень этим заниматься в час ночи
8. SlavaKron 17.02.25 21:52 Сейчас в теме
вместо ПодключаемыеКомандыКлиент.ВыполнитьКоманду() использовать ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды()
Почему бы тогда просто всегда не использовать ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды()? Тем более, что ВыполнитьКоманду() - устаревший метод.
11. user1832003 46 18.02.25 02:14 Сейчас в теме
(8) Не видел пометок об устаревании. Плюс во флагманских конфигурациях типо ERP они используют ВыполнитьКоманду()
14. SlavaKron 18.02.25 08:20 Сейчас в теме
(11) Скачал последнюю БСП – единственное место "использования" ПодключаемыеКомандыКлиент.ВыполнитьКоманду – это проверка на устаревший способ встраивания.
Прикрепленные файлы:
15. user1832003 46 18.02.25 08:24 Сейчас в теме
(14) демку бсп никогда не смотрел. Пока в коде сверху в месте описания процедуры\функции не написано "устарело" считается актуальным. Типо как в ДлительныеОперации.ВыполнитьВФоне().

возможно в 3.1.11 пометят. Пока не сделали
Оставьте свое сообщение