Дозагрузка кадровых документов в ЗУП 3.1 из ЗУП 2.5 в интерактивном режиме (загрузка в документы списком)



При переходе с ЗУП 2.5 на ЗУП 3.1, иногда по тем или иным причинам требуется ручной перенос кадровых документов за период.
Это помощник ручного создания кадровых документов в ЗУП 3.1, который пытается по максимуму заполнить открываемую форму данными из ЗУП 2.5 (через COM-соединение), попутно создает сотрудников и физлиц, если их нет.
Основано на публикации rilmir https://infostart.ru/public/793479/ , которое было местами переписано заново, почищено, отлажено, и все равно там еще есть что переделать и оптимизировать, и которое в свою очередь было когда то чьим-то еще творением, видимо для более глобальных целей.

Это помощник ручного создания кадровых документов в ЗУП 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)}: Значение не является значением объектного типа (Пустая)
Если НС.Ссылка.Пустая() И НЕ НС.Сотрудник.Пустая() Тогда"

— добавлен перенос номера и даты трудового договора  при Приеме на работу

исправлено частично, номер квартиры до сих пор не открывается:
не корректно загружается контактная информация, таблица справочника физлица не полностью заполняется, из-за этого, при открытии адреса — он пустой

14 Comments

  1. васисубатор

    Полезная вещь в наше смутное время переносов. Только физлиц я обычно ищу в первую очередь по СНИЛС — ИНН не у всех есть

    Reply
  2. bugtester

    (1) Работаете с ортодоктально религиозными людьми?)

    В наше смутное время пенсионных реформ, скоро и СНИЛС может стать ненужным

    Reply
  3. васисубатор

    Его дают уже детям, используют для авторизации на госуслугах, … в отличие от бесовского ИНН 🙂

    Reply
  4. nia72

    Так и не понял — обработка работоспособная?

    Reply
  5. bugtester

    (4) работоспособная, но не без огрехов. допилить там тоже есть что. но поменьше, чем в изначальной ссылке

    Reply
  6. nia72

    Да, очень даже работоспособная. за что автору большой респект и уважуха! Допилил в части поступлений. А именно — корректный ввод вида занятости для создаваемого сотрудника в документах приема, по документу ПриемНаРаботуСписком изменил расшифровку и отображение ставки, чтобы не заходить в каждую строку и не перекнопывать ФОТ или количество ставок. Остальное надеюсь сегодня доделать и приспособить для массовой загрузки документов по каждому сотруднику в хронологии кадровых движений.

    Reply
  7. FReIM

    Добрый день.

    Есть ли обновление обработки под версию ЗУПа 3.1.8.185? Платформу используем 8.3.13.1644.

    Reply
  8. bugtester

    (7) нет, использовалась единично, нужды на последующих релизах не было.

    вы нашли что-то, что на 3.1.8.185 перестало работать?

    Reply
  9. vin_lucy

    На 3.1.8.185 — Приемы на работу, отпуска — работает. (другое пока не проверяли).

    Очень облегчает жизнь. Спасибо.

    Reply
  10. FReIM

    (8) Приём, перевод, увольнение, отпуск, отпуск без сохранения, больничный загрузились

    При создании командировки появилась ошибка на картинке.

    ЗУП КОРП 3.1.8.185. Платформа 8.3.13.1644. Все документы, которые к загрузке, типовые.

    Reply
  11. snogl

    Добрый день! Подскажите…

    Необходимо выгрузить все из ЗУП (базовая), редакция 2.5 (2.5.130.2) в ЗУП (базовая), редакция 3.1 (3.1.8.246).

    Данная обработка для этой цели подойдет ?

    Reply
  12. victor_k

    как то сложно

    ГУИД_Сотрудник = БазаТам.String(РаботникОрганизации.Сотрудник.УникальныйИдентификатор());

    Если СокрЛП(ГУИД_Организация) <> «00000000-0000-0000-0000-000000000000» Тогда // ПустаяСсылка

    должно сработать

    РаботникОрганизации.Сотрудник.Пустая()

    или

    БазаТам.ЗначениеЗаполнено(РаботникОрганизации.Сотрудник)

    Reply
  13. bugtester

    (12) это оставленный код из изначальной публикации rilmir.

    «Основано на публикации rilmir https://infostart.ru/public/793479/ , которое было местами переписано заново, почищено, отлажено, и все равно там еще есть что переделать и оптимизировать»

    Не помню почему оставлен, возможно потому что действительно не срабатывало Пустая() или ЗначениеЗаполнено(), возможно потому что этот мелкий блок кода работает — пусть работает

    Reply
  14. bugtester

    (11) не проверял, но шанс есть, в любом случае можно взять за основу для правки кода под себя

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *