Предпосылки дальнейшего разбора функционала ЗУП 3.1
Очередной привет всем! В предыдущем материале я рассказал, что последнее время занимаюсь в основном типовой конфигураций 1С:Зарплата и управление персоналом 3.1, и постарался подробно описать функционал работы с профилями пользователей и добавлению ролей, а так же несколько полезных функций по работе с физическими лицами.
По-моему, такие технические описания "заходят" любым пользователям или программистам, одним в качестве шпаргалок, а другим - для расширения понимая возможностей. С предыдущей статьей вы можете ознакомиться вот по этой ссылке.
Собственно, теперь о предпосылках разбора функционала: базу, с которой я работаю, нужно привести в порядок - вычистить от "мусора", привести в комфортное использование через перенос в чистую базу.
В данный момент пришло время вспомнить, как обстоят дела в этой базе со справочником "Сотрудники" организаций. Все примеры и эксперименты делаются на конфигурации 1С:ЗУП 3.1.32.66 и 1С:Платформе 8.3.24.1586.
Базовые полезные функции работы с сотрудниками организаций
1.Функция СотрудникиОрганизации(ТолькоРазрешенные, Параметры) Экспорт
Параметры1 = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
АА = КадровыйУчет.СотрудникиОрганизации(Истина, Параметры1); // Таблица значений
В итоге, таблица значений полученного результата выглядит вот так:
Рис.1. Результат выполнения функции сотрудники организации
В основе функции ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц() лежит вот такая структура:
Функция ПараметрыПолученияСотрудниковОрганизаций()
ПараметрыПолучения = Новый Структура("Организация,Подразделение");
ПараметрыПолучения.Вставить("КадровыеДанные", "");
ПараметрыПолучения.Вставить("ОтбиратьПоГоловнойОрганизации", Ложь);
ПараметрыПолучения.Вставить("НачалоПериода", '00010101');
ПараметрыПолучения.Вставить("ОкончаниеПериода", '00010101');
ПараметрыПолучения.Вставить("Отборы");
ПараметрыПолучения.Вставить("ИсключаемыйРегистратор");
ПараметрыПолучения.Вставить("ВключаяУволенныхНаНачалоПериода", Ложь);
ПараметрыПолучения.Вставить("РаботникиПоТрудовымДоговорам", Истина);
ПараметрыПолучения.Вставить("ПодработкиРаботниковПоТрудовымДоговорам", Ложь);
ПараметрыПолучения.Вставить("РаботникиПоДоговорамГПХ", Неопределено);
ПараметрыПолучения.Вставить("ВыбрасыватьИсключениеДоступа", Истина);
ДополнитьСтруктуруПараметровИменамиТаблицСКадровойИсториейСотрудников(ПараметрыПолучения);
Возврат ПараметрыПолучения;
КонецФункции
2. Функция ОсновныеСотрудникиФизическихЛиц(СписокФизическихЛиц, ТолькоРазрешенные, Организация, Период) Экспорт
Вероятно, что это будет самая ходовая функция, когда необходимо получить список сотрудников по списку физических лиц за выбранный период по определенной организации:
Функция ОсновныеСотрудникиФизическихЛиц(СписокФизическихЛиц, ТолькоРазрешенные, Организация, Период) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
СоздатьВТОсновныеСотрудникиФизическихЛиц(Запрос.МенеджерВременныхТаблиц, ТолькоРазрешенные, СписокФизическихЛиц, Организация, Период, Период);
Запрос.Текст =
"ВЫБРАТЬ ОсновныеСотрудникиФизическихЛиц.* ИЗ ВТОсновныеСотрудникиФизическихЛиц КАК ОсновныеСотрудникиФизическихЛиц";
ОсновныеСотрудникиФизическихЛиц = Запрос.Выполнить().Выгрузить();
Возврат ОсновныеСотрудникиФизическихЛиц;
КонецФункции
Результат выполнения - таблица значений ФизическоеЛицо:Сотрудник.
3. Функция СреднесписочнаяЧисленностьРаботающих(Организация, НачалоПериода, КонецПериода, ПоГоловнойОрганизации = Ложь, Точность =0) Экспорт
Используя данную функцию вот таким кодом:
АА = КадровыйУчет.СреднесписочнаяЧисленностьРаботающих(Организация,Период.ДатаНачала, Период.ДатаОкончания);
Получаем очередную структуру:
Рис.2. Структура среднесписочной численности сотрудников по категориям
4. Функция КадровыеДанныеСотрудника(ТолькоРазрешенные, Сотрудник, КадровыеДанные, ДатаПолученияДанных) Экспорт
Использую кадровые данные функции, получаем структуру по выбранным кадровым данным
Функция КадровыеДанныеСотрудника(ТолькоРазрешенные, Сотрудник, КадровыеДанные, ДатаПолученияДанных) Экспорт
Если Не ЗначениеЗаполнено(Сотрудник) Тогда
Возврат Неопределено;
КонецЕсли;
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(Сотрудник);
ТаблицаЗначений = КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных);
Если ТаблицаЗначений.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ТаблицаЗначений[0];
КонецФункции
где КадровыеДанные - "строка" - имена полей перечисленные через запятую, список полей вот такой:
Информация о рабочем месте.
- РабочееМестоПериодРегистрации - Дата
- РабочееМестоРегистратор - ДокументСсылка
- Организация - СправочникСсылка.Организации
- Подразделение - СправочникСсылка.ПодразделенияОрганизаций
- Должность - СправочникСсылка.Должности
- ВидЗанятости - ПеречисленияСсылка.ВидыЗанятости
- ВидСобытия - ПеречисленияСсылка. ВидыКадровыхСобытий
- КоличествоСтавок - Число, в этой конфигурации всегда 1.
- ДолжностьПоШтатномуРасписанию - СправочникСсылка.ШтатноеРасписание
- ВидДоговора - ПеречислениеСсылка.ВидыДоговоровССотрудниками
- МестоВСтруктуреПредприятия - СправочникСсылка.СтруктураПредприятия.
- РайонныйКоэффициент - Число
- РайонныйКоэффициентРФ - Число
- РазрядКатегорияПериодРегистрации - Дата
- РазрядКатегорияРегистратор - ДокументСсылка
- ПКУПериодРегистрации - Дата
- ПКУ - СправочникСсылка.РазрядыКатегорииДолжностей.
и др....
в итоге выглядит это вот так (сделал отбор только должности и вида занятости):
КадровыеДанныеПоФильтру = КадровыйУчет.КадровыеДанныеСотрудника(Истина,ЭтаФорма.Сотрудник,"Должность,ВидЗанятости",ТекущаяДата());
Рис.3. Отбор кадровых данных сотрудника и сопоставление его с физ.лицом
5. Процедура ПроверитьРаботающихСотрудников(СписокСотрудников, ПараметрыПолученияСотрудниковОрганизаций, Отказ, ПараметрыСообщения) Экспорт
Данная процедура - проверка о неработающих сотрудниках по фильтру периоду, где результат выполнения - это сообщение пользователю:
Процедура ПроверитьРаботающихСотрудников(СписокСотрудников, ПараметрыПолученияСотрудниковОрганизаций, Отказ, ПараметрыСообщения) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
|ПОМЕСТИТЬ ВТФизическиеЛица
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Ссылка В(&СписокСотрудников)";
УстановитьПривилегированныйРежим(Истина);
Запрос.Выполнить();
СоздатьВТСотрудникиОрганизации(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыПолученияСотрудниковОрганизаций);
УстановитьПривилегированныйРежим(Ложь);
СообщитьОНеработающихСотрудниках(Запрос.МенеджерВременныхТаблиц, ПараметрыПолученияСотрудниковОрганизаций, Отказ, ПараметрыСообщения);
КонецПроцедуры
6. Функция НеоформленныеСотрудникиФизическихЛиц(ФизическиеЛица, Организация, ВключатьВПоискУволенныхСотрудников = Истина) Экспорт
Возвращает соответствие неоформленных сотрудников, код такой:
ФЛ = Новый Массив();
ФизЛица = Новый Запрос("ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица");
ТЗ = ФизЛица.Выполнить().Выгрузить();
Для Каждого Стр11 ИЗ ТЗ Цикл
ФЛ.Добавить(Стр11);
КонецЦикла;
Неоформленные1 = КадровыйУчет.НеоформленныеСотрудникиФизическихЛиц(ФЛ, ЭтаФорма.Организация,Истина);
7. Функция НовыйСотрудникФизическогоЛица(ФизическоеЛицо, Организация) Экспорт
Данная функция создаст нового сотрудника на основе физического лица и организации. Функция выглядит вот так (простая функция, как оказалось, но она есть):
Функция НовыйСотрудникФизическогоЛица(ФизическоеЛицо, Организация) Экспорт
СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
СотрудникОбъект.ФизическоеЛицо = ФизическоеЛицо;
СотрудникОбъект.ГоловнаяОрганизация = ЗарплатаКадры.ГоловнаяОрганизация(Организация);
Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
ОбновлениеИнформационнойБазы.ЗаписатьДанные(СотрудникОбъект);
Иначе
СотрудникОбъект.Записать();
КонецЕсли;
Возврат СотрудникОбъект.Ссылка;
КонецФункции
8. Процедура ПоместитьСотрудникаВАрхив(Сотрудник, ПомечатьНаУдаление = Ложь) Экспорт
Данная процедура работает через блокировку и позволит поместить сотрудника в архив, пометив его на удаление:
Процедура ПоместитьСотрудникаВАрхив(Сотрудник, ПомечатьНаУдаление = Ложь) Экспорт
Блокировка = Новый БлокировкаДанных();
Блокировка.Добавить(Метаданные.Справочники.Сотрудники.ПолноеИмя()).УстановитьЗначение("Ссылка", Сотрудник);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
СотрудникОбъект = Сотрудник.ПолучитьОбъект();
СотрудникОбъект.ВАрхиве = Истина;
Если ПомечатьНаУдаление Тогда
СотрудникОбъект.ПометкаУдаления = Истина;
КонецЕсли;
СотрудникОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
9. Процедура ИзвлечьСотрудникаИзАрхива(Сотрудник) Экспорт
Процедура извлекает сотрудника из архива, так же через блокировку, но что интересно, пометку удаления не снимает - такого параметра нет.
Процедура ИзвлечьСотрудникаИзАрхива(Сотрудник) Экспорт
Блокировка = Новый БлокировкаДанных();
Блокировка.Добавить(Метаданные.Справочники.Сотрудники.ПолноеИмя()).УстановитьЗначение("Ссылка", Сотрудник);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
СотрудникОбъект = Сотрудник.ПолучитьОбъект();
СотрудникОбъект.ВАрхиве = Ложь;
СотрудникОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
10. Функция ОсновнойСотрудникФизическогоЛица(ФизическоеЛицо, Организация, Период) Экспорт
Получение основного сотрудника физического лица по фильтру организации и периоду. Можно получить "крайнего" сотрудника:
Функция ОсновнойСотрудникФизическогоЛица(ФизическоеЛицо, Организация, Период) Экспорт
Возврат КадровыйУчетПовтИсп.ОсновнойСотрудникФизическогоЛица(ФизическоеЛицо, Организация, Период);
КонецФункции
Получаем ссылку на сотрудника организации.
Пожалуй, на этом завершим обзор и перейдем к выводам по данному функционалу.
Выводы по описанному функционалу
Почти все, что мы хотим придумать и ломаем над этим голову - придумано и задействовано уже до нас, причем достаточно долгое время.
Как и в данном обзоре - получение сотрудников, создание на основе физического лица, получение кадровых данных, работа с архивом сотрудников и т.д...
Подобные обзоры облегчают вам ваш труд на ниве кодинга 1с и повышают уровень вашего мастерства. Благодарим за интерес к данному материалу.
Авторские обзоры и публикации
Ознакомьтесь с публикациями автора - статьи и технические обработки на данном аккаунте. У нас накоплена большая библиотека технических знаний, обзоров и примеров, которая размещается как здесь - на портале, так и в телеграмм канале. Автор является практикующим сертифицированным программистом 1с с опытом работы уже ближе к 20-ти годам, что, как минимум, подтверждается публикациями материалов на данном портале.
Примеры работ с торговым оборудованием с применением и без применения БПО:
Тестирование принтера чеков через различные версии БПО
Работа с эмулятором дисплея покупателя через БПО
Работа со встроенным сканером на терминале сбора данных АТОЛ
Отчеты и доп.функционал для бухгалтерии:
Доходы и расходы хозрасчетного плана счетов для 1С:БП 3.0 (2025 г.)
Пересборка отчета по ОС - бухгалтерский учет
Суммы НДС в формах списка объектов для Бухгалтерии 3.0
Классические примеры и функционал:
Установка своего пароля на отчет, не втягивая в это RLS
Запрет глобального поиска в конфигурации
Классический корректный пример внешней печатной формы с печатью и подписями на БСП 3.1.10