При выполнении штатного переноса кадровых и расчетных данных из конфигурации «Зарплата и Кадры 7.7» в «Управление производственным предприятием» (или «Зарплата и Управление Персоналом 8») специалисты нередко сталкиваются со сбоем при загрузке документа Перенос данных. В журнале регистрации или в окне сообщений появляется ошибка следующего вида:
Ошибка при вызове метода контекста (Записать): Запись не верна! Неверно задан период действия (Регистр расчета: Основные начисления сотрудников организаций; Номер строки: 1297)
В результате загрузка расчетного месяца прерывается: часть сотрудников (например, первые 200 из 1000) успешно записывается в документ и регистры, а остальные сотрудники в перенос не попадают. Разберем по шагам, почему возникает эта ошибка на уровне платформы «1С:Предприятие 8», как быстро локализовать проблемную запись среди сотен сотрудников и как корректно устранить расхождение.
Проанализируем механику работы регистра расчета Основные начисления сотрудников организаций. Данный регистр поддерживает период действия. Платформа «1С:Предприятие 8» выполняет жесткую валидацию дат при вызове метода Записать() набора записей. Исключение «Запись не верна! Неверно задан период действия» выбрасывается в двух основных случаях:
ПериодДействияНачало строго больше значения ПериодДействияКонец.01.01.0001), тогда как для загружаемого вида расчета в плане видов расчета включен признак Использует период действия.Обратим внимание на указание строки: Номер строки: 1297. Платформа сообщает точный порядковый номер записи внутри набора движений регистра расчета, формируемого для конкретного документа Перенос данных (например, НЗР-1603). Поскольку у каждого сотрудника в расчетном месяце может быть несколько строк начислений (оклад, надбавки, доплаты), первые 1296 записей успешно сформировались (что соответствует примерно 200 сотрудникам), а на 1297-й строке процесс записи набора движений аварийно остановился.
Выясним причину появления таких данных в исходной информационной базе. Конфигурация «Зарплата и Кадры 7.7» имеет менее строгую модель проверки периодов действия по сравнению с регистрами расчета «1С:Предприятия 8»:
Рассмотрим, как найти конкретного сотрудника и запись, вызвавшую сбой, не перебирая вручную сотни документов.
Способ 1. Поиск по файлу выгрузки XML
Если выгрузка за проблемный месяц сформирована в отдельный XML-файл, откроем его в текстовом редакторе (например, Notepad++):
Перенос данных за проблемный месяц.ОсновныеНачисленияРаботниковОрганизаций.<Запись> внутри набора.Способ 2. Поиск внешней обработкой в базе «1С:ЗиК 7.7»
Наиболее быстрый способ — запустить в 7.7 внешнюю обработку, которая сканирует ЖурналРасчетов.Зарплата за проблемный расчетный месяц и выводит все аномальные записи:
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьПериод(НачМесяца, КонМесяца);
Пока ЖР.ПолучитьЗапись() = 1 Цикл
Если (ЖР.ДатаНачала > ЖР.ДатаОкончания)
Или (ПустаяДата(ЖР.ДатаНачала) = 1)
Или (ПустаяДата(ЖР.ДатаОкончания) = 1) Тогда
Сообщить("Сотрудник: " + ЖР.Объект + ", Расчет: " + ЖР.ВидРасчета
+ ", Начало: " + ЖР.ДатаНачала + ", Конец: " + ЖР.ДатаОкончания);
КонецЕсли;
КонецЦикла;
После того как конкретная строка обнаружена, выберем один из способов устранения ошибки:
Вариант 1. Корректировка записи в базе ЗиК 7.7
Если расчетный месяц уже закрыт, откат периода и перерасчет зарплаты делать не требуется. Достаточно программно спозиционироваться на найденной записи в ЖурналРасчетов.Зарплата, установить корректное значение реквизита ДатаОкончания и вызвать метод Записать(). После исправления данных сформируем выгрузку повторно.
Вариант 2. Исправление в XML-файле обмена
Если перенос данных является разовым, найдем тег записи номер 1297 в XML-файле и исправим значение реквизита ПериодДействияКонец на корректную дату (например, конец месяца или дату, совпадающую с началом). После сохранения файла выполним повторную загрузку в УПП через обработку УниверсальныйОбменДаннымиXML.
Вариант 3. Защита в правилах обмена (Конвертация данных)
Чтобы исключить подобные сбои на всем объеме переносимых периодов, откроем правила обмена в конфигурации «Конвертация данных». В правиле конвертации объекта для набора записей регистра основных начислений в обработчике ПослеЗагрузкиОбъекта добавим программную проверку и автокоррекцию дат перед вызовом метода Записать():
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.ПериодДействияНачало > Запись.ПериодДействияКонец Тогда
Запись.ПериодДействияКонец = Запись.ПериодДействияНачало;
КонецЕсли;
Если Не ЗначениеЗаполнено(Запись.ПериодДействияНачало) Тогда
Запись.ПериодДействияНачало = Объект.Дата;
КонецЕсли;
Если Не ЗначениеЗаполнено(Запись.ПериодДействияКонец) Тогда
Запись.ПериодДействияКонец = КонецМесяца(Запись.ПериодДействияНачало);
КонецЕсли;
КонецЦикла;
Такой подход позволяет успешно загрузить документ Перенос данных со всеми 1000 сотрудниками без прерывания процесса.