Переход со старых редакций программных продуктов 1С на новые — всегда ответственный процесс, сопровождающийся техническими нюансами. Одной из частых проблем, с которой сталкиваются системные администраторы и программисты при переходе с 1С:Зарплата и Управление Персоналом редакции 2.5 на редакцию 3.1, является перенос исторических данных о трудовом стаже сотрудников для корректного формирования отчетности в ПФР (СФР).
Начиная с версии ЗУП 3.1.8, разработчики фирмы «1С» удалили из общего модуля ПереносДанных встроенные механизмы обратной совместимости, отвечавшие за разбор и загрузку файлов старых форматов переноса стажа. Из-за этого при попытке загрузить сведения о стаже, выгруженные стандартной обработкой из ЗУП 2.5, база-приемник выдает фатальную ошибку: Метод объекта не обнаружен (ПроверкаВозможностиЗагрузкиФайлаЗаписиСтажаПФР).
В этой статье мы подробно разберем причины возникновения данной проблемы, проанализируем структуру хранения данных о стаже в новой редакции и рассмотрим наиболее эффективные методы обхода этого ограничения, включая написание собственного расширения конфигурации.
Выясним первопричину сбоя. В конфигурациях ЗУП 3.1 ранних версий (вплоть до 3.1.7) при выгрузке данных из старой базы формировались три основных файла: ЗаписиПоСтажу (формат XML), Инструкция и Протокол. Загрузка этих файлов в ЗУП 3.1 выполнялась через специализированный помощник перехода.
В релизе 3.1.8 разработчики оптимизировали метаданные и удалили код поддержки этой загрузки. Из общего модуля ПереносДанных исчезли три ключевые процедуры:
ПроверкаВозможностиЗагрузкиФайлаЗаписиСтажаПФР — отвечает за сопоставление ИНН и наименований организаций из XML-файла со справочником в текущей информационной базе.ДокументПереносДанныхПриЗагрузке — выполняет инициализацию документа переноса и отключает бизнес-логику при записи движений регистров.ОбработатьПериодыОплаченныеДоНачалаЭксплуатации — сопоставляет начисления и виды стажа ПФР за прошлые периоды.Поскольку сама обработка выгрузки в ЗУП 2.5 осталась прежней и продолжает генерировать XML-файлы со ссылками на эти процедуры, загрузка в ЗУП 3.1.8 и более новых версиях прерывается ошибкой. Ниже приведены два работающих способа решения этой проблемы.
Для того чтобы не снимать рабочую конфигурацию ЗУП 3.1 с поддержки и сохранить возможность ее автоматического обновления, мы воспользуемся механизмом расширений. Мы добавим в расширение общий модуль ПереносДанных и внесем туда удаленный разработчиками программный код.
Рассмотрим пошагово этот процесс:
ВосстановлениеПереносаСтажа). Назначение расширения укажите как Адаптация.ПереносДанных, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.ПереносДанных внутри созданного расширения и добавьте в него следующий программный код:
Процедура ПроверкаВозможностиЗагрузкиФайлаЗаписиСтажаПФР(Параметры, Отказ, ПричинаОтказа) Экспорт
ВыгруженныеОрганизации = Параметры.ВыгруженныеОрганизации.Получить();
Если ВыгруженныеОрганизации = Неопределено Тогда
Отказ = Истина;
ТекстСообщения = "Отсутствуют данные для загрузки";
Возврат;
КонецЕсли;
// ВыгруженныеОрганизации - таблица значений с полями Наименование и ИНН
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Организации.Наименование КАК Наименование,
| Организации.ИНН КАК ИНН
|ИЗ
| Справочник.Организации КАК Организации";
ОрганизацииИБ = Запрос.Выполнить().Выгрузить();
Отбор = Новый Структура("Наименование,ИНН");
ТекстСообщения = "Загрузка данных отменена. В загружаемых данных есть организации, отсутствующие в информационной базе";
Для каждого Организация Из ВыгруженныеОрганизации Цикл
ЗаполнитьЗначенияСвойств(Отбор, Организация);
НайденныеСтроки = ОрганизацииИБ.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
Отказ = Истина;
Если Не ПустаяСтрока(ТекстСообщения) Тогда
ТекстСообщения = ТекстСообщения + Символы.ПС;
КонецЕсли;
ТекстСообщения = ТекстСообщения + "Наименование: " + СокрЛП(Организация.Наименование) + " ИНН: " + СокрЛП(Организация.ИНН);
КонецЕсли;
КонецЦикла;
ПричинаОтказа = ТекстСообщения;
КонецПроцедуры
Процедура ДокументПереносДанныхПриЗагрузке(Объект, СписокРегистров) Экспорт
Объект.Дата = ТекущаяДатаСеанса();
Объект.ДополнительныеСвойства.Вставить("ПроверятьБизнесЛогикуПриЗаписи");
Для Каждого ИмяРегистра Из СписокРегистров Цикл
Если Объект.ТаблицаРегистров.Найти(ИмяРегистра, "Имя") = Неопределено Тогда
Объект.ТаблицаРегистров.Добавить().Имя = ИмяРегистра;
КонецЕсли;
Объект.Движения[ИмяРегистра].ОбменДанными.Загрузка = Истина;
Если ИмяРегистра = "ПлановыеНачисленияПоДоговорам"
Или ИмяРегистра = "Начисления"
Или ИмяРегистра = "ДанныеТабельногоУчетаРабочегоВремениСотрудников" Тогда
// Пропускаем специфичные регистры
Иначе
Объект.Движения[ИмяРегистра].ДополнительныеСвойства.Вставить("ПроверятьБизнесЛогикуПриЗаписи");
КонецЕсли;
КонецЦикла;
Объект.Заполнить(Неопределено);
КонецПроцедуры
Процедура ОбработатьПериодыОплаченныеДоНачалаЭксплуатации(Объект, ОбъектНайден, ПараметрыОбъекта) Экспорт
Если Не ОбъектНайден Тогда
Возврат;
КонецЕсли;
Если ПараметрыОбъекта = Неопределено Тогда
Возврат;
КонецЕсли;
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ПериодыОплаченныеДоНачалаЭксплуатации");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
Попытка
Блокировка.Заблокировать();
Исключение
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
Начисления = ПараметрыОбъекта.Получить("НачисленияТабличнаяЧасть");
Начисления.Индексы.Добавить("Сотрудник,ВидПериода,ДатаНачала,ДатаОкончания");
Отбор = Новый Структура("Сотрудник,ВидПериода,ДатаНачала,ДатаОкончания");
ДокументОбъект = Объект.Ссылка.ПолучитьОбъект();
ДанныеОбновлены = Ложь;
НеОбновленныеСтроки = Новый Массив;
Для каждого СтрокаТЧ Из ДокументОбъект.Начисления Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.ВидСтажаПФР) Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Отбор, СтрокаТЧ);
НайденныеСтроки = Начисления.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
НеОбновленныеСтроки.Добавить(СтрокаТЧ);
ИначеЕсли ЗначениеЗаполнено(НайденныеСтроки[0].ВидСтажаПФР) Тогда
СтрокаТЧ.ВидСтажаПФР = НайденныеСтроки[0].ВидСтажаПФР;
ДанныеОбновлены = Истина;
КонецЕсли;
КонецЦикла;
Если ДанныеОбновлены Тогда
РежимЗаписи = ?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись);
ДокументОбъект.Записать(РежимЗаписи);
КонецЕсли;
ЗафиксироватьТранзакцию();
КонецПроцедуры
После сохранения расширения запустите информационную базу в режиме «1С:Предприятие» и повторите процедуру загрузки данных через помощник переноса данных. Все данные о стаже сотрудников будут импортированы корректно.
Если у вас нет возможности или прав для создания расширений в рабочей базе, проанализируем альтернативный вариант — перенос с использованием промежуточной базы-приемника ранней версии.
Для реализации этого метода выполните следующие шаги:
Перенос данных с кодами стажа успешно созданы и проведены.Универсальный обмен данными в формате XML выгрузите документы Перенос данных по регистру стажа из обновленной промежуточной базы и загрузите их в вашу основную рабочую базу.Этот способ дольше по времени, однако он гарантирует полную корректность структуры данных, так как все изменения таблиц при обновлении релизов выполняются штатными обработчиками обновления фирмы «1С».
Обратим внимание на критически важные параметры выгрузки данных из ЗУП 2.5. На практике часто возникает путаница с датами начала эксплуатации программного продукта.
Правило определения периода выгрузки стажа:
Стандартный алгоритм обработки выгрузки рассчитывает период выгружаемого стажа по следующей формуле:
ДатаОкончанияВыгрузки = МесяцНачалаЭксплуатации - 1 день
То есть программа стремится выгрузить всю историю стажа ПФР до того момента, как вы начнете вести учет в новой информационной базе. Рассмотрим это на практических примерах:
Если вы сталкиваетесь с ошибкой пересечения временных интервалов (Записи о стаже уже существуют), убедитесь, что вы предварительно очистили регистр сведений Записи о стаже до начала эксплуатации за переносимый период в базе-приемнике. В противном случае СУБД заблокирует запись дублирующихся строк с одинаковыми ключевыми измерениями (Физическое лицо, Период, Организация).
Еще одна распространенная проблема при переносе исторических сведений о стаже — потеря периодов нахождения сотрудников в отпусках без сохранения заработной платы, периодов нетрудоспособности и прочих неоплачиваемых интервалов.
Выясним причину этой проблемы. В ЗУП 2.5 виды стажа для ПФР могли настраиваться пользователями вручную, либо определяться сложным анализом видов расчета. При выгрузке данных стандартная обработка может пропустить такие периоды, если у видов расчета в ЗУП 2.5 не были правильно заполнены параметры отражения в учете по ПФР.
Если после успешного импорта вы обнаружили, что в документах Перенос данных отсутствуют строки с кодом НЕОПЛ, воспользуйтесь следующим алгоритмом исправления:
Основные начисления организаций для отпусков за свой счет). Убедитесь, что на вкладке «Использование» для параметра «Вид стажа для СЗВ» выбрано значение «В контексте ПФР» и указан соответствующий код.Перенос данных. Такие обработки сопоставляют данные кадровых документов отклонений (болезней, отпусков за свой счет), перенесенных из ЗУП 2.5, и автоматически генерируют необходимые записи в регистре сведений Записи о стаже до начала эксплуатации.Используя приведенные в этой статье инструкции и программный код для расширения, мы сможем восстановить функционал миграции данных, сэкономив значительное количество времени кадровой и бухгалтерской служб вашего предприятия.