Имя: Пароль:
1C
1С v8
ТаблицаЗначений управляемые формы
,
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, спасибо большущее...победила)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn