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