|
v8: УПП Закачка данных из Excel-я в документ ВводПостНачисИлиУдерСотрОрг | ☑ | ||
---|---|---|---|---|
0
Изучаю УПП
30.07.12
✎
13:39
|
1С 8.2 УПП 1.3
Ситуация следующая: банк ежемесячно присылает файл формата *.xls со следующими полями: 1.Номер карты 2.Сумма 3.Дата оплаты Смысл в том, что, если сотрудник пользовался картой в своей столовой, то ему компенсируется (начисляется) не более 30 рублей за каждый обед. Всего в базе около 3 тысяч записей. Необходимо загрузить эти данные в документ ВводПостоянногоНачисленияИлиУдержанияСотрудникамОрганизации. Написал следующую обработку: ТаблЧастьДокумента = Документ.ОсновныеНачисления; ТаблЧастьДокумента.Очистить(); ОбщаяСумма = 0; НачСтрока = 2; КонСтрока = 10; // КонСтрока = ЛистExcel.Cells(1,1).SpecialCells(11).Row; Для х=НачСтрока По КонСтрока Цикл НомерКарты = СокрЛП(ЛистExcel.Cells(х,1).Text); СуммаОбеда = ЛистExcel.Cells(х,2).Value; СуммаОбеда = ?(СуммаОбеда > 30, 30, СуммаОбеда); // Не больше 30 ДатаОбеда = ЛистExcel.Cells(х,3).Value; Выборка = Справочники.СотрудникиОрганизаций.Выбрать(); Найден = Ложь; Пока Выборка.Следующий() Цикл Если НЕ Выборка.ЭтоГруппа Тогда Сотрудн = Выборка.Ссылка; ФизЛицо = Выборка.Физлицо; НаборЗаписей = РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Физлицо.Установить(ФизЛицо.Ссылка); НаборЗаписей.Прочитать(); Для Каждого Запись из НаборЗаписей Цикл Если Запись.НомерЛицевогоСчета = НомерКарты Тогда Найден = Истина; Прервать; КонецЕсли; КонецЦикла; Если Найден Тогда Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если Найден Тогда Найден = Ложь; Для Каждого ТекущаяСтрока Из ТаблЧастьДокумента Цикл Если ТекущаяСтрока.Сотрудник = Сотрудн Тогда Найден = Истина; Прервать; КонецЕсли; КонецЦикла; Если Найден Тогда ТекущаяСтрока.Показатель1 = ТекущаяСтрока.Показатель1 + СуммаОбеда; Иначе НоваяСтрокаТЧ = ТаблЧастьДокумента.Добавить(); НоваяСтрокаТЧ.Сотрудник = Сотрудн; НоваяСтрокаТЧ.ФизЛицо = ФизЛицо; НоваяСтрокаТЧ.Показатель1 = СуммаОбеда; КонецЕсли; Иначе Сообщить("Сотрудник с картой № " + НомерКарты + " не найден!!!"); КонецЕсли; КонецЦикла; Документ.Комментарий = "Загружено из Excel-файла банка " + Строка(ТекущаяДата()); Документ.Записать(); Результат: на загрузку 9 строк ушло 18 секунд, значит на весь файл 6000/3600 почти 2 часа. Хотелось бы ускорить. Вполне возможно, что сам алгоритм составлен не правильно, или саму обработку можно усовершенствовать. Может есть кому что-то предложить, заранее благодарен. Свои обработки сам писать только начинаю, поэтому не обессудьте, и камнями не закидывайте. |
|||
1
Жан Пердежон
30.07.12
✎
13:54
|
1. читаешь всё из файла в таблицу значений
2. ТЗ передаешь в запрос и соединяешь с данными и базы 3. результат запроса записываешь в табличную часть |
|||
2
Изучаю УПП
30.07.12
✎
16:32
|
1-ю и 3-ю части сделал, со второй проблема – подскажите, пожалуйста, как поймать СотрудникаОрганизации и ФизическоеЛицо, на которое оформлена карта. С учетом, того, что сотрудник может быть уволен и повторно принят и не единожды. ФизЛицо – одно, Сторудник – несколько.
Вот то, что получилось, может какие есть замечания? ТаблЧастьДокумента = Документ.ОсновныеНачисления; ТаблЧастьДокумента.Очистить(); ОбщаяСумма = 0; НачСтрока = 2; КонСтрока = ЛистExcel.Cells(1,1).SpecialCells(11).Row; ВремяНач1 = Секунда(ТекущаяДата()); ТабЗнач = Новый ТаблицаЗначений; ТабЗнач.Колонки.Добавить("НомерКарты",,"НомерКарты"); ТабЗнач.Колонки.Добавить("Сотрудн",,"Сотрудн"); ТабЗнач.Колонки.Добавить("ФизЛицо",,"ФизЛицо"); ТабЗнач.Колонки.Добавить("СуммаОбеда",,"СуммаОбеда"); ТабЗнач.Сортировать("НомерКарты"); Для х=НачСтрока По КонСтрока Цикл ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение + 1; НомерКарты = СокрЛП(ЛистExcel.Cells(х,1).Text); СуммаОбеда = ЛистExcel.Cells(х,2).Value; СуммаОбеда = ?(СуммаОбеда > 30, 30, СуммаОбеда); // Не больше 30 НайденнаяСтрока = ТабЗнач.Найти(НомерКарты, "НомерКарты"); Если НайденнаяСтрока = Неопределено Тогда СтрокаТЧ = ТабЗнач.Добавить(); СтрокаТЧ.НомерКарты = НомерКарты; СтрокаТЧ.СуммаОбеда = 0; Иначе СтрокаТЧ = НайденнаяСтрока; КонецЕсли; СтрокаТЧ.СуммаОбеда = СтрокаТЧ.СуммаОбеда + СуммаОбеда; ОбщаяСумма = ОбщаяСумма + СуммаОбеда; КонецЦикла; ВремяКон1 = Секунда(ТекущаяДата()); Сообщить("Время1: " + Строка(ВремяКон1 - ВремяНач1) + " секунд"); ВремяНач3 = Секунда(ТекущаяДата()); Для Каждого СтрокаИсходнойТаблицы Из ТабЗнач Цикл НоваяСтрокаТЧ = ТаблЧастьДокумента.Добавить(); НоваяСтрокаТЧ.Сотрудник = СтрокаИсходнойТаблицы.Сотрудн; НоваяСтрокаТЧ.ФизЛицо = СтрокаИсходнойТаблицы.ФизЛицо; НоваяСтрокаТЧ.Показатель1 = СтрокаИсходнойТаблицы.СуммаОбеда; КонецЦикла; ВремяКон3 = Секунда(ТекущаяДата()); Сообщить("Время3: " + Строка(ВремяКон3 - ВремяНач3) + " секунд"); Документ.Комментарий = "Загружено из Excell файла банка " + Строка(ТекущаяДата()); Документ.Записать(); |
|||
3
Изучаю УПП
31.07.12
✎
11:03
|
Никак не получается передать ТЗ в запрос и соединить со справочниками. Помогите, пожалуйста.
|
|||
4
Изучаю УПП
31.07.12
✎
13:17
|
ВремяКон2 = Секунда(ТекущаяДата());
Запрос = Новый Запрос; Запрос.Текст = " | ВЫБРАТЬ | ФизическиеЛица.Ссылка | ИЗ | Справочник.ФизическиеЛица КАК ФизическиеЛица | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации | ПО ФизическиеЛица.Ссылка = ЛицевыеСчетаРаботниковОрганизации.ФизЛицо | ГДЕ | ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета = &НомерКарты "; Для Каждого СтрокаИсходнойТаблицы Из ТабЗнач Цикл НомерКарты = СтрокаИсходнойТаблицы.НомерКарты; Запрос.УстановитьПараметр("НомерКарты", НомерКарты); СтрокаИсходнойТаблицы.ФизЛицо = Запрос.Выполнить().Выбрать(); КонецЦикла; Сообщить("Время2: " + Строка(ВремяКон2 - ВремяНач2) + " секунд"); Где-то ошибка, а, возможно, и сам код кривой: что не так? И почему-то время расчета = 0 (редко 1 сек). |
|||
5
Изучаю УПП
31.07.12
✎
14:05
|
Никто не поможет?
|
|||
6
Изучаю УПП
31.07.12
✎
15:34
|
?
|
|||
7
Изучаю УПП
01.08.12
✎
09:17
|
Доброго дня! Еще раз задача:
1. По номеру банковской карты найти ФизЛицо. 2. По ФизЛицу найти последнего Сотрудника. Помогите, кто знает, что не верно выше. |
|||
8
izekia
01.08.12
✎
09:23
|
(7) 1. регистр сведений
2. регистр сведений |
|||
9
Изучаю УПП
01.08.12
✎
09:27
|
(7) 1. Понятно, что из регистра сведений ЛицевыеСчетаРаботниковОрганизации – где в запросе (4) ошибка – не найду.
2. А здесь какой регистр? |
|||
10
Изучаю УПП
01.08.12
✎
09:28
|
(9) к (8)
|
|||
11
izekia
01.08.12
✎
10:03
|
(9) перед тем как изучать УПП, стоит подтянуть 1С
данные по картам скинь во временную таблицу дополнительно цеплять справочник в запросе необязательно 2. По кадровой истории смотри |
|||
12
Изучаю УПП
01.08.12
✎
11:05
|
Запрос.Текст = "
| ВЫБРАТЬ | ЛицевыеСчетаРаботниковОрганизации.ФизЛицо КАК ФЛ | ИЗ | РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации | ГДЕ | ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета = &НомерКарты "; {(5, 4)}: Таблица не найдена "РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации" <<?>>РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации Пишу вторую обработку, с запросами ни разу не сталкивался. Книг под рукой нету. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |