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

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 секунд.

 

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

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

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

См. также

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

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

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

1 стартмани

11.04.2024    570    tango    0    

3

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

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

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

10 стартмани

11.04.2024    440    tango    5    

4

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

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

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

08.04.2024    812    tango    0    

2

Ценовая власть (УТ 11.5) - 2

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

В прошлый раз специальной обработкой мы выбрали объекты УТ 1.5, группируя по подсистемам. Оказалось, что состав подсистем не вполне корректно отображает функциональную структуру, но зато мы нашли процедуру, которая, вроде бы, должна содержать в себе всё, что нас интересует. Обновление цен должно ведь следовать выбранной стратегии ценообразования, верно? Иначе что она обновляет...

06.04.2024    500    tango    1    

1

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

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

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

1 стартмани

05.04.2024    635    tango    12    

2

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

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

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

07.02.2024    2736    YA_418728146    11    

46

Регистры накопления в 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    1249    8    2ncom    6    

8

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

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

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

28.12.2023    5103    mrXoxot    11    

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