Имя: Пароль:
1C
1С v8
Загрузка из 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
СтруктураСтрокиВремени = Новый Структура(",,,,,,,,,...