Это помощник ручного создания кадровых документов в ЗУП 3.1, который пытается по максимум заполнить открываемую форму данными из ЗУП 2.5 (через COM-соединение), попутно создает сотрудников и физлиц, если их нет.
Основано на публикации rilmir //infostart.ru/public/793479/
Не идеал, можно еще многое переделать и оптимизировать. Выложено как более функциональная и менее косячная версия по просьбе некоторых читателей комментариев ссылки выше.
Протестирована на Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.6.54) и Зарплата и управление персоналом КОРП, редакция 2.5 (2.5.133.1) .
Должно работать и на не КОРП версиях.
Некоторые рекомендации и замечания:
- Если в базах используется РЛС, то пользователь 3.1 с РЛС, использующий данную обработку, например кадровик из филиала, должен подключаться к базе 2.5 под аналогичным кадровиком филиала с таким же ограничениями на просмотр документов и сотрудников (у последнего должна быть в правах включена галочка Внешнее соединение). Т.е. не прописывать подключение под администратором в филиалах :)
- Перед переносом документов желательно должно быть заведено Штатное расписание. Подразделения, должности, графики не переносятся этой обработкой. Физлица и Сотрудники создаются, причем при переносе документа любого типа, но нужно все равно проверить перенесенные данные. Например, перенос адреса хоть и улучшен, но номер квартиры так и не открывается в полях адресного классификатора.
- Можно использовать теперь отбор переносимого по виду документов (флажки).
- Тип документа 3.1, в который будет переносится документ 2.5 и который заполняется автоматически при нажатии на кнопку "Прочитать", можно отредактировать вручную, если вы считаете, что должен быть например КадровоеПеремещениеСписком, а не ИзменениеГрафикаСписком.
- ИзменениеГрафикаСписком определяется наличием одного графика для всех на один период и простым быстрым способом - по комментарию (он должен содержать слова "график", "смена режима", "Внутренний временный перевод"), для моей рабочей базы это было достаточно. Желающим можно извратиться и дописать сравнение графиков и начислений до и после перевода.
- Теперь можно переносить отпуска, не только в документ Отпуск, но и помимо ОтпускаСотрудников в ОтпускБезСохраненияОплаты и ОтпускБезСохраненияОплатыСотрудников. Без сохранения оплаты определяется в запросе по документам следующим образом (максимум по всей табличной части РаботникиОрганизации документа в ЗУП 2.5)
|МАКСИМУМ(ВЫБОР КОГДА ОтпускаОрганизацийРаботникиОрганизации.ПричинаОтсутствия = ЗНАЧЕНИЕ(Перечисление.ПричиныОтсутствияНаРаботеВОрганизации.ОтпускБезСохраненияЗарплаты) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ) КАК ЭтоОтпускБезСохраненияЗарплаты,
- Хоть и были использованы некоторые процедуры формы при изменении тех или иных реквизитов. Но в кадровом переводе списком, возможно нужно иногда заходить в строку по сотруднику, в открывшемся окне (там все перенесено) включать выключать какую-нибудь галочку, чтобы при возврате в строке появлялась запись типа "изменен график работы" и т.п.
- Есть возможность переноса нетиповых добавленных в конфигураторе дополнительных реквизитов (например, флажков) из 2.5 в типовой механизм Дополнительных реквизитов, заводимых в режиме Предприятия в 3.1. Оставлено в обработке закомментированным для примера, подробнее описано здесь //infostart.ru/public/901654/
- Мне требовались только кадровые Приемы (списками), Перемещения (списками) и Увольнения (без списков), все остальное тоже переделано для загрузки в документы списками и работает, но оно меньше тестировались. Увольнение списком сделано только базово, без начислений (у одиночного Увольнения расчет начислений в 3.1 был сделан еще предыдущим автором) Заполнение больничного прежнее, без начислений, исправлена выдаваемая ранее ошибка при прочтении: "{ВнешняяОбработка.РаботаСКадрами_из_ЗУП25.МодульОбъекта(1270)}: Значение не является значением объектного типа (Пустая) Если НС.Ссылка.Пустая() И НЕ НС.Сотрудник.Пустая() Тогда"
- В моей рабочей базе коды начислений в 2.5 и 3.1 унифицированы и в целом совпадают. Для типовой оставлен такой вариант с кодами начислений для приема и перемещений:
//Не будем переносить районный коэффициент
Если СокрЛП(КодНачисления) = "00070" ИЛИ СокрЛП(ОснНачисление.ВидРасчета.Description) = "Районный коэффициент" Тогда
Продолжить;
КонецЕсли;
//добавить нужные доплаты при приеме при необходимости
Если СокрЛП(ОснНачисление.ВидРасчета.Description) = "Месячная премия" Тогда
КодНачисления = "ПРЕМП";
ИначеЕсли СокрЛП(КодНачисления) = "00001" Тогда
КодНачисления = "ОКЛ";
ИначеЕсли СокрЛП(КодНачисления) = "00002" Тогда
КодНачисления = "ОКЛЧС";
ИначеЕсли СокрЛП(КодНачисления) = "00003" Тогда
КодНачисления = "ТРФЧС";
КонецЕсли;
СтруктураНачисленийСотрудника.Вставить("ОснНачисление" + СокрЛП(а), ПланыВидовРасчета.Начисления.НайтиПоКоду(КодНачисления));
и такой поиск для отпусков, командировок и больничных:
//начисления ищем по кодам для типовой, учебный и дополнительный ежегодный - попытка найти по имени, нужно поправить на наименование или код в базе
ПричинаОтсутствияТам = БазаТам.String(РаботникОрганизации.ПричинаОтсутствия);
Если ПричинаОтсутствияТам = "Отпуск ежегодный" Тогда
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпуска" + СокрЛП(к), Справочники.ВидыОтпусков.Основной);
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпускаНачисление" + СокрЛП(к), ПланыВидовРасчета.Начисления.НайтиПоКоду("ОТ")); //Отпуск основной
ИначеЕсли ПричинаОтсутствияТам = "Отпуск учебный" Тогда
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпуска" + СокрЛП(к), Справочники.ВидыОтпусков.ОтпускУчебный);
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпускаНачисление" + СокрЛП(к), ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Учебный отпуск")); //Учебный отпуск
ИначеЕсли ПричинаОтсутствияТам = "Отпуск учебный неоплачиваемый" Тогда
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпуска" + СокрЛП(к), Справочники.ВидыОтпусков.ОтпускБезОплатыУчебный);
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпускаНачисление" + СокрЛП(к), ПланыВидовРасчета.Начисления.НайтиПоКоду("ОТПУД")); //Дополнительный учебный отпуск без оплаты
ИначеЕсли ПричинаОтсутствияТам = "Отпуск без сохранения заработной платы" Тогда
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпуска" + СокрЛП(к), Справочники.ВидыОтпусков.ОтпускБезОплатыПоТКРФ);
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпускаНачисление" + СокрЛП(к), ПланыВидовРасчета.Начисления.НайтиПоКоду("ОТПДО")); //Отпуск за свой счет
Иначе
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидОтпуска" + СокрЛП(к), Справочники.ВидыОтпусков.ПустаяСсылка());
КонецЕсли;
//для типовой
РеквизитыДокумента25.Вставить("РаботникиОрганизацииВидРасчетаНачисление" + СокрЛП(к), ПланыВидовРасчета.Начисления.НайтиПоКоду("КОМНД")); //Командировка
//для типовой по коду
РеквизитыДокумента25.Вставить("ВидРасчета", ПланыВидовРасчета.Начисления.НайтиПоКоду("БЛН")); //Больничный
РеквизитыДокумента25.Вставить("ВидРасчетаЗаСчетРаботодателя", ПланыВидовРасчета.Начисления.НайтиПоКоду("БЛРДТ")); //Оплата больничного листа за счет работодателя
РеквизитыДокумента25.Вставить("ДоплачиватьДоПолногоСреднегоЗаработка", ТекДокументТам.ДоплачиватьДоПолногоСреднегоЗаработка);
//попытка найти по наименованию, поправить на наименование из рабочей базы
РеквизитыДокумента25.Вставить("ВидРасчетаДоплаты", ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Доплата до среднего заработка")); //Доплата до среднего заработка
Нужно поменять на свое, если требуется.
Отличия от версии 1.1 rilmir ( //infostart.ru/public/793479/ )
взято из своих же комментариев, описанные замечания исправлены.
- пришлось полностью переписать прочтение доков в таблицу, ибо все множилось зачем-то по одному и тому же документу, лишние реквизиты в запросе...
- сделаны маленькие полезняшки с отбором по типу загружаемого, с визуальным просмотром таб номеров сотрудников до и после (чтоб можно было визуально понять, например, найден точно он или он-совместитель), добавлено отображение списка сотрудников в документе 2.5 для информации. отображение комментария документов.
- полностью переписаны процедуры заполнения реквизитов документов в структуры для загрузки, с учетом того, что они могут потом использоваться для загрузки в документы списком. в том числе и начисления записываются не для одного, а всех сотрудников с возможностью потом найти чье именно.
- сделана загрузка в документы-списки, в том числе с попыткой определять, когда данные подходят для ИзменениеГрафикаСписком, ОтпускБезСохраненияОплаты и ОтпускБезСохраненияОплатыСотрудников, написана загрузка для них.
- подкорректировано дозаполнение формы в документах по одному сотруднику, типа расчета итогового ФОТ в Приеме на работу после загрузки начислений
- добавлено перенос действий Установить, Отменить и т.п. для начислений в Кадровых перемещениях, ибо переносилось все независимо от источника с предопределенным действием Установить.
- исправлены "Объект не найден" на СтрНайти(СокрЛП(НС.Ссылка),"Объект не")>0 Тогда,
именно так СокрЛП обрезает не найденную ссылку
- исправлена ошибка во всех процедурах ПолучитьРеквизиты...() :
1. для сотрудников стояла ГУИД_Организация
2. не надо продолжать сотрудников искать по наименованию, если код, т.е. табельный номер у них уже не равен. если такой найдется, то это он же совместитель или уволенный ранее
ГУИД_Сотрудник = БазаТам.String(РаботникОрганизации.Сотрудник.УникальныйИдентификатор());
Если СокрЛП(ГУИД_Организация) <> "00000000-0000-0000-0000-000000000000" Тогда // ПустаяСсылка
Сотрудник = Справочники.Сотрудники.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД_Сотрудник));
Если СтрНайти(СокрЛП(Сотрудник), "Объект не") Тогда
Сотрудник = Справочники.Сотрудники.НайтиПоКоду(СокрП(РаботникОрганизации.Сотрудник.Code));
//не надо так, это другой сотрудник - он же уже уволенный или совместитель
//Если НЕ ЗначениеЗаполнено(Сотрудник) Тогда
// Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию(СокрЛП(РаботникОрганизации.Сотрудник.Description));
//КонецЕсли;
КонецЕсли;
Иначе
Сотрудник = Справочники.Сотрудники.ПустаяСсылка();
КонецЕсли;
- сделан поиск физлица в первую очередь по ИНН
- ошибка в загрузке физ лиц, если физлицо не военнообязанное, то ВДЗКом.ОтношениеКВоинскомуУчету - пустая ссылка в базе 2.5 и индекс по ней получить нельзя, вылетает на этой строке:
ОтношениеКВоинскомуУчетуТам = СокрЛП(БазаТам.String(ВДЗКом.ОтношениеКВоинскомуУчету));
Ном = "";
Ном = БазаТам.Перечисления.ОтношениеКВоинскомуУчету.Индекс(ВДЗКом.ОтношениеКВоинскомуУчету);
- не нужно создавать физлицо по умолчанию вместе с сотрудником, если сотрудник не найден, часто оно есть, хоть и с другим GUID и вот его как-то стоит поискать по наименованию еще дополнительно. а так дубли плодятся в базе, а по внутренним совместителям с разными физлицами потом еще и НДФЛ не соберете, если не проверите и оставите как загрузилось
- созданное физлицо, если его нет, не обновляется после создания в реквизитах (структуре РеквизитыДокумента25) для записи документа. и в этом случае в документ запишется новосозданный сотрудник и пустое физлицо.
- добавлен перенос Группы доступа физлица (очень важно для тех кто работает в филиалах с ограничением на просмотр физлиц), заполнение регистра сведений ФИО физлиц последними сведениями.
- при приеме и перемещении в начислениях районный коэффициент не нужно тянуть в табличную часть 3.1 из 2.5
- исправлена ошибка при прочтении больничного: "{ВнешняяОбработка.РаботаСКадрами_из_ЗУП25.МодульОбъекта(1270)}: Значение не является значением объектного типа (Пустая)
Если НС.Ссылка.Пустая() И НЕ НС.Сотрудник.Пустая() Тогда"
- добавлен перенос номера и даты трудового договора при Приеме на работу
- исправлено частично, номер квартиры до сих пор не открывается:
не корректно загружается контактная информация, таблица справочника физлица не полностью заполняется, из-за этого, при открытии адреса - он пустой