При переходе с конфигурации 1С:Зарплата и Управление Персоналом ред. 2.5 на ред. 3.1 многие сталкиваются с ошибкой на этапе выгрузки данных. Система прерывает процесс и выдает сообщение: Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML...}: Поле объекта не обнаружено (ОтсутствияСдвигающиеРабочийГод). Эта проблема часто носит «плавающий» характер: при выборе одной даты начала эксплуатации ошибка возникает, а при другой — нет. Разберем, в чем причина этой ошибки и как ее можно исправить.
Проанализируем ситуацию. Ошибка указывает на то, что правила конвертации не могут найти поле ОтсутствияСдвигающиеРабочийГод в выгружаемых данных из ЗУП 2.5. Это поле связано с новым, более сложным механизмом учета остатков отпусков и влиянием различных неявок (больничных, отпусков за свой счет) на сдвиг рабочего года сотрудника в ЗУП 3.1. Проблема чаще всего проявляется на релизах 3.1.7.x и связана с несовершенством правил обмена для определенных сценариев данных.
Ключевой фактор, провоцирующий ошибку — это попытка выполнить перенос данных с датой начала эксплуатации, которая не совпадает с текущим месяцем. Например, если вы в октябре пытаетесь запустить эксплуатацию новой базы с 1 августа. В данных за август могут быть «переходящие» документы (например, отпуск, начавшийся в августе и закончившийся в сентябре), которые обработка не может корректно интерпретировать.
Рассмотрим несколько способов решения этой проблемы, от самого простого к более технически сложному.
Это самый простой и быстрый способ обойти ошибку, не требующий вмешательства в код. Его суть заключается в правильном выборе начального периода для работы в новой программе.
Логика метода: Ошибка возникает при обработке данных за прошлые, уже закрытые периоды. Если мы укажем в качестве месяца начала эксплуатации период, следующий за последним полностью рассчитанным месяцем в старой базе, то проблемный механизм обработки «переходящих» документов не будет задействован в полной мере.
Выполним следующие шаги:
Этот метод в большинстве случаев помогает успешно завершить перенос. Технически, это обходной путь, но с точки зрения методологии он является наиболее правильным, так как исключает дублирование расчетов за один и тот же период в двух базах.
Проблема с полем ОтсутствияСдвигающиеРабочийГод является известной ошибкой, которая была зарегистрирована и исправлена фирмой «1С» в последующих релизах. Например, в обсуждениях пользователи отмечали, что в версии ЗУП КОРП 3.1.8.112 ошибка уже исправлена.
Рекомендация: Прежде чем начинать переход, убедитесь, что обе конфигурации (и исходная ЗУП 2.5, и целевая ЗУП 3.1) обновлены до последних актуальных версий. Вместе с обновлением конфигурации поставляются и новые, исправленные правила обмена данными, которые, скорее всего, уже не содержат этой ошибки.
Это самый надежный и правильный способ, который гарантирует не только исправление данной конкретной ошибки, но и многих других потенциальных проблем при переносе.
Если обновление по каким-либо причинам невозможно, а изменить дату начала эксплуатации нельзя, остается техническое решение — доработать обработку выгрузки данных. Этот способ требует навыков конфигурирования в 1С.
Суть доработки: Мы найдем в коде обработки место, где происходит обращение к данным об отпусках и отсутствиях, и добавим проверку. Если для какого-то документа этих данных нет, мы будем принудительно создавать пустые таблицы значений, чтобы у программы всегда было поле для обращения и ошибка «Поле объекта не обнаружено» не возникала.
Разберем по шагам:
ПомощникВыгрузки_V8 или похожим образом и является частью механизма перехода. Откройте ее модуль объекта.
Если НайденныеСтроки.Количество > 0 Тогда
ВыборкаПоДокументу.Вставить("ЕжегодныеОтпуска", НайденныеСтроки[0].ЕжегодныеОтпуска);
ВыборкаПоДокументу.Вставить("ОстаткиОтпусковПоРабочимГодам", НайденныеСтроки[0].ОстаткиОтпусковПоРабочимГодам);
// ... здесь может быть или не быть строка про ОтсутствияСдвигающиеРабочийГод
КонецЕсли;
Иначе. В этой ветке мы создадим пустые структуры данных для всех полей, которые могут отсутствовать.
Если НайденныеСтроки.Количество > 0 Тогда
ВыборкаПоДокументу.Вставить("ЕжегодныеОтпуска", НайденныеСтроки[0].ЕжегодныеОтпуска);
ВыборкаПоДокументу.Вставить("ОстаткиОтпусковПоРабочимГодам", НайденныеСтроки[0].ОстаткиОтпусковПоРабочимГодам);
ВыборкаПоДокументу.Вставить("ОтсутствияСдвигающиеРабочийГод", НайденныеСтроки[0].ОтсутствияСдвигающиеРабочийГод);
Иначе
ВыборкаПоДокументу.Вставить("ЕжегодныеОтпуска", Новый ТаблицаЗначений);
ВыборкаПоДокументу.Вставить("ОстаткиОтпусковПоРабочимГодам", Новый ТаблицаЗначений);
ВыборкаПоДокументу.Вставить("ОтсутствияСдвигающиеРабочийГод", Новый ТаблицаЗначений);
КонецЕсли;
ОтсутствияСдвигающиеРабочийГод, но и для связанных с ним полей ЕжегодныеОтпуска и ОстаткиОтпусковПоРабочимГодам, чтобы гарантировать целостность структуры.
В процессе обсуждения проблемы пользователи также выяснили, что стандартный перенос (как полный, так и краткий) может не переносить некоторые специфичные документы, например, Корректировки НДФЛ. После завершения переноса данных обязательно проверьте корректность учета НДФЛ и будьте готовы к тому, что некоторые данные придется вводить или корректировать вручную в новой базе ЗУП 3.1.