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

Процедура Сформировать()        
    
    ТЗ.ВыбратьСтроки();
    
     Пока ТЗ.ПолучитьСтроку()=1 Цикл  
         Авто=  ТЗ.Авто;
         Вод=   ТЗ.Водитель;
         Док=   ТЗ.Документ;
5 dubolom
 
23.07.21
13:21
(4) Зачем вызывать ОбработатьЭлемент отдельно от Сформировать?
6 Aldnepr
 
23.07.21
13:34
(5) Потому что в этой функции перебираются строки эксель.
7 dubolom
 
23.07.21
13:37
(6) В семёрке же нет клиент-сервера. Вызывайте ОбработатьЭлемент непосредственно из Сформировать и перебирайте строки экселя, в чём проблема-то?
8 Злопчинский
 
23.07.21
13:45
(6) если тз определена внутри функции, то это локальная переменная функции. И если её специальным образом не передать наружу из функции, то при выходе из функции тз будет уничтожена.
9 Злопчинский
 
23.07.21
13:46
А, сорри, тз определена вне функции.
Убивать надо за то что область описания переменных не отделена хотя бы пустой строкой от дальнейшего кода
10 dubolom
 
23.07.21
13:48
(9) Видимо, это не модуль формы, если ТЗ уничтожается в другой процедуре.
Ну, насколько я помню семёрку.
11 Aldnepr
 
23.07.21
13:50
(9) Да, сорри... как сделать чтоб не убивалась эта ТЗ, и не убивать никого(
12 dubolom
 
23.07.21
13:51
(11) Вас (7) чем не устраивает? Пусть ОбработатьЭлемент ТЗ возвращает, а в Сформировать её подхватывайте.
13 Злопчинский
 
23.07.21
13:52
В сформировать перед перебором строк вызвать функцию, тз ведь перед перебором д. Б. Заполнена
14 Злопчинский
 
23.07.21
13:53
Ну и функция странная. После вызова функции в тз будет одна строка.
15 Aldnepr
 
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;
КонецПроцедуры
                  
// ===============================
16 Aldnepr
 
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) ну вот испортил воспитательный процесс...
22 8 bit
 
23.07.21
14:12
(17) соглашусь.
(19) я бы еще объект екселя убил после цикла.
23 Aldnepr
 
23.07.21
14:51
(19) Настоящий ёпрст! Спасибо, заработало как надо.
24 Mikeware
 
23.07.21
15:50
(21) ктулху хотел сказать - "питательный"?
25 Исновая
 
23.07.21
15:55
объяви тз вне процедур, ваш кэп
26 Григорополисец
 
12.12.21
21:11
Уважаемые программисты!

Помогите, пожалуйста, новичку. У меня такая проблема. Создаю таблицу значений в форме документа. В неё я добавляю колонку с типом "СправочникСсылка.ФизЛица". Слеудющие колонки я получаю через запрос из регистра накопления. Название каждой колонки - это значение из запроса, тип: Число. Количество колонок после Физлиц каждый месяц может быть разной. Так вот, получается у меня следующее.

Продавец | ВидНачисления 1 | ВидНачисления2 | ... | ВидНачисленияN

У каждого продавца есть несколько видов начислений, которые соответствуют тому или иному названию колонки.

Я делаю запрос к регистру накопления, получаю такую структуру:

Продавец | Сумма | ВидНачисления.

////////////////////////////////////////

    Для каждого стрВ Из ЗапросСпискаПродавцов Цикл
        
        НоваяСтрока = ТаблицаЗначений.Добавить();
        НоваяСтрока.Продавец = стрВ.Продавец;
        
        Для каждого стрН Из ЗапросСпискаПродавцов_Сумм_ВидовНачислений Цикл
            
            Если стрН.Продавец = стрВ.Продавец Тогда
                
                ТекКолонка = стрН.Признак;
                ТаблицаЗначений.ЗаполнитьЗначения(стрН.Сумма, ТекКолонка);
                
            КонецЕсли;
                        
        КонецЦикла;
        
    КонецЦикла;

По завершении обхода, метод "ЗаполнитьЗначения()" каждый проход не заполняет текущую строку, а перезаполняет очередными значениями весь столбец, то есть у меня в конце обхода все столбцы с одинаковыми суммами. Я никак не могу побороть эту проблему.

Уверен, ответ на поверхности, просто у меня не хватает опыта его найти. Пересмотрел уже кучу форумов. Именно такой проблемы нет. Везде есть стандартный набор колонок. Но у меня задача немного сложнее.

Если кто знает решение, пожалуйста, дайте знать! Буду очень признателен!
P.S. Может, кто-то ответит ссылкой на похожий вопрос...
27 Григорополисец
 
12.12.21
21:19
(26) Забыл написать: Платформа у нас 1С 8.3, А сама конфигурация довольно старая: Розница 1.0
28 Йохохо
 
12.12.21
21:26
(26) "Уверен, ответ на поверхности" нет, на строке 11
29 GreyK
 
12.12.21
21:37
Что-то в 7ку полезли школьники, видимо у кого-то деньги ляшку жмут, нанимают кого не попадя.
30 МихаилМ
 
12.12.21
21:51
(26) урод, зачем ты влез в чужую ветку
31 Злопчинский
 
12.12.21
21:57
(30) ну, зачем так грубо..? можно же культурнее, типа
"ты зачем, человек мешающий обществу, влез в чужую ветку..?"
;-)
32 МихаилМ
 
12.12.21
22:05
(31) можно. но придурки понимают только жесткое.
33 Franchiser
 
гуру
12.12.21
22:13
(26) нет условия на вид начисления
34 Смотрящий
 
12.12.21
22:13
(29) Думают что заплатив 65к, а не 110 стребуют результат на 140,а не получат на 100
Он одумается, гена этот
(30) Фу. Порутчик...
35 Смотрящий
 
12.12.21
22:14
(32) Где ж твоя улыпка, миша. Правила форума почитай, чтоль
36 Григорополисец
 
12.12.21
22:43
Вы тут чё, небожители все что ли? Я вообще-то экономистом работаю и параллельно осваиваю программирование, т.к. мне это интересно.
37 Григорополисец
 
12.12.21
22:43
(30) надеюсь, ваша ветка сильно не пострадала!
38 Смотрящий
 
12.12.21
22:44
(36) ну да. Небожители. а че такова ?
39 Смотрящий
 
12.12.21
22:45
(37) Это не его ветка. Это местный фрик-перфекционист
40 Arbuz
 
13.12.21
17:02
(37) Откровенно говоря, ветка была уже конченная, ещё до твоего перфоманса здесь. Так что - в целом - ничего страшного не произошло. Как кашу маслом не испортишь, так и выгребную яму дерьмом не испугаешь.
Но, ты бы, вообще-то экономист, сначала ознакомился бы с правилами сего форума, с основными понятиями как в программировании, так и в 1С. И не ломился бы как слон в посудной лавке. Полагаю, в твоём селе на 8к жителей за такое ЧёНебожители можно и в бубен отхватить? Смелый ты, вообще-то экономист! Отважный...
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.