Дорабатывая у клиента отчет по данным для предоставления в статистику - появилось несколько готовых функций, которые Вам наверняка понадобятся:
Код 1C v 8.х Функция ПолучитьКоличествоСотрудниковСНеполнымРабочимДнём(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(Работники.НеполноеРабочееВремя) КАК НеполноеРабочееВремя,
| Работники.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_СписокРаботниковНаНеполномРабочемГрафике
|ИЗ
| (ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
| РаботникиОрганизацийСрезПоследних.ГрафикРаботы.СокращенноеРабочееВремя КАК НеполноеРабочееВремя
| ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&НачалоПериода, Организация =Организация) КАК РаботникиОрганизацийСрезПоследних
| ГДЕ
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
| И РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РаботникиОрганизаций.Сотрудник,
| РаботникиОрганизаций.ГрафикРаботы.СокращенноеРабочееВремя
| ИЗ
| РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
| ГДЕ
| РаботникиОрганизаций.Период МЕЖДУНачалоПериода ИКонецПериода
| И РаботникиОрганизаций.Организация =Организация
| И РаботникиОрганизаций.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)) КАК Работники
|ГДЕ
| Работники.НеполноеРабочееВремя
|
|СГРУППИРОВАТЬ ПО
| Работники.Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_СписокРаботниковНаНеполномРабочемГрафике.Сотрудник) КАК КоличествоСотрудниковНаСокрРабВремени
|ИЗ
| ВТ_СписокРаботниковНаНеполномРабочемГрафике КАК ВТ_СписокРаботниковНаНеполномРабочемГрафике";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КоличествоСотрудниковНаСокрРабВремени
Иначе
Возврат 0
КонецЕсли;
КонецФункции //ПолучитьКоличествоСотрудниковСНеполнымРабочимДнём()
Функция ПолучитьКоличествоСотрудниковИмевшихОтпускаБезСохраненияЗП(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеРаботниковСрезПоследних.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_СотрудникиВОтпускахБезСохрЗП
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций.СрезПоследних(&НачалоПериода, Организация =Организация) КАК СостояниеРаботниковСрезПоследних
|ГДЕ
| СостояниеРаботниковСрезПоследних.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты)
| И ВЫБОР
| КОГДА СостояниеРаботниковСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА СостояниеРаботниковСрезПоследних.ПериодЗавершения >=НачалоПериода
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| И СостояниеРаботниковСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СостояниеРаботниковОрганизаций.Сотрудник
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
|ГДЕ
| СостояниеРаботниковОрганизаций.Период МЕЖДУНачалоПериода ИКонецПериода
| И СостояниеРаботниковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты)
| И СостояниеРаботниковОрганизаций.Организация =Организация
| И СостояниеРаботниковОрганизаций.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_СотрудникиВОтпускахБезСохрЗП.Сотрудник) КАК КоличествоСотрудниковВОтпускеБезСохраненияЗП
|ИЗ
| ВТ_СотрудникиВОтпускахБезСохрЗП КАК ВТ_СотрудникиВОтпускахБезСохрЗП";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КоличествоСотрудниковВОтпускеБезСохраненияЗП
Иначе
Возврат 0
КонецЕсли;
КонецФункции //ПолучитьКоличествоСотрудниковИмевшихОтпускаБезСохраненияЗП()
Функция ПолучитьКоличествоПринятыхСотрудников(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюРаботникиОрганизации.Сотрудник
|ПОМЕСТИТЬ ВТ_СотрудникиПринятыеПоПриемуНаРаботу
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.РаботникиОрганизации КАК ПриемНаРаботуВОрганизациюРаботникиОрганизации
|ГДЕ
| ПриемНаРаботуВОрганизациюРаботникиОрганизации.ДатаПриема МЕЖДУНачалоПериода ИКонецПериода
| И ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Проведен
| И ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Организация =Организация
| И ПриемНаРаботуВОрганизациюРаботникиОрганизации.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_СотрудникиПринятыеПоПриемуНаРаботу.Сотрудник) КАК КоличествоСотрудниковПринятыхНаРаботу
|ИЗ
| ВТ_СотрудникиПринятыеПоПриемуНаРаботу КАК ВТ_СотрудникиПринятыеПоПриемуНаРаботу";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КоличествоСотрудниковПринятыхНаРаботу
Иначе
Возврат 0
КонецЕсли;
КонецФункции //ПолучитьКоличествоПринятыхСотрудников()
Функция ПолучитьКоличествоУволенныхСотрудников(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| УвольнениеИзОрганизацийРаботникиОрганизации.Сотрудник
|ПОМЕСТИТЬ ВТ_СотрудникиУволенные
|ИЗ
| Документ.УвольнениеИзОрганизаций.РаботникиОрганизации КАК УвольнениеИзОрганизацийРаботникиОрганизации
|ГДЕ
| УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения МЕЖДУНачалоПериода ИКонецПериода
| И УвольнениеИзОрганизацийРаботникиОрганизации.Ссылка.Проведен
| И УвольнениеИзОрганизацийРаботникиОрганизации.Ссылка.Организация =Организация
| И УвольнениеИзОрганизацийРаботникиОрганизации.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_СотрудникиУволенные.Сотрудник) КАК КоличествоУволенныхСотрудников
|ИЗ
| ВТ_СотрудникиУволенные КАК ВТ_СотрудникиУволенные";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КоличествоУволенныхСотрудников;
Иначе
Возврат 0
КонецЕсли;
КонецФункции
Функция ПолучитьКоличествоСотрудниковСписочногоСостава(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Сотрудник
|ПОМЕСТИТЬ ВТ_СотрудникиСписочногоСостава
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1), Организация =Организация) КАК РаботникиОрганизацийСрезПоследних
|ГДЕ
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
| И (РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
| ИЛИ РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство))
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_СотрудникиСписочногоСостава.Сотрудник) КАК КоличествоСотрудниковСписочногоСостава
|ИЗ
| ВТ_СотрудникиСписочногоСостава КАК ВТ_СотрудникиСписочногоСостава";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КоличествоСотрудниковСписочногоСостава;
Иначе
Возврат 0
КонецЕсли;
КонецФункции
---------- Использование -------------------
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(мДатаНачалаПериодаОтчета));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(мДатаКонцаПериодаОтчета));
// Сотрудники с неполным рабочим днём
СтруктураПолей.П0001000201 = ПолучитьКоличествоСотрудниковСНеполнымРабочимДнём(Запрос);
// Отпуска без сохранения зп
СтруктураПолей.П0001000501 = ПолучитьКоличествоСотрудниковИмевшихОтпускаБезСохраненияЗП(Запрос);
// Принятые сотрудники
СтруктураПолей.П0001000601 = ПолучитьКоличествоПринятыхСотрудников(Запрос);
// Выбывшие сотрудники
СтруктураПолей.П0001000801 = ПолучитьКоличествоУволенныхСотрудников(Запрос);
// По собственному желанию
СтруктураПолей.П0001001201 = СтруктураПолей.П0001000801;
// Количество сотрудников списочного состава на конец месяца
СтруктураПолей.П0001001301 = ПолучитьКоличествоСотрудниковСписочногоСостава(Запрос);
Необходимо при Увольнении или Перемещении работников проверять - работает ли сотрудник? или он в отпуске, болеет и т.д.?
Для решение этого создадим в разделе
Подписки на события , подписку "ПриПроведенииПроверкаСостоянияРаботников"
и укажем в её свойствах:
А это код обработки из Обработчика:
Код 1C v 8.х //Проверка Состояния Сотрудников // для обработчика Подписка на Событие
Процедура ПриПроведенииПроверкаСостоянияРаботниковОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
ОчиститьСообщения();
Если ТипЗнч(Источник.Ссылка) = Тип("ДокументСсылка.УвольнениеИзОрганизаций") Тогда
Для Каждого Сотр из Источник.РаботникиОрганизации Цикл
Сост=РегистрыСведений.СостояниеРаботниковОрганизаций.ПолучитьПоследнее(Сотр.ДатаУвольнения, Новый Структура("Сотрудник",Сотр.Сотрудник));
Если НЕ Сост.Состояние = Перечисления.СостоянияРаботникаОрганизации.Работает Тогда
Если Сост.СостояниеЗавершения = Перечисления.СостоянияРаботникаОрганизации.Работает и Сотр.ДатаУвольнения < Сост.ПериодЗавершения Тогда
Сообщить("Сотрудник "+Строка(Сотр.Сотрудник)+" на "+Формат(Сотр.ДатаУвольнения, "ДЛФ=DD")+ " - "+Строка(Сост.Состояние)+"! Можно уволить после "+Формат(Сост.ПериодЗавершения, "ДЛФ=DD") , СтатусСообщения.ОченьВажное);
Отказ = Истина; // Запрет проведения
ИначеЕсли НЕ Сост.СостояниеЗавершения = Перечисления.СостоянияРаботникаОрганизации.Работает и Сотр.ДатаУвольнения < Сост.ПериодЗавершения Тогда
Сообщить("Сотрудник "+Строка(Сотр.Сотрудник)+" на "+Формат(Сотр.ДатаУвольнения, "ДЛФ=DD")+ " - "+Строка(Сост.Состояние)+"!", СтатусСообщения.ОченьВажное);
Отказ = Истина; // Запрет проведения
КонецЕсли;
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипЗнч(Источник.Ссылка) = Тип("ДокументСсылка.КадровоеПеремещениеОрганизаций") Тогда
Для Каждого Сотр из Источник.РаботникиОрганизации Цикл
Сост=РегистрыСведений.СостояниеРаботниковОрганизаций.ПолучитьПоследнее(Сотр.ДатаНачала, Новый Структура("Сотрудник",Сотр.Сотрудник));
Если НЕ Сост.Состояние = Перечисления.СостоянияРаботникаОрганизации.Работает Тогда
Если Сост.СостояниеЗавершения = Перечисления.СостоянияРаботникаОрганизации.Работает и Сотр.ДатаНачала < Сост.ПериодЗавершения Тогда
Сообщить("Сотрудник "+Строка(Сотр.Сотрудник)+" на "+Формат(Сотр.ДатаНачала, "ДЛФ=DD")+ " - "+Строка(Сост.Состояние)+"! Можно переместить после "+Формат(Сост.ПериодЗавершения, "ДЛФ=DD") , СтатусСообщения.ОченьВажное);
Отказ = Истина; // Запрет проведения
ИначеЕсли НЕ Сост.СостояниеЗавершения = Перечисления.СостоянияРаботникаОрганизации.Работает и Сотр.ДатаНачала < Сост.ПериодЗавершения Тогда
Сообщить("Сотрудник "+Строка(Сотр.Сотрудник)+" на "+Формат(Сотр.ДатаНачала, "ДЛФ=DD")+ " - "+Строка(Сост.Состояние)+"!", СтатусСообщения.ОченьВажное);
Отказ = Истина; // Запрет проведения
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Нужен Отчет, в котором было бы видно, кто и из какой организации к нам пришел?
Эти данные хранятся в Табличной части "Трудовая деятельность" справочника "ФизическиеЛица", еще нужно вывести в отчет текущую Должность и Подразделение(Выводить ПолноеНаименование, т.е со всеми родителями) работника из регистра сведений "Работники орагнизации" и получить из документа "ПриемНаРаботуВОрганизацию" Дату приема и номер документа.
1. Создаем новый отчет, открываем СКД и добавляем набор данных Запрос. Согласно нашим требованиям формируем запрос:
Код 1C v 8.х ВЫБРАТЬ
ФизическиеЛицаТрудоваяДеятельность.Ссылка,
ФизическиеЛицаТрудоваяДеятельность.НомерСтроки,
ФизическиеЛицаТрудоваяДеятельность.Организация,
ФизическиеЛицаТрудоваяДеятельность.ДатаНачала,
ФизическиеЛицаТрудоваяДеятельность.ДатаОкончания,
ФизическиеЛицаТрудоваяДеятельность.Должность КАК ДолжностьТруд,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Номер,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Дата,
РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации,
РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
РаботникиОрганизацийСрезПоследних.Сотрудник.Код,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.ДатаПриема,
РаботникиОрганизацийСрезПоследних.Организация КАК ОрганизацияГлавная,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование ЕСТЬ NULL
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель.Наименование ЕСТЬ NULL
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
КОНЕЦ КАК ПолныйКод
ИЗ
Справочник.ФизическиеЛица.ТрудоваяДеятельность КАК ФизическиеЛицаТрудоваяДеятельность
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
ПО ФизическиеЛицаТрудоваяДеятельность.Ссылка = РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботуВОрганизацию.РаботникиОрганизации КАК ПриемНаРаботуВОрганизациюРаботникиОрганизации
ПО ФизическиеЛицаТрудоваяДеятельность.Ссылка = ПриемНаРаботуВОрганизациюРаботникиОрганизации.ФизЛицо.Ссылка
2. Переходим в закладку Настройки, Заполняем Выбранные поля Добавляем к отчету пустую группировку:
3. В итоге должно получиться:
4. Сохраняем и проверяем отчет, уже что-то формируется
:
5. Теперь сделаем отчет красивым. Добавим отбор по организации на форме, и создадим макет вывода. Создадим основную форму отчета, кроме существующих Элементов панели и Табличного документа "Результат" добавим на форму "ТабличноеПоле" и установим Данные: "КомпоновщикНастроек.Настройки.Отбор"
6. Откроем СКД, закладку Макеты. В табличном поле Нарисуем макет, в левом верхнем поле Добавим макет Группировки "ЗаголовокОтчета:Заголовок" и "СтрокаОтчета:Заголовок". В нижнем левом поле опишем Параметры макета, для "СтрокаОтчета:Заголовок":
7. На закладке Настройки, добавим группировки "ОрганизацияГлавная" и входящая в нее "Детальные записи". Щелкнув правой клавишей мыши на каждой группировке и выбрав из меню пункт "Установить имя..." установим именя областей созданного макета. Заполним Выбранные поля:
8. Внизу на закладке "Отбор" установим:
9. Сохраним отчет и проверим его работу, все ок
Автор:
Евгений Мигачев