|
Загрузка из Excel, реализовать оптимальный код | ☑ | ||
---|---|---|---|---|
0
Juliette_
Juliette 28.01.21
✎
21:00
|
Нужен совет, пишу обработку загрузки из Экселя табеля в зуп.
Хочется уйти от некрасивого кода перебора строк, видимо "доросла" ) Строки файла такие: Табельный номер1 | ВидВремени1число | ВидВремени2число | ВидВремени3число | Часы1число | Часы2число | Часы3число Табельный номер2 | ВидВремени1число | ВидВремени2число | ВидВремени3число | Часы1число | Часы2число | Часы3число Сейчас работает так Для ИндексТаблицы = 1 По ТЗ.Количество()-1 Цикл //пропускаем заголовок загруженного файла СтрокаВидаВремени = ТЗ[ИндексТаблицы]; СтрокаЧасов = ТЗ[ИндексТаблицы + 1]; ТабельныйНомерСотрудника = СтрокаВидаВремени["N" + КолонкаТН]; Если ТабельныйНомерСотрудника = "" Тогда //по логике достигли окончания данных Прервать; КонецЕсли; Сотрудник = Справочники.Сотрудники.НайтиПоКоду(ТабельныйНомерСотрудника); Если Сотрудник.Пустая() Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден сотрудник с кодом: " + ТабельныйНомерСотрудника); ИндексТаблицы = ИндексТаблицы + 1; Продолжить; КонецЕсли; Для НомерДня = КолонкаПервыйДень По (КолонкаПервыйДень + (ДнейМесяца - 1)) Цикл КонецЦикла; ... считаю код неоптимальным. Как бы Вы обработали такой формат? |
|||
1
polosov
28.01.21
✎
21:09
|
(0) В чем неоптимальность по-твоему?
|
|||
2
Juliette_
Juliette 28.01.21
✎
21:10
|
Даже не так, начало оставляем, но как обработать СтрокаВидаВремени и СтрокаЧасов так, чтобы потом проще загрузить в Табель?
Например 237 | Я/Н | Я/Н | Я | | 8/4 | 8/4 | 8 | Надо привести к таблице Для явки: 237 Я8 Я8 Я8 Для ночных: 237 Н4 Н4 |
|||
3
Juliette_
Juliette 28.01.21
✎
21:12
|
не знаю как оптимально привести к формату таблицы ДанныеОВремени документа Табель
Блин, воды много, не знаю, поймете или нет ( |
|||
4
polosov
28.01.21
✎
21:15
|
(3) Пока не объяснишь, что тебе надо, тебе не помогут.
|
|||
5
Juliette_
Juliette 28.01.21
✎
21:22
|
файл такой https://ibb.co/YXKVjD9
а надо сделать как в (2) |
|||
6
МихаилМ
28.01.21
✎
21:23
|
перенесите строки в конец , либо прочитайте отдельно нечетные и четные строки.
учитесь мыслить множествами. проверяйте все множество сотрудников , а не по одному |
|||
7
ReaLg
28.01.21
✎
21:25
|
(0) Сотрудник = Справочники.Сотрудники.НайтиПоКоду(ТабельныйНомерСотрудника);
Вот это вот - запрос в цикле. Сначала сделай новую типизированную ТЗ, в которой нет ничего лишнего(проверки все, первая-последжняя строка и т.д), только "нормальные" строки с данными. Потом эту таблицу в запрос во временную таблицу. Потом соединяй со справочником по таб. номеру. Тогда не будет запроса в цикле :) |
|||
8
polosov
28.01.21
✎
21:25
|
(7) Тут это не имеет значения.
|
|||
9
Juliette_
Juliette 28.01.21
✎
21:26
|
(7) все верно, там каждая строка - отдельный сотрудник
|
|||
10
Juliette_
Juliette 28.01.21
✎
21:27
|
(+9)т.е. каждая нечетная строка, в след строке нет сотрудника, там часы. но в коде есть перескок
|
|||
11
ДедМорроз
28.01.21
✎
21:30
|
Читаем Excel в массив ComSafeArray и потом по нему анализируем строки парами.
Далее,когда таблицу из строк собрали,можно переходить к поиску сотрудников. |
|||
12
Йохохо
28.01.21
✎
21:31
|
зачем подшаг внутри цикла?
|
|||
13
Juliette_
Juliette 28.01.21
✎
21:33
|
(12) колонка табномер объединенная из 2х строк.
Читаем по табномеру, подшаг после чтения часов. Стурктура файла в (5) |
|||
14
Йохохо
28.01.21
✎
21:37
|
(13) внутри если вводит в заблуждение, шагайте по формату раз красоты хочется
если файл колбасят вручную не надо ничего оптимизировать, косяки ввода сложнее обработать |
|||
15
Juliette_
Juliette 28.01.21
✎
21:44
|
а как оптимальнее писать данные для множества?
допустим все 31 день вид времени Я/Н и часы 8/4 Надо перевести в таблицу с 2мя строками 1: ВидВремени1 = Я|...|ВидВремени31 = Я|Часов1 = 8|...|Часов31 = 8| 2: ВидВремени1 = Н|...|ВидВремени31 = Н|Часов1 = 4|...|Часов31 = 4| вот собственно что необходимо Понимаем, что может быть и 3 вида времени, и 1 |
|||
16
Juliette_
Juliette 28.01.21
✎
21:50
|
пока решение только в лоб, найти максимальное количетсво элементов массива после преобразования Я/Н по всем строкам.
Это будет количество строк таблицы, создать ее с пустыми значениями Потом анализировать каждую ячейку и в зависимости от индекса массива писать в нужную строку ТЗ. Не громозко ли? |
|||
17
Juliette_
Juliette 28.01.21
✎
21:51
|
по всем строкам = по всем колонкам дней обрабатываемого сотрудника
|
|||
18
Йохохо
28.01.21
✎
21:55
|
СтруктураСтрокиВремени = Новый Структура(",,,,,,,,,...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |