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