Переход с устаревшей конфигурации «Зарплата и управление персоналом», редакция 2.5, на актуальную редакцию 3.1 — процесс сложный и зачастую сопровождающийся техническими сбоями. Одной из самых коварных ошибок является остановка выгрузки с сообщением «Ошибка при вызове метода контекста (Вставить): Задано неправильное имя атрибута структуры». Чаще всего это происходит при обработке правила выгрузки данных (ПВД) НачальнаяШтатнаяРасстановка.
В этой статье мы подробно разберем, почему возникает эта ошибка, где именно в базе искать «скрытую угрозу» и как подготовить данные так, чтобы перенос прошел гладко.
Проанализируем ситуацию с технической точки зрения. В процессе миграции данных, особенно при формировании документа «Начальная штатная расстановка», алгоритмы типового переноса создают в оперативной памяти специальный объект — Структура. Этот объект используется для временного хранения соответствий между начислениями, показателями и их значениями.
Особенность объекта Структура в языке 1С заключается в том, что к имени ее ключа (атрибута) предъявляются те же требования, что и к именам переменных:
Ошибка возникает из-за того, что правила обмена пытаются динамически создать ключ структуры, используя в качестве имени Наименование вашего начисления, удержания или показателя из базы 2.5. Если у вас есть начисление с названием «Премия (процент)» или показатель «% выполнения», программа попытается выполнить код, аналогичный этому:
// Программная ошибка в логике переноса при наличии спецсимволов
ВременнаяСтруктура.Вставить("Премия (процент)", Значение); // ОШИБКА!
Система выдает ошибку «Задано неправильное имя атрибута структуры», так как скобки и пробелы недопустимы в ключе.
Если база большая и вы не знаете, на каком именно объекте спотыкается перенос, рассмотрим метод отладки. Выясним причину, установив точку останова в конфигураторе исходной базы (ЗУП 2.5), откуда запускается выгрузка.
Найдем в конфигурации обработку УниверсальныйОбменДаннымиXML. Перейдем в ее модуль объекта и найдем строку, указанную в тексте ошибки (в примере это строка 1720, но в разных версиях она может отличаться). Нам нужно найти метод Вставить(), который применяется к структуре в обработчике ПередОбработкойПравилаВыгрузки.
Последовательность действий для программиста:
Структура.Вставить(...).Так вы точно узнаете, какое именно начисление или показатель блокирует процесс.
Если вы не хотите погружаться в отладку, проанализируем данные визуально или с помощью запросов. Нам необходимо проверить три основных справочника в ЗУП 2.5:
Проверьте, чтобы наименования в этих справочниках не начинались с цифр и не содержали спецсимволов. Особое внимание уделите знаку процента «%», так как он часто встречается в названиях премий и надбавок. Также проверьте наличие лишних пробелов в начале или в конце строк.
Рассмотрим пример правильного и неправильного именования:
10% Надбавка, Премия (плановая), Оплата по тарифу/часу.Надбавка_10_процентов, Премия_плановая, Оплата_по_тарифу_часу.Важный нюанс: После успешного переноса в ЗУП 3.1 вы сможете вернуть начислениям привычные красивые названия, так как в новой базе связь уже будет установлена по внутренним идентификаторам.
Чтобы не перебирать сотни записей вручную, воспользуемся консолью запросов. Напишем простой запрос к справочнику показателей, чтобы быстро найти проблемные записи. Посмотрим на пример текста запроса:
ВЫБРАТЬ
ПоказателиСхемМотивации.Ссылка,
ПоказателиСхемМотивации.Наименование
ИЗ
Справочник.ПоказателиСхемМотивации КАК ПоказателиСхемМотивации
ГДЕ
(ПоказателиСхемМотивации.Наименование ПОДОБНО "%(%"
ИЛИ ПоказателиСхемМотивации.Наименование ПОДОБНО "%)%"
ИЛИ ПоказателиСхемМотивации.Наименование ПОДОБНО "%%%"
ИЛИ ПоказателиСхемМотивации.Наименование ПОДОБНО "%/%"
ИЛИ ПоказателиСхемМотивации.Наименование ПОДОБНО "%-%")
Аналогичные запросы можно выполнить к плановым начислениям и удержаниям.
Иногда проблема кроется не в названии, а в отсутствии объекта. Рассмотрим ситуацию, когда в списке базовых начислений для какого-то вида расчета осталась «битая» ссылка (объект удален, а запись в базе осталась). При попытке получить Наименование от пустой ссылки, система может вернуть пустую строку, которая также является недопустимым ключом структуры.
Рекомендуем выполнить стандартное Тестирование и исправление (ТиИ) в конфигураторе ЗУП 2.5 с включенными опциями:
Существует альтернативный способ, который помогает в некоторых случаях. Если вы запускаете перенос не через стандартный помощник перехода, а через обработку Универсальный обмен данными в формате XML, загляните на вкладку «Дополнительные настройки».
Там присутствует флажок «Автоматически удалять недопустимые символы из строк для записи в XML». Хотя эта настройка предназначена для корректного формирования XML-файла, иногда она помогает «проскочить» некоторые проверки. Однако помните: если ошибка происходит именно на этапе формирования структуры (до записи в файл), этот флажок не спасет, и чистка данных в исходной базе останется единственным верным решением.
Подведем итог нашему исследованию. Ошибка атрибута структуры — это типичный конфликт между свободным именованием объектов пользователем и строгими правилами программирования в 1С. Чтобы победить ее, выполните следующие действия:
%, /, ( ) и начальных цифр.Следуя этим шагам, вы устраните препятствие, и перенос данных «Начальной штатной расстановки» завершится успешно.