Переход с устаревшей конфигурации «Зарплата и управление персоналом», редакция 2.5 на современную версию 3.1 — это процесс, с которым рано или поздно сталкивается любой специалист 1С. Фирма «1С» предоставляет штатный механизм для этой задачи. Однако при переносе данных за длительные периоды (или при переносе больших объемов информации) пользователи часто сталкиваются с крайне странными ошибками разбора XML-пакета.
Типичные симптомы этой проблемы выглядят следующим образом: в процессе загрузки данных платформа выдает фатальные ошибки разметки XML, при этом в именах типов или метаданных внезапно появляются пробелы или разрывы строк. Например, вместо типа СправочникСсылка.Сотрудники платформа видит СправочникСсылка.Сотрудник и, а вместо свойства ОснованиеВыслугиЛет пытается прочитать ОснованиеВы слугиЛет. На первый взгляд кажется, что это программная ошибка в самих правилах обмена. Но на самом деле корни этой проблемы лежат гораздо глубже — на стыке работы платформы с памятью, кэширования операционной системы и влияния внешнего программного обеспечения.
В этой статье мы подробно разберем, почему возникают подобные сбои в XML-потоке, как локализовать ошибку и какие практические шаги помогут успешно завершить переход на новую редакцию ЗУП.
Давайте проанализируем физику процесса выгрузки и загрузки данных. Типовой перенос представляет собой выгрузку информации из источника (ЗУП 2.5) во временный файл формата XML с последующим последовательным чтением этого файла в базе-приемнике (ЗУП 3.1). Если база имеет длительную историю ведения учета, размер этого файла может достигать сотен мегабайт или даже нескольких гигабайт.
Искажение данных (появление лишних пробелов, «откусывание» кусков тегов, сдвиг каретки) обычно происходит по трем основным причинам:
УниверсальныйОбменДаннымиXML буферы сериализации переполняются. В моменты, когда платформа пытается экстренно выделить новый сегмент памяти или сбросить кэш на диск, происходит микросбой адресации, приводящий к «сдвигу» каретки чтения/записи на несколько байт. Это и порождает нелепые пробелы в словах.Temp пользователя. Большинство антивирусов (включая встроенный Windows Defender) в режиме реального времени начинают сканировать этот файл по мере его заполнения. Блокировка потока записи/чтения антивирусным монитором на долю секунды приводит к тому, что 1С пропускает байты данных при записи или считывании очередного буфера.0x0B), перевода страницы (0x0C) или системные маркеры конца файла (0x1A). При формировании XML платформа пытается записать их как есть, что полностью ломает структуру XML-документа для стандартного парсера на этапе чтения.Прежде чем предпринимать радикальные шаги, нам необходимо понять, на каком именно этапе ломаются данные — при выгрузке из ЗУП 2.5 или уже при загрузке в ЗУП 3.1. Для этого выполним простую диагностику:
%temp%.ЗарплатаКадрыПереносДанных и имеет расширение .xml.224621).Если в самом файле вы видите поврежденный тег (например, ство вместо Свойство), значит, **проблема возникла на этапе выгрузки** из базы 1С:ЗУП 2.5. Если же в текстовом редакторе XML-структура в этой строке выглядит абсолютно корректной, значит, файл записан верно, но **платформа повреждает его в оперативной памяти в процессе загрузки** в ЗУП 3.1.
Если анализ файла показал, что сам XML-файл не имеет физических повреждений, но при загрузке платформа выдает ошибки непересекающихся типов или несуществующих реквизитов, это верный признак нехватки памяти 32-разрядного клиента. Решаем эту проблему по шагам:
C:\Program Files\1cv8\... (а не из папки Program Files (x86)).Для предотвращения внезапных блокировок файлового потока операционной системой во время переноса необходимо выполнить следующие действия:
TEMP и TMP) в список исключений сканирования вашего антивируса.1cv8.exe и 1cv8c.exe в доверенную зону вашего защитного ПО.Если при анализе XML-файла вы обнаружили в текстовых полях «битые» символы или нечитаемые квадраты, базу-источник ЗУП 2.5 необходимо предварительно подготовить и очистить. Мы можем сделать это с помощью Тестирования и исправления (ТИИ), но стандартные механизмы не всегда справляются с непечатными символами внутри строк.
Для надежного решения напишем и запустим в базе ЗУП 2.5 внешнюю обработку, которая будет обходить строковые реквизиты справочников (в первую очередь «Сотрудники», «Физические лица» и контактную информацию) и очищать их от спецсимволов. Рассмотрим пример кода функции очистки:
Функция ОчиститьСтрокуОтНедопустимыхСимволовXML(Знач ВходнаяСтрока) Экспорт
Результат = "";
Для Индекс = 1 По СтрДлина(ВходнаяСтрока) Цикл
КодСимвола = КодСимвола(ВходнаяСтрока, Индекс);
// XML 1.0 допускает символы с кодами: 9 (табуляция), 10 (перевод строки), 13 (возврат каретки)
// А также диапазоны: [32, 55295], [57344, 65533]
Если (КодСимвола >= 32 И КодСимвола <= 55295)
ИЛИ КодСимвола = 9
ИЛИ КодСимвола = 10
ИЛИ КодСимвола = 13
ИЛИ (КодСимвола >= 57344 И КодСимвола <= 65533) Тогда
Результат = Результат + Сред(ВходнаяСтрока, Индекс, 1);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Примените эту или аналогичную функцию для нормализации наименований сотрудников, адресов и полей комментариев перед тем, как запускать повторную выгрузку.
Иногда ошибки могут быть вызваны тем, что релиз ЗУП 2.5 обновился, а правила обмена в используемой вами версии ЗУП 3.1 еще не учитывают новые реквизиты метаданных (например, связанные со стажем ПФР, как в случае с ошибкой ОснованиеВыслугиЛет). Выясним, где хранятся эти правила обмена и как с ними работать.
В конфигурации ЗУП 3.1 все правила и обработки выгрузки/загрузки зашиты непосредственно в макеты конфигурации. Нам могут быть полезны следующие объекты:
ЗарплатаКадрыПереносДанныхИзЗУП25 — содержит основные правила обмена (XML).ПомощникПереходаСПрежнихПрограммЗарплатаКадры — управляет всем процессом миграции.ПравилаОбслуживанияВыгрузкиДанных, ПравилаЗагрузкиДанныхЗаписиСтажаПФР и обработка ОбработкаВыгрузкиЗаписиСтажаПФР — используются для переноса исторических сведений ПФР по обновленным форматам.Если типовой перенос падает на этапе загрузки конкретного регистра (например, регистра сведений по стажу ПФР), мы можем выгрузить эти правила обмена в формате .xml через Конфигуратор, открыть их в специализированной конфигурации «1С:Конвертация данных 2.1» и вручную скорректировать правила конвертации свойств объектов (ПКС), отключив выгрузку проблемного реквизита или настроив его обход, если эти данные не являются критически важными для ведения текущего учета в ЗУП 3.1.
Если база-источник слишком велика и даже на 64-битной платформе перенос «захлебывается», лучшим решением будет разбиение выгрузки на порции:
Используя комплексный подход — от контроля разрядности платформы до очистки данных от недопустимых XML-символов — вы гарантированно сможете преодолеть любые сбои и успешно завершить переход на ЗУП 3.1.