Как перенести данные о стаже (СЗВ-СТАЖ) из ЗУП 2.5 в ЗУП 3.1.8 и выше: подробная инструкция и исправление ошибок

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Переход со старых редакций программных продуктов 1С на новые — всегда ответственный процесс, сопровождающийся техническими нюансами. Одной из частых проблем, с которой сталкиваются системные администраторы и программисты при переходе с 1С:Зарплата и Управление Персоналом редакции 2.5 на редакцию 3.1, является перенос исторических данных о трудовом стаже сотрудников для корректного формирования отчетности в ПФР (СФР).

Начиная с версии ЗУП 3.1.8, разработчики фирмы «1С» удалили из общего модуля ПереносДанных встроенные механизмы обратной совместимости, отвечавшие за разбор и загрузку файлов старых форматов переноса стажа. Из-за этого при попытке загрузить сведения о стаже, выгруженные стандартной обработкой из ЗУП 2.5, база-приемник выдает фатальную ошибку: Метод объекта не обнаружен (ПроверкаВозможностиЗагрузкиФайлаЗаписиСтажаПФР).

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

Почему возникает ошибка при переносе стажа в ЗУП 3.1.8?

Выясним первопричину сбоя. В конфигурациях ЗУП 3.1 ранних версий (вплоть до 3.1.7) при выгрузке данных из старой базы формировались три основных файла: ЗаписиПоСтажу (формат XML), Инструкция и Протокол. Загрузка этих файлов в ЗУП 3.1 выполнялась через специализированный помощник перехода.

В релизе 3.1.8 разработчики оптимизировали метаданные и удалили код поддержки этой загрузки. Из общего модуля ПереносДанных исчезли три ключевые процедуры:

Поскольку сама обработка выгрузки в ЗУП 2.5 осталась прежней и продолжает генерировать XML-файлы со ссылками на эти процедуры, загрузка в ЗУП 3.1.8 и более новых версиях прерывается ошибкой. Ниже приведены два работающих способа решения этой проблемы.

Способ 1. Восстановление процедур загрузки через Расширение Конфигурации (Рекомендуемый)

Для того чтобы не снимать рабочую конфигурацию ЗУП 3.1 с поддержки и сохранить возможность ее автоматического обновления, мы воспользуемся механизмом расширений. Мы добавим в расширение общий модуль ПереносДанных и внесем туда удаленный разработчиками программный код.

Рассмотрим пошагово этот процесс:

  1. Откройте конфигуратор вашей рабочей базы ЗУП 3.1.
  2. Перейдите в меню Конфигурация — Расширения конфигурации и создайте новое расширение (например, с именем ВосстановлениеПереносаСтажа). Назначение расширения укажите как Адаптация.
  3. Найдите в основной конфигурации общий модуль ПереносДанных, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.
  4. Откройте модуль ПереносДанных внутри созданного расширения и добавьте в него следующий программный код:

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

    // ВыгруженныеОрганизации - таблица значений с полями Наименование и ИНН
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Организации.Наименование КАК Наименование,
        |   Организации.ИНН КАК ИНН
        |ИЗ
        |   Справочник.Организации КАК Организации";
    ОрганизацииИБ = Запрос.Выполнить().Выгрузить();
    
    Отбор = Новый Структура("Наименование,ИНН");
    ТекстСообщения = "Загрузка данных отменена. В загружаемых данных есть организации, отсутствующие в информационной базе";
    
    Для каждого Организация Из ВыгруженныеОрганизации Цикл
        ЗаполнитьЗначенияСвойств(Отбор, Организация);
        НайденныеСтроки = ОрганизацииИБ.НайтиСтроки(Отбор);
        Если НайденныеСтроки.Количество() = 0 Тогда
            Отказ = Истина;
            Если Не ПустаяСтрока(ТекстСообщения) Тогда
                ТекстСообщения = ТекстСообщения + Символы.ПС;
            КонецЕсли;
            ТекстСообщения = ТекстСообщения + "Наименование: " + СокрЛП(Организация.Наименование) + " ИНН: " + СокрЛП(Организация.ИНН);
        КонецЕсли;
    КонецЦикла;
    ПричинаОтказа = ТекстСообщения;
КонецПроцедуры

Процедура ДокументПереносДанныхПриЗагрузке(Объект, СписокРегистров) Экспорт
    Объект.Дата = ТекущаяДатаСеанса();
    Объект.ДополнительныеСвойства.Вставить("ПроверятьБизнесЛогикуПриЗаписи");
    Для Каждого ИмяРегистра Из СписокРегистров Цикл
        Если Объект.ТаблицаРегистров.Найти(ИмяРегистра, "Имя") = Неопределено Тогда
            Объект.ТаблицаРегистров.Добавить().Имя = ИмяРегистра;
        КонецЕсли;
        Объект.Движения[ИмяРегистра].ОбменДанными.Загрузка = Истина;
        Если ИмяРегистра = "ПлановыеНачисленияПоДоговорам" 
            Или ИмяРегистра = "Начисления" 
            Или ИмяРегистра = "ДанныеТабельногоУчетаРабочегоВремениСотрудников" Тогда
            // Пропускаем специфичные регистры
        Иначе
            Объект.Движения[ИмяРегистра].ДополнительныеСвойства.Вставить("ПроверятьБизнесЛогикуПриЗаписи");
        КонецЕсли;
    КонецЦикла;
    Объект.Заполнить(Неопределено);
КонецПроцедуры

Процедура ОбработатьПериодыОплаченныеДоНачалаЭксплуатации(Объект, ОбъектНайден, ПараметрыОбъекта) Экспорт
    Если Не ОбъектНайден Тогда
        Возврат;
    КонецЕсли;
    Если ПараметрыОбъекта = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    НачатьТранзакцию();
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("Документ.ПериодыОплаченныеДоНачалаЭксплуатации");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
    Попытка
        Блокировка.Заблокировать();
    Исключение
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;
    
    Начисления = ПараметрыОбъекта.Получить("НачисленияТабличнаяЧасть");
    Начисления.Индексы.Добавить("Сотрудник,ВидПериода,ДатаНачала,ДатаОкончания");
    Отбор = Новый Структура("Сотрудник,ВидПериода,ДатаНачала,ДатаОкончания");
    ДокументОбъект = Объект.Ссылка.ПолучитьОбъект();
    ДанныеОбновлены = Ложь;
    НеОбновленныеСтроки = Новый Массив;
    
    Для каждого СтрокаТЧ Из ДокументОбъект.Начисления Цикл
        Если ЗначениеЗаполнено(СтрокаТЧ.ВидСтажаПФР) Тогда
            Продолжить;
        КонецЕсли;
        ЗаполнитьЗначенияСвойств(Отбор, СтрокаТЧ);
        НайденныеСтроки = Начисления.НайтиСтроки(Отбор);
        Если НайденныеСтроки.Количество() = 0 Тогда
            НеОбновленныеСтроки.Добавить(СтрокаТЧ);
        ИначеЕсли ЗначениеЗаполнено(НайденныеСтроки[0].ВидСтажаПФР) Тогда
            СтрокаТЧ.ВидСтажаПФР = НайденныеСтроки[0].ВидСтажаПФР;
            ДанныеОбновлены = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если ДанныеОбновлены Тогда
        РежимЗаписи = ?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись);
        ДокументОбъект.Записать(РежимЗаписи);
    КонецЕсли;
    ЗафиксироватьТранзакцию();
КонецПроцедуры

После сохранения расширения запустите информационную базу в режиме «1С:Предприятие» и повторите процедуру загрузки данных через помощник переноса данных. Все данные о стаже сотрудников будут импортированы корректно.

Способ 2. Промежуточный перенос через базу раннего релиза

Если у вас нет возможности или прав для создания расширений в рабочей базе, проанализируем альтернативный вариант — перенос с использованием промежуточной базы-приемника ранней версии.

Для реализации этого метода выполните следующие шаги:

  1. Создайте пустую информационную базу ЗУП версии 3.1.5 или 3.1.7 (в этих релизах функционал переноса стажа еще присутствует «из коробки»).
  2. Используя стандартную обработку выгрузки из ЗУП 2.5, выгрузите данные по стажу.
  3. Выполните штатный импорт этих файлов в вашу пустую промежуточную базу ЗУП 3.1.5/3.1.7. Убедитесь, что документы Перенос данных с кодами стажа успешно созданы и проведены.
  4. Последовательно обновите полученную промежуточную базу до целевого релиза вашей рабочей базы (например, до ЗУП 3.1.8 или новее). При обновлении конфигурации платформа автоматически преобразует и пересчитает регистры сведений, хранящие стаж, под новую структуру метаданных.
  5. С помощью стандартной обработки Универсальный обмен данными в формате XML выгрузите документы Перенос данных по регистру стажа из обновленной промежуточной базы и загрузите их в вашу основную рабочую базу.

Этот способ дольше по времени, однако он гарантирует полную корректность структуры данных, так как все изменения таблиц при обновлении релизов выполняются штатными обработчиками обновления фирмы «1С».

Разбор важных параметров выгрузки стажа

Обратим внимание на критически важные параметры выгрузки данных из ЗУП 2.5. На практике часто возникает путаница с датами начала эксплуатации программного продукта.

Правило определения периода выгрузки стажа:

Стандартный алгоритм обработки выгрузки рассчитывает период выгружаемого стажа по следующей формуле:

ДатаОкончанияВыгрузки = МесяцНачалаЭксплуатации - 1 день

То есть программа стремится выгрузить всю историю стажа ПФР до того момента, как вы начнете вести учет в новой информационной базе. Рассмотрим это на практических примерах:

Если вы сталкиваетесь с ошибкой пересечения временных интервалов (Записи о стаже уже существуют), убедитесь, что вы предварительно очистили регистр сведений Записи о стаже до начала эксплуатации за переносимый период в базе-приемнике. В противном случае СУБД заблокирует запись дублирующихся строк с одинаковыми ключевыми измерениями (Физическое лицо, Период, Организация).

Особенности переноса периодов без оплаты (код «НЕОПЛ»)

Еще одна распространенная проблема при переносе исторических сведений о стаже — потеря периодов нахождения сотрудников в отпусках без сохранения заработной платы, периодов нетрудоспособности и прочих неоплачиваемых интервалов.

Выясним причину этой проблемы. В ЗУП 2.5 виды стажа для ПФР могли настраиваться пользователями вручную, либо определяться сложным анализом видов расчета. При выгрузке данных стандартная обработка может пропустить такие периоды, если у видов расчета в ЗУП 2.5 не были правильно заполнены параметры отражения в учете по ПФР.

Если после успешного импорта вы обнаружили, что в документах Перенос данных отсутствуют строки с кодом НЕОПЛ, воспользуйтесь следующим алгоритмом исправления:

  1. Проверьте в исходной базе ЗУП 2.5 настройки видов расчета (особенно в плане видов расчета Основные начисления организаций для отпусков за свой счет). Убедитесь, что на вкладке «Использование» для параметра «Вид стажа для СЗВ» выбрано значение «В контексте ПФР» и указан соответствующий код.
  2. Если ручная корректировка сотен сотрудников в ЗУП 3.1 трудоемка, можно использовать внешние обработки заполнения табличных частей для документов Перенос данных. Такие обработки сопоставляют данные кадровых документов отклонений (болезней, отпусков за свой счет), перенесенных из ЗУП 2.5, и автоматически генерируют необходимые записи в регистре сведений Записи о стаже до начала эксплуатации.

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

← На главную