Обработка загрузки табеля в ЗУП 3.1 с Инфостарта за 10 см

Решил сэкономить силы, победил жабу и скачал обработку по загрузке табеля за 10 см (примерно 7000 рублей): https://infostart.ru/public/1784514

Но нет совершенства в природе, обработка написана женской рукой, внешний вид красивый, а у функционала есть местами проблемы.

Написал такой комментарий:

10 см подразумевает, что обработка написана качественно, как минимум. Интерфейс красивый, спору нет, но это иногда сложно, т.к. мешает разобраться.

В обработке есть ошибка:

        |    ВТ_ТЗСотрудников КАК ВТ_ТЗСотрудников
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(
        |                &Период,
        |                (Фамилия, Имя, Отчество) В
        |                    (ВЫБРАТЬ
        |                        ВТ_ТЗСотрудников.Фамилия КАК Фамилия,
        |                        ВТ_ТЗСотрудников.Имя КАК Имя,
        |                        ВТ_ТЗСотрудников.Отчество КАК Отчество
        |                    ИЗ
        |                        ВТ_ТЗСотрудников КАК ВТ_ТЗСотрудников)) КАК ФИОФизическихЛицСрезПоследних
        |        ПО ВТ_ТЗСотрудников.Фамилия = ФИОФизическихЛицСрезПоследних.Фамилия
        |            И ВТ_ТЗСотрудников.Имя = ФИОФизическихЛицСрезПоследних.Имя
        |            И ВТ_ТЗСотрудников.Отчество = ФИОФизическихЛицСрезПоследних.Отчество
        |            И (ВЫБОР
        |                КОГДА &ИспользоватьСНИЛС
        |                    ТОГДА ВТ_ТЗСотрудников.СНИЛС = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо.СтраховойНомерПФР
        |                ИНАЧЕ ЛОЖЬ
        |            КОНЕЦ)
Проблема в "ИНАЧЕ ЛОЖЬ".

Я понимаю, почему так написано, но в итоге не ищет по просто фамилии и инициалам.

Вообще видно увлечение автора километровыми запросами вместо банальной логики поиска отдельными запросами по сотрудникам. Это дурное методологическое влияние метрополии, в итоге чего разобраться в причинах, почему не работает поиск сложно, мне пришлось добавлять менеджер временных таблиц и служебную таблицу в начало запроса:

        |        ВЫБРАТЬ * ПОМЕСТИТЬ ТЗФизлицаВременно ИЗ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(
        |                &Период,
        |                //(Фамилия, ПОДСТРОКА(Имя, 1, 1), ПОДСТРОКА(Отчество, 1, 1)) В
        |                //    (ВЫБРАТЬ
        |                //        ВТ_ТЗСотрудников.Фамилия КАК Фамилия,
        |                //        ВТ_ТЗСотрудников.Имя КАК Имя,
        |                //    [1C-CODE]

Ладно, ФИО мы получили. Автора прошу, убери эти километровые простыни запросов. Они разрушают мою веру в человечество.

Добавил в параметры «Последняя строка», чтобы считывать помесячно из длинного файла, была указана только «Начальная строка».

Файл Excel считывается через Excel.Application, причем строится матрица по полному размеру файла, это фиаско.

Но можно переписать на современную механику:

&НаКлиенте
Процедура ОбработатьФайл(ПолноеИмя, НомерЗаписи);   
    
    ДД = Новый ДвоичныеДанные(ПолноеИмя);  
    Ф = Новый Файл(ПолноеИмя);
    ПрочитатьФайлНаСервере(ДД, ПолноеИмя, Ф.Расширение, НомерЗаписи); 

    //Попытка
    //    Эксель = новый COMОбъект("Excel.Application");
    //    Эксель.visible = True;
    //Исключение
    //    Сообщить(ОписаниеОшибки());
    //    Возврат;    
    //КонецПопытки;
    //
    //Книга = Эксель.WorkBooks.Open(ПолноеИмя);
    //Лист = Книга.WorkSheets(1);
    //ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    //ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
    //
    //НаборСтрокФайла = Новый Массив;
    //Для Строка = 1 По ВсегоСтрок Цикл
    //    МассивСтрока = Новый Массив;
    //    Для Колонка = 1 По ВсегоКолонок Цикл
    //        Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value); 
    //        МассивСтрока.Добавить(Значение);
    //    КонецЦикла;
    //    НаборСтрокФайла.Добавить(МассивСтрока);
    //КонецЦикла;
    //Эксель.Application.Quit();
    
    
КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлНаСервере(ДД, ПолноеИмя, Расширение, НомерЗаписи) 
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    ДД.Записать(ИмяВременногоФайла);
    Т = Новый ТабличныйДокумент();
    Т.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    ВсегоСтрок = Т.ВысотаТаблицы;                        
    ВсегоКолонок = Т.ШиринаТаблицы;
    
    НаборСтрокФайла = Новый Массив;
    Для Строка = 1 По ВсегоСтрок Цикл
        МассивСтрока = Новый Массив;
        Для Колонка = 1 По ВсегоКолонок Цикл
            Значение = Т.Область(Строка,Колонка).Текст; 
            МассивСтрока.Добавить(Значение);
        КонецЦикла;
        НаборСтрокФайла.Добавить(МассивСтрока);
    КонецЦикла;
    ОбработатьФайлНаСервере(НаборСтрокФайла, ВсегоКолонок, ПолноеИмя, НомерЗаписи);
КонецПроцедуры

Далее, зачем-то проставляются выходные дни. Я делал для сотрудников 2/2 работающих, там это не актуально. Нужна галочка, чтобы убрать выходные дни. У себя просто закомментировал.

Если хотя бы один сотрудник не найден, не грузит. Я бы добавил кнопку — убрать не найденных сотрудников.

Сначала не понял, почему только 5 дней грузит, потом понял, что период 5 марта стоял, он по день периода прогружает табель.

Я восхищен упорностью программиста, который рисовал 31 колонку, но это надо делать программно, рекомендую переписать. Колонки слишком широкие, сжал:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ТекШирина = 2;
    Для день = 1 По 31 Цикл
        Элемент = Элементы["ДанныеВидВремени" + День];
        Элемент.Ширина = ТекШирина;
        Элемент.Заголовок = "Вид";
        Элемент.АвтомаксимальнаяШирина = ложь;
        Элемент.РастягиватьПоГоризонтали = ложь;

        Элемент = Элементы["ДанныеЧасов" + День];
        Элемент.Ширина = ТекШирина;
        Элемент.АвтомаксимальнаяШирина = ложь;
        Элемент.Заголовок = "День";
        Элемент.РастягиватьПоГоризонтали = ложь;

        Элемент = Элементы["ДанныеДень" + День];
        Элемент.Заголовок = День;
        //Элемент.АвтомаксимальнаяШирина = ложь;
        Элемент.РастягиватьПоГоризонтали = ложь;
        Элемент.Ширина = ТекШирина;
    КонецЦикла;
КонецПроцедуры

Но все равно широковато выглядит:

В таком виде сдаю клиенту, если будут еще замечания, поправлю. Последнюю версию вышлю автору, чтобы учел мои замечания.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 6

  1. Rafaraf:

    Если хочешь сэкономить СМ, обращайся ко мне ) 10 СМ за 7000 это оооочень дорого

    • у меня свои СМ есть на инфостарте. Они там что-то вроде 100 рублей за СМ, получается эта обработка стоит 1000 рублей.

  2. Rafaraf:

    можно читать через Построитель Запроса, что то типа
    ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    тчСотрудники.Загрузить(ПЗ.Результат.Выгрузить());

    • Криво и ненадежно. Там есть проблема и с именами колонок и с типом значений (у построителя).
      Лучше использовать свою функцию чтения из табличного документа. Ее можно поправить если что. Уже пару раз натыкался на подобные способы чтения и проблемы с ними.

      • Rafaraf:

        Ну это да, но если самостоятельно контролируешь выгрузку и загрузку (например, через Эксель), то пара ПостроительОтчета (обязательно с правильным Макетом!!!) и построительЗапроса в паре упрощают код просто до пары строк и переносят типизацию, кстати

        • я предпочитаю повторно использовать отлаженные функции из своей библиотеки.
          потому что их можно контролировать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *