|
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
|
Так хотя бы..
|
|||
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к жителей за такое ЧёНебожители можно и в бубен отхватить? Смелый ты, вообще-то экономист! Отважный... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |