|
ТаблицаЗначений управляемые формы | ☑ | ||
---|---|---|---|---|
0
an_str
07.05.14
✎
10:01
|
Здравствуйте. Управляемые формы. В документе есть реквизит ФОРМЫ с типом "ТаблицаЗначений". По кнопке "Загрузить" открывается форма обработки, которая должна загрузить в эту таблицу данные из екселя. пока по кнопке Загрузить следующий код:
ПараметрыФормы = Новый Структура("Документ", Объект.Ссылка); Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.ОткрытьМодально(); В процедуре ПриСозданииНаСервере в форме обработки: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Объект.ОбъектСтроительства = Параметры.Документ.ОбъектСтроительства; КонецПроцедуры но так я могу получить доступ к реквизитам объектам, а мне нужно именно формы получить ту таблицу значений и заполнить ее. подскажите, пожалуйста, как можно это реализовать |
|||
1
su_mai
07.05.14
✎
10:07
|
(0) 1. Не надо использовать модальное открытие форм, надо пользоваться методом ОткрытьФорму(), а у формы устанавливать режим блокирования владельца.
На сервере можно так: Таблица = РеквизитФормыВЗначение("ФОРМЫ"); В этом стучае Таблица это таблица значений, как работать с неё знаешь. После окончания её изменения необходимо преобразовать её в реквизит формы: ЗначениеВРеквизитФормы() |
|||
2
an_str
07.05.14
✎
10:26
|
(1) первый пункт исправила, спасибо за уточнение про открытие форм. Второй пункт: если бы нужно было менять в этой же форме то понятно, можно так сделать. вопрос как передать эту таблицу значений в форму обработки и там его менять.
Передать вот так получилось: ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип("ТаблицаЗначений")); ПараметрыФормы = Новый Структура("Документ, ТаблицаПрогноза", Объект.Ссылка,ТаблицаПрогноза); Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.Открыть(); В обработке в форме: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТаблицаПрогноза = Параметры.ТаблицаПрогноза; КонецПроцедуры получить могу, но как с ней дальше работать? и вернуть обратно, чтобы на форме документа отобразились загруженные мною данные из екселя. |
|||
3
su_mai
07.05.14
✎
10:30
|
(2) В клиентском контексте формы тип данных "ТаблицаЗначений" обрабатываться не может. В нем только массивы структур и тп
|
|||
4
su_mai
07.05.14
✎
10:30
|
+(3) Ты с серверными вызовами борешся?
|
|||
5
an_str
07.05.14
✎
10:37
|
(4) я просто не знаю как в форме обработки с этой таблицей работать и вернуть ее обратно. ПриСозданииНаСервере я ее получила.
Дальше по кнопке "Выполнить в обработке": &НаКлиенте Процедура Выполнить(Команда) ЗагрузитьИзExcel(); КонецПроцедуры &НаСервере Функция ЗагрузитьИзExcel() Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Не найден Microfoft Excel."); Возврат Ложь; КонецПопытки; Попытка WorkBook = Excel.WorkBooks.Open( Объект.ПутьКФайлу ); Исключение Сообщить("Excel не удалось открыть файл " + Объект.ПутьКФайлу ); Возврат Ложь; КонецПопытки; Конвертировать(Excel); WorkBook.Saved = True; Excel.Workbooks.Close(); Excel.Application.Quit(); Возврат Истина; КонецФункции &НаСервере Процедура Конвертировать(Excel) Лист = Excel.Sheets(Объект.НомерСтраницы); Для индС = Объект.НомерПервойСтроки По Объект.НомерПоследнейСтроки Цикл НоваяСтрока = ТаблицаПрогноза.Добавить(); // Здесь надо внести данные в таблицу значений, но естественно ТаблицаПрогноза тут не видна Если ЗначениеЗаполнено(Объект.СтолбецВидПомещения) Тогда НоваяСтрока.ВидПомещения = Перечисления.ВидыПомещений[СокрЛП(Лист.Cells(индС, Объект.СтолбецВидПомещения).Value)]; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
6
su_mai
07.05.14
✎
10:44
|
(5)
&НаСервере Процедура Конвертировать(Excel) ТаблицаПрогноза = РеквизитФормыВЗначение("Формы"); Лист = Excel.Sheets(Объект.НомерСтраницы); Для индС = Объект.НомерПервойСтроки По Объект.НомерПоследнейСтроки Цикл НоваяСтрока = ТаблицаПрогноза.Добавить(); // Здесь надо внести данные в таблицу значений, но естественно ТаблицаПрогноза тут не видна Если ЗначениеЗаполнено(Объект.СтолбецВидПомещения) Тогда НоваяСтрока.ВидПомещения = Перечисления.ВидыПомещений[СокрЛП(Лист.Cells(индС, Объект.СтолбецВидПомещения).Value)]; КонецЕсли; КонецЦикла; ЗначениеВРеквизитФормы(ТаблицаПрогноза, "Формы"); КонецПроцедуры |
|||
7
su_mai
07.05.14
✎
11:01
|
+(6) Дело в том, что даже в серверном контексте формы реквизит "ФОРМЫ" имеет тип "ДанныеФормаКоллекция". Тип "ДанныеФормаКоллекция" позволяет добавлять строки и тп. По этому можно не преобразовывать в таблицу значений.
|
|||
8
su_mai
07.05.14
✎
11:04
|
+(7) При этом, если не сервере необходимо работать именно с типом "ТаблицаЗначений", то необходимо выполнить преобразование данных:
до обработки ТаблицаПрогноза = РеквизитФормыВЗначение("Формы"); после обработки ЗначениеВРеквизитФормы(ТаблицаПрогноза, "Формы"); При возврате на клиента "уедет" именно "ДанныеФормаКоллекция" |
|||
9
an_str
07.05.14
✎
11:26
|
(8) это я понимаю. но так хорошо получается, если в одном модуле все делать. Сначала. Тыкаем кнопку загрузить, по которой должна открыться форма обработки "ЗагрузкаПланирование":
&НаКлиенте Процедура ЗагрузитьИзФайла(Команда) Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.Открыть(); КонецПроцедуры как в нее передать реквизит формы TOTALКалендарный, который имеет тип ТаблицаЗначений? &НаКлиенте Процедура ЗагрузитьИзФайла(Команда) ТаблицаПрогноза = РеквизитФормыВЗначение("Формы"); ПараметрыФормы = Новый Структура("ТаблицаПрогноза", ТаблицаПрогноза); Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.Открыть(); КонецПроцедуры // так не отработает У меня передать получилось вот так: ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип("ТаблицаЗначений")); ПараметрыФормы = Новый Структура("Документ, ТаблицаПрогноза", Объект.Ссылка,ТаблицаПрогноза); Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.Открыть(); каковы должны быть мои действия в форме обработки а не документа |
|||
10
su_mai
07.05.14
✎
11:32
|
(9) Можно передать данные из другой формы через временное хранилище, но напрямую работать с таблицей значений можно только в серверном контексте формы.
|
|||
11
an_str
07.05.14
✎
11:34
|
Попробовала еще в ременным хранилищем.
В документе: &НаКлиенте Процедура ЗагрузитьИзФайла(Команда) АдресХранилища = ПоместитьДанныеФормыВХранилище(); ПараметрыФормы = Новый Структура("Адрес,Ключ", АдресХранилища, Объект.Ссылка); Обработка = ПолучитьФорму("Обработка.ЗагрузкаПланирование.Форма", ПараметрыФормы, ЭтаФорма); Обработка.Открыть(); КонецПроцедуры &НаСервере Функция ПоместитьДанныеФормыВХранилище() ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип("ТаблицаЗначений")); Возврат ПоместитьВоВременноеХранилище(ТаблицаПрогноза, УникальныйИдентификатор); КонецФункции В обработке: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес); КонецПроцедуры как мне с ней тут дальше работать? на форме может тоже нужно создать таблицу значений и скопировать это туда? |
|||
12
su_mai
07.05.14
✎
11:38
|
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда) ПараметрыФормы = Новый Структура("ТаблицаПрогноза", ПоместитьКалендарь(Формы)); ОткрытьФорму("Обработка.АппроксимацияДанных.Форма", Параметры, ЭтаФорма, ,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаСервере Функция ПоместитьКалендарь() Возврат ПоместитьВоВременноеХранилище(TOTALКалендарный, УникальныйИдентификатор); КонецФункции &НаСервере Процедура ПриСозданииНаСервере() Если ЭтоАдресВременногоХранилища(Параметры.ТаблицаПрогноза) Тогда ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.ТаблицаПрогноза); КонецЕсли; КонецПроцедуры |
|||
13
su_mai
07.05.14
✎
11:38
|
(12) Сори: "Обработка.АппроксимацияДанных.Форма - имя вашей формы обработки :)
|
|||
14
su_mai
07.05.14
✎
11:39
|
Процедура ПриСозданииНаСервере() - это уже модуль открываемой формы
|
|||
15
su_mai
07.05.14
✎
11:42
|
Если есть доступ к ИТС: "Минимизация количества серверных вызовов" - "Выполнение подбора элементов" - "7.2. В целях оптимизации передачи данных между формой объекта и формой подбора рекомендуется использовать временное хранилище, чтение и запись которого должна выполняться на сервере."
http://its.1c.ru/db/v8std#content:2149184136:1 |
|||
16
an_str
07.05.14
✎
11:43
|
(14)Да, спасибо огромное. у меня так все и работает. Вопрос то что дальше делать. Получила я эту таблицу в процедуре на сервере. а как мне в нее внести изменения???
&НаКлиенте Процедура ВыполнитьЗагрузку(Команда) ЗагрузитьИзExcel(); ЭтаФорма.Закрыть(); КонецПроцедуры &НаСервере Функция ЗагрузитьИзExcel() Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Не найден Microfoft Excel."); Возврат Ложь; КонецПопытки; Попытка WorkBook = Excel.WorkBooks.Open( Объект.ПутьКФайлу ); Исключение Сообщить("Excel не удалось открыть файл " + Объект.ПутьКФайлу ); Возврат Ложь; КонецПопытки; НоваяСтрока = ТаблицаПрогноза.Добавить();// вот тут это не отработает WorkBook.Saved = True; Excel.Workbooks.Close(); Excel.Application.Quit(); Возврат Истина; КонецФункции |
|||
17
ProProg
07.05.14
✎
11:51
|
(16) на сервере ком объекты работать не будут.
|
|||
18
ProProg
07.05.14
✎
11:53
|
Кстати путь к файлу - должен быть серверным )))
Те файл нужно передать опять таки на сервер через хранилище и обрабатывать там получив из хранилища. |
|||
19
an_str
07.05.14
✎
11:56
|
(17) - сплошные расстройства(
|
|||
20
su_mai
07.05.14
✎
11:58
|
(17) COMОбъект (COMObject) Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Так что если на сервере установлен MS Excel, то будет работать. А файл необходимо передать на сервер опять же через временное хранилище "ПоместитьФайл". |
|||
21
an_str
07.05.14
✎
12:01
|
(20) это радует, но это уже другой вопрос) что с таблицей то в итоге делать? мне бы ее хоть как-то изменить и вернуть обратно для начала)
|
|||
22
an_str
07.05.14
✎
12:03
|
Попробовала добавить тоже реквизит на форму с типом ТаблицаЗначений.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес); Таблица1 = ДанныеФормыВЗначение(ЭтаФорма.TOTALКалендарный, Тип("ТаблицаЗначений")); Таблица1=ТаблицаПрогноза.Скопировать(); ЗначениеВДанныеФормы(Таблица1, ЭтаФорма.TOTALКалендарный); КонецПроцедуры но так работать не захотело |
|||
23
su_mai
07.05.14
✎
12:10
|
Адрес временного хранилища по которому мы поместили ТаблицаПрогноза в форме документа "живет" пока открыта форма документа. В этом случае можно вернуть подготовленную таблицу прогноза поместив по этому же адресу: Параметры.ТаблицаПрогноза. Только в этом случае либо параметр "Параметры.ТаблицаПрогноза" должен ключевым, либо этот адрес надо сохранить в реквизите формы обработки. А так же в форме документа надо сохранить в отдельной переменной адрес в который поместили ТаблицаПрогноза. Тогда после возврата в форму документа можно прочитать данные ТаблицаПрогноза по адресу.
|
|||
24
su_mai
07.05.14
✎
12:11
|
+(23) Т.е. в (12) сделать так :
было ПараметрыФормы = Новый Структура("ТаблицаПрогноза", ПоместитьКалендарь(Формы)); стало АдресДанных = ПоместитьКалендарь(Формы); ПараметрыФормы = Новый Структура("ТаблицаПрогноза", АдресДанных); |
|||
25
an_str
07.05.14
✎
12:14
|
С вернуть разобрались, как изменить в обработке эту таблицу не в процедуре ПриСозднииНаСервере)
|
|||
26
su_mai
07.05.14
✎
12:16
|
(23) (24) Отставить!
Мы же вызывали асинхронно форму, по этому необходимо возвращать данные в форму документа через механизм оповещений. В форме документа реализовать обработчик "ОбработкаОповещения(ИмяСобытия, Параметр, Источник)" В форме обработки при закрытии используя метод "Оповестить" передать в форму документа адрес во временном хранилище ТаблицаПрогноза. |
|||
27
su_mai
07.05.14
✎
12:16
|
(25) см. (7)
|
|||
28
an_str
07.05.14
✎
12:34
|
(27) - так, хорошо, я поняла можно не преобразовывать.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес); ЭтаФорма.TOTALКалендарный.Загрузить(ТаблицаПрогноза); КонецПроцедуры так тоже не копируется полученная таблица |
|||
29
su_mai
07.05.14
✎
12:42
|
(28)
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес); ЗначениеВДанныеФормы(ТаблицаПрогноза, "TOTALКалендарный"); КонецПроцедуры Если дальше в обработчиках команд формы TOTALКалендарный заполняется, то см. (6),(7),(8) |
|||
30
an_str
07.05.14
✎
12:56
|
(29) Ошибка при вызове метода контекста (ЗначениеВДанныеФормы)
ЗначениеВДанныеФормы(ТаблицаПрогноза, "TOTALКалендарный"); по причине: Несоответствие типов (параметр номер '2') Хотя ТаблицаПрогноза тип ТаблицаЗначений и TOTALКалендарный тип ТаблицаЗначений, просто беда какая-то( |
|||
31
su_mai
07.05.14
✎
13:02
|
(30) Ну тада так:
&НаСервере Процедура ПриСозданииНаСервере() Если ЭтоАдресВременногоХранилища(Параметры.ТаблицаПрогноза) Тогда ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.ТаблицаПрогноза); Для каждого СтрокаТаблицы Из ТаблицаПрогноза Цикл НоваяСтрока = TOTALКалендарный.Добавить(); ЗаполнитьЗначение(НоваяСтрока, СтрокаТаблицы); КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
32
an_str
07.05.14
✎
15:54
|
su_mai, спасибо большущее...победила)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |