Имя: Пароль:
1C
1С v8
ОШИБКА: Метод объекта не обнаружен ПолучитьОбъект()
🠗 (Волшебник 16.08.2017 18:23)
0 mihalich979
 
16.08.17
18:13
Конфа самописная
1С 8.3.10

Вот кусок кода:

    Режим = РежимДиалогаВыбораФайла.Открытие;
    
    ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "CSV (*.csv)|*.csv";
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберите файл";
    Если ДиалогОткрытия.Выбрать() Тогда
        ИмяФайла = ДиалогОткрытия.ПолноеИмяФайла;
    Иначе
        Предупреждение("Нет выбранного файла!");
    КонецЕсли;
    
    Таблица = Новый ТаблицаЗначений;

    //очищаем таблицу и удаляем информацию
    Таблица.Очистить();
    Таблица.Колонки.Очистить();

    // чтение
    ЗагружаемыйФайл = Новый ТекстовыйДокумент;
    ЗагружаемыйФайл.Прочитать(ИмяФайла);
    
    //шапка по умолчанию первая строчка
    Шапка = ЗагружаемыйФайл.ПолучитьСтрoку(1);

Уважаемый all помогите.
1 mihalich979
 
16.08.17
18:14
ОШИБКА метод объекта не обнаружен ПолучитьСтроку()

П.С. В заголовке ошибка
2 Heckfy
 
16.08.17
18:16
А где в коде ПолучитьОбъект()???

ЗЫ: Вангую, код выполняется на клиенте. :)
3 Heckfy
 
16.08.17
18:20
Вот этот ШЕДЕВР :)

    Таблица = Новый ТаблицаЗначений;

    //очищаем таблицу и удаляем информацию

    Таблица.Очистить();
    Таблица.Колонки.Очистить();

Тоже не будет на клиенте работать.

Вот это:
    ЗагружаемыйФайл = Новый ТекстовыйДокумент;
    ЗагружаемыйФайл.Прочитать(ИмяФайла);
не есть гуд. На больших файлах получишь жестокий тупняк
лучше замени на
Новый ЧтениеТекста
4 mihalich979
 
16.08.17
18:23
(3) работает  в толстом клиенте прекрасно.
(2) получитьОбъект() - это про какой именно объект?
5 Волшебник
 
модератор
16.08.17
18:23
в цитируемом фрагменте кода ПолучитьОбъект не найден
6 mihalich979
 
17.08.17
10:24
Возможно я что-то делаю не так.

Задача:

- Есть файл CSV (разделитель ";") который надо загрузить в таблицу документа

что хочу:

- заполнить таблицу документа на основании данного файла

что делаю:

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

П.С. Файл формализован изначально, и я не могу повлиять на его содержимое. Редактирование файла перед загрузкой не рассматривается.

П.П.С. запутался немного что на клиента что на сервере делать и как между ними передавать данные.

Вот мой код:

&НаКлиенте
Процедура Загрузить(Команда)
         
    Режим = РежимДиалогаВыбораФайла.Открытие;
    
    ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "CSV (*.csv)|*.csv";
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберите файл";
    Если ДиалогОткрытия.Выбрать() Тогда
        ИмяФайла = ДиалогОткрытия.ПолноеИмяФайла;
    Иначе
        Предупреждение("Нет выбранного файла!");
    КонецЕсли;
    
    
    // чтение
    //ЗагружаемыйФайл = Новый ТекстовыйДокумент;
    ЗагружаемыйФайл = Новый ЧтениеТекста;
    ЗагружаемыйФайл.Прочитать(ИмяФайла);
    
    //шапка по умолчанию первая строчка
    Шапка = ЗагружаемыйФайл.ПрочитатьСтрoку();
    
    //раскладываем строку в массив
    МассивКол = РазложитьСтрокуВМассивПодстрок(Шапка,";"); // процедура из типовой конфигурации, разбивает строку в массив по разделителям

    
    Таблица = Новый ТаблицаЗначений;

    //очищаем таблицу и удаляем информацию
    Таблица.Очистить();
    Таблица.Колонки.Очистить();
    
    //генерируем столбцы
    Для Каждого ИмяСтолбца Из МассивКол Цикл
        ИмяБезПробелов = СтрЗаменить(ИмяСтолбца," ",""); // убираем из имени пробелы
        Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяСтолбца);
        НовыйСтолбец = Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяСтолбца);
        НовыйСтолбец.Данные = ИмяБезПробелов;
    КонецЦикла;
    
    Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл
    
        // получить стрoку с указанным номером и преобразуем её в массив
        Строка = ЗагружаемыйФайл.ПрочитатьСтроку();//ПолучитьСтроку(НомерСтроки);
        МассивКол = РазложитьСтрокуВМассивПодстрок(Строка,";");// процедура из типовой конфигурации, разбивает строку в массив по разделителям
        НоваяСтрочка= Таблица.Добавить();
        
        Если МассивКол.Количество() <> Таблица.Колонки.Количество() Тогда
            Продолжить; // скорее всего в тексте содержит разделитель
        КонецЕсли;
        
        Для НомерСтолбца= 1 по МассивКол.Количество() Цикл
            //заполняем строчку значениями
            ТекущееЗначение = МассивКол[НомерСтолбца-1];
            ИмяКолонки = Таблица.Колонки[НомерСтолбца-1].Имя;
            НоваяСтрочка[ИмяКолонки] = ТекущееЗначение;
        КонецЦикла;
        
    КонецЦикла;
    
    ТабДанныеЗаМесяц = ЭтотОбъект.Элементы.ДанныеЗаМесяц;
    Для Каждого Строка ИЗ Таблица Цикл
        НоваяСтрока = ТабДанныеЗаМесяц.ДобавитьСтроку();
        НоваяСтрока.Дата = Строка.Дата;
    КонецЦикла;
        
КонецПроцедуры

&НаСервере
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",",
    Знач ПропускатьПустыеСтроки = Неопределено)

    Результат = Новый Массив;

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

    Позиция = Найти(Строка, Разделитель);
    Пока Позиция > 0 Цикл
        Подстрока = Лев(Строка, Позиция - 1);
        Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
            Результат.Добавить(Подстрока);
        КонецЕсли;
        Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
        Позиция = Найти(Строка, Разделитель);
    КонецЦикла;

    Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
        Результат.Добавить(Строка);
    КонецЕсли;

    Возврат Результат;

КонецФункции
7 mihalich979
 
17.08.17
10:25
(6)
попытался заменить на "чтениетекста"
еще не работает в данном виде
8 mihalich979
 
17.08.17
10:59
ура. что-то получилось.

передал файл на сервер во временное хранилище и получил его оттуда и смог прочитать.


&НаКлиенте
Процедура Загрузить(Команда)
         
    Режим = РежимДиалогаВыбораФайла.Открытие;
    
    ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "CSV (*.csv)|*.csv";
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберите файл";
    Если ДиалогОткрытия.Выбрать() Тогда
        ИмяФайла = ДиалогОткрытия.ПолноеИмяФайла;
    Иначе
        Предупреждение("Нет выбранного файла!");
    КонецЕсли;
    
    // создадим тестовый файл для передачи
    
    ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПомещенияФайла", ЭтотОбъект);    

    НачатьПомещениеФайла(ОповещениеОЗавершении,
        , // адрес в хранилище
        ИмяФайла, // имя файла
        Ложь, // интерактивно
        ЭтаФорма.УникальныйИдентификатор);
    // если опустить последний параметр, то помещенный файл
    // будет удален после очередного запроса сервера
    // а если указать - то только после удаления объекта формы

    // если нужно предоставить пользователю возможность
    // выбрать файл самому четвёртый параметр (интерактивно)
    // нужно установить в Истина

КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлНаСервереИзХранилищаНаСервере(АдресФайлаВХранилище)

    Если АдресФайлаВХранилище = "" Тогда
        Сообщить("Сначала нужно передать файл с клиента на сервер.");
        Возврат;
    КонецЕсли;

    ДвоичныеДанные =
        ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);

    Если ДвоичныеДанные = Неопределено Тогда
        Сообщить("Похоже файл уже был удалён из хранилища.");
        Возврат;
    КонецЕсли;

    ДвоичныеДанные.Записать("c:\temp\server.txt");

    Текст = Новый ЧтениеТекста("c:\temp\server.txt");
    Пока Истина Цикл
        Строка = Текст.ПрочитатьСтроку();
        Если Строка = Неопределено Тогда
            Прервать;
        Иначе
            Сообщить(Строка);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеПомещенияФайла(Результат, Адрес,
    ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат Тогда

        // сохраним полученный адрес в реквизит формы
        АдресФайлаВХранилище = Адрес;

        Сообщить(
            "Наконец-то! Файл " +
            ВыбранноеИмяФайла + " передан на сервер и сохранён во " +
            "временном хранилище по адресу " + Адрес);

    Иначе

        Сообщить("Не удалось передать файл на сервер.");

    КонецЕсли;
    
    ПрочитатьФайлНаСервереИзХранилищаНаСервере(АдресФайлаВХранилище)

КонецПроцедуры