Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Работа с Таблица значений

v7: Работа с Таблица значений
Я
   Aldnepr
 
23.07.21 - 13:00
Есть таблица значений, которая заполняется в функции. Нужно взять из нее данные из другой процедуры. Объявил в начале модуля Перем ТЗ; не работает. Как к ней добраться?
   mikecool
 
1 - 23.07.21 - 13:00
если это не реквизит формы, то передать параметром в процедуру, ваш кеп
   1Сергей
 
2 - 23.07.21 - 13:01
Что значит "не работает"?
   Aldnepr
 
3 - 23.07.21 - 13:18
(1) Это не реквизит формы. Данные вытягиваются из файла Ексель функцией с циклом в ТЗ, затем мне нужно уже работать с данными в этой таблице.
перем ТЗ;
Функция ОбработатьЭлемент(ТМЦ, ТекСтрока, Excel)//2 

    
    ТЗ= СоздатьОбъект("ТаблицаЗначений");
    тз.НоваяКолонка("Авто", "Строка");
    тз.НоваяКолонка("Водитель", "Строка");
    тз.НоваяКолонка("Документ", "Строка");
    
    тз.НоваяСтрока();
    тз.Авто=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбАВТО).Value)));
    
    
    тз.Водитель=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбСотр).Value)));
    
    
    тз.Документ=Сред((Строка(Excel.Cells(ТекСТрока, СтлбРН).Value)),21,10);
   Aldnepr
 
4 - 23.07.21 - 13:19
Затем из другой процедуры пытаюсь взять данные.
Процедура Сформировать()        
    
    ТЗ.ВыбратьСтроки(); 
    
     Пока ТЗ.ПолучитьСтроку()=1 Цикл  
         Авто=  ТЗ.Авто;
         Вод=   ТЗ.Водитель;
         Док=   ТЗ.Документ;
   dubolom
 
5 - 23.07.21 - 13:21
(4) Зачем вызывать ОбработатьЭлемент отдельно от Сформировать?
   Aldnepr
 
6 - 23.07.21 - 13:34
(5) Потому что в этой функции перебираются строки эксель.
   dubolom
 
7 - 23.07.21 - 13:37
(6) В семёрке же нет клиент-сервера. Вызывайте ОбработатьЭлемент непосредственно из Сформировать и перебирайте строки экселя, в чём проблема-то?
   Злопчинский
 
8 - 23.07.21 - 13:45
(6) если тз определена внутри функции, то это локальная переменная функции. И если её специальным образом не передать наружу из функции, то при выходе из функции тз будет уничтожена.
   Злопчинский
 
9 - 23.07.21 - 13:46
А, сорри, тз определена вне функции.
Убивать надо за то что область описания переменных не отделена хотя бы пустой строкой от дальнейшего кода
   dubolom
 
10 - 23.07.21 - 13:48
(9) Видимо, это не модуль формы, если ТЗ уничтожается в другой процедуре.
Ну, насколько я помню семёрку.
   Aldnepr
 
11 - 23.07.21 - 13:50
(9) Да, сорри... как сделать чтоб не убивалась эта ТЗ, и не убивать никого(
   dubolom
 
12 - 23.07.21 - 13:51
(11) Вас (7) чем не устраивает? Пусть ОбработатьЭлемент ТЗ возвращает, а в Сформировать её подхватывайте.
   Злопчинский
 
13 - 23.07.21 - 13:52
В сформировать перед перебором строк вызвать функцию, тз ведь перед перебором д. Б. Заполнена
   Злопчинский
 
14 - 23.07.21 - 13:53
Ну и функция странная. После вызова функции в тз будет одна строка.
   Aldnepr
 
15 - 23.07.21 - 14:02
(14) Вот полный  модуль перебора строк Эксель.Переделал. Всё заполняется
//=======================================================


Функция ОбработатьСтроку(Товар, ТекСтрока, Excel)
    Тип = Excel.Cells(ТекСтрока, 1).Value;
    Состояние("Обрабатывается строка " + ТекСТрока);


    ТЗ= СоздатьОбъект("ТаблицаЗначений");
    тз.НоваяКолонка("Авто", "Строка");
    тз.НоваяКолонка("Водитель", "Строка");
    тз.НоваяКолонка("Документ", "Строка");
    тз.НоваяКолонка("ВЧ", "Строка"); 
    
    
     
    тз.НоваяСтрока();
    тз.Авто=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбАВТО).Value)));
    
    
    тз.Водитель=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбСотр).Value)));

    
    тз.Документ=Сред((Строка(Excel.Cells(ТекСТрока, СтлбРН).Value)),21,10);
    
    тз.ВЧ=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбВЧ).Value)));
    Сообщить(Тз.авто+" "+тз.Водитель+" "+Тз.Документ);
    Возврат 1;
КонецФункции    
//=========================================================


Процедура Выполнить() 
    Тов = СоздатьОбъект("Справочник.Номенклатура");
    
    Excel = СоздатьОбъект("Excel.Application");
    Excel.Workbooks.Open(Сокрлп(ИмяФайла));
    Книга = Excel.ActiveWorkbook;
    //

    Строк=200;
    //    Строк = Excel.Cells.CurrentRegion.Rows.Count;

    //            

    НачатьТранзакцию();
    Для ТекСтрока = 2 По Строк Цикл
        Если ОбработатьСтроку(Тов, ТекСтрока, Excel)= 0 Тогда
            ЗафиксироватьТранзакцию();
            Возврат;
        КонецЕсли;
    КонецЦикла;
    //                                

    ЗафиксироватьТранзакцию();
    Excel.Visible = 1;
КонецПроцедуры
                  
// ===============================
   Aldnepr
 
16 - 23.07.21 - 14:04
Какие параметры передать в ОбработатьСтроку(???????) вместо вопросов
Процедура Сформировать()  
     ОбработатьСтроку(??????? );
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    ТЗ.ВыбратьСтроки(); 
    
     Пока ТЗ.ПолучитьСтроку()=1 Цикл  
         Авто=  ТЗ.Авто;
         Вод=   ТЗ.Водитель;
         Док=   ТЗ.Документ;
         Веч= ТЗ.ВЧ;
     КонецЦикла;
   Ёпрст
 
17 - 23.07.21 - 14:04
(15) феерический п..ц
   серый КТУЛХУ
 
18 - 23.07.21 - 14:10
во-первых - убери наф транзакцию.
у тебя в цикле вызывается функция, которая (повторю - в цикле!) при каждом ее вызове - пере(!)сознает тз и добавляет в нее единственную строку. перенеси создание тз и добавление в нее колонок в начало процедуры Выполнить
   Ёпрст
 
19 - 23.07.21 - 14:10
Так хотя бы..

Функция ОбработатьСтроку(ТЗ,Товар, ТекСтрока, Excel)
    Тип = Excel.Cells(ТекСтрока, 1).Value;
    Состояние("Обрабатывается строка " + ТекСТрока);
    тз.НоваяСтрока();
    тз.Авто=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбАВТО).Value)));
    тз.Водитель=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбСотр).Value)));
    тз.Документ=Сред((Строка(Excel.Cells(ТекСТрока, СтлбРН).Value)),21,10);
    тз.ВЧ=СокрЛП((Строка(Excel.Cells(ТекСТрока, СтлбВЧ).Value)));
    Сообщить(Тз.авто+" "+тз.Водитель+" "+Тз.Документ);
    Возврат 1;
КонецФункции    
//=========================================================



Процедура Выполнить() 
    
    ТЗ= СоздатьОбъект("ТаблицаЗначений");
    тз.НоваяКолонка("Авто", "Строка");
    тз.НоваяКолонка("Водитель", "Строка");
    тз.НоваяКолонка("Документ", "Строка");
    тз.НоваяКолонка("ВЧ", "Строка"); 

    Тов = СоздатьОбъект("Справочник.Номенклатура");
    
    Excel = СоздатьОбъект("Excel.Application");
    Excel.Workbooks.Open(Сокрлп(ИмяФайла));
    Книга = Excel.ActiveWorkbook;
    //


    Строк=200;
    //    Строк = Excel.Cells.CurrentRegion.Rows.Count;

   Для ТекСтрока = 2 По Строк Цикл
        Если ОбработатьСтроку(ТЗ,Тов, ТекСтрока, Excel)= 0 Тогда
            Возврат;
        КонецЕсли;
    КонецЦикла;
    Excel.Visible = 1;
КонецПроцедуры

   серый КТУЛХУ
 
20 - 23.07.21 - 14:11
ну и в (15) куда-то пропало "Перем ТЗ;" из (0) - причем указано что это "полный модуль".
добавь в (15) первую строку "Перем ТЗ;"
   серый КТУЛХУ
 
21 - 23.07.21 - 14:12
(19) ну вот испортил воспитательный процесс...
   8 bit
 
22 - 23.07.21 - 14:12
(17) соглашусь.
(19) я бы еще объект екселя убил после цикла.
   Aldnepr
 
23 - 23.07.21 - 14:51
(19) Настоящий ёпрст! Спасибо, заработало как надо.
   Mikeware
 
24 - 23.07.21 - 15:50
(21) ктулху хотел сказать - "питательный"?
   Исновая
 
25 - 23.07.21 - 15:55
объяви тз вне процедур, ваш кэп


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.