При разработке собственных документов на базе типовых конфигураций, таких как «Зарплата и управление персоналом» (ЗУП), программисты часто прибегают к копированию существующих объектов метаданных. Однако копирование такого сложного документа, как «Премия», неизбежно ведет к возникновению ошибки «Несоответствие типов (параметр номер '1')». Эта проблема возникает не только в момент записи документа, но и при попытке его открытия из списка. Разберем детально, почему это происходит и как правильно адаптировать новый документ под жесткие стандарты типовой конфигурации.
В конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем) и специализированных подсистем ЗУП, многие механизмы работают универсально для целого ряда документов. Когда вы создаете новый документ путем копирования, он получает новое имя в метаданных (например, ВашНовыйДокумент). В то же время внутри модулей (модуль формы, модуль объекта, модуль менеджера) остаются вызовы стандартных процедур из общих модулей. Проанализируем ситуацию: эти процедуры ожидают в качестве первого параметра объект определенного типа или ссылку, входящую в состав конкретных Определяемых типов. Поскольку ваш новый документ еще не зарегистрирован в этих типах, система выдает ошибку несоответствия.
Это самый важный этап при внедрении нового документа в экосистему ЗУП. Определяемые типы используются в качестве фильтров для процедур расчета зарплаты, учета рабочего времени и кадрового учета. Рассмотрим наиболее критичные типы, в которые необходимо включить ваш новый документ:
Для внесения изменений разверните ветку метаданных Общие -> Определяемые типы, найдите нужный тип и в свойстве «Тип» отметьте галочкой ваш новый документ.
Подписки на события — это невидимые «контролеры», которые срабатывают автоматически при записи или проведении документа. Проанализируем, почему они вызывают ошибку. Типовая подписка, например ЗарплатаКадрыБазовыйПередЗаписью, может быть настроена для работы с типом ДокументОбъект.Премия или целым набором типов. Если ваш новый документ не включен в источник подписки, но при этом в его программном коде вызываются связанные процедуры, возникнет конфликт.
Просмотрите следующие подписки в дереве метаданных:
При копировании документа Премия в модуле его формы часто остаются вызовы процедур, которые жестко завязаны на имя метаданных. Рассмотрим пример кода, который может вызывать ошибку:
// В модуле формы нового документа
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Типовой вызов, который может ожидать конкретный тип
ЗарплатаКадрыСоставОбъектов.ПриСозданииНаСервере(ЭтотОбъект, Отказ);
КонецПроцедуры
Если процедура ПриСозданииНаСервере общего модуля внутри себя проверяет Метаданные().Имя и не находит там ожидаемого значения (например, "Премия"), она может вернуть Неопределено или пустую ссылку, которая при передаче в следующую функцию в качестве параметра №1 и вызовет ошибку. Проанализируем решение автора из обсуждения: он закомментировал ненужную функцию. Однако для полноценной работы лучше не удалять код, а адаптировать его, убедившись, что ваш документ корректно обрабатывается общими модулями.
Если документ отображается в списке, но не открывается, проблема часто кроется в Динамическом списке или событии ПриЧтенииНаСервере. В ЗУП динамические списки часто используют сложные запросы с объединением таблиц или вызовы функций оформления.
Посмотрим на возможные причины:
Чтобы точно найти место, где возникает «затык», выполните следующие действия:
Важный совет: После добавления документа в определяемые типы и подписки, обязательно выполните обновление конфигурации базы данных. В некоторых случаях может потребоваться перезагрузка сервера 1С или очистка кеша, так как метаданные определяемых типов кэшируются платформой для ускорения работы.
Разберем итог ситуации: простое копирование в ЗУП не работает «из коробки», так как конфигурация сильно завязана на типизацию объектов. Вместо бездумного удаления кода, старайтесь следовать логике типового решения, регистрируя свой объект во всех необходимых системных «реестрах» через Определяемые типы.