Имя: Пароль:
1C
1С v8
Обработка загрузки XLS в справочник
0 Олеся999
 
22.01.15
08:39
Здравствуйте!
Пытаюсь сделать чтобы в место 3 колонок стало 5,  добавила Объект.СоответствиеПолей[3].КолонкаВЭксель = 14 ;,  Объект.СоответствиеПолей[4].КолонкаВЭксель = 17 ; так же добавила в  Справочник Остатки в табличную часть "Остатки"  еще 2 рекизита (Реквизит4, Реквизит5). Запустила и выдает ошибку" {Форма.ФормаУпр.Форма(232)}: Поле объекта не обнаружено (Реквизит4)
            НС["Реквизит" + (Стр.ПолучитьИдентификатор() + 1)] = ТекЗначение;
" Не могу понять в чем дело, подскажите пожалуйста ?

Код:  &НаКлиенте
      Процедура ПриОткрытии(Отказ)
      //список справочников базы
      ЭтаФорма.Элементы.Справочник.СписокВыбора.Очистить();
    
    МассивСправочников = ПолучитьСписокСправочников();
    
    Для Каждого Спр Из МассивСправочников Цикл
        ЭтаФорма.Элементы.Справочник.СписокВыбора.Добавить(Спр);
    КонецЦикла;
    
    //добавить основные параметры
    Объект.НастройкиЭксель.Очистить();
//с какой по какую строку берем, и какой лист    
    СтрокаНастройки=Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Номер листа";
    СтрокаНастройки.Значение  = 1;
    
    СтрокаНастройки=Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Первая строка";
    СтрокаНастройки.Значение  = 1;

    СтрокаНастройки=Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Последняя строка";
    СтрокаНастройки.Значение  = 2;
    
//Здесь указываются из каких колонок в xls будем брать.
    Объект.СоответствиеПолей[0].КолонкаВЭксель = 2;
    Объект.СоответствиеПолей[1].КолонкаВЭксель=  6 ;
    Объект.СоответствиеПолей[2].КолонкаВЭксель = 11 ;
    Объект.СоответствиеПолей[3].КолонкаВЭксель = 14 ;
        Объект.СоответствиеПолей[4].КолонкаВЭксель = 17 ;


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

&НаСервере
Функция ПолучитьСписокСправочников()
    
    МассивСправочников = Новый Массив;
    
    Для Каждого Спр Из Метаданные.Справочники Цикл
        МассивСправочников.Добавить(Спр.Имя);
    КонецЦикла;
    
    Возврат МассивСправочников;
    
КонецФункции

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Укажите файл импорта";
    ДиалогВыбора.Фильтр =
    "Файлы excel (*.xls;*.xlsx)|*.xls;*.xlsx|";
    
    Если (Не ДиалогВыбора.Выбрать()) Тогда
        Возврат;
    КонецЕсли;    
    
    Объект.ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;

    //+++ Добавил при изменение файла искать по полям
    ЗаполнитьПараметры();
    
КонецПроцедуры

&НаКлиенте
Функция ЗаполнитьПараметры()
    
    xlLastCell = 11;
    НомерЛиста = 1;
    
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(Объект.ПутьКФайлу);
        Состояние("Обработка файла...");
        ExcelЛист = Excel.Sheets(НомерЛиста);
    Исключение
        Сообщить("Ошибка. Не получилось прочитать файл.");
        Возврат ложь;
    КонецПопытки;
    
    ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
    RowCount = ActiveCell.Row;
    ColumnCount = ActiveCell.Column;
    НомерСтроки = 1;
    
    ДиапазонДанных = ExcelЛист.Range(ExcelЛист.Cells(1, 1), ExcelЛист.Cells(RowCount, ColumnCount));

    ИскомоеЗначениеНомерFootprint = "ComponentName"; // метка старта
    НайденнаЯчейка = ДиапазонДанных.Find(ИскомоеЗначениеНомерFootprint);
    НомерFootprint  = НайденнаЯчейка.Row; // номер строки    
    
    ИскомоеЗначениеНомерApproved =  "25082"; // метка стоп    
    НайденнаЯчейка = ДиапазонДанных.Find(ИскомоеЗначениеНомерApproved);
    НомерApproved = НайденнаЯчейка.Row;
    
    Excel.WorkBooks.Close();
    Excel = 0;

    Объект.НастройкиЭксель.Очистить();
    СтрокаНастройки = Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Номер листа";
    СтрокаНастройки.Значение  = 1;
    
    СтрокаНастройки=Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Первая строка";
    СтрокаНастройки.Значение  = НомерFootprint+1;

    СтрокаНастройки=Объект.НастройкиЭксель.Добавить();
    СтрокаНастройки.Параметр  = "Последняя строка";
    СтрокаНастройки.Значение  = НомерApproved+1;
КонецФункции // ЗаполнитьПараметры()



&НаСервере
Процедура ЗаполнитьРеквизитыСправочника()
    
    Для Каждого Стр Из Метаданные.Справочники.ОстаткиТехнолоджи.ТабличныеЧасти.Остатки.Реквизиты Цикл
        
        Если Стр.Имя = "Номенклатура" Тогда
            
            Продолжить;
        КонецЕсли;
        
        СтрокаТаблицы = Объект.СоответствиеПолей.Добавить();
        СтрокаТаблицы.РеквизитВ1С = Стр.Имя;
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьРеквизитыСправочника()
    
    Рекв=Новый Массив;
    Для Каждого Стр Из Метаданные.Справочники[Объект.ТекСправочник].Реквизиты Цикл
    

        Рекв.Добавить(Стр.Имя);
    КонецЦикла;
        
    Возврат Рекв;
    
КонецФункции

&НаКлиенте
Процедура Загрузить(Команда)
ФормаСпр = ПолучитьФорму("Справочник.ОстаткиТехнолоджи.ФормаВыбора", );

ФормаСпр.Открыть();
    
    Элементы.Загрузить.ЦветФона = WebЦвета.Зеленый;    
    // Вставить содержимое обработчика.
    Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
        Сообщить("Не выбран файл для загрузки!",СтатусСообщения.ОченьВажное);
        Возврат;
    КонецЕсли;
    
    НомерЛиста=Объект.НастройкиЭксель[0].Значение;
    Если Не ЗначениеЗаполнено(НомерЛиста) Тогда
        Сообщить("На закладке *Настройки эксель* не выбран номер листа",СтатусСообщения.ОченьВажное);    
        Возврат;    
    КонецЕсли;
    
    ПерваяСтрока=Объект.НастройкиЭксель[1].Значение;
    Если Не ЗначениеЗаполнено(ПерваяСтрока) Тогда
        Сообщить("На закладке *Настройки эксель* не выбрана первая строка",СтатусСообщения.ОченьВажное);    
        Возврат;    
    КонецЕсли;
    
    ПоследняяСтрока=Объект.НастройкиЭксель[2].Значение;
    Если Не ЗначениеЗаполнено(ПоследняяСтрока) Тогда
        Сообщить("На закладке *Настройки эксель* не выбрана последняя строка",СтатусСообщения.ОченьВажное);    
        Возврат;    
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(Объект.ТекСправочник) Тогда
        Сообщить("Не выбран справочник!",СтатусСообщения.ОченьВажное);
        Возврат;
    КонецЕсли;

    ИмяОбъекта = Объект.ТекСправочник;
    
    //ФайлЭксель = ПолучитьCOMОбъект(Объект.ПутьКФайлу);
    //Лист = ФайлЭксель.Worksheets(НомерЛиста);
    
    ПрочитатьИСоздатьЭлементы(НомерЛиста,ПерваяСтрока,ПоследняяСтрока);
    //ПрочитатьИСоздатьЭлементы();
    
КонецПроцедуры

&НаСервере
Функция ЗаписатьСпецификацию()
    ЭлементСпец = Объект.ТекСправочник.ПолучитьОбъект();
    ЭлементСпец.Остатки.Очистить();
    Для каждого Стр Из тзExcel Цикл
        НС = ЭлементСпец.Остатки.Добавить();
        Для Каждого СтрС Из Объект.СоответствиеПолей Цикл
            НС[СтрС.РеквизитВ1С]    = Стр["Реквизит" + (СтрС.ПолучитьИдентификатор() + 1)];
        КонецЦикла;
    КонецЦикла;
    Попытка
        ЭлементСпец.Записать();
    Исключение
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат Ложь;
    КонецПопытки;
    Возврат Истина;
КонецФункции


&НаКлиенте
Процедура ПрочитатьИСоздатьЭлементы(НомерЛиста,ПерваяСтрока,ПоследняяСтрока)
    
    ФайлЭксель = ПолучитьCOMОбъект(Объект.ПутьКФайлу);
    Лист = ФайлЭксель.Worksheets(НомерЛиста);
    Флаг=0;
    Для ТекСтр = ПерваяСтрока По ПоследняяСтрока Цикл
        НС = тзExcel.Добавить();
        Для Каждого Стр Из Объект.СоответствиеПолей Цикл
            Если Не ЗначениеЗаполнено(Стр.КолонкаВЭксель) Тогда
                Продолжить;
            КонецЕсли;
            
            //         Попытка
            ТекЗначение = Лист.Cells(ТекСтр, Стр.КолонкаВЭксель).Value;
            НС["Реквизит" + (Стр.ПолучитьИдентификатор() + 1)] = ТекЗначение;
            
        КонецЦикла;
    КонецЦикла;
    Ошибки = ЗаписатьСпецификацию();
    
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЗаполнитьРеквизитыСправочника();
КонецПроцедуры

&НаКлиенте
Процедура Перезаполнить(Команда)
    
    ЗаполнитьПараметры()
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
    // Вставить содержимое обработчика.
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры





Скрин: http://lvkr.ru/f/b9VRSA/1280.jpg
Обработка: http://www.fayloobmennik.net/4509974
1 Олеся999
 
22.01.15
08:40
2 RomaH
 
naïve
22.01.15
08:43
в ТЗексель - нет такой колонки
3 Олеся999
 
22.01.15
08:45
(2)Как нету, когда есть ))
4 RomaH
 
naïve
22.01.15
08:46
(3) скрин
5 RomaH
 
naïve
22.01.15
08:47
(3) отладчиком пользоваться умеешь?
вычисли выражение тзExcel и раскрой его полностью
6 Krolik Bezobraznik
 
22.01.15
08:48
Не пойму, надо из справочника в Excel или наоборот?
7 RomaH
 
naïve
22.01.15
08:49
у тебя эта ТЗ описана в реквизитах формы
в справочник реквизиты добавила, а в ТЗ - забыла
8 Олеся999
 
22.01.15
08:52
(6) из exel в справочник 1С
9 RomaH
 
naïve
22.01.15
08:55
а где олеся 998?
92-ю нашел
а остальные 806?
10 Олеся999
 
22.01.15
08:55
11 Krolik Bezobraznik
 
22.01.15
08:55
(8) Так проще простого. Из Excel в ТЗ а оттуда в справочник.

Вот процедуры. В ТЗ запихнете, ну а там уже знаете что делать 0;

Функция УбратьПробелыВСтроке(ИмяКолонки)
    ИтогоСтрока = СокрЛП(ИмяКОлонки);
    ПробелыУбраны = Ложь;
    Пока НЕ ПробелыУбраны Цикл
        НомерСимвола = Найти(ИтогоСтрока, " ");
        Если НомерСимвола = 0 Тогда
            ПробелыУбраны = Истина;
        Иначе
            СимволВРег = ВРег(Сред(ИтогоСтрока, НомерСимвола + 1,1));
            ЛеваяЧасть = Лев(ИтогоСтрока, НомерСимвола-1);
            ПраваяЧасть = Сред(ИтогоСтрока, НомерСимвола+2, СтрДлина(ИтогоСтрока));
            ИтогоСтрока = ЛеваяЧасть + СимволВРег + ПраваяЧасть;
        КонецЕсли;
    КонецЦикла;
    Возврат ИтогоСтрока;
КонецФункции
//Функция конвертирует данные из Excel в Таблизу значений
Функция ПрочитатьИзExcelВТЗ(ИмяФайла, ИмяЛиста, ИмяПервойКОлонки = "") Экспорт
    
    Excel = новый COmObject("Excel.Application");
    Excel.Visible = False;
    Excel.DisplayAlerts = 1;
    
    ФайлСДанными = Excel.WorkBooks.Open(ИмяФайла);
    
    Попытка
        Лист = ФайлСДанными.Sheets(ИмяЛиста);
    Исключение
        Сообщить(ОписаниеОшибки());
        Сообщить("Скорее всего, в файле екселя не найден лист с именем """ + ИмяЛиста + """.");
        Возврат Неопределено;
    КонецПопытки;
        
    НомерКолонкиИсходный = 1;
    
    ТаблицаДанных = Новый ТаблицаЗначений;
    НомерКолонки = НомерКолонкиИсходный;    
    ИмяКолонки = Лист.Cells(3,НомерКолонки).Value;
    ЧислоКолонок = ФайлСДанными.ActiveSheet.UsedRange.Columns.Count;
    
    Для ТекНомерКолонки = 1 По ЧислоКолонок Цикл
        ТаблицаДанных.Колонки.Добавить("Колонка" + Строка(ТекНомерКолонки));
    КонецЦикла;
    
    НомерИсходнойСтроки = 1;
    ФлагКонцаЦикла = 0;
    НомерТекущейСтроки = НомерИсходнойСтроки;
    
    Пока ФлагКонцаЦикла = 0 Цикл
        НоваяСтрока = ТаблицаДанных.Добавить();
        ЭтоПустаяСтрока = Истина;
        Для ИндексКолонки = 0 По ЧислоКолонок - 1 Цикл
            ДанныеЯчейки = Лист.Cells(НомерТекущейСтроки,НомерКолонкиИсходный + ИндексКолонки).value;
            НомерКолонкиТек = ИндексКолонки + 1;
            НоваяСтрока["Колонка" + НомерКолонкиТек] = ДанныеЯчейки;
            Если ДанныеЯчейки <> "" И ДанныеЯчейки <> Неопределено Тогда
                ЭтоПустаяСтрока = Ложь;
            КонецЕсли;
        КонецЦикла;
        Если ЭтоПустаяСтрока И НомерТекущейСтроки > 20 Тогда
            ФлагКонцаЦикла = Истина;
        КонецЕсли;
        
        НомерТекущейСтроки = НомерТекущейСтроки + 1;
    КонецЦикла;
    
    Если ИмяПервойКОлонки = "" Тогда
        СтрокаСНазваниямиКолонок = ТаблицаДанных[0];
    Иначе
        СтрокаСНазваниямиКолонок = ТаблицаДанных.Найти("ИмяПервойКолонки");
    КонецЕсли;
    
    Если СтрокаСНазваниямиКолонок = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
        НачальныйНомер = 1;
        ИмяБезПробелов = УбратьПробелыВСтроке(СтрокаСНазваниямиКолонок[Колонка.Имя]);
        
        Нашли = ТаблицаДанных.Колонки.Найти(ИмяБезПробелов);
        Пока Нашли <> Неопределено Цикл
            
            Если Нашли <> Неопределено Тогда
                ИмяБезПробелов = ИмяБезПробелов + Строка(НачальныйНомер);
            КонецЕсли;
            
            Нашли = ТаблицаДанных.Колонки.Найти(ИмяБезПробелов);
            НачальныйНомер = НачальныйНомер +1;
        КонецЦикла;
        Попытка
            Колонка.Имя = ИмяБезПробелов;
        Исключение
            текстСообщения = "Уберите из колонки """ + СтрокаСНазваниямиКолонок[Колонка.Имя]+ """ все спец. символы. Не должно быть никакиз сомволов кроме букв и цифр.";
            ОбщегоНазначения.СообщитьОбОшибке(ТекстСообщения,,"Проблема в Excel файле.");
            Возврат Неопределено;
        КонецПопытки;
    КонецЦикла;
    
    ТаблицаДанных.Удалить(СтрокаСНазваниямиКолонок);    

    Попытка
        Excel.DisplayAlerts = 0;
        ФайлСДанными.Close();
        Excel.DisplayAlerts = 1;
        Excel.Quit();
        Excel = Неопределено;
        Возврат ТаблицаДанных;
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;    
    
КонецФункции
12 Олеся999
 
22.01.15
08:56
(9) Это мой аккаунт пароль забыла :(
13 Олеся999
 
22.01.15
09:27
(11) Это нужно вставить в обработку?
14 Krolik Bezobraznik
 
22.01.15
09:30
(13) Эти процедуры вставьте в обработку и вызывайте их. Там вроде все понятно.
15 RomaH
 
naïve
22.01.15
09:30
(13) просто чукча - писатель
16 RomaH
 
naïve
22.01.15
09:31
читаем внимательно (7)
17 Олеся999
 
22.01.15
09:39
(7) http://lvkr.ru/xZqRM4.jpg

Дак Есть же реквизиты у таблицы ?
18 RomaH
 
naïve
22.01.15
09:45
внимательно читаем (7)
попробуй прочитать вслух
соседу
может он поймет
19 RomaH
 
naïve
22.01.15
09:50
а где "спасибо"?
20 Олеся999
 
22.01.15
09:52
(19) Сасибо:)
21 Олеся999
 
22.01.15
09:52
Ой Спасибо:))
22 RomaH
 
naïve
22.01.15
09:53
(21)
а что именно помогло? прочитать вслух или пришлось найти слушателя?
23 Олеся999
 
22.01.15
09:55
Ничего не помогло :) ...до сих пор соображаю ) врубиться не могу)
24 RomaH
 
naïve
22.01.15
09:59
(23) не повезло значит с соседом - ищи другого
25 RomaH
 
naïve
22.01.15
10:02
скучно с вами
http://www.dropmocks.com/mHvyuk
26 Олеся999
 
22.01.15
10:02
(24) у тебя эта ТЗ описана в реквизитах формы
в справочник реквизиты добавила, а в ТЗ - забыла (В какую ТЗ, которая в обработке?) http://lvkr.ru/f/r7P2Qh/640.jpg
27 RomaH
 
naïve
22.01.15
10:04
(26) учите мат часть, и термины
в (26) это реквизиты табличной части обраотки
в (25) - реквизиты реквизита формы типа ТЗ
28 Олеся999
 
22.01.15
10:05
(27) Хорошо :) спасибо большое поняла))
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший