Имя: Пароль:
1C
1С v8
Загрузить в РегистрСведений из Эксель
,
0 dft2014
 
16.05.14
13:00
Загружаю из Эксель данные в регистр сведений "Заметки" (это в ЗУП). Файл состоит из трех колонок:
- ФИО
- Номер
- Дата
Все загружается, кроме измерения "Дата" в этом регистре (данные должны браться из Эксель, из столбца "Дата"). Подскажите, где ошибка, вот код:



Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Если Не ЗначениеЗаполнено(ИмяФайлаДляЗагр) Тогда
        Сообщить("Не выбран файл!");
        Возврат;
    КонецЕсли;
    
    СодержимоеФайла = ПолучитьСодержимоеФайла(ИмяФайлаДляЗагр);    
    
    Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
        Сообщить("Ошибка считывания содержимого файла " + ИмяФайлаДляЗагр);
        Возврат;
    КонецЕсли;
    
    Если Не ЗаписатьЛС(СодержимоеФайла) Тогда
        Сообщить("Ошибка при попытке записи ЛС!");
        Возврат;
    КонецЕсли;        
    
    Сообщить("Данные загружены!");
    
КонецПроцедуры

Функция ПолучитьСодержимоеФайла(ИмяФайлаДляЗагр)
    
    ВозврМассив = Новый Массив;
    МассивСтр = Новый Массив;
    ТаблЗнач = Новый ТаблицаЗначений;
    
    ТаблЗнач.Очистить();
    ТаблЗнач.Колонки.Добавить("ФИО");
    ТаблЗнач.Колонки.Добавить("НомерАД");
    ТаблЗнач.Колонки.Добавить("ДатаАД");
    
    
    // Excel
    Попытка
        
        Excel = Новый COMОбъект("Excel.Application");            
        Excel.WorkBooks.Open(ИмяФайлаДляЗагр);
        
        РабЛист = Excel.Worksheets(1);
        РабЛист.Activate();
        
        ОбщКолво = ПоследняяСтрока - ПерваяСтрока + 1;
        
        счСтр = ПерваяСтрока;
        Пока счСтр <= ПоследняяСтрока Цикл
            ТекСтрДанных = Новый Массив;
            новСтр = ТаблЗнач.Добавить();
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаФИО).Value);  
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[0] = ЗначениеДанных;
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаНомерАД).Value);  
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[1] = ЗначениеДанных;
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаДатаАД).Value);  
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[2] = ЗначениеДанных;
            
            МассивСтр.Добавить(ТекСтрДанных);
            
            счСтр = счСтр + 1;
            
        КонецЦикла;
        
        Excel.Quit();
        Excel = 0;
        
        Возврат МассивСтр;
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат ВозврМассив;
    КонецПопытки;    
    
КонецФункции

Функция ЗаписатьЛС(ТаблМас)
    
    ТаблНом = Новый ТаблицаЗначений;    
    ТаблНом.Очистить();
    
    ТаблНом.Колонки.Добавить("ФИО");
    ТаблНом.Колонки.Добавить("НомерАД");
    ТаблНом.Колонки.Добавить("ДатаАД");
    
    ОбщКолво = ТаблМас.Количество();
    
    Для сч1 = 0 По ТаблМас.Количество() - 1 Цикл
        СтрТаблНом = ТаблНом.Добавить();        
        Для сч2 = 0 По 1 Цикл        
            СтрТаблНом[сч2] = ТаблМас[сч1][сч2];            
        КонецЦикла;        
    КонецЦикла;
    
    ОбщКолво = ТаблНом.Количество();
    
    Для Каждого стрНом Из ТаблНом Цикл
        
        ВидЗ = Справочники.ВидыЗаметок.НайтиПоНаименованию("договор");
        Если  НЕ ВидЗ.Пустая() Тогда
            ВидЗаметки = ВидЗ.Ссылка;
            
            з=Новый Запрос;
            з.Текст=        
            "ВЫБРАТЬ
            |    Заметки.Дата,
            |    Заметки.Объект,
            |    Заметки.ВидЗаметки
            |ИЗ
            |    РегистрСведений.Заметки КАК Заметки
            |ГДЕ
            |    Заметки.Объект = &ФЛ
            |    И Заметки.ВидЗаметки = &Вид";
            
            з.УстановитьПараметр("ФЛ",стрНом.ФИО);
            з.УстановитьПараметр("Вид", ВидЗаметки);
            
            ТаблРез = З.Выполнить().Выгрузить();
            ТаблРезКол = ТаблРез.Количество();            
            
            Если ТаблРезКол = 0 Тогда
                
                Запрос = Новый Запрос();
                Запрос.Текст =
                "ВЫБРАТЬ
                |    ФизическиеЛица.Ссылка
                |ИЗ
                |    Справочник.ФизическиеЛица КАК ФизическиеЛица
                |ГДЕ
                |    ФизическиеЛица.Наименование = &ФИО"
                ;
                
                Запрос.УстановитьПараметр("ФИО", стрНом.ФИО);
                
                ТаблФИО = Запрос.Выполнить().Выгрузить();
                ТаблФИОКол = ТаблФИО.Количество();
                
                Если ТаблФИОКол = 0 Тогда
                    Сообщить("Не найден сотрудник " + стрНом.ФИО);
                    Продолжить;
                ИначеЕсли ТаблФИОКол > 1 Тогда
                    Сообщить("Не уникален сотрудник " + стрНом.ФИО);
                    Продолжить;
                КонецЕсли;
                
                ЗаписьРС = РегистрыСведений.Заметки.СоздатьМенеджерЗаписи();
                ЗаписьРС.Дата = стрНом.ДатаАД;       // вот эта дата не подгружается
                ЗаписьРС.Объект = ТаблФИО[0].Ссылка;
                //        ЗаписьРС.Автор = ;
                ЗаписьРС.Содержание = стрНом.НомерАД;
                ЗаписьРС.ВидЗаметки = ВидЗаметки;
                ЗаписьРС.Записать();
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции
1 dft2014
 
16.05.14
13:02
+(0) Есть у меня подозрение, что неправильно написала в начале функции ЗаписатьЛС(), возможно, столбец с датой не видит... Вот:


Функция ЗаписатьЛС(ТаблМас)
    
    ТаблНом = Новый ТаблицаЗначений;    
    ТаблНом.Очистить();
    
    ТаблНом.Колонки.Добавить("ФИО");
    ТаблНом.Колонки.Добавить("НомерАД");
    ТаблНом.Колонки.Добавить("ДатаАД");
    
    ОбщКолво = ТаблМас.Количество();
    
    Для сч1 = 0 По ТаблМас.Количество() - 1 Цикл
        СтрТаблНом = ТаблНом.Добавить();        
        Для сч2 = 0 По 1 Цикл        
            СтрТаблНом[сч2] = ТаблМас[сч1][сч2];            
        КонецЦикла;        
    КонецЦикла;
    
    ОбщКолво = ТаблНом.Количество();
2 dft2014
 
16.05.14
13:03
Запуталась с массивом и ТЗ...
Помогите!!!
3 mexanik_96
 
16.05.14
13:19
стрНом.ДатаАД какой тип? строка?
4 Gogger
 
16.05.14
13:20
А зачем делать такую загрузку ректально газовой горелкой?
Есть прекрасная типовая обработка "Загрузка данных из табличного документа". Воспользуйтесь ей.
5 mexanik_96
 
16.05.14
13:26
религия она такая ))
6 dft2014
 
16.05.14
13:46
(4) Пробовал типовой: она перезаписывает, а мне надо добавлять, чтобы у сотрудника было несколько заметок. Поэтому и пишу свою обработку.
7 dft2014
 
16.05.14
13:47
(3) Не прописывала. В Эксель-файле она тип "дата": 12.03.2014 например
8 mexanik_96
 
16.05.14
14:01
в 1с стрНом.ДатаАД какой тип?
9 dft2014
 
16.05.14
14:01
Ап!
10 dft2014
 
16.05.14
14:02
Комп глючит! В отладку не заходит (((
11 mexanik_96
 
16.05.14
14:03
типзнч(стрНом.ДатаАД) что там?
12 dft2014
 
16.05.14
14:05
сейчас...
13 Gogger
 
16.05.14
14:06
(6) у типовой есть настройки, в том числе и те, которые регулируют - перезаписывать, или добавлять...
14 dft2014
 
16.05.14
14:07
(8), (11)  "Не определено" пишет через Сообщить(ТипЗнч(стрНом.ДатаАД));
15 dft2014
 
16.05.14
14:08
(13) типовая мне не подходит, речь здесь не о ней...
16 mexanik_96
 
16.05.14
14:10
Что здесь ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаДатаАД).Value)?
17 Aleks73
 
16.05.14
14:13
ТС, весь эльфокод не читал, попробуй отладчик.
18 dft2014
 
16.05.14
14:14
(17) отладчик не запускается, см.(10), уже и комп перегружала...
19 dft2014
 
16.05.14
14:18
(16) Написала:

ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаФИО).Value);  //сотрудник
            Сообщить(ЗначениеДанных + " *0 ");
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[0] = ЗначениеДанных;
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаНомерАД).Value);  //номер ЛС
            Сообщить(ЗначениеДанных + " *1 ");
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[1] = ЗначениеДанных;
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаДатаАД).Value);  //номер ЛС
            Сообщить(ЗначениеДанных + " *2 ");
            ТекСтрДанных.Добавить(ЗначениеДанных);
            новСтр[2] = ЗначениеДанных;


Выводит:


Кузнецов Артем Алексеевич *0
2 *1
12.03.2014 0:00:00 *2
20 Aleks73
 
16.05.14
14:19
хорошо тогда попробуй так
дт = СокрЛП(Эксель.ActiveSheet.Cells(к,8).Value);
если дт <> "" тогда
дт = лев(дт,10);
ПОПЫТКА
новдог.Дата = дата(число(ПРАВ(дт,4)),число(ЛЕВ(ПРАВ(дт,7),2)),лев(дт,2));
исключение
//сообщить("Не удалось ДАТА" + СокрЛП(Эксель.ActiveSheet.Cells(к,8).Value) + " на строке "+ к);
конецпопытки ;
конецесли;
21 Aleks73
 
16.05.14
14:20
это конечно если время ставить начало дня
22 dft2014
 
16.05.14
14:23
Я думаю ошибка в том, что изначально, в коде было только две колонки и все грузилось отлично, затем я добавила колонку ДатаАД и она не грузится:

ТаблНом.Колонки.Добавить("ФИО");
ТаблНом.Колонки.Добавить("НомерАД");
ТаблНом.Колонки.Добавить("ДатаАД");    //это я добавила


Вероятно, надо поменять что-то здесь, т.к. это для двух колонок - срабатывает, а если три колонки, то нет:


ОбщКолво = ТаблМас.Количество();

Для сч1 = 0 По ТаблМас.Количество() - 1 Цикл
    СтрТаблНом = ТаблНом.Добавить();        
    Для сч2 = 0 По 1 Цикл        
        СтрТаблНом[сч2] = ТаблМас[сч1][сч2];            
    КонецЦикла;        
КонецЦикла;

ОбщКолво = ТаблНом.Количество();

Для Каждого стрНом Из ТаблНом Цикл
23 dft2014
 
16.05.14
14:24
(20) это куда вставлять?
24 Aleks73
 
16.05.14
14:25
(23) это нужно творчески переработать.
25 mexanik_96
 
16.05.14
14:29
Функция ПолучитьСодержимоеФайла(ИмяФайлаДляЗагр)
    
    ТаблЗнач = Новый ТаблицаЗначений;
    ТаблЗнач.Колонки.Добавить("ФИО");
    ТаблЗнач.Колонки.Добавить("НомерАД");
    ТаблЗнач.Колонки.Добавить("ДатаАД");
    
    Попытка
        
        Excel = Новый COMОбъект("Excel.Application");            
        Excel.WorkBooks.Open(ИмяФайлаДляЗагр);
        
        РабЛист = Excel.Worksheets(1);
        РабЛист.Activate();
        
        ОбщКолво = ПоследняяСтрока - ПерваяСтрока + 1;
        
        счСтр = ПерваяСтрока;
        Пока счСтр <= ПоследняяСтрока Цикл
            
            новСтр = ТаблЗнач.Добавить();
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаФИО).Value);  
            новСтр.ФИО = ЗначениеДанных;
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаНомерАД).Value);  
            новСтр.НомерАД = ЗначениеДанных;
            
            ЗначениеДанных = НормСтрокаВыгр(РабЛист.Cells(счСтр, КолонкаДатаАД).Value);  
            новСтр.ДатаАД = ЗначениеДанных;
            
            счСтр = счСтр + 1;
            
        КонецЦикла;
        
        Excel.Quit();
        Excel = 0;
        
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;    
    
    Возврат ТаблЗнач;
    
КонецФункции

Функция ЗаписатьЛС(ТаблМас)
    
      
    ТаблМас = ТаблНом.Количество();
    
    Для Каждого стрНом Из ТаблМас Цикл
        
        ВидЗ = Справочники.ВидыЗаметок.НайтиПоНаименованию("договор");
        Если  НЕ ВидЗ.Пустая() Тогда
            ВидЗаметки = ВидЗ.Ссылка;
            
            з=Новый Запрос;
            з.Текст=        
            "ВЫБРАТЬ
            |    Заметки.Дата,
            |    Заметки.Объект,
            |    Заметки.ВидЗаметки
            |ИЗ
            |    РегистрСведений.Заметки КАК Заметки
            |ГДЕ
            |    Заметки.Объект = &ФЛ
            |    И Заметки.ВидЗаметки = &Вид";
            
            з.УстановитьПараметр("ФЛ",стрНом.ФИО);
            з.УстановитьПараметр("Вид", ВидЗаметки);
            
            ТаблРез = З.Выполнить().Выгрузить();
            ТаблРезКол = ТаблРез.Количество();            
            
            Если ТаблРезКол = 0 Тогда
                
                Запрос = Новый Запрос();
                Запрос.Текст =
                "ВЫБРАТЬ
                |    ФизическиеЛица.Ссылка
                |ИЗ
                |    Справочник.ФизическиеЛица КАК ФизическиеЛица
                |ГДЕ
                |    ФизическиеЛица.Наименование = &ФИО"
                ;
                
                Запрос.УстановитьПараметр("ФИО", стрНом.ФИО);
                
                ТаблФИО = Запрос.Выполнить().Выгрузить();
                ТаблФИОКол = ТаблФИО.Количество();
                
                Если ТаблФИОКол = 0 Тогда
                    Сообщить("Не найден сотрудник " + стрНом.ФИО);
                    Продолжить;
                ИначеЕсли ТаблФИОКол > 1 Тогда
                    Сообщить("Не уникален сотрудник " + стрНом.ФИО);
                    Продолжить;
                КонецЕсли;
                
                ЗаписьРС = РегистрыСведений.Заметки.СоздатьМенеджерЗаписи();
                
                Рег = РегистрыСведений.Ассортимент.СоздатьМенеджерЗаписи();
                        
                ЗаписьРС.Дата = стрНом.ДатаАД;       // вот эта дата не подгружается

                ЗаписьРС.Объект = ТаблФИО[0].Ссылка;
                //        ЗаписьРС.Автор = ;

                ЗаписьРС.Содержание = стрНом.НомерАД;
                ЗаписьРС.ВидЗаметки = ВидЗаметки;
                ЗаписьРС.Записать();
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции
26 dft2014
 
16.05.14
15:37
(25) Выдал ошибку:

{Форма.Форма.Форма(341)}: Итератор для значения не определен
    Для Каждого стрНом Из ТаблМас Цикл
27 ДенисЧ
 
16.05.14
15:38
ТаблМас = ТаблНом.Количество();
  Для Каждого стрНом Из ТаблМас Цикл

facepalm.png
28 dft2014
 
16.05.14
15:42
(25), (27) Пишет ошибку еще только при синтаксич.контроле:

{Форма.Форма.Форма(339,11)}: Переменная не определена (ТаблНом)
ТаблМас = <<?>>ТаблНом.Количество();
29 dft2014
 
16.05.14
16:07
Разобралась!
mexanik_96 - СПАСИБО!!! *)