7.7 Проблемы с таблицей значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем alex_x, 22 авг 2012.

  1. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Всем добрый день!
    Есть документ с добавленной текстовой колонкой "код" (туда при заполнении документа автоматом пишется код номенклатуры)
    Выгружаю его в ТЗ:


    ВыгрузитьТабличнуюЧасть(ТаблЧасть);
    ТаблЧасть.ВставитьКолонку("кодд");
    i=1;
    ТаблЧасть.ВыбратьСтроки();
    Пока ТаблЧасть.ПолучитьСтроку()=1 Цикл
    кодд=сокрлп(ТаблЧасть.код);
    ТаблЧасть.кодд=кодд;
    ТаблЧасть.УстановитьЗначение(i,"Код",кодд);
    //ТаблЧасть.код=кодд;
    Сообщить(ТаблЧасть.код + "*"+ ТаблЧасть.кодд + "*"+ ТаблЧасть.Номенклатура + "*"+ ТаблЧасть.цена +"*"+ ТаблЧасть.Количество);
    i=i+1;
    КонецЦикла;

    в ТЗ код получается с лишними пробелами, т.е. максимальной длины.
    хочу их убрать.
    (строчка с комментом - это я пробовал и так, и так)
    в результате данной обработки в столбце код упорно остаются лишние пробелы.
    а в столбце кодд - желаемый результат.
    почему?
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Потому что колонка КОД - фиксированной длины. Вот 1с и возвращает вам строку как нужно. Какая стоит задача в целом? Чем мешают пробелы?
  3. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    В данном случае - не могу найти строку по коду.
    Приходится искать по специально созданной колонке кодд.
    далее:

    Если ТаблЧасть.НайтиЗначение(СокрЛП(КодТ), СтрокаТаб, "Кодд") = 1 Тогда
    ПолучитьСтрокуПоНомеру(СтрокаТаб);
    Сообщить(ТаблЧасть.код + "*"+ ТаблЧасть.кодд + "*"+ ТаблЧасть.Номенклатура + "*"+ ТаблЧасть.цена +"*"+ ТаблЧасть.Количество);
    ТаблЧасть.цена = ЦенаТ;
    КонецЕсли;

    Сообщает вообще пустую строчку, в том числе если к полям добавить сокрлп()
    после проставления таким образом цены, и повторной проверки при помощи обработки из первого поста, цена по-прежнему оказывается нулевой.
    Выводит опять исходную таблицу.
  4. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    PS правильнее будет сказать: при повторной проверке при помощи ЦИКЛА из первого поста. Конечно же, я не выгружаю еще раз табличную часть.
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Что-то сильно мудрено у вас. Озвучте задачу в целом
  6. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Задача:
    Выгрузить табличную часть в ТЗ, проставить цену из екселя (перебирая строки в екселе и находя соответствующие строки в ТЗ по коду), загрузить ТЗ обратно в док.
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    используйте поиск по коду в справочнике ТМЦ, а потом уже в выгруженной таблице
  8. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Ну да, это можно. Я просто думал, можно обойтись без доп действия.
    Но какова причина второй проблемы:
    проставляю цены:

    Если ТаблЧасть.НайтиЗначение(СокрЛП(КодТ), СтрокаТаб, "Кодд") = 1 Тогда
    ПолучитьСтрокуПоНомеру(СтрокаТаб);
    Сообщить(ТаблЧасть.код + "*"+ ТаблЧасть.кодд + "*"+ ТаблЧасть.Номенклатура + "*"+ ТаблЧасть.цена +"*"+ ТаблЧасть.Количество);
    ТаблЧасть.цена = ЦенаТ;
    КонецЕсли;

    Сообщает вообще пустую строчку, в том числе если к полям добавить сокрлп()
    Потом проверяю таблицу значений - она не изменилась. Цены нет.

    Выводит опять исходную таблицу.
  9. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Что-то я вообще не понимаю сути этого топика.
    Во-первых, пользуйтесь тегами! Достаточно сложно разобрать мешанину текста.
    Во-вторых, думаю вопросы "почему" тут не уместны (так сделали программисты фирмы 1С). Если и задавать вопрос, то нужно озвучить полностью задачу и спросить "как".

    Что бы лучше понять, с чем имеете дело, то используйте отладчик, там будет видно и что хранится в таблице, и что ищется. Так же рекомендую жестко задать типы добавленных в ТЗ колонок, это исключит разноброд.
  10. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Простите, но я не знаю, что такое теги и как их использовать. В FAQ по составлению тем и ответов я такого понятия не нашел :(

    Начнем с начала:
    Задача: загрузить в документ цены из таблицы Excel. (Позже возможно добавление функционала по обработке табличной части).
    Вот полный текст обработки:

    Код:
    ВыгрузитьТабличнуюЧасть(ТаблЧасть);
    ТаблЧасть.НоваяКолонка("кодд");
    
    ТаблЧасть.ВыбратьСтроки();
    Пока ТаблЧасть.ПолучитьСтроку()=1 Цикл
    ТаблЧасть.кодд=сокрлп(ТаблЧасть.код);
    КонецЦикла;
    
    СледующаяСтрока = "СледующаяСтрока";
    ш = 2;
    Пока СокрЛП(Строка(СледующаяСтрока)) <> "" Цикл
    СледующаяСтрока = НашЛист.Cells(ш+1,1).Value;
    КодТ = СокрЛП(НашЛист.Cells(ш,1).Value);
    ЦенаТ = НашЛист.Cells(ш,6).Value;
    КолвоТ = НашЛист.Cells(ш,5).Value;
    ш= ш + 1;
    Если КодТ = "" Тогда
    Продолжить;
    КонецЕсли;
    Если Номенк.НайтиПоКоду(КодТ,0) = 0 Тогда
    Сообщить("Номенклатура с кодом " + КодТ + " в справочнике не найдена");
    Возврат;
    КонецЕсли;
    СтрокаТаб = 0;
    Если ТаблЧасть.НайтиЗначение(СокрЛП(КодТ), СтрокаТаб, "Кодд") = 1 Тогда
    ПолучитьСтрокуПоНомеру(СтрокаТаб); //---------------ЗДЕСЬ!!!
    ТаблЧасть.цена = ЦенаТ;
    Иначе
    Сообщить("Код " + КодТ + " в документе не найден");
    КонецЕсли;
    КонецЦикла;
    
    ЗагрузитьТабличнуюЧасть(ТаблЧасть);
    
    Все идет по плану до строки с комментарием "ЗДЕСЬ". Похоже, строка по номеру не получается. Хотя СтрокаТаб содержит нужный номер.
    После попытки получить строку в отладчике я вижу, что ТаблЧасть.Номенклатура, ТаблЧасть.Код и другие выражения имеют пустое значение.
  11. TopicStarter Overlay
    alex_x
    Offline

    alex_x

    Регистрация:
    22 авг 2012
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Всё, в другом форуме помогли. В ошибочной строке я случайно применил метод ПолучитьСтрокуПоНомеру к документу, а не к ТЗ.
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1)По тэгам
    Начало
    ["code1c"]
    Окончание
    ["/code1c"]
    (без кавычек)

    2)
    Код:
    ПолучитьСтрокуПоНомеру(СтрокаТаб); //тут вы по получаете строку ДОКУМЕНТА. Вопрос: ДЛЯ ЧЕГО? Надо к ТЗ
    ТаблЧасть.цена = ЦенаТ;
    
    + ЦенаТ может иметь строковый тип. Неизвестно что у вас там в EXCEL. Поэтому надо так

    Код:
    СтрокаТаб = 0;
    Если ТаблЧасть.НайтиЗначение(СокрЛП(КодТ), СтрокаТаб, "Кодд") = 1 Тогда
    ТаблЧасть.ПолучитьСтрокуПоНомеру(СтрокаТаб);
    ТаблЧасть.цена = Число(ЦенаТ);
    Иначе
    Сообщить("Код " + КодТ + " в документе не найден");
    КонецЕсли;
    
    + посмотрите что у вас получается при преобразовании... В EXCEL разделитель это запятая, а в 1с - точка.

Поделиться этой страницей