|
Обработка загрузки 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
|
||||
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) Хорошо :) спасибо большое поняла))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |