При разработке и внедрении дополнительных инструментов в типовые конфигурации, такие как 1С:Зарплата и управление персоналом 3.1 или 1С:Бухгалтерия предприятия 3.0, программисты часто сталкиваются с подсистемой «Дополнительные отчеты и обработки». Одной из самых коварных ошибок при регистрации нового файла в справочнике является исключение: {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(3439)}: Поле объекта не обнаружено (ХранилищеВариантов).
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизмы работы Библиотеки стандартных подсистем (БСП) и выясним, как правильно составить программный интерфейс для регистрации внешних объектов.
Давайте проанализируем ситуацию. Ошибка происходит внутри общего модуля ДополнительныеОтчетыИОбработки. Если мы заглянем в код системы в момент возникновения ошибки, то увидим, что платформа пытается обратиться к свойству ХранилищеВариантов метаданных загруженного объекта. Смысл проблемы заключается в фундаментальном различии между Отчетом и Обработкой в системе 1С:
ХранилищеВариантов. Это необходимо для работы механизма вариантов отчетов (сохранение пользовательских настроек, группировок и фильтров).Ошибка «Поле объекта не обнаружено» сигнализирует о том, что система ожидает увидеть отчет (потому что вы так указали в коде), но физически загружает обработку. Когда программный код БСП пытается проверить настройки хранилища у обработки, происходит аварийное завершение операции.
Рассмотрим стандартный фрагмент кода, который чаще всего становится источником проблемы. В модуле объекта внешней обработки или отчета должна присутствовать экспортная функция СведенияОВнешнейОбработке(). Посмотрим на типичную ошибку в заполнении структуры:
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
// ОШИБКА ЗДЕСЬ:
РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет");
РегистрационныеДанные.Вставить("Наименование", "Моя обработка");
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
// ... дальнейший код заполнения команд
Возврат РегистрационныеДанные;
КонецФункции
Если этот код написан внутри файла с расширением .epf (Внешняя обработка), система БСП при регистрации прочитает значение ключа Вид, увидит там ДополнительныйОтчет и попытается программно работать с объектом как с отчетом. Не найдя у него хранилища вариантов, она выдаст искомую ошибку.
Если вы создаете именно обработку (например, для заполнения документов или группового изменения данных), вам необходимо изменить значение параметра Вид в функции регистрации. Рассмотрим правильный вариант заполнения:
// Для внешней обработки используйте:
РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
Если же вы создаете именно отчет, убедитесь в выполнении двух условий:
.erf.РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет");.В современных версиях конфигураций (ЗУП 3.1, БП 3.0, ERP 2.5) лучше не формировать структуру РегистрационныеДанные вручную с нуля, а использовать программный интерфейс БСП. Это застрахует вас от отсутствия обязательных полей, которые могут появиться в новых версиях библиотеки. Рассмотрим, как это сделать правильно:
Функция СведенияОВнешнейОбработке() Экспорт
// Получаем стандартную структуру параметров регистрации для версии БСП 2.2.2
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = Перечисления.ДополнительныеОтчетыИОбработкиВиды.ДополнительнаяОбработка;
ПараметрыРегистрации.Наименование = "Обработка выгрузки данных";
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Истина;
// Добавление команд происходит в таблицу Команды
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить выгрузку";
НоваяКоманда.Идентификатор = "ВыгрузитьДанные";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Использование вызова ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1") гарантирует, что все необходимые поля метаданных будут инициализированы значениями по умолчанию, и вы не забудете заполнить важные параметры.
Выясним еще несколько причин, которые могут косвенно влиять на стабильность регистрации внешних модулей в ЗУП:
БезопасныйРежим = Ложь обязательна. Однако при этом система при регистрации может потребовать настройки профилей безопасности.ПечатьMXL. Если же вы регистрируете отчет, проверьте, чтобы идентификатор команды соответствовал имени основной формы отчета, либо используйте стандартный механизм СКД без указания конкретной формы.ПоказыватьОповещение, а в новых — требования могут измениться.Важный совет: Если вы переделываете отчет в обработку (или наоборот), не забудьте пересохранить сам файл через меню «Файл» -> «Сохранить как...» с правильным расширением. Простое переименование файла в проводнике Windows не меняет внутреннюю структуру метаданных 1С, и ошибка ХранилищеВариантов может сохраниться даже после исправления кода.
Таким образом, мы выяснили, что основной причиной проблемы является попытка выдать «желаемое за действительное»: регистрация обработки под видом отчета. Следуя правилам типизации объектов 1С и используя актуальные методы БСП, вы сможете легко избежать подобных ошибок при разработке.