Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузка из Excel, реализовать оптимальный код

Загрузка из Excel, реализовать оптимальный код
Я
   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)) Цикл
        КонецЦикла;
...



считаю код неоптимальным. Как бы Вы обработали такой формат?
   polosov
 
1 - 28.01.21 - 21:09
(0) В чем неоптимальность по-твоему?
   Juliette_Juliette
 
2 - 28.01.21 - 21:10
Даже не так, начало оставляем, но как обработать СтрокаВидаВремени и СтрокаЧасов  так, чтобы потом проще загрузить в Табель?
Например
237  | Я/Н | Я/Н | Я |
      | 8/4 | 8/4 | 8 |

Надо привести к таблице
Для явки:   237  Я8 Я8 Я8   
Для ночных: 237  Н4  Н4
   Juliette_Juliette
 
3 - 28.01.21 - 21:12
не знаю как оптимально привести к формату таблицы ДанныеОВремени документа Табель

Блин, воды много, не знаю, поймете или нет (
   polosov
 
4 - 28.01.21 - 21:15
(3) Пока не объяснишь, что тебе надо, тебе не помогут.
   Juliette_Juliette
 
5 - 28.01.21 - 21:22
файл такой https://ibb.co/YXKVjD9
а надо сделать как в (2)
   МихаилМ
 
6 - 28.01.21 - 21:23
перенесите строки в конец , либо прочитайте отдельно нечетные и четные строки.
учитесь мыслить множествами.

проверяйте все множество сотрудников , а не по одному
   ReaLg
 
7 - 28.01.21 - 21:25
(0)  Сотрудник = Справочники.Сотрудники.НайтиПоКоду(ТабельныйНомерСотрудника);
Вот это вот - запрос в цикле.

Сначала сделай новую типизированную ТЗ, в которой нет ничего лишнего(проверки все, первая-последжняя строка и т.д), только "нормальные" строки с данными.
Потом эту таблицу в запрос во временную таблицу. Потом соединяй со справочником по таб. номеру.
Тогда не будет запроса в цикле :)
   polosov
 
8 - 28.01.21 - 21:25
(7) Тут это не имеет значения.
   Juliette_Juliette
 
9 - 28.01.21 - 21:26
(7) все верно, там каждая строка - отдельный сотрудник
   Juliette_Juliette
 
10 - 28.01.21 - 21:27
(+9)т.е. каждая нечетная строка, в след строке нет сотрудника, там часы. но в коде есть перескок
   ДедМорроз
 
11 - 28.01.21 - 21:30
Читаем Excel в массив ComSafeArray и потом по нему анализируем строки парами.
Далее,когда таблицу из строк собрали,можно переходить к поиску сотрудников.
   Йохохо
 
12 - 28.01.21 - 21:31
зачем подшаг внутри цикла?
   Juliette_Juliette
 
13 - 28.01.21 - 21:33
(12) колонка табномер объединенная из 2х строк.
Читаем по табномеру, подшаг после чтения часов.
Стурктура файла в (5)
   Йохохо
 
14 - 28.01.21 - 21:37
(13) внутри если вводит в заблуждение, шагайте по формату раз красоты хочется
если файл колбасят вручную не надо ничего оптимизировать, косяки ввода сложнее обработать
   Juliette_Juliette
 
15 - 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
   Juliette_Juliette
 
16 - 28.01.21 - 21:50
пока решение только в лоб, найти максимальное количетсво элементов массива после преобразования Я/Н по всем строкам.
Это будет количество строк таблицы, создать ее с пустыми значениями
Потом анализировать каждую ячейку и в зависимости от индекса массива писать в нужную строку ТЗ.
Не громозко ли?
   Juliette_Juliette
 
17 - 28.01.21 - 21:51
по всем строкам = по всем колонкам дней обрабатываемого сотрудника
   Йохохо
 
18 - 28.01.21 - 21:55
СтруктураСтрокиВремени = Новый Структура(",,,,,,,,,...

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.