| 
    
            
         
         | 
    
    
  | 
Получить значение элемента с управляемой формы | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    19:19 
 | 
         
        Собственно задача поднималась мною пару дней назад и кое-как я решил вопрос, получаю на клиенте форму, открываю ее, перебираю все значения полей ввода и флажков, записываю имена таблиц, после чего закрываю форму и передаю инфу на сервак, клепаю простенький отчет о том как называется элемент и что содержит, в т.ч. отслеживаю на каких страницах что находится.
  
        Но вот косяк. Господа разработчики, как последние собаки, взяли и назвали реквизит немного не так, как называется элемент на форме, в итоге обращаясь к Форма[Элемент.Имя] или к Форма.Объект[Элемент.Имя], дабы получить его содержание, я вылетаю с ошибкой потому что Элемент.Имя=РеализацияПоЗаказу, а Форма.Объект[Элемент.Имя]=РеализацияПоЗаказам. Возник вопрос, как мне управляемую форму разобрать так, чтобы полностью получить имя реквизита, соответствующего полю на форме.  | 
|||
| 
    1
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    19:33 
 | 
         
        Вверх     
         | 
|||
| 
    2
    
        GANR    
     12.02.13 
            ✎
    19:35 
 | 
         
        (0) Этот код должен выпоняться на сервере
  
        Форма[]  | 
|||
| 
    3
    
        GANR    
     12.02.13 
            ✎
    19:35 
 | 
         
        Форма[ИмяЭлемента].ПутьКДанным     
         | 
|||
| 
    4
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    19:36 
 | 
         
        Ты очень умный, скажи как мне форму на сервере получить?     
         | 
|||
| 
    5
    
        GANR    
     12.02.13 
            ✎
    19:42 
 | 
         
        В модуле формы можно сделать что-то вроде
  
        &НаСервере Функция ПолучитьПутьЭлемента(ИмяЭлемента) Возврат Элементы[ИмяЭлемента].ПутьКДанным КонецФункции (4) Ты хочешь передать форму в некий общий модуль так? Тогда дествия такие (с клиента, на сервер в качестве параметра ее передать нельзя) 1. модуль формы &НаСервере Процедура ТвояПроцедура() ТвойСерверныйОбщийМодуль.ТвояФункция(ЭтаФорма) КонецПроцедуры 2. серверный общий модуль Функция ТвояФункция(Форма) ... ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным; ... КонецФункции Пойдет?  | 
|||
| 
    6
    
        GANR    
     12.02.13 
            ✎
    19:46 
 | 
         
        С клиента, на сервер в качестве параметра процедуры/функции форму передать нельзя. Обходной путь - зайти в подпрограмму с директивой &НаСервере.     
         | 
|||
| 
    7
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    19:48 
 | 
         
        Так объясню. Я выбираю на форме отчета любой справочник или документ, после чего выбираю объект\документ. Надо получить его форму, после чего обойти все его элементы формы и вывести их названия и значения которые они содержат. Это внешний отчет и работать должно в любой типовой УТ11/КА1.1/БП3.0     
         | 
|||
| 
    8
    
        GANR    
     12.02.13 
            ✎
    19:55 
 | 
         
        (7) Хм. ПолучитьФорму(...) только на клиенте работает. Да уж, вилы.     
         | 
|||
| 
    9
    
        GANR    
     12.02.13 
            ✎
    19:58 
 | 
         
        И метаданные, похоже, тоже не выход     
         | 
|||
| 
    10
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:00 
 | 
         
        Все было хорошо и даже получалось, пока совпадали имена реквизитов формы и пути к данным     
         | 
|||
| 
    11
    
        MSII    
     12.02.13 
            ✎
    20:00 
 | 
         
        Записать имена элементов, реквизитов и значения реквизитов в какую-то подходящую коллекцию и передать ее на сервер. В чем проблема? Или я неправильно понял задачу?     
         | 
|||
| 
    12
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:06 
 | 
         
        Имена всех элементов и я могу списать, реквизитов тоже. Как их сопоставить?     
         | 
|||
| 
    13
    
        MSII    
     12.02.13 
            ✎
    20:09 
 | 
         
        (12) На клиенте же ты их можешь сопоставить. У элемента читаешь свойство ПутьКДанным, пишешь в коллекцию - имя элемента, его путь к данным, значение реквизита. Все это пакуй и на сервер. Нет?     
         | 
|||
| 
    14
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:14 
 | 
         
        Нет. У элемента на форме нет пути к данным, потому что как не странно, у элемента на форме нет доступа к данным. Путь к данным возможен только на сервере.     
         | 
|||
| 
    15
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:27 
 | 
         
        Вверз     
         | 
|||
| 
    16
    
        V_V_V    
     12.02.13 
            ✎
    20:33 
 | 
         
        Элементы не спасут отца?     
         | 
|||
| 
    17
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:34 
 | 
         
        (16) предлагай     
         | 
|||
| 
    18
    
        V_V_V    
     12.02.13 
            ✎
    20:36 
 | 
         
        (14) Если тебе данные нужно возвращать на сервер - почему не перебрать все элементы еще ПриСозданииНаСервере?     
         | 
|||
| 
    19
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:44 
 | 
         
        (18) при создании на сервере чего? У меня внешний отчет. Я в нем получаю основную форму указанного документа или справочника.     
         | 
|||
| 
    20
    
        MSII    
     12.02.13 
            ✎
    20:48 
 | 
         
        (19) Тогда беда. Жди, когда подписки на события форм появятся. Все ждем и ты жди. Или модифицируй форму.     
         | 
|||
| 
    21
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:50 
 | 
         
        (20) все управляемые формы во всех конфах с управляемыми формами у всех клиентов?))))     
         | 
|||
| 
    22
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:51 
 | 
         
        (20) начну сейчас, чтобы завтра уже поехать по клиентам ставить новый "релиз"...     
         | 
|||
| 
    23
    
        MSII    
     12.02.13 
            ✎
    20:56 
 | 
         
        (22) Без паники. Предлагаю решение - обернуть присваивание в попытку, а в исключении сообщать - "Внимание! Имена реквизита формы и элемента формы различны! Немедленно внесите изменения в конфигурацию!" и на этом завершать построение отчета.     
         | 
|||
| 
    24
    
        Rizhij_Nikitos    
     12.02.13 
            ✎
    20:58 
 | 
         
        (23) почти это и делаю, только я придумал так - записывать имя элемента и давать пользователю сопоставить со всеми объектами это имя элемента, типа как "Для элемента ХХХ не определен источник данных, пожалуйста определите имя реквизита, который является источником данных для данного реквизита:"
  
        И вываливается список всех объектов с возможностью выбора одного. А данные выбора засуну в отчет.  | 
|||
| 
    25
    
        GANR    
     13.02.13 
            ✎
    03:15 
 | 
         
        (24)Пиши рационализаторское предложение разработчикам платформы на v8@1c.ru с указанием конфы, платформы, рег. номера программного продукта и фирмы (без этого - пошлют).     
         | 
|||
| 
    26
    
        GANR    
     13.02.13 
            ✎
    03:17 
 | 
         
        +(25) И ты, (20), пиши и убеждай.     
         | 
|||
| 
    27
    
        НЕА123    
     13.02.13 
            ✎
    08:32 
 | 
         
        1. модуль формы
  
        &НаКлиенте Процедура ТвояПроцедура() Для Каждого ЭЛ из Элементы Цикл ТвойПуть = ТвойСерверныйОбщийМодуль.ТвояФункция(ЭЛ); КонецЦикла КонецПроцедуры &НаСервере Функция ТвояФункция(Форма) Попытка ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным; Исключение ТвойПуть = ""; КонецПопытки Возврат ТвойПуть; КонецФункции  | 
|||
| 
    28
    
        НЕА123    
     13.02.13 
            ✎
    08:33 
 | 
         
        1. модуль формы
  
        &НаКлиенте Процедура ТвояПроцедура() Для Каждого ЭЛ из Форма.Элементы Цикл ТвойПуть = ТвойСерверныйОбщийМодуль.ТвояФункция(ЭЛ); КонецЦикла КонецПроцедуры &НаСервере Функция ТвояФункция() Попытка ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным; Исключение ТвойПуть = ""; КонецПопытки Возврат ТвойПуть; КонецФункции  | 
|||
| 
    29
    
        НЕА123    
     13.02.13 
            ✎
    08:35 
 | 
         
        мля...
  
        не мое 1. модуль формы &НаКлиенте Процедура ТвояПроцедура() Для Каждого ЭЛ из Форма.Элементы Цикл ТвойПуть = ТвояФункция(ЭЛ); КонецЦикла КонецПроцедуры &НаСервере Функция ТвояФункция(ЭЛ) Попытка ТвойПуть = ЭЛ.ПутьКДанным; Исключение ТвойПуть = ""; КонецПопытки Возврат ТвойПуть; КонецФункции  | 
|||
| 
    30
    
        MSII    
     13.02.13 
            ✎
    08:55 
 | 
         
        (26) Да кто я такой. Им там, на Селезневской, виднее, что и как.     
         | 
|||
| 
    31
    
        Rizhij_Nikitos    
     13.02.13 
            ✎
    09:32 
 | 
         
        (29) Одна проблема, для типов данных элементов на форме нет типов данных на сервере:
  
        Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: Запись значения свойства 'param': форма: Элемент имя: {http://v8.1c.ru/8.2/managed-application/modules}param по причине: Ошибка отображения типов: Отсутствует отображение для типа 'ГруппаФормы'  | 
|||
| 
    32
    
        Поросенок Петр    
     13.02.13 
            ✎
    09:34 
 | 
         
        Жесть. 31 пост решается совсем другая проблема.     
         | 
|||
| 
    33
    
        Rizhij_Nikitos    
     13.02.13 
            ✎
    09:45 
 | 
         
        (32) ты о чем?) В общем объясняю, что нужны отображения типов на сервере для того что бы передавать на сервер клиентские типы данных. Каждый раз определять что за тип и что то придумывать(а я честно даже не знаю, есть ли для этих типов отображения на сервере)...     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |