Опыт оптимизации одной простенькой пользовательской задачи

24.04.24

Разработка - Механизмы типовых конфигураций

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

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

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

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

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

 

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. Попытка реабилитировать и (для себя) понять рамки и возможности применения вычисляемых выражений с обращением к экспортным функциям. Создаем еще один общий модуль в расширении с настройками:

 

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

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

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

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

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

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

 

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

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

оптимизация отчет СКД общий модуль универсальный отчет

См. также

Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Проблемы при создании ресурсной спецификации. Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5.

06.05.2024    389    It-digit    1    

2

Ценовая власть. Выносим из цикла схему СКД

Механизмы типовых конфигураций Ценообразование, анализ цен Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

Продолжение темы вынесения кусков повторно-используемого кода в запрос. В прошлый раз мы сделали это с вычислением пользовательских формул. Здесь замахнулись на формулы, задаваемые пользователем запросами.

1 стартмани

11.04.2024    606    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Какому-либо элементу списка сопоставляется числовое значение, зависящее от других значений, причем эта зависимость изменяется от элемента к элементу. Так, в справочнике "Валюты" курс какой-либо валюты может быть задан формулой (или даже запросом) от значения другой валюты. А в справочнике "Виды цен" формула определяет расчет цены для товарной позиции, т.е. элементов справочника "Номенклатура", у которых в карточке указан этот вид цены. А в 1С:ERP, например, этот механизм используется в ресурсной спецификации.

10 стартмани

11.04.2024    481    tango    5    

4

Ценовая власть. Второй сезон

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Бесплатно (free)

В первом сезоне мы рассмотрели (с точки зрения программиста) внутренний механизм, помещающий цены в регистр "Цены". Из этого регистра цена попадает в исходящие УПД (в продажи). Но эта цена (в прайс-листе) дифференцирована (ценообразована) в разрезах свойств самой номенклатуры. Но стратегия ценообразования, ценовая власть - это в первую очередь о работе с ценами для клиента. И тут вступает в дело второй акт марлезонского, Скидки (наценки) и кешбек.

08.04.2024    840    tango    0    

2

Ценовая власть или Управление ценообразованием (УТ 11.5)

Ценообразование, анализ цен Механизмы типовых конфигураций Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Абонемент ($m)

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    687    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2849    YA_418728146    11    

48

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1357    8    2ncom    6    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    5224    mrXoxot    11    

104
Оставьте свое сообщение