Имя: Пароль:
1C
1С v8
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)}: Таблица не найдена "РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации"
<<?>>РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации

Пишу вторую обработку, с запросами ни разу не сталкивался. Книг под рукой нету.