Услуги программирования на 1С. Опыт оптимизации одной простенькой пользовательской задачи

Услуги по установке 1С

Опыт оптимизации одной простенькой пользовательской задачи с использованием запросов, универсального отчета и общих модулей с повторным использованием возвращаемых значений.

Исходные данные: конфигурация ERP ред. 2.5.16.101

Пользователи просят отчет по фактическим трудозатратам, указанным в Этапах производства за период, с группировкой по подразделениям, направлениям деятельности (включена функциональная опция), исполнителям.

Реализуем с помощью универсального отчета по регистру накопления ТрудозатратыКОформлению.

Настройки отчета:

Все довольны и счастливы.

Через какое-то время пользователи просят добавить в отчет должность исполнителя.

Варианты реализации:

  1. Используем уже существующую экспортную функцию в расширении в серверном модуле: Функция ПолучитьДолжностьСотрудника(Сотрудник,ДатаСрезаИнформации = “23991231”) Экспорт УстановитьПривилегированныйРежим(Истина); ТолькоРазрешенные = Ложь; ДатаСрезаИнформации = ДатаСрезаИнформации; КадровыеДанные = “Должность”; Должность = Неопределено; МассивСотрудников = Новый Массив; МассивСотрудников.Добавить(Сотрудник); КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников( ТолькоРазрешенные, МассивСотрудников, КадровыеДанные, ДатаСрезаИнформации); Для Каждого Строка Из КадровыеДанныеСотрудников Цикл Должность = Строка.Должность; КонецЦикла; КадровыеДанныеСотрудников = ЦС_ЭкспортныеФункцииСерверПовтИсп.ДолжностьСотрудника(Сотрудник,ДатаСрезаИнформации); СтрокаСотрудника = КадровыеДанныеСотрудников.Найти(Сотрудник, “Сотрудник”); Для Каждого Строка Из СтрокаСотрудника Цикл Должность = СтрокаСотрудника.Должность; КонецЦикла; Возврат Должность; КонецФункции

    Функция обращается к типовой (КадровыйУчет.КадровыеДанныеСотрудников(

                   ТолькоРазрешенные, МассивСотрудников, КадровыеДанные, ДатаСрезаИнформации)) для получения кадровых данных.

    Но – здесь нужен сотрудник, а в регистре накопления ТрудозатратыКОформлению Исполнитель – физЛицо.

    Меняем запрос на:

    ВЫБРАТЬ РАЗРЕШЕННЫЕ ТрудозатратыКОформлениюОстаткиИОбороты.ПартияПроизводства КАК ПартияПроизводства, ТрудозатратыКОформлениюОстаткиИОбороты.Распоряжение КАК Распоряжение, ТрудозатратыКОформлениюОстаткиИОбороты.ВидРабот КАК ВидРабот, ТрудозатратыКОформлениюОстаткиИОбороты.Исполнитель КАК Исполнитель, ТрудозатратыКОформлениюОстаткиИОбороты.Подразделение КАК Подразделение, ТрудозатратыКОформлениюОстаткиИОбороты.ПериодДень КАК ПериодДень, ТрудозатратыКОформлениюОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ISNULL(ОсновныеСотрудникиФизическихЛиц.Сотрудник, СправочникСотрудники.ПустаяСсылка) КАК Сотрудник, ИЗ РегистрНакопления.ТрудозатратыКОформлению.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Авто, Движения, ) КАК ТрудозатратыКОформлениюОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСотрудникиФизическихЛиц КАК ОсновныеСотрудникиФизическихЛиц ПО ТрудозатратыКОформлениюОстаткиИОбороты.Исполнитель = ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо ГДЕ ОсновныеСотрудникиФизическихЛиц.ДатаНачала = &ПустаяДата

    Соединяем нашу таблицу с регистром сведений ОсновныеСотрудникиФизическихЛиц, устанавливаем в Параметрах значение Пустой даты.

    Добавляем в схему СКД универсального отчета вычисляемое поле, в выражении пишем

    Услуги по программированию 1С

    НАЗВАНИЕ_ВАШЕГО_ОБЩЕГО_МОДУЛЯ.ПолучитьДолжностьСотрудника(Сотрудник, ТекущаяДата()) – вместо текущей даты можно ставить и дату начала периода и дату окончания периода – в зависимости от ваших желаний (надо понимать, что должность может меняться, и с пользователями это надо обсудить – на какой период получать должность они хотят).

    Выводим поле должность в отчет.

    Отчет формируется, но – и это вполне ожидаемо – долго.

    На наших данных за 10 дней периода отчет формируется примерно 60 секунд.

    Пользователи довольны, но несчастливы (отчет все-таки формируется).

    Мы недовольны, но счастливы (ибо все это суета).

  2. Изучаем типовую функцию КадровыйУчет.КадровыеДанныеСотрудников(ТолькоРазрешенные, МассивСотрудников, КадровыеДанные, ДатаСрезаИнформации), откуда она берет данные, выясняем, что из регистра сведений КадроваяИсторияСотрудниковИнтервальный. Добавляем в запрос соединение с этим регистром: ВЫБРАТЬ РАЗРЕШЕННЫЕ ТрудозатратыКОформлениюОстаткиИОбороты.ПартияПроизводства КАК ПартияПроизводства, ТрудозатратыКОформлениюОстаткиИОбороты.Распоряжение КАК Распоряжение, ТрудозатратыКОформлениюОстаткиИОбороты.ВидРабот КАК ВидРабот, ТрудозатратыКОформлениюОстаткиИОбороты.Исполнитель КАК Исполнитель, ТрудозатратыКОформлениюОстаткиИОбороты.Подразделение КАК Подразделение, ТрудозатратыКОформлениюОстаткиИОбороты.ПериодДень КАК ПериодДень, ТрудозатратыКОформлениюОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ОсновныеСотрудникиФизическихЛиц.Сотрудник КАК Сотрудник, ОсновныеСотрудникиФизическихЛиц.ДатаНачала КАК ДатаНачала, ОсновныеСотрудникиФизическихЛиц.ДатаОкончания КАК ДатаОкончания ПОМЕСТИТЬ втТрудозатратыСотрудников ИЗ РегистрНакопления.ТрудозатратыКОформлению.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Авто, Движения, ) КАК ТрудозатратыКОформлениюОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСотрудникиФизическихЛиц КАК ОсновныеСотрудникиФизическихЛиц ПО ТрудозатратыКОформлениюОстаткиИОбороты.Исполнитель = ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо ГДЕ ОсновныеСотрудникиФизическихЛиц.ДатаНачала = &ПустаяДата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втТрудозатратыСотрудников.ПартияПроизводства КАК ПартияПроизводства, втТрудозатратыСотрудников.Распоряжение КАК Распоряжение, втТрудозатратыСотрудников.ВидРабот КАК ВидРабот, втТрудозатратыСотрудников.Исполнитель КАК Исполнитель, ЕстьNULL(КадроваяИсторияСотрудниковИнтервальный.Должность, Справочник.Должности.ПустаяСсылка КАК Должность, втТрудозатратыСотрудников.Подразделение КАК Подразделение, втТрудозатратыСотрудников.ПериодДень КАК ПериодДень, втТрудозатратыСотрудников.КоличествоПриход КАК КоличествоПриход, втТрудозатратыСотрудников.Сотрудник КАК Сотрудник, втТрудозатратыСотрудников.ДатаНачала КАК ДатаНачала, втТрудозатратыСотрудников.ДатаОкончания КАК ДатаОкончания ИЗ втТрудозатратыСотрудников КАК втТрудозатратыСотрудников ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный ПО втТрудозатратыСотрудников.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник И втТрудозатратыСотрудников.Исполнитель = КадроваяИсторияСотрудниковИнтервальный.ФизическоеЛицо И (КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания = ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59))

    Убираем вычисляемое поле Должность, вместо него появляется поле Должность, выводим в структуру отчета.

    Отчет формируется и выводится на тех же данных за 2 секунды.

    Все довольны и счастливы.

  3. Попытка реабилитировать и (для себя) понять рамки и возможности применения вычисляемых выражений с обращением к экспортным функциям. Создаем еще один общий модуль в расширении с настройками:
  Услуги программирования на 1С. Автоматизация учета на базе ПП "1С:Зарплата и Управление Персоналом 8. ПРОФ" в ООО "ЯХТ-КЛУБ РПН" в облачном сервисе «1С:Предприятие 8 через Интернет» (1cfresh.com)

 

В этом модуле размещаем функцию, в которой получаем должность для ВСЕХ сотрудников организации.

Функция ДолжностьСотрудника(Сотрудник,ДатаСрезаИнформации = “23991231”) Экспорт УстановитьПривилегированныйРежим(Истина); ТолькоРазрешенные = Ложь; ДатаСрезаИнформации = ДатаСрезаИнформации; КадровыеДанные = “Должность”; Должность = Неопределено; МассивСотрудников = Новый Массив; Запрос = Новый Запрос; Запрос.Текст = “Выбрать Сотрудники.Ссылка КАК Сотрудник ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ НЕ Сотрудники.ПометкаУдаления”; МассивСотрудников = Запрос.Выполнить().Выгрузить(); КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников( ТолькоРазрешенные, МассивСотрудников, КадровыеДанные, ДатаСрезаИнформации); Возврат КадровыеДанныеСотрудников; КонецФункции

А в модуле из п.1 (выше): 

Функция ДолжностьСотрудника(Сотрудник,ДатаСрезаИнформации = “23991231”) Экспорт КадровыеДанныеСотрудников = ЦС_ЭкспортныеФункцииСерверПовтИсп.ДолжностьСотрудника(Сотрудник,ДатаСрезаИнформации); СтрокаСотрудника = КадровыеДанныеСотрудников.Найти(Сотрудник, “Сотрудник”); Должность = СтрокаСотрудника.Должность; Возврат Должность; КонецФункции;

                Здесь мы обращаемся к функции из модуля с повторным использованием возвращаемых значений для получения таблицы КадровыеДанныеСотрудников, из которой берем только ту, которая в данный момент нужна. В настройках отчета ничего менять не нужно по сравнению с п.1.

Отчет формируется и выводится на тех же данных за 6-8 секунд.

На этом пока наше исследование закончено. Если у кого есть предложения по альтернативным видам реализации этой задачи – нам будет интересно их узнать.

Спасибо за внимание.

Услуги программирования на 1С представляют собой комплекс деятельности, направленной на создание, настройку, модификацию и поддержку программных решений на платформе 1С:Предприятие. 1С — это популярная российская система автоматизации бизнес-процессов, используемая предприятиями различных отраслей.

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

Услуги программирования на 1С часто предоставляются специализированными IT-компаниями или независимыми разработчиками, обладающими высокой квалификацией и опытом работы с данной платформой. Эти услуги помогают компаниям оптимизировать бизнес-процессы, повысить эффективность работы и снизить затраты на управление и ведение бизнеса.

  Услуги программирования на 1С. Автоматизация бизнес-процессов на базе четвертого комплекта ПП "1С:Розница 8. Салон оптики" в Общество с ограниченной ответственностью "Фармация Дона"

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