Имя: Пароль:
1C
1С v8
Как работать с данными, загруженными в ТЗ на форму обработки
,
0 dft2014
 
22.04.14
11:44
Пишу внешнюю обработку по загрузке данных из Эксель. На форме обработки разместила ТабличноеПоле имя-"Таблица" (тип - таблица значений). Сначала, по кнопке Прочитать, данные из Эксель попадают в это табличное поле, вот процедура:


Процедура ПрочитатьНажатие(Элемент)
    
    //очищаем таблицу и удаляем колонки
    Таблица.Очистить();
    Таблица.Колонки.Очистить();
    ЭлементыФормы.Таблица.Колонки.Очистить();
    
    
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
        
        //считываем первую строку и генерируем колонки    
        Сч = 1;    
        Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
            ИмяКолонки = Excel.Cells(1, Сч).Text;
            ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
            Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);         
            НоваяКолонка = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
            НоваяКолонка.Данные = ИмяБезПробелов;
            Сч = Сч + 1;
        КонецЦикла;
        
        Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку        
            НоваяСтрока = Таблица.Добавить();        
            Для НомерКолонки = 1 по Таблица.Колонки.Количество() Цикл
                //заполняем строку значениями
                ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text;
                ИмяКолонки = Таблица.Колонки[НомерКолонки-1].Имя;             
                НоваяСтрока[ИмяКолонки] = ТекущееЗначение;            
            КонецЦикла;
        КонецЦикла;  
        
    КонецПроцедуры


А как теперь мне обрабатывать эти данные на форме. Вопрос, как? Пишу:
1 dft2014
 
22.04.14
12:03
+(0) Т.е. мне надо теперь перебрать все строчки ТЗ и загрузить их в справочник. Для этого создала новую кнопку, процедура в ней:


Процедура ЗагрузитьНажатие(Элемент)
    
    Для Каждого Стр Из Таблица Цикл
        
        
        
    КонецЦикла;
    
    
КонецПроцедуры


Как теперь обратиться к каждой строчке каждого столбца?
2 DmitriyDI
 
22.04.14
12:05
Стр точка имя стобца или Стр[номерстолбца]
3 Люблю_УПП
 
22.04.14
12:05
сначала На клиенте заполняешь Таблицу ту что на форму вставил.

Потом передаешь ее на Сервер и записываешь в справочник данные
4 Люблю_УПП
 
22.04.14
12:06
8.3? или 8.2?
5 Fram
 
22.04.14
12:08
(2) ИндексСтолбца
6 Люблю_УПП
 
22.04.14
12:09
выгрузи Таблицу  в ТаблицуЗначение.


Типо


ТЗ = Новый ТаблицаЗначений;

Тз.Загрузить(ТвояТаблицаСФормы)

или

ТвояТаблицаСФормы.ВЫгрузить(ТЗ);
7 Люблю_УПП
 
22.04.14
12:10
а дальше уже работай с таблицей значений
8 dft2014
 
22.04.14
12:11
(3), (4) Платформа 8.2, ЗУП. Загружаю из Эксель в спр.ФЛ
9 Адинэснег
 
22.04.14
12:12
Процедура ЗагрузитьНажатие(Элемент)
    
    Для Каждого Стр Из Таблица Цикл
        Для Каждого Кол Из   Таблица.Колонки Цикл

               Сообщить (Кол.Имя + Стр[Кол.Имя]);
        

        КонецЦикла;
    КонецЦикла;
    
    
КонецПроцедуры
10 dft2014
 
22.04.14
12:12
(6) У меня ТабличноеПоле изначально имеет тип таблица значений.
(7) Как?
11 Люблю_УПП
 
22.04.14
12:13
(8)  тогда выгружай Таблицу из формы в Таблицу значений и дальше уше с ней работай.   наверное самый простой вариант
12 Люблю_УПП
 
22.04.14
12:14
Процедура ЗагрузитьНажатие(Элемент)
    
ТЗ = Новый ТаблицаЗначений;

Тз.Загрузить(ТвояТаблицаСФормы);

    Для Каждого Стр Из ТЗ Цикл
      

       Сотрудник = Стр.Сотрудник; //

        

      
    КонецЦикла;
    
    
КонецПроцедуры
13 Адинэснег
 
22.04.14
12:15
(10)ТабличноеПоле изначально имеет тип ТабличноеПоле
а вот данные ТабличноеПоле может и таблица значений :)
14 Люблю_УПП
 
22.04.14
12:15
какие там у тебя колонки в таблице?
15 dft2014
 
22.04.14
12:22
(13), (14) Вот ТабличноеПоле (тип-ТЗ), колонок нет, сюда грузятся данные из Эксель: http://s018.radikal.ru/i515/1404/69/fc3290574797.jpg
16 Люблю_УПП
 
22.04.14
12:26
(15) Попробуй


Для каждого СтрокаТЗ из ТабличноеПоле  цикл


Сообщить(СтрокаТЗ.(Название));


КонецЦикла;
17 dft2014
 
22.04.14
12:28
+(15) А после загрузки из Эксель в ТабличноеПоле, в нем устанавливаются столбцы по аналогии с Эксель-файлом (код я написала в (0)), вот: http://i058.radikal.ru/1404/1d/a60c053d4214.jpg
18 Люблю_УПП
 
22.04.14
12:29
а я понял.  У вас нет названий колонок. тогда 9 попробуйте
19 dft2014
 
22.04.14
12:29
И мне теперь надо понять, как обратиться к колонке, содержащено НаменованиеФЛ, или к колонке ДатеРождения и т.д.
20 Люблю_УПП
 
22.04.14
12:30
Для каждого СтрокаТЗ из ТабличноеПоле  цикл

Сообщить(СтрокаТЗ.TAB_NOMER);


КонецЦикла;
21 dft2014
 
22.04.14
15:23
Всем спасибо. Теперь не создает новый элемент в справочнике "ФЛ"... Вот код:


Функция СоздатьФЛ(СпрФЛ, ТекСтрока)
    
    СпрФЛ = Справочники.ФизическиеЛица.СоздатьЭлемент();
    СпрФЛ.Наименование = ТекСтрока.FIO;
    СпрФЛ.ИНН = ТекСтрока.INN;
    СпрФЛ.Записать();
    
КонецФункции


Процедура ЗагрузитьНажатие(Элемент)
    
    Для Каждого СтрокаТЧ Из Таблица Цикл
        СпрФЛ = Справочники.ФизическиеЛица;
        
        Если СпрФЛ.НайтиПоНаименованию(СтрокаТЧ.FIO) = 0 Тогда
            ТекФЛ = СоздатьФЛ(СпрФЛ, СтрокаТЧ);
        Иначе
            ТекФЛ = СпрФЛ.ТекущийЭлемент();
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры
22 antoneus
 
22.04.14
15:26
Если СпрФЛ.НайтиПоНаименованию(СтрокаТЧ.FIO) = 0

это не семёрка таки
23 dft2014
 
22.04.14
15:37
(22) Что не так?
24 Enders
 
22.04.14
15:41
а она разве не пустую ссылку возвращает или неопределено, если не находит?
Откуда 0 то?) в Сп гляньте
25 Torquader
 
22.04.14
15:45
Последний раз, когда писал загрузку из Excel на УФ делал в два этапа - первый этап - создание Excel на клиенте и загрузка данных из него в массив (простые типы - только то, что есть в Excel), на втором этапе массив отправляется на сервер, где из него уже начинают формироваться объекты в базе.
26 dft2014
 
22.04.14
15:48
(25) У меня ЗУП, платформа 8.2.
27 dft2014
 
22.04.14
15:49
(24) Переписала, все равно не создает новых:

Функция СоздатьФЛ(СпрФЛ, ТекСтрока)
    
    СпрФЛ = Справочники.ФизическиеЛица.СоздатьЭлемент();
    СпрФЛ.Наименование = ТекСтрока.FIO;
    СпрФЛ.ИНН = ТекСтрока.INN;
    СпрФЛ.Записать();
    
КонецФункции


Процедура ЗагрузитьНажатие(Элемент)
    
    Для Каждого СтрокаТЧ Из Таблица Цикл
        
        ФЛ = Справочники.ФизическиеЛица.НайтиПоНаименованию(СокрЛП(СтрокаТЧ.FIO),Истина);
        Если ФЛ <> Справочники.ФизическиеЛица.ПустаяСсылка() Тогда
            ТекФЛ = СоздатьФЛ(ФЛ, СтрокаТЧ);
        Иначе
            Сообщить(СтрокаТЧ.FIO);
        КонецЕсли;        
        
    КонецЦикла;
    
КонецПроцедуры
28 dft2014
 
22.04.14
15:51
Нашла ошибку!!!
Вместо:
Если ФЛ <> Справочники.ФизическиеЛица.ПустаяСсылка() Тогда


Надо было:
Если ФЛ = Справочники.ФизическиеЛица.ПустаяСсылка() Тогда
29 Enders
 
22.04.14
15:53
Ну и кстати, зачем вы передаёте параметр ФЛ, в процедуру СоздатьФЛ? Если в ней же этот параметр и меняете?
Передавайте только строчку.
30 Eugene_life
 
22.04.14
15:54
(0) Я бы посоветовал в данном случае не обработку писать, а загружать через Загрузку из табличного документа. Можно в выражении написать код, который создаст не достающих