Как получить все реквизиты управляемой формы

1. user950703 24.04.23 14:42 Сейчас в теме
Доброе время суток, уважаемые.

Проблема. Для передачи (записи) во внешнюю базу (Interbase/Fireberd) нужно получить список имен и значений реквизитов управляемой формы (именно управляемой формы а не объекта).
Поэтому прошу описать или дать ссылку на описание применения метода
ПолучитьРеквизиты()

Заранее благодарен.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 24.04.23 15:07 Сейчас в теме
(1)ЗачемЪ вам именно реквизиты формы? Завтра возьмут и подменят форму/настроят доступность реквизитов в зависимости от функциональных опций/прав, что вы делать будете?
Форма - всего лишь "обертка".......
4. user950703 24.04.23 15:23 Сейчас в теме
(3)
(2)Задача стоит так. Передать во внешнюю базу данные, частично входящие в ОБЪЕКТ, отображаемый управляемой формой (объект формы), и данные, заполняемые вручную на отдельной вкладке на форме. Последние, подчеркиваю, не входят в объект, поэтому могут быть заполнены только из реквизитов формы. Поэтому приходится получать их список. Понятно, что их состав постоянен и меняться не будет.
6. nomad_irk 76 24.04.23 15:51 Сейчас в теме
(4)Если список реквизитов известен и постоянен, то зачем вообще ПолучитьРеквизиты()?
7. user950703 24.04.23 16:06 Сейчас в теме
(6) Хотелось бы получить унифицированную процедуру, наподобие

Получить Реквизиты Объекта В Структуру (https://fastcode.im/Templates/403/poluchit-rekvizity-obekta-v-strukturu)
Только, чтобы работала с реквизитами, в общем случае, не включенными в объект
(6)
8. nomad_irk 76 24.04.23 16:15 Сейчас в теме
(7)ЗачемЪ? Их же все равно придется как-то определять нужные из этого списка/структуры.
Как по-мне, проще просто в структуру вручную набить ключи = имени реквизита и присваивать значения циклом по этой структуре, либо при изменении значения одного реквизита интерактивно.
9. user950703 24.04.23 16:23 Сейчас в теме
(8)Ну, выделять их довольно просто. Достаточно именовать их, начиная, с допустим с "Я_".
Тогда они будут доступны в общей структуре, вместе с реквизитами объекта.
11. nomad_irk 76 24.04.23 16:33 Сейчас в теме
(9)так и в чем проблемы-то я до сих пор категорически не понимаю. зачем усложнять на ровном месте то, что делается просто?
я бы еще понял, если бы было несколько форм, набор реквизитов постоянно менялся или еще какая хрень, тогда да, нужна некая универсальная штука, но в вашем конкретном случае - не понимаю вообще.
12. user950703 24.04.23 16:43 Сейчас в теме
(11) Так сложилось исторически. В модуле перед записью отрабатывала процедура Реквизиты Объекта В Структуру. Добавилась вкладка на форме со своими реквизитами. Хотелось бы, чтобы реквизиты этой вкладки дополняли созданную структуру с реквизитами объекта. По этой методике должны работать разные документы и справочники.
13. nomad_irk 76 24.04.23 16:47 Сейчас в теме
(12)Вам необходимо реквизиты формы "складировать" в ДополнительныеСвойства объекта - они доступны в модуле объекта.
14. user950703 24.04.23 17:00 Сейчас в теме
(13) Складировать каким способом?
(13)
15. nomad_irk 76 24.04.23 17:05 Сейчас в теме
(14)Как-то так:

&НаСервере
РеквизитыФормы = Новый Структура("Ключ1, Ключ2..... , КлючN", Значение1, Значение2......, ЗначениеN);
ТекОбъект = РеквизитФормыВЗначение("Объект");
ТекОбъект.ДополнительныеСвойства.Вставить("РеквизитыФормы", РеквизитыФормы);
16. user950703 24.04.23 17:10 Сейчас в теме
(13) А при каком событии вызывать?
(15)
18. nomad_irk 76 24.04.23 17:17 Сейчас в теме
(16)При необходимости как бы, но именно такой код лучше "ПередЗаписьюНаСервере"
20. user950703 24.04.23 17:27 Сейчас в теме
(18)Похоже, то, что надо. Не хватает обезличенной формы сбора реквизитов формы, без ручного задания имен реквизитов.
25. spacecraft 24.04.23 17:46 Сейчас в теме
(20)
Не хватает обезличенной формы сбора реквизитов формы, без ручного задания имен реквизитов.

А вот это не стоит делать. Что будете делать с ДанныеФормыКоллекция, которая может существовать только на форме? И т.д. и т.п.
21. spacecraft 24.04.23 17:33 Сейчас в теме
(15) я что-то не знаю? Как эти данные попадут в модуль объекта?
23. user950703 24.04.23 17:45 Сейчас в теме
(21) Да, модуль объекта. Процедура ПередЗаписью()
(21)
28. nomad_irk 76 24.04.23 17:54 Сейчас в теме
(21)Не разбирался как именно реализовано, нужно делать все в ПередЗаписьюНаСервере Формы, т.е.

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

РеквизитыФормы = Новый Структура("Ключ1, Ключ2..... , КлючN", Значение1, Значение2......, ЗначениеN);
ТекущийОбъект.ДополнительныеСвойства.Вставить("РеквизитыФормы", РеквизитыФормы);

КонецПроцедуры


Либо структуру реквизитов формы хранить в переменной модуля формы и менять по мере необходимости.
31. spacecraft 24.04.23 17:58 Сейчас в теме
(28) с ТекущийОбъект все понятно.
Вот с ТекОбъект = РеквизитФормыВЗначение("Объект"); не понятно. Это создаст новый объект в памяти и удалит его при выходе из области видимости. Ничего в объект (контекст модуль объекта) не добавит, так как по факту, в модуле формы объекта(не путать с реквизитом формы) нет.
5. wertep 24 24.04.23 15:31 Сейчас в теме
(1) В модуле формы вот такую функцию, и вызываешь когда нужно.
&НаСервере
//Функция ПолучитьВсеРеквизиты(Форма, Путь = "")
Функция ПолучитьВсеРеквизиты(Путь = "")
	
	Результат = Новый Массив;
	
//	Реквизиты = Форма.ПолучитьРеквизиты(Путь);
	Реквизиты = ПолучитьРеквизиты(Путь);
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Реквизиты);
	
	Для Каждого Реквизит Из Реквизиты Цикл
//		ПодчиненныеРеквизиты = ПолучитьВсеРеквизиты(Форма, Реквизит.Путь);
		ПодчиненныеРеквизиты = ПолучитьВсеРеквизиты(Реквизит.Путь);
		ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПодчиненныеРеквизиты);
	КонецЦикла;
	
	Возврат Результат;

КонецФункции
Показать


Писалось наугад, тестирование не проходило. Я думаю смысл понятен, если где что подправишь. Вызов без указания пути должен вернуть все реквизиты.

П.С. Хотя Форма наверное тут лишняя.
10. user950703 24.04.23 16:32 Сейчас в теме
(5)

// Реквизиты = Форма.ПолучитьРеквизиты(Пут


Все хорошо, кроме одного. Атрибут Форма должен быть доступен в модуле объекта. (Процедура Перед Записью). Так сложилось, работает подписка на события.
19. spacecraft 24.04.23 17:24 Сейчас в теме
(10) модуль формы:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	СтруктураРеквизитовФормы = Новый Структура("Реквизит1,Реквизит2,Реквизит3");
	ЗаполнитьЗначенияСвойств(СтруктураРеквизитовФормы, ЭтаФорма);
	ТекущийОбъект.ДополнительныеСвойства.Вставить("РеквизитыФормы", СтруктураРеквизитовФормы);
КонецПроцедуры

модуль объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	Перем РеквизитыФормы;
	
	Если ДополнительныеСвойства.Свойство("РеквизитыФормы", РеквизитыФормы) Тогда
		// тут получаем переданные значения реквизитов формы
	КонецЕсли;
КонецПроцедуры
27. wertep 24 24.04.23 17:52 Сейчас в теме
(19) Надо сделать микс.

модуль формы:
&НаСервере
Функция ПолучитьВсеРеквизиты(Путь = "")
    
    Результат = Новый Массив;
    
    Реквизиты = ПолучитьРеквизиты(Путь);
    ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Реквизиты);
    
    Для Каждого Реквизит Из Реквизиты Цикл
        ПодчиненныеРеквизиты = ПолучитьВсеРеквизиты(Реквизит.Путь);
        ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПодчиненныеРеквизиты);
    КонецЦикла;
    
    Возврат Результат;

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

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


модуль объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Перем РеквизитыФормы;
    
    Если ДополнительныеСвойства.Свойство("РеквизитыФормы", РеквизитыФормы) Тогда
        // тут получаем переданные значения реквизитов формы
    КонецЕсли;
КонецПроцедуры
24. wertep 24 24.04.23 17:45 Сейчас в теме
(10) Да тут у вас получится жопа небольшая.
Потому как вы собираетесь это делать в модуле объекта, но при программном создании у вас не будет ни формы, ни реквизитов заполненных руками, что тогда произойдет?
А если у вас в вашу левую базу "ПередЗаписью" записалось, а 1Ска по каким-то причинам записать не смогла, что будет с целостностью данных?
26. user950703 24.04.23 17:52 Сейчас в теме
(24) С целостностью вопрос решается транзакцией (попытка и т.д.) Пишется средствами ВИД, это там доступно.
А с модулем объекта действительно проблема, от этого и весь сыр-бор. Можно было бы эти реквизиты добавить в объект (расширение), но городить костыль неохота.
(24)
29. wertep 24 24.04.23 17:55 Сейчас в теме
(26) Транзакцией где, в 1С или во внешней базе? Так-то это решается распределенными транзакциями, но в 1С этого нет.
17. user1826630 24.04.23 17:16 Сейчас в теме
(1)
Поэтому прошу описать или дать ссылку на описание применения метода
ПолучитьРеквизиты()
Че, в Cинтакс-Помощнике забанили?
22. user950703 24.04.23 17:36 Сейчас в теме
(19) Нет, все в порядке. Помощник обычно скуповат на пояснения и примеры.
(17)
3. soft_wind 24.04.23 15:11 Сейчас в теме
как вариант,
самый простой, на форме заводите реквизит; ИменаПолей (тип Строка) в нем через запятую, перечисляете нужные реквизиты
в любом месте где нужно сформировать и отправить данные, выполняете такой код

лкДанные = Новый Структура(ИменаПолей);
ЗаполнитьЗначенияСвойств(лкДаные, ЭтаФорма);

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот