PDA

Просмотр полной версии : Перенос справочников с 1С 7.7 в 1С 8.2



kmrdpro
21.01.2014, 11:53
Перенес с 1С 7.7 ЗиК 2.3 в 1С 8.2 ЗиКБУ 1.0 через V77Exp.ert(который в справочнике конвертации в ЗиКБУ) три первых пункта(Набор констант, Организация, Кадровые данные)
Некоторых сотрудников, которые увольнялись и заново устраивались, он их задвоил-затроил. Вообще по сути уволенные не нужны, пометил уволенных на удаление, но они не удаляются потому что при переносе перенеслись еще и кадровые документы, прием на работу, кадровые перемещения, записи регистров и т.п. А самих помеченных сотрудников 1300 с лишним получилось, вручную замучаешься удалять
Возможно ли удаление помеченных объектов и всех связанных с ним ссылок, документов разом? Или каким способом лучше переносить справочники?

Может указать это в файле с правилами обмена через конфигурацию "Конвертация Данных"? Как там сделать такой отбор?

Вот код ПВД_КадровыеДанные_ПередОб работкойПравила который вытянул через "Конвертация Данных"

Состояние(Правило.Наименов ание);

ДатаНачалаУчета = Параметры.ДатаНачалаУчета;

ВыборкаДанных = СоздатьОбъект("СписокЗначений");

ВыборкаДанныхРаботникиОрг анизаций = СоздатьТЗРаботникиОрганиз аций();
ВыборкаДанныхЗанятыеШтатн ыеЕдиницы = СоздатьТЗЗанятыеШтатныеЕд иницыОрганизаций();

ВыборкаДанныхВременноПриб ывающиеРаботники = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанныхВременноПриб ывающиеРаботники.НоваяКол� �нка("Физлицо");
ВыборкаДанныхВременноПриб ывающиеРаботники.НоваяКол� �нка("Организация");
ВыборкаДанныхВременноПриб ывающиеРаботники.НоваяКол� �нка("Период");
ВыборкаДанныхВременноПриб ывающиеРаботники.НоваяКол� �нка("ПринятПоДолгосрочномуДого вору");


СпрСотрудники = СоздатьОбъект("Справочник.Сотрудники");
СпрСотрудники.ВыбратьЭлем� �нты();
Пока СпрСотрудники.ПолучитьЭле� �ент() = 1 Цикл
Если СпрСотрудники.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;

Сотрудник = СпрСотрудники.ТекущийЭлем� �нт();

Если (ПустоеЗначение(Параметры.� �изическоеЛицоДляОтладкиВ� �грузки) = 0) И (Параметры.ФизическоеЛицоД ляОтладкиВыгрузки <> Сотрудник) Тогда
Продолжить;
КонецЕсли;

Если ПустоеЗначение(глРаботалС� �трудник(Сотрудник, ДатаНачала, ДатаОкончания)) = 1 Тогда
Продолжить;
КонецЕсли;

Состояние("Кадровые данные: " + Сотрудник);

РаботникиОрганизаций = СоздатьТЗРаботникиОрганиз аций();
РаботникиОрганизаций.Нова� �Колонка("ПодразделениеОрганизацииБ ыло");
РаботникиОрганизаций.Нова� �Колонка("ДолжностьБыло");
РаботникиОрганизаций.Нова� �Колонка("ЗанимаемыхСтавокБыло");

Если Параметры.РаспределятьПоИ� �точникамФинансирования = 1 Тогда
ВоинскиеИСпециальныеЗвани я = СоздатьОбъект("ТаблицаЗначений");
ВоинскиеИСпециальныеЗвани я.НоваяКолонка("Период");
ВоинскиеИСпециальныеЗвани я.НоваяКолонка("Физлицо");
ВоинскиеИСпециальныеЗвани я.НоваяКолонка("Звание");

КлассныеЧиныДипломатическ иеРангиФизлиц = СоздатьОбъект("ТаблицаЗначений");
КлассныеЧиныДипломатическ иеРангиФизлиц.НоваяКолонк� �("Период");
КлассныеЧиныДипломатическ иеРангиФизлиц.НоваяКолонк� �("Физлицо");
КлассныеЧиныДипломатическ иеРангиФизлиц.НоваяКолонк� �("КлассныйЧин");
КонецЕсли;

ПерРеквизит = СоздатьОбъект("Периодический");
ПерРеквизит.ИспользоватьО� �ъект("", Сотрудник);
ПерРеквизит.ВыбратьЗначен� �я(, ДатаОкончания);
Пока ПерРеквизит.ПолучитьЗначе� �ие() > 0 Цикл
Если (ПустоеЗначение(ПерРеквизи т.ДатаЗнач) = 1) ИЛИ (ПерРеквизит.ДатаЗнач > ДатаНачалаУчета) Тогда
Продолжить;
КонецЕсли;

Документ = ПерРеквизит.ТекущийДокуме� �т();
Реквизит = ПерРеквизит.ТекущийРеквиз� �т();

Если (ПустоеЗначение(ПерРеквизи т.Значение) = 1) И (Реквизит <> "СостояниеФизлица") Тогда
Продолжить;
КонецЕсли;

Если (ПустоеЗначение(Документ) = 0)
И (Документ.Вид() <> "ПриказОПриемеНаРаботу")
И (Документ.Вид() <> "ПриказОЗачисленииВСпискиЧ асти")
И (Документ.Вид() <> "КадровоеПеремещение")
И (Документ.Вид() <> "КадровоеПеремещениеВоенно служащего")
И (Документ.Вид() <> "ПриказОбУвольнении")
И (Документ.Вид() <> "ПриказОбИсключенииИзСписк овЧасти")
И (Документ.Вид() <> "ПерерасчетОкладовПоПредпр иятию")
И (Документ.Вид() <> "СведенияДляРасчетаСтрахов ыхВзносов") Тогда
Продолжить;
КонецЕсли;

Если (Реквизит = "Подразделение")
ИЛИ (Реквизит = "Должность")
ИЛИ (Реквизит = "ГрафикРаботы")
ИЛИ (Реквизит = "Ставка")
ИЛИ (Реквизит = "Оклад")
ИЛИ (Реквизит = "СостояниеФизлица")
ИЛИ (Реквизит = "ДолгосрочныйДоговорСИност ранцем") Тогда

ЭтоПриемНаРаботу = 0;
ЭтоУвольнение = 0;
Если (Документ.Вид() = "ПриказОПриемеНаРаботу") ИЛИ (Документ.Вид() = "ПриказОЗачисленииВСпискиЧ асти") Тогда
Если Документ.ДатаПриема = ПерРеквизит.ДатаЗнач Тогда
ЭтоПриемНаРаботу = 1;
Иначе
ЭтоУвольнение = 1;
КонецЕсли;

ИначеЕсли (Документ.Вид() = "ПриказОбУвольнении") ИЛИ (Документ.Вид() = "ПриказОбИсключенииИзСписк овЧасти") Тогда
ЭтоУвольнение = 1;

КонецЕсли;

ТекущийСотрудник = ЗаполнитьТЗСотрудникаОрга низации(Сотрудник, ПерРеквизит.ДатаЗнач-ЭтоУвольнение);

// Если у сотрудника нет вида договора, значит кадровый документ по нему оформлять не нужно
Если СотрудникБезДоговора(Теку� �ийСотрудник) = 1 Тогда
Продолжить;
КонецЕсли;

Если Реквизит = "ДолгосрочныйДоговорСИност ранцем" Тогда
ВыборкаДанныхВременноПриб ывающиеРаботники.НоваяСтр� �ка();
ВыборкаДанныхВременноПриб ывающиеРаботники.ФизЛицо = ТекущийСотрудник.Получить("Физлицо");
ВыборкаДанныхВременноПриб ывающиеРаботники.Организа� �ия = ТекущийСотрудник.Получить("ОбособленноеПодразделение");
ВыборкаДанныхВременноПриб ывающиеРаботники.Период = ПерРеквизит.ДатаЗнач;
ВыборкаДанныхВременноПриб ывающиеРаботники.ПринятПо� �олгосрочномуДоговору = ПерРеквизит.Значение;
Продолжить;
КонецЕсли;

СтрокаНайдена = 0;
РаботникиОрганизаций.Выбр� �тьСтроки();
Пока РаботникиОрганизаций.Полу� �итьСтроку() = 1 Цикл
Если РаботникиОрганизаций.Пери� �д <> ПерРеквизит.ДатаЗнач Тогда
Продолжить;
КонецЕсли;

НайденныйСотрудник = РаботникиОрганизаций.Сотр� �дник;

Если (НайденныйСотрудник.Получи ть("ВидДоговора") <> ТекущийСотрудник.Получить("ВидДоговора"))
ИЛИ (НайденныйСотрудник.Получи ть("ВидЗанятости") <> ТекущийСотрудник.Получить("ВидЗанятости"))
ИЛИ (НайденныйСотрудник.Получи ть("НомерДоговора") <> ТекущийСотрудник.Получить("НомерДоговора"))
ИЛИ (НайденныйСотрудник.Получи ть("ДатаДоговора") <> ТекущийСотрудник.Получить("ДатаДоговора"))
Тогда
Продолжить;
КонецЕсли;

СтрокаНайдена = 1;
Прервать;
КонецЦикла;

Если СтрокаНайдена = 0 Тогда
// Подразделение
Подразделение = ЗначениеПериодическогоРек визитаНаНачало("Подразделение", Сотрудник, ПерРеквизит.ДатаЗнач-1);

// Должность
Должность = ЗначениеПериодическогоРек визитаНаНачало("Должность", Сотрудник, ПерРеквизит.ДатаЗнач-1);

// ГрафикРаботы
ГрафикРаботы = ЗначениеПериодическогоРек визитаНаНачало("ГрафикРаботы", Сотрудник, ПерРеквизит.ДатаЗнач-1);
Если ПустоеЗначение(ГрафикРабо� �ы) = 1 Тогда
ГрафикРаботы = Константа.ОсновнойГрафик;
КонецЕсли;

// Занимаемых ставок
ЗанимаемыхСтавок = ЗначениеПериодическогоРек визитаНаНачало("Ставка", Сотрудник, ПерРеквизит.ДатаЗнач-1);

РаботникиОрганизаций.Нова� �Строка();
РаботникиОрганизаций.Пери� �д = ПерРеквизит.ДатаЗнач;
РаботникиОрганизаций.Сотр� �дник = ТекущийСотрудник;
РаботникиОрганизаций.Орга� �изация = "Наша организация";
РаботникиОрганизаций.Обос� �бленноеПодразделение = ?(ПустоеЗначение(Подраздел� �ние) = 0, Подразделение, "Наша организация");
РаботникиОрганизаций.Подр� �зделениеОрганизации = Подразделение;
РаботникиОрганизаций.Долж� �ость = Должность;
РаботникиОрганизаций.Граф� �кРаботы = ГрафикРаботы;
РаботникиОрганизаций.Зани� �аемыхСтавок = ЗанимаемыхСтавок;
РаботникиОрганизаций.Прич� �наИзмененияСостояния = "Перемещение";

РаботникиОрганизаций.Подр� �зделениеОрганизацииБыло = Подразделение;
РаботникиОрганизаций.Долж� �остьБыло = Должность;
РаботникиОрганизаций.Зани� �аемыхСтавокБыло = ЗанимаемыхСтавок;

РаботникиОрганизаций.Перв� �чныйДокумент = Документ;
КонецЕсли;

Если Реквизит = "Подразделение" Тогда
РаботникиОрганизаций.Подр� �зделениеОрганизации = ПерРеквизит.Значение;
РаботникиОрганизаций.Обос� �бленноеПодразделение = ?(ПустоеЗначение(ПерРеквиз� �т.Значение) = 0, ПерРеквизит.Значение, "Наша организация");

ИначеЕсли Реквизит = "Должность" Тогда
РаботникиОрганизаций.Долж� �ость = ПерРеквизит.Значение;

ИначеЕсли Реквизит = "ГрафикРаботы" Тогда
РаботникиОрганизаций.Граф� �кРаботы = ПерРеквизит.Значение;

ИначеЕсли Реквизит = "Ставка" Тогда
РаботникиОрганизаций.Зани� �аемыхСтавок = ПерРеквизит.Значение;

ИначеЕсли Реквизит = "СостояниеФизлица" Тогда
Если ((ЭтоПриемНаРаботу = 1) И (РаботникиОрганизаций.Прич инаИзмененияСостояния = "Увольнение"))
ИЛИ ((ЭтоУвольнение = 1) И (РаботникиОрганизаций.Прич инаИзмененияСостояния = "ПриемНаРаботу"))
Тогда
// Если было увольнение и прием на работу в один день
// Необходимо создать вторую запись
ТекущийСотрудник = ЗаполнитьТЗСотрудникаОрга низации(Сотрудник, ПерРеквизит.ДатаЗнач);

// Надо создавать еще одну запись
ОбособленноеПодразделение = РаботникиОрганизаций.Обос� �бленноеПодразделение;
ПодразделениеОрганизации = РаботникиОрганизаций.Подр� �зделениеОрганизации;
Должность = РаботникиОрганизаций.Долж� �ость;
ГрафикРаботы = РаботникиОрганизаций.Граф� �кРаботы;
ЗанимаемыхСтавок = РаботникиОрганизаций.Зани� �аемыхСтавок;

РаботникиОрганизаций.Нова� �Строка();
РаботникиОрганизаций.Пери� �д = ПерРеквизит.ДатаЗнач;
РаботникиОрганизаций.Сотр� �дник = ТекущийСотрудник;
РаботникиОрганизаций.Орга� �изация = "Наша организация";
РаботникиОрганизаций.Обос� �бленноеПодразделение = Подразделение;
РаботникиОрганизаций.Подр� �зделениеОрганизации = Подразделение;
РаботникиОрганизаций.Долж� �ость = Должность;
РаботникиОрганизаций.Граф� �кРаботы = ГрафикРаботы;
РаботникиОрганизаций.Зани� �аемыхСтавок = ЗанимаемыхСтавок;

РаботникиОрганизаций.Подр� �зделениеОрганизацииБыло = Подразделение;
РаботникиОрганизаций.Долж� �остьБыло = Должность;
РаботникиОрганизаций.Зани� �аемыхСтавокБыло = ЗанимаемыхСтавок;

РаботникиОрганизаций.Перв� �чныйДокумент = Документ;
КонецЕсли;

Если ЭтоПриемНаРаботу = 1 Тогда
ЗанимаемыхСтавок = ЗначениеПериодическогоРек визитаНаНачало("Ставка", Сотрудник, ПерРеквизит.ДатаЗнач);
РаботникиОрганизаций.Зани� �аемыхСтавок = ЗанимаемыхСтавок;
РаботникиОрганизаций.Прич� �наИзмененияСостояния = "ПриемНаРаботу";
ИначеЕсли ЭтоУвольнение = 1 Тогда
РаботникиОрганизаций.Зани� �аемыхСтавок = 0;
РаботникиОрганизаций.Прич� �наИзмененияСостояния = "Увольнение";
КонецЕсли;

КонецЕсли;

КонецЕсли;

Если Параметры.РаспределятьПоИ� �точникамФинансирования = 1 Тогда
Если (Реквизит = "РазрядЗваниеЧин") Тогда
ТекущийСотрудник = ЗаполнитьТЗСотрудникаОрга низации(Сотрудник, ПерРеквизит.ДатаЗнач-ЭтоУвольнение);

// Если у сотрудника нет вида договора, значит кадровый документ по нему оформлять не нужно
Если СотрудникБезДоговора(Теку� �ийСотрудник) = 1 Тогда
Продолжить;
КонецЕсли;

ВидДоговора = ТекущийСотрудник.Получить("ВидДоговора");

Если (ВидДоговора = "ВоеннаяСлужбаПоПризыву") ИЛИ (ВидДоговора = "ВоеннаяСлужбаПоКонтракту") Тогда
РазрядыЧиныЗвания = ВоинскиеИСпециальныеЗвани я;
Иначе
РазрядыЧиныЗвания = КлассныеЧиныДипломатическ иеРангиФизлиц;
КонецЕсли;

НомерСтроки = 0;
Если РазрядыЧиныЗвания.НайтиЗн� �чение(ПерРеквизит.ДатаЗна� �, НомерСтроки, "Период") = 1 Тогда
РазрядыЧиныЗвания.Получит� �СтрокуПоНомеру(НомерСтрок и);
Иначе
РазрядыЧиныЗвания.НоваяСт� �ока();
РазрядыЧиныЗвания.Период = ПерРеквизит.ДатаЗнач;
РазрядыЧиныЗвания.Физлицо = СпрСотрудники.ОсновнойЭле� �ент;
КонецЕсли;

Если (ВидДоговора = "ВоеннаяСлужбаПоПризыву") ИЛИ (ВидДоговора = "ВоеннаяСлужбаПоКонтракту") Тогда
РазрядыЧиныЗвания.Звание = ПерРеквизит.Значение;
Иначе
РазрядыЧиныЗвания.Классны� �Чин = ПерРеквизит.Значение;
КонецЕсли;

КонецЕсли;
КонецЕсли;

КонецЦикла;

РаботникиОрганизаций.Сорт� �ровать("Период");

// Необходимо исправить полученные записи:
// - Удалить "лишние" увольнения
// - Удалить перемещения после увольнения
ИсправлятьЗаписи = 1;
Пока ИсправлятьЗаписи = 1 Цикл
ИсправлятьЗаписи = 0;

НайденоУвольнение = 0;
РаботникиОрганизаций.Выбр� �тьСтроки();
Пока РаботникиОрганизаций.Полу� �итьСтроку() = 1 Цикл
Если НайденоУвольнение = 1 Тогда
НайденоУвольнение = 0;
Если РаботникиОрганизаций.Прич� �наИзмененияСостояния <> "ПриемНаРаботу" Тогда
РаботникиОрганизаций.Удал� �тьСтроку();
ИсправлятьЗаписи = 1;
Прервать;
КонецЕсли;
КонецЕсли;

Если РаботникиОрганизаций.Прич� �наИзмененияСостояния = "Увольнение" Тогда
НайденоУвольнение = 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;

ЗанятыеШтатныеЕдиницыОрга низаций = СоздатьТЗЗанятыеШтатныеЕд иницыОрганизаций();

РаботникиОрганизаций.Выбр� �тьСтроки();
Пока РаботникиОрганизаций.Полу� �итьСтроку() = 1 Цикл
Если ПустоеЗначение(РаботникиО� �ганизаций.ЗанимаемыхСтаво кБыло) = 0 Тогда
ЗанятыеШтатныеЕдиницыОрга низаций.НоваяСтрока();
ЗанятыеШтатныеЕдиницыОрга низаций.Период = РаботникиОрганизаций.Пери� �д;
ЗанятыеШтатныеЕдиницыОрга низаций.ВидДвижения = "Расход";
ЗанятыеШтатныеЕдиницыОрга низаций.ПодразделениеОрга� �изации = РаботникиОрганизаций.Подр� �зделениеОрганизацииБыло;
ЗанятыеШтатныеЕдиницыОрга низаций.Должность = РаботникиОрганизаций.Долж� �остьБыло;
ЗанятыеШтатныеЕдиницыОрга низаций.КоличествоСтавок = РаботникиОрганизаций.Зани� �аемыхСтавокБыло;
КонецЕсли;

Если ПустоеЗначение(РаботникиО� �ганизаций.ЗанимаемыхСтаво к) = 0 Тогда
ЗанятыеШтатныеЕдиницыОрга низаций.НоваяСтрока();
ЗанятыеШтатныеЕдиницыОрга низаций.Период = РаботникиОрганизаций.Пери� �д;
ЗанятыеШтатныеЕдиницыОрга низаций.ВидДвижения = "Приход";
ЗанятыеШтатныеЕдиницыОрга низаций.ПодразделениеОрга� �изации = РаботникиОрганизаций.Подр� �зделениеОрганизации;
ЗанятыеШтатныеЕдиницыОрга низаций.Должность = РаботникиОрганизаций.Долж� �ость;
ЗанятыеШтатныеЕдиницыОрга низаций.КоличествоСтавок = РаботникиОрганизаций.Зани� �аемыхСтавок;
КонецЕсли;
КонецЦикла;

ЗанятыеШтатныеЕдиницыОрга низаций.Сортировать("Период");

глПереписатьИзТаблицыВТаб лицу(РаботникиОрганизаций, ВыборкаДанныхРаботникиОрг анизаций);
РаботникиОрганизаций = 0;

глПереписатьИзТаблицыВТаб лицу(ЗанятыеШтатныеЕдиниц� �Организаций, ВыборкаДанныхЗанятыеШтатн ыеЕдиницы);
ЗанятыеШтатныеЕдиницыОрга низаций = 0;

Если Параметры.РаспределятьПоИ� �точникамФинансирования = 1 Тогда
ВоинскиеИСпециальныеЗвани я.ВыбратьСтроки();
Пока ВоинскиеИСпециальныеЗвани я.ПолучитьСтроку() = 1 Цикл
ВыгрузитьПоПравилу(Воинск� �еИСпециальныеЗвания, , , , "ВоинскиеИСпециальныеЗвани я_Регистр");
КонецЦикла;

КлассныеЧиныДипломатическ иеРангиФизлиц.ВыбратьСтро� �и();
Пока КлассныеЧиныДипломатическ иеРангиФизлиц.ПолучитьСтр� �ку() = 1 Цикл
ВыгрузитьПоПравилу(Классн� �еЧиныДипломатическиеРанг� �Физлиц, , , , "КлассныеЧиныДипломатическ иеРангиФизлиц_Регистр");
КонецЦикла;
КонецЕсли;

КонецЦикла;

ВыборкаДанныхВременноПриб ывающиеРаботники.ВыбратьС� �роки();
Пока ВыборкаДанныхВременноПриб ывающиеРаботники.Получить� �троку() = 1 Цикл
ВыгрузитьПоПравилу(Выборк� �ДанныхВременноПрибывающи� �Работники, , , , "ВременноПребывающиеПринят ыеПоДолгосрочнымДоговорам");
КонецЦикла;

КадровыеДанные = СоздатьОбъект("СписокЗначений");
КадровыеДанные.Установить("Дата", ТекущаяДата());
КадровыеДанные.Установить("ПериодРегистрации", Параметры.ДатаНачалаУчета) ;
КадровыеДанные.Установить("Номер", "КД");
КадровыеДанные.Установить("Организация", "Наша организация");
КадровыеДанные.Установить("Комментарий", "Кадровые данные");
КадровыеДанные.Установить("РаботникиОрганизаций", ВыборкаДанныхРаботникиОрг анизаций);
КадровыеДанные.Установить("ЗанятыеШтатныеЕдиницыОрга низаций", ВыборкаДанныхЗанятыеШтатн ыеЕдиницы);

Если (ВыборкаДанныхРаботникиОр� �анизаций.КоличествоСтрок() > 0)
ИЛИ (ВыборкаДанныхЗанятыеШтат� �ыеЕдиницы.КоличествоСтрок () > 0) Тогда
ВыборкаДанных.ДобавитьЗна� �ение(КадровыеДанные);
КонецЕсли;

Если ВыборкаДанных.РазмерСписк� �() = 0 Тогда
Отказ = 1;
КонецЕсли;