Как исправить ошибку «Неверно задан период действия» при переносе данных из ЗиК 7.7 в УПП?

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

При выполнении штатного переноса кадровых и расчетных данных из конфигурации «Зарплата и Кадры 7.7» в «Управление производственным предприятием» (или «Зарплата и Управление Персоналом 8») специалисты нередко сталкиваются со сбоем при загрузке документа Перенос данных. В журнале регистрации или в окне сообщений появляется ошибка следующего вида:

Ошибка при вызове метода контекста (Записать): Запись не верна! Неверно задан период действия (Регистр расчета: Основные начисления сотрудников организаций; Номер строки: 1297)

В результате загрузка расчетного месяца прерывается: часть сотрудников (например, первые 200 из 1000) успешно записывается в документ и регистры, а остальные сотрудники в перенос не попадают. Разберем по шагам, почему возникает эта ошибка на уровне платформы «1С:Предприятие 8», как быстро локализовать проблемную запись среди сотен сотрудников и как корректно устранить расхождение.

Причина ошибки на уровне платформы

Проанализируем механику работы регистра расчета Основные начисления сотрудников организаций. Данный регистр поддерживает период действия. Платформа «1С:Предприятие 8» выполняет жесткую валидацию дат при вызове метода Записать() набора записей. Исключение «Запись не верна! Неверно задан период действия» выбрасывается в двух основных случаях:

  1. Значение реквизита ПериодДействияНачало строго больше значения ПериодДействияКонец.
  2. Одна из дат периода действия пустая (01.01.0001), тогда как для загружаемого вида расчета в плане видов расчета включен признак Использует период действия.

Обратим внимание на указание строки: Номер строки: 1297. Платформа сообщает точный порядковый номер записи внутри набора движений регистра расчета, формируемого для конкретного документа Перенос данных (например, НЗР-1603). Поскольку у каждого сотрудника в расчетном месяце может быть несколько строк начислений (оклад, надбавки, доплаты), первые 1296 записей успешно сформировались (что соответствует примерно 200 сотрудникам), а на 1297-й строке процесс записи набора движений аварийно остановился.

Почему это происходит в исходной базе ЗиК 7.7

Выясним причину появления таких данных в исходной информационной базе. Конфигурация «Зарплата и Кадры 7.7» имеет менее строгую модель проверки периодов действия по сравнению с регистрами расчета «1С:Предприятия 8»:

  1. Человеческий фактор при ручном вводе: расчетчик мог вручную отредактировать даты в документе или журнале расчетов, случайно перепутав местами дату начала и окончания (например, дата начала — 15.03.2016, а дата окончания — 14.03.2016 или дата из прошлого года).
  2. Годовые или квартальные премии: при вводе начисления расчетчик мог указать период действия за прошлый год, что привело к разрыву или инверсии расчетного интервала.
  3. Сторнирование и перерасчеты: нетиповые сторно-записи или переходящие отпуска/больничные, где одно из полей дат оказалось незаполненным.
  4. Несоответствие планов видов расчета: если при сопоставлении начисление, не требующее периода действия (например, разовая материальная помощь), по ошибке попало в регистр основных начислений вместо дополнительных, для него не заполнились даты, что привело к ошибке валидации.

Способы локализации проблемной записи

Рассмотрим, как найти конкретного сотрудника и запись, вызвавшую сбой, не перебирая вручную сотни документов.

Способ 1. Поиск по файлу выгрузки XML

Если выгрузка за проблемный месяц сформирована в отдельный XML-файл, откроем его в текстовом редакторе (например, Notepad++):

  1. Найдем узел документа Перенос данных за проблемный месяц.
  2. Перейдем к блоку набора записей регистра ОсновныеНачисленияРаботниковОрганизаций.
  3. Отсчитаем 1297-й тег <Запись> внутри набора.
  4. Внутри этого узла будут указаны ФИО сотрудника, вид расчета и ошибочные значения дат.

Способ 2. Поиск внешней обработкой в базе «1С:ЗиК 7.7»

Наиболее быстрый способ — запустить в 7.7 внешнюю обработку, которая сканирует ЖурналРасчетов.Зарплата за проблемный расчетный месяц и выводит все аномальные записи:


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

Варианты исправления ситуации

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

Вариант 1. Корректировка записи в базе ЗиК 7.7

Если расчетный месяц уже закрыт, откат периода и перерасчет зарплаты делать не требуется. Достаточно программно спозиционироваться на найденной записи в ЖурналРасчетов.Зарплата, установить корректное значение реквизита ДатаОкончания и вызвать метод Записать(). После исправления данных сформируем выгрузку повторно.

Вариант 2. Исправление в XML-файле обмена

Если перенос данных является разовым, найдем тег записи номер 1297 в XML-файле и исправим значение реквизита ПериодДействияКонец на корректную дату (например, конец месяца или дату, совпадающую с началом). После сохранения файла выполним повторную загрузку в УПП через обработку УниверсальныйОбменДаннымиXML.

Вариант 3. Защита в правилах обмена (Конвертация данных)

Чтобы исключить подобные сбои на всем объеме переносимых периодов, откроем правила обмена в конфигурации «Конвертация данных». В правиле конвертации объекта для набора записей регистра основных начислений в обработчике ПослеЗагрузкиОбъекта добавим программную проверку и автокоррекцию дат перед вызовом метода Записать():


Для Каждого Запись Из НаборЗаписей Цикл
    Если Запись.ПериодДействияНачало > Запись.ПериодДействияКонец Тогда
        Запись.ПериодДействияКонец = Запись.ПериодДействияНачало;
    КонецЕсли;
    Если Не ЗначениеЗаполнено(Запись.ПериодДействияНачало) Тогда
        Запись.ПериодДействияНачало = Объект.Дата;
    КонецЕсли;
    Если Не ЗначениеЗаполнено(Запись.ПериодДействияКонец) Тогда
        Запись.ПериодДействияКонец = КонецМесяца(Запись.ПериодДействияНачало);
    КонецЕсли;
КонецЦикла;

Такой подход позволяет успешно загрузить документ Перенос данных со всеми 1000 сотрудниками без прерывания процесса.

← На главную