8.х Выгрузка из DBF Ошибка при вызове метода контекста (ПолучитьЗначениеПоля)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем selig, 27 июл 2016.

  1. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток!
    Похоже вопрос изъезженный, но читал и всё-равно ничего не понял.
    Нужно выгрузить данные из DBF. Названия колонок всегда меняются, поэтому привязываюсь к названию полей.
    Код:
    ВыбФайл = Новый Файл(ДанныеПоФайлу.ПутьКФайлу);
    Если НЕ ВыбФайл.Существует() Тогда
       Сообщить("Файл не существует!");
       Возврат;
    КонецЕсли;        
           
    ФайлДБФ  = Новый XBase;
    ФайлДБФ.Кодировка = КодировкаXBase.OEM;
    Попытка
       ФайлДБФ.ОткрытьФайл(ДанныеПоФайлу.ПутьКФайлу);
    Исключение
       Сообщить("Ошибка открытия файла!");
       Возврат;
    КонецПопытки;       
             
    ФайлДБФ.Первая();
    Пока Не ФайлДБФ.ВКонце() Цикл
       НоваяСтрока = Материалы.Добавить();
       КодМатериала = ФайлДБФ.ПолучитьЗначениеПоля(ДанныеПоФайлу.КодМатериала);
       НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(КодМатериала));
                  
       ФайлДБФ.Следующая();
    КонецЦикла;
    на ФайлДБФ.ПолучитьЗначениеПоля(ДанныеПоФайлу.КодМатериала) ошибка
    Заранее спасибо!
    --- Объединение сообщений, 27 июл 2016 ---
    атас какой-то, то работает, то нет
    upload_2016-7-27_16-58-15.png
    Последнее редактирование: 27 июл 2016
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Если зназвания полей постоянно меняются, то нужно какое-то соответствие полей делать.

    Для ПолучитьЗначениеПоля нужно передавать имя этого поля.
  3. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    В ФайлДБФ.ПолучитьЗначениеПоля(ДанныеПоФайлу.КодМатериала) вместо ДанныеПоФайлу.КодМатериала поставьте "КодМатериала", и все. Текст же нужен в параметре.

    PS Вижу, что не так все просто...

    А если в отладчике посмотреть СокрЛП(Строка(ДанныеПоФайлу.КодМатериала))? Что выдаст?
    Последнее редактирование: 27 июл 2016
  4. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    И когда просто ставлю "ZAVMAT" ошибка. Работает только по индексу и то до первой попытки взять поле по строке - после возвращение индекса (как на картинке) отказывается выводить то, что до этого выводилось.

    Выдает
    Еще выпадает ошибка причем исключительно на существующие поля.
    upload_2016-7-27_23-37-9.png
  5. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    А почему в отладчике у Вас названия полей не заглавными буквами? Может и не нужен тут верхний регистр?
  6. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    и так и так пробовал
  7. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    C базой DBF в этот момент никто не работает?
  8. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Доброго всем,
    непонятна строка
    Код:
    КодМатериала = ФайлДБФ.ПолучитьЗначениеПоля(ДанныеПоФайлу.КодМатериала)
    У вас данные о коде материала содержаться в структуре с данными о имени файла ?
    --- Объединение сообщений, 28 июл 2016 ---
    что будет, если значение не найдено, неопределено, пустое ?
    и похоже строк у вас в "Материалах" будет столько же сколько записей в таблице базы XBase
  9. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    upload_2016-7-29_11-54-59.png

    ДанныеПоФайлу - структура возвращаемая из формы, в которой задаются настройки
    ДанныеПоФайлу.КодМатериала - название поля с кодом материала, тип строка
  10. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Вы же получаете значение поля, и пытаетесь получить значение по значению ?
  11. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    я пытаюсь сделать так, как это показано здесь https://helpf.pro/faq8/view/461.html
    --- Объединение сообщений, 29 июл 2016 ---
    upload_2016-7-29_12-16-20.png
    --- Объединение сообщений, 29 июл 2016 ---
    upload_2016-7-29_12-20-15.png
    Последнее редактирование: 29 июл 2016
  12. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Посмотрите есть ли там данные по этому индексу в этой колонке.
  13. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    по индексу все нормально выходит, поэтому переписал уже через индекс, но вопрос остался - "что там не так?"
    --- Объединение сообщений, 29 июл 2016 ---
    Настораживает, что окошко с ошибкой вылетает только на верные поля
    [​IMG]
    и после этого уже строка Пока Не ФайлДБФ.ВКонце() Цикл уже выпадает с ошибкой
  14. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    может вам воспользоваться методом "НайтиПоКлючу"
    --- Объединение сообщений, 29 июл 2016 ---
    Если вы не используете привязку к наименованию полей, то стоит дополнить алгоритм поиском поля в таблице XBase
    т.е. банально в цикле перебрать поля "XBase.Поля" проверить их на совпадение с наименованием искомого поля "КодМатериала" (например с использованием ВРег, как вы написали выше), таким образом вы получите нормальное наименование поля XBase которое годится для "ПолучитьЗначениеПоля"
    Последнее редактирование: 29 июл 2016
  15. TopicStarter Overlay
    selig
    Offline

    selig Опытный в 1С

    Регистрация:
    30 май 2012
    Сообщения:
    50
    Симпатии:
    0
    Баллы:
    26
    Вот так сделал
    Код:
            ФайлДБФ  = Новый XBase;
            ФайлДБФ.Кодировка = КодировкаXBase.OEM;
            Попытка
                ФайлДБФ.ОткрытьФайл(ДанныеПоФайлу.ПутьКФайлу);
            Исключение
                Сообщить("Ошибка открытия файла!");
                Возврат;
            КонецПопытки;
        
            Если Материалы.Количество() > 0 Тогда
                Если Вопрос("Табличная часть будет очищена, продолжить?", РежимДиалогаВопрос.ДаНетОтмена) = КодВозвратаДиалога.Да Тогда
                    Материалы.Очистить();
                КонецЕсли;
            КонецЕсли;
        
            //поиск полей по индексу
            ИндексКодМатериала = Неопределено;
            ИндексМесяц1 = Неопределено;
            ИндексМесяц2 = Неопределено;
            ИндексМесяц3 = Неопределено;
        
            КоличествоПолей = ФайлДБФ.Поля.Количество();
            Для Шаг = 0 По КоличествоПолей - 1 Цикл
                Если ВРег(СокрЛП(ФайлДБФ.Поля[Шаг].Имя)) = ВРег(СокрЛП(ДанныеПоФайлу.КодМатериала)) Тогда 
                    ИндексКодМатериала = Шаг;
                ИначеЕсли ВРег(СокрЛП(ФайлДБФ.Поля[Шаг].Имя)) = ВРег(СокрЛП(ДанныеПоФайлу.Месяц1)) Тогда
                    ИндексМесяц1 = Шаг;
                ИначеЕсли ВРег(СокрЛП(ФайлДБФ.Поля[Шаг].Имя)) = ВРег(СокрЛП(ДанныеПоФайлу.Месяц2)) Тогда
                    ИндексМесяц2 = Шаг;
                ИначеЕсли ВРег(СокрЛП(ФайлДБФ.Поля[Шаг].Имя)) = ВРег(СокрЛП(ДанныеПоФайлу.Месяц2)) Тогда
                    ИндексМесяц3 = Шаг;
                КонецЕсли;
            КонецЦикла;
        
            ФайлДБФ.Первая();
            Пока Не ФайлДБФ.ВКонце() Цикл
                НоваяСтрока = Материалы.Добавить();
                НайденнаяНоменклатура = Справочники.НоменклатураНайтиПоКоду(СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля(ИндексКодМатериала)));
                Если ЗначениеЗаполнено(НайденнаяНоменклатура) Тогда
                    НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
                КонецЕсли;
            
                ФайлДБФ.Следующая();
            КонецЦикла;
  16. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Работает ? Ну, замечательно :)

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