Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Заполнение программного созданных реквизитов формы на стороне клиента.

Заполнение программного созданных реквизитов формы на стороне клиента.
Я
   BelousovSergey
 
08.12.17 - 10:26
Опустим постановку задачи, перейдем к сути:

Есть форма, на которой программно создаются реквизиты формы и элементы к ним, заполняются данными из внешних файлов.

Проблема в следующем: к программно созданному реквизиту формы нельзя обратиться через ".", в следствии чего я не могу найти способ для заполнения / чтения этих реквизитов без вызова методов РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы(), что заставляет для любого обращения к этим данным вызывать сервер.
Сейчас заполнение такого реквизита выглядит следующим образом:

1) На клиенте читается внешний файл, формируется массив из структур строк, передается на сервер.
2) На сервере вызывается РеквизитФормыВЗначение() заполняется реквизит и передается обратно через ЗначениеВРеквизитФормы()

Вопрос: как получить доступ к данным программно созданных реквизитов на стороне клиента?

Пример кода:

&НаКлиенте
Перем ExcelApplication;

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); 
    ДиалогОткрытияФайла.ПолноеИмяФайла = ""; 
    ДиалогОткрытияФайла.Фильтр = "(*.xls;*.xlsx)|*.xls;*.xlsx"; 
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь; 
    ДиалогОткрытияФайла.Заголовок = "Выберите файл"; 
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда 
        
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; 
        
        Если МассивФайлов.Количество() = 1 Тогда
            ПутьКФайлу = МассивФайлов[0];
        КонецЕсли;
        
    КонецЕсли; 
    
КонецПроцедуры

&НаКлиенте                                                                          
Процедура ПрочитатьФайл(Команда)
    
    ОчиститьФорму();
    
    Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
        Сообщить("Не выбран файл для загрузки!"); 
        Возврат;
    КонецЕсли;
    
    УстановитьСоединениеСExcel();
    
    МассивОписанийКолонов = СформироватьМассивОписанийКолонок();
    
    СформироватьТаблицуДанные(МассивОписанийКолонов);
    ЗаполнитьТаблицуДанные(МассивОписанийКолонов);
    
    РазорватьСоединениеСExcel();
    
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСоединениеСExcel()
    
    Попытка 
        ExcelApplication = Новый COMОбъект("Excel.Application");
        ExcelApplication.WorkBooks.Open(ПутьКФайлу);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        ExcelApplication = Неопределено;
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки() );
        Возврат; 
    КонецПопытки; 

    Попытка  
        ExcelApplication.Sheets(1).Select(); 
    Исключение
        РазорватьСоединениеСExcel();
        Сообщить("Файл " + Строка(ПутьКФайлу) + " не соответствует необходимому формату! Первый лист не найден!"); 
        Возврат; 
    КонецПопытки;
    
КонецПроцедуры

&НаКлиенте
Процедура РазорватьСоединениеСExcel()
    
    ExcelApplication.ActiveWorkbook.Close();     
    ExcelApplication.Quit();
    ExcelApplication = Неопределено;
    
КонецПроцедуры

&НаКлиенте
Функция СформироватьМассивОписанийКолонок()
    
    МассивОписанийКолонок = Новый Массив;
    
    Сч = 1; 
    Пока ЗначениеЗаполнено(ExcelApplication.Cells(1, Сч).Text) Цикл 
        
        Структура = Новый Структура;
        Структура.Вставить("НомерКолонки", Сч);
        Структура.Вставить("ИмяКолонки", "Колонка" + Строка(Сч) );
        Структура.Вставить("СинонимКолонки", ExcelApplication.Cells(1, Сч).Text);
        Структура.Вставить("ТипКолонки", Неопределено);
        
        МассивОписанийКолонок.Добавить(Структура);
        
        Сч = Сч + 1;
        
    КонецЦикла;
 
     Возврат МассивОписанийКолонок;
 
КонецФункции

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

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

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

&НаКлиенте
Процедура ЗаполнитьТаблицуДанные(МассивОписанийКолонок)
        
    МассивСтруктурСтрок = Новый Массив;
    
    Версия = Лев(ExcelApplication.Version, Найти(ExcelApplication.Version, ".") - 1); 
    Если Версия = "8" тогда 
        ФайлСтрок = ExcelApplication.Cells.CurrentRegion.Rows.Count; 
        ФайлКолонок = Макс(ExcelApplication.Cells.CurrentRegion.Columns.Count, 13); 
    Иначе
        ФайлСтрок = ExcelApplication.Cells(1, 1).SpecialCells(11).Row; 
        ФайлКолонок = ExcelApplication.Cells(1, 1).SpecialCells(11).Column; 
    Конецесли;

    Для НС = 2 по ФайлСтрок Цикл
        
        ОбработкаПрерыванияПользователя();
        
        Состояние("Файл " + ПутьКФайлу + ": Обрабатывается первый лист " + Формат( ?(ФайлСтрок = 0, 0, (100 * НС) / ФайлСтрок) , "ЧЦ=3; ЧДЦ=0") + "%"); 
        
        СтруктураСтроки = Новый Структура;
                
        Для Каждого ОписаниеКолонки Из МассивОписанийКолонок Цикл
            ИмяКолонки = ОписаниеКолонки.ИмяКолонки;            
            ТекущееЗначение = ExcelApplication.Cells(НС, ОписаниеКолонки.НомерКолонки).Text; 
 
            СтруктураСтроки.Вставить(ИмяКолонки, ТекущееЗначение); 
            
        КонецЦикла; 

        МассивСтруктурСтрок.Добавить(СтруктураСтроки);
    КонецЦикла;
    
    ЗагрузитьМассивСтруктурСтрокВТаблицуДанные(МассивСтруктурСтрок);

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

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

&НаСервере
Процедура ОчиститьФорму()
    
    МассивУдаляемыхРеквизитов = Новый Массив;
    
    МассивРеквизитовФормы = ПолучитьРеквизиты();
    Для Каждого РеквизитФормы Из МассивРеквизитовФормы Цикл    
        Если РеквизитФормы.Имя = "Данные" Тогда
            МассивУдаляемыхРеквизитов.Добавить("Данные");            
        КонецЕсли;
    КонецЦикла;
    
    Элемент = Элементы.Найти("Данные");
    
    Если Элемент <> Неопределено Тогда
        Элементы.Удалить(Элементы.Найти("Данные") );
    КонецЕсли;
    
    ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
    
КонецПроцедуры
 
 
   Волшебник
 
Модератор
1 - 08.12.17 - 10:35
Опишите задачу
   BelousovSergey
 
2 - 08.12.17 - 10:47
Я же написал: "Опустим постановку задачи". Это просто научный интерес, но можно привести массу примеров, где это может понадобиться.
   vicof
 
3 - 08.12.17 - 10:51
ЭтотОбъект[ИмяРеквизита]
   BelousovSergey
 
4 - 08.12.17 - 10:55
Хах, ларчик то просто открывался :) спасибо, vicof.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует