Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
31 мая 2024, 21:19

Загрузка в 1С

Автор Ивашка, 30 сен 2020, 19:41

0 Пользователей и 1 гость просматривают эту тему.

Ивашка

Здравствуйте!!! Помогите пожалуйста исправить ошибки в обработке в управляемых формах. Делаю загрузку в 1С из файла CSV, но возникла ошибка
{ВнешняяОбработка.ДанныеКПП.Форма.Форма.Форма(39)}: Ошибка при вызове метода контекста (Добавить)
ТЗ.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
по причине:
Неверное имя колонки

Ивашка

Исправил на Разделитель = ";" и ошибка исчезла, но сейчас в результате ничего не выводится, это потому что я не вывел ТЗ на форму?

IL2016

Цитата: Ивашка от 30 сен 2020, 19:41Добавить(ИмяБезПробелов,,ИмяКолонки)
совет: в синтакс-помощнике наберите эту функцию и почитайте как нужно указать данные внутри скобок.

Использую учебную платформу 1С:Предприятие 8.3

Ивашка

задача стоит у меня так: Загрузить из csv в 1с и записать эти данные в регистр сведений, записал функцию

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

Что надо вместо вопросительных знаков писать? или до записи что-то еще необходимо сделать?

alexandr_ll

Цитата: Ивашка от 01 окт 2020, 20:24
задача стоит у меня так: Загрузить из csv в 1с и записать эти данные в регистр сведений, записал функцию

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

Что надо вместо вопросительных знаков писать? или до записи что-то еще необходимо сделать?
Поскольку В регистре Поставщик и товар - это ссылки на конкретные элементы справочников, то эти ссылки нужно получить, сопоставив значения из таблицы значений методами НайтиПоКодУ, найтипоНаименованию, найтиПоРеквизиту или другими.

Ивашка

записал запрос и в цикле произвел записи в регистр, но ничего в результате не выводит(((, в чем ошибка?
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ТЗ.ВремениСобытия КАК ВремениСобытия,
        |   ТЗ.NAME КАК Имя,
        |   ТЗ.FIRSTNAME КАК Фамилия,
        |   ТЗ.События КАК События
        |ПОМЕСТИТЬ ВТ_ТЗ
        |ИЗ
        |   &ТЗ КАК ТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ_ТЗ.ВремениСобытия КАК ВремениСобытия,
        |   ВТ_ТЗ.Имя КАК Имя,
        |   ВТ_ТЗ.Фамилия КАК Фамилия,
        |   ВТ_ТЗ.События КАК События,
        |   ФизическоеЛицо.Ссылка КАК Ссылка,
        |   ФизическоеЛицо.ИмяДляСинхронизации КАК ИмяДляСинхронизации,
        |   ФизическоеЛицо.ФамилияДляСинхронизации КАК ФамилияДляСинхронизации
        |ИЗ
        |   ВТ_ТЗ КАК ВТ_ТЗ
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическоеЛицо КАК ФизическоеЛицо
        |       ПО ВТ_ТЗ.Имя = ФизическоеЛицо.ИмяДляСинхронизации
        |           И ВТ_ТЗ.Фамилия = ФизическоеЛицо.ФамилияДляСинхронизации
        |
        |УПОРЯДОЧИТЬ ПО
        |   Ссылка,
        |   ВремениСобытия";
    Запрос.УстановитьПараметр("ТЗ",ТЗ);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл   
        Менеджер = РегистрыСведений.ДанныеКПП.СоздатьМенеджерЗаписи();
        Менеджер.ФизическоеЛицо = Выборка.Имя + " " + Выборка.Фамилия;
        Если ЗначениеЗаполнено(Менеджер.ДатаВхода) Тогда
            Менеджер.ДатаВхода = Выборка.ВремениСобытия;
            Менеджер.ДатаВыхода = Дата("00010101");
        Иначе
            Менеджер.ДатаВхода = Дата("00010101");
            Менеджер.ДатаВыхода = Выборка.ВремениСобытия;
        КонецЕсли;

alexandr_ll

Цитата: Ивашка от 05 окт 2020, 23:25
записал запрос и в цикле произвел записи в регистр, но ничего в результате не выводит(((, в чем ошибка?
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ТЗ.ВремениСобытия КАК ВремениСобытия,
        |   ТЗ.NAME КАК Имя,
        |   ТЗ.FIRSTNAME КАК Фамилия,
        |   ТЗ.События КАК События
        |ПОМЕСТИТЬ ВТ_ТЗ
        |ИЗ
        |   &ТЗ КАК ТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ_ТЗ.ВремениСобытия КАК ВремениСобытия,
        |   ВТ_ТЗ.Имя КАК Имя,
        |   ВТ_ТЗ.Фамилия КАК Фамилия,
        |   ВТ_ТЗ.События КАК События,
        |   ФизическоеЛицо.Ссылка КАК Ссылка,
        |   ФизическоеЛицо.ИмяДляСинхронизации КАК ИмяДляСинхронизации,
        |   ФизическоеЛицо.ФамилияДляСинхронизации КАК ФамилияДляСинхронизации
        |ИЗ
        |   ВТ_ТЗ КАК ВТ_ТЗ
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическоеЛицо КАК ФизическоеЛицо
        |       ПО ВТ_ТЗ.Имя = ФизическоеЛицо.ИмяДляСинхронизации
        |           И ВТ_ТЗ.Фамилия = ФизическоеЛицо.ФамилияДляСинхронизации
        |
        |УПОРЯДОЧИТЬ ПО
        |   Ссылка,
        |   ВремениСобытия";
    Запрос.УстановитьПараметр("ТЗ",ТЗ);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл   
        Менеджер = РегистрыСведений.ДанныеКПП.СоздатьМенеджерЗаписи();
        Менеджер.ФизическоеЛицо = Выборка.Имя + " " + Выборка.Фамилия;
        Если ЗначениеЗаполнено(Менеджер.ДатаВхода) Тогда
            Менеджер.ДатаВхода = Выборка.ВремениСобытия;
            Менеджер.ДатаВыхода = Дата("00010101");
        Иначе
            Менеджер.ДатаВхода = Дата("00010101");
            Менеджер.ДатаВыхода = Выборка.ВремениСобытия;
        КонецЕсли;

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

Ивашка

Надо проверить, если временисобытия(вход) пуста, то дата выводится пустой, и временисобытия(выход) пуста, то дата выводится также пустой, у меня че то не выводится ничего, или я не там проверяю на пустоту? Бывает же,что забыли записать на входе или выходе
Пока Выборка.Следующий() Цикл 
        Если Выборка.События = 1 Тогда
            Если НЕ ЗначениеЗаполнено(Выборка.ВремениСобытия) Тогда
                ДатаВхода = Дата("00010101");
            Иначе
                ДатаВхода = Выборка.ВремениСобытия;
            КонецЕсли;
        ИначеЕсли Выборка.События = 2 Тогда   
            Если НЕ ЗначениеЗаполнено(Выборка.ВремениСобытия) Тогда
                ДатаВыхода = Дата("00010101");
            Иначе
                ДатаВыхода = Выборка.ВремениСобытия;
            КонецЕсли;
           
            Менеджер = РегистрыСведений.ДанныеКПП.СоздатьМенеджерЗаписи();
            Менеджер.ФизическоеЛицо = Выборка.Ссылка;
       
            Менеджер.ДатаВхода = ДатаВхода;
            Менеджер.ДатаВыхода = ДатаВыхода;
           
            Менеджер.Записать();
        КонецЕсли;
       
    КонецЦикла;

Добавлено: 06 окт 2020, 22:30


на картинке видно, ДатаВхода считывает правильно, так как в файле есть 03.08.2020 Вход, а вот 03.08.2020 Выхода в файле нету, значит надо вывести пустую дату(00010101)
Добавлено: 08 окт 2020, 09:40


у меня щас В таблице получилось, что вошёл 3-го, а вышел 27-го, как изменить код, чтоб картина была такаяПроцедура ЗагрузкаНаСервере(Файл)
    // создаем разделитель
    Разделитель = ";";
   
    //получаем шапку из файла (первую строку)
    Шапка = Файл.ПолучитьСтроку(1);
       
    //раскладываем строку в массив
    МассивКолонок = СтрРазделить(Шапка,Разделитель);
   
    //создаем таблицу значений
    ТаблицаЗначения = Новый ТаблицаЗначений;
   
    //создаем в таблице значений колонки
    ТаблицаЗначения.Колонки.Добавить("ВремениСобытия", Новый ОписаниеТипов("Дата"));
    //длина колонок 100 символов
    КвалификаторыСтроки = Новый КвалификаторыСтроки(100);
    ТаблицаЗначения.Колонки.Добавить("NAME", Новый ОписаниеТипов("Строка",КвалификаторыСтроки));
    ТаблицаЗначения.Колонки.Добавить("FIRSTNAME", Новый ОписаниеТипов("Строка",КвалификаторыСтроки));
    ТаблицаЗначения.Колонки.Добавить("Вход", Новый ОписаниеТипов("Дата"));
    ТаблицаЗначения.Колонки.Добавить("Выход", Новый ОписаниеТипов("Дата"));
   
    Для НомерСтроки = 2 по Файл.КоличествоСтрок() Цикл       
        //получаем строку файла с указанным номером и преобразуем её в массив
        МассивКолонок = СтрРазделить(Файл.ПолучитьСтроку(НомерСтроки),Разделитель);
        МассивКолонок[0] = ПреобразоватьДату(МассивКолонок[0]);
        Если СтрНайти(МассивКолонок[4],"Вход") Тогда
            НоваяСтрока = ТаблицаЗначения.Добавить();
            Для НомерКолонки = 0 по 2 Цикл НоваяСтрока[НомерКолонки] = МассивКолонок[НомерКолонки]; КонецЦикла;
            НоваяСтрока.Вход = НоваяСтрока.ВремениСобытия;
        ИначеЕсли СтрНайти(МассивКолонок[4],"Выход") Тогда
            СписокВходовБезВыходов = ТаблицаЗначения.НайтиСтроки(Новый Структура("NAME,FIRSTNAME,Выход",МассивКолонок[1],МассивКолонок[2],Дата("00010101")));
            Если СписокВходовБезВыходов.Количество()>0 Тогда
                СписокВходовБезВыходов[СписокВходовБезВыходов.ВГраница()].Выход = МассивКолонок[0];
                //Выход приписываем к самому последнему входу
            Иначе // Выход без входа (да-да, бывает и такое)
                НоваяСтрока = ТаблицаЗначения.Добавить();
                Для НомерКолонки = 0 по 2 Цикл НоваяСтрока[НомерКолонки] = МассивКолонок[НомерКолонки]; КонецЦикла;
                НоваяСтрока.Выход = НоваяСтрока.ВремениСобытия;
            КонецЕсли;
        КонецЕсли;
           
    КонецЦикла;
   
    // создаем запрос и получаем в запросе поля таблицы значений
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ТЗ.Вход КАК Вход,
        |   ТЗ.Выход КАК Выход,
        |   ТЗ.NAME КАК Имя,
        |   ТЗ.FIRSTNAME КАК Фамилия
        |ПОМЕСТИТЬ ВТ_ТаблицаЗначений
        |ИЗ
        |   &ТЗ КАК ТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ_ТаблицаЗначений.Вход КАК Вход,
        |   ВТ_ТаблицаЗначений.Выход КАК Выход,
        |   ФизическиеЛица.Ссылка КАК ФизЛицо,
        |   ФизическиеЛица.АИ_ИмяДляСинхронизации КАК ИмяДляСинхронизации,
        |   ФизическиеЛица.АИ_ФамилияДляСинхронизации КАК ФамилияДляСинхронизации,
        |   ВТ_ТаблицаЗначений.Имя КАК Имя,
        |   ВТ_ТаблицаЗначений.Фамилия КАК Фамилия
        |ИЗ
        |   ВТ_ТаблицаЗначений КАК ВТ_ТаблицаЗначений
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
        |       ПО ВТ_ТаблицаЗначений.Имя = ФизическиеЛица.АИ_ИмяДляСинхронизации
        |           И ВТ_ТаблицаЗначений.Фамилия = ФизическиеЛица.АИ_ФамилияДляСинхронизации
        |
        |УПОРЯДОЧИТЬ ПО
        |   ФизЛицо,
        |   Вход,
        |   Выход";
   
    // устаналиваем параметры запроса
    Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначения);
    Выборка = Запрос.Выполнить().Выбрать();
   
    //пока есть записи, записываем их в регистр сведений
    Пока Выборка.Следующий() Цикл
        // создаем менеджер для записи в регистр
        МенеджерЗаписи = РегистрыСведений.АИ_ДанныеКПП.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ФизическоеЛицо = Выборка.ФизЛицо;
           
        МенеджерЗаписи.ДатаВхода = Выборка.Вход;
        МенеджерЗаписи.ДатаВыхода = Выборка.Выход;
       
        //записываем их
        МенеджерЗаписи.Записать();
    КонецЦикла;   
       
КонецПроцедуры

Помогите пожалуйста

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск