При работе с конфигурациями 1С, такими как 1С:Комплексная автоматизация (КА) версии 2.4, мы часто сталкиваемся с необходимостью расширить функционал типовых документов, например, добавить внешние обработки для автоматического заполнения табличных частей. Однако иногда возникает ситуация, когда правильно разработанная и зарегистрированная внешняя обработка, предназначенная для заполнения конкретного объекта, не отображается в командном интерфейсе документа. Именно с такой проблемой столкнулись мы при попытке добавить внешнюю обработку заполнения в документ "Перемаркировка товаров ИС МП".
Давайте рассмотрим исходную ситуацию. Мы разработали внешнюю обработку типа "Заполнение объекта", которая должна была помочь с заполнением табличной части документа "Перемаркировка товаров ИС МП". Для этого в модуле объекта обработки мы корректно описали сведения для ее регистрации в подсистеме "Дополнительные отчеты и обработки" (БСП) следующим образом:
&НаСервере
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.6.197"); // Это пример GUID обработки
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Информация="Заполнение табличной части перемаркировки.";
ПараметрыРегистрации.Назначение.Добавить("Документ.ПеремаркировкаТоваровИСМП"); // Указываем наш документ как объект назначения
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = '"+ПараметрыРегистрации.Информация+"'");
НоваяКоманда.Идентификатор = "Заполнить табличную часть";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина));
Возврат ПараметрыРегистрации;
КонецФункции
После подключения этой обработки в разделе "Администрирование" -> "Печатные формы, отчеты и обработки" и попытки открыть документ "Перемаркировка товаров ИС МП", мы обнаружили, что команды заполнения не появлялись в командном интерфейсе документа. Более того, при регистрации обработки в списке "Дополнительные отчеты и обработки" в поле "Объект назначения" мы не могли выбрать нужный документ.
Первоначальные предположения могли бы указывать на то, что документ "Перемаркировка товаров ИС МП" каким-то образом не поддерживает дополнительные отчеты и обработки. Однако на практике ситуация оказалась гораздо проще и связана с особенностями подсистемы "Библиотека стандартных подсистем" (БСП), на которой построены многие современные конфигурации 1С.
Основная причина такого поведения заключается в том, что не все объекты метаданных в конфигурации 1С по умолчанию включены в специальный определяемый тип ОбъектСДополнительнымиКомандами. Этот тип играет роль "белого списка" для подсистемы "Дополнительные отчеты и обработки". Он указывает системе, для каких объектов (документов, справочников и т.д.) следует отображать дополнительные команды, такие как внешние обработки заполнения, дополнительные отчеты и печатные формы.
Если наш документ, в данном случае Документ.ПеремаркировкаТоваровИСМП, не включен в состав этого определяемого типа, то система просто не будет "знать", что для него нужно отображать какие-либо дополнительные команды. Таким образом, команды внешних обработок для него отображаться не будут, независимо от того, насколько корректно мы зарегистрировали саму обработку и указали для нее объект назначения.
Для решения этой проблемы нам необходимо добавить наш документ в состав определяемого типа ОбъектСДополнительнымиКомандами. Давайте рассмотрим два основных способа это сделать.
Этот подход подразумевает непосредственное изменение типовой конфигурации. Мы категорически не рекомендуем его, так как он снимает конфигурацию с поддержки поставщика. Это означает, что при каждом обновлении конфигурации нам придется либо вручную переносить свои изменения, либо использовать сложные механизмы сравнения и объединения, что существенно усложняет процесс.
ОбъектСДополнительнымиКомандами.Документ.ПеремаркировкаТоваровИСМП и установим для него флажок.После этих действий документ будет включен в список объектов, поддерживающих дополнительные команды. Однако, как уже упоминалось, этот метод нежелателен из-за потери поддержки.
Наиболее предпочтительным, безопасным и гибким способом решения данной проблемы является использование механизма расширений конфигурации. Расширения позволяют изменять и дополнять функционал типовой конфигурации без снятия ее с поддержки, что значительно упрощает процесс обновления.
ОбъектСДополнительнымиКомандами через расширениеДля того чтобы добавить наш документ в состав определяемого типа ОбъектСДополнительнымиКомандами, используя расширение, мы выполним следующие шаги:
ОбъектСДополнительнымиКомандами: В открывшемся окне "Добавление объектов из конфигурации" найдем и выберем определяемый тип ОбъектСДополнительнымиКомандами из основной конфигурации. Это действие называется "заимствованием" объекта, то есть мы включаем его в расширение для последующей модификации.ОбъектСДополнительнымиКомандами появится в нашем расширении, откроем его свойства (двойным кликом).Документ.ПеремаркировкаТоваровИСМП и установим для него флажок. В контексте расширения это означает, что мы дополняем состав типового определяемого типа нашим документом.После выполнения этих шагов наш документ будет включен в состав определяемого типа ОбъектСДополнительнымиКомандами, и подсистема "Дополнительные отчеты и обработки" начнет "видеть" его как объект, для которого могут быть показаны дополнительные команды. Важно, что все это сделано без прямого изменения основной конфигурации, сохраняя ее на поддержке.
Даже после добавления документа в ОбъектСДополнительнымиКомандами, его формы (форма списка, форма объекта) должны содержать специальный код, который отвечает за обработку и отображение дополнительных команд. В большинстве типовых форм, которые должны поддерживать внешние обработки, эти процедуры уже присутствуют. Однако, если команды всё ещё не появляются, возможно, потребуется добавить стандартные обработчики в модули форм документа ПеремаркировкаТоваровИСМП через расширение.
Документ.ПеремаркировкаТоваровИСМП. Обычно это ФормаДокумента (форма объекта) и ФормаСписка.ФормаДокумента.ПриСозданииНаСервере: Убедимся, что в процедуре ПриСозданииНаСервере или аналогичной (например, ПриСозданииНаСервереПосле) вызывается метод подсистемы дополнительных отчетов и обработок. Если его нет, добавим следующий вызов:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ... существующий код формы ...
ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтотОбъект); // Инициализация подсистемы для формы
// ... продолжение существующего кода формы ...
КонецПроцедуры
Этот вызов гарантирует, что подсистема "Дополнительные отчеты и обработки" будет инициализирована для текущей формы документа.
&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКоманду(Команда, ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция Подключаемый_ПриКомпоновкеРезультата(ИмяКоманды, КомпоновщикМакета, ДополнительныеПараметры)
Возврат ДополнительныеОтчетыИОбработкиСервер.ПриКомпоновкеРезультата(ЭтотОбъект, ИмяКоманды, КомпоновщикМакета, ДополнительныеПараметры);
КонецФункции
&НаКлиенте
Процедура Подключаемый_ВыполнитьВнешнююКоманду(Команда)
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьВнешнююКоманду(Команда);
КонецПроцедуры
Мы должны понимать, что состав необходимых процедур может варьироваться в зависимости от версии Библиотеки стандартных подсистем (БСП), используемой в нашей конфигурации, и конкретного функционала, который мы хотим задействовать (например, выполнение отчетов, обработок или печатных форм).
После внесения всех изменений, особенно при активной работе с расширениями и подсистемой "Дополнительные отчеты и обработки", иногда требуется обновить вспомогательные данные этой подсистемы. Это гарантирует, что все новые настройки и зарегистрированные обработки будут корректно учтены системой.
Обновление можно выполнить одним из следующих способов:
ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf, которая часто входит в состав Библиотеки стандартных подсистем (БСП) и может быть найдена на ИТС.После этих действий и перезапуска программы 1С:Предприятие, команды внешней обработки заполнения должны появиться в командном интерфейсе документа "Перемаркировка товаров ИС МП".
После того как внешняя обработка успешно интегрирована и вызывается из документа, мы можем столкнуться с необходимостью передать в ее форму дополнительные параметры, помимо самого объекта-владельца (документа).
При вызове обработки заполнения из формы документа, сама ссылка на документ, для которого вызывается обработка, автоматически передается в форму обработки. Этот объект будет доступен в процедуре ПриСозданииНаСервере формы внешней обработки через параметр Параметры.ОбъектыНазначения[0]. Мы всегда можем получить к нему доступ для получения данных или выполнения действий.
Если нам необходимо передать дополнительные, произвольные параметры (например, дату документа, режим работы, информацию о текущем пользователе и т.п.), мы можем это сделать, немного модифицировав способ вызова формы обработки.
Для передачи произвольных параметров нам потребуется создать собственную команду в форме документа (или модифицировать существующую) и в ее обработчике использовать метод ОткрытьФорму или ПолучитьФорму, передавая в качестве параметра структуру с нужными данными. Это означает, что мы не будем полагаться на стандартный механизм вызова БСП для этой конкретной команды, а реализуем свой.
Например, если у нас есть кнопка "Заполнить табличную часть", мы можем сделать следующее в модуле формы документа:
&НаКлиенте
Процедура ЗаполнитьТабличнуюЧасть(Команда)
СтруктураПараметров = Новый Структура;
// Добавляем произвольные параметры
СтруктураПараметров.Вставить("ДатаДокумента", Объект.Дата); // Пример: передаем дату текущего документа
СтруктураПараметров.Вставить("ДополнительныйРежим", "Специальный"); // Пример: передаем текстовый параметр
// Обязательно передаем объект назначения, если обработка его использует
МассивОбъектовНазначения = Новый Массив;
МассивОбъектовНазначения.Добавить(Объект.Ссылка);
СтруктураПараметров.Вставить("ОбъектыНазначения", МассивОбъектовНазначения);
// Определяем полное имя формы нашей внешней обработки
// ИмяВашейОбработки - это имя объекта метаданных 'ВнешняяОбработка'
// ФормаОбработки - это имя формы в вашей внешней обработке
ИмяФормы = "ВнешняяОбработка.ИмяВашейОбработки.Форма.ФормаОбработки";
// Открываем форму внешней обработки, передавая нашу структуру параметров
ОткрытьФорму(ИмяФормы, СтруктураПараметров, ЭтаФорма); // ЭтаФорма - владелец открываемой формы
КонецПроцедуры
Здесь ИмяВашейОбработки — это имя вашей внешней обработки в списке подключенных дополнительных отчетов и обработок, а ФормаОбработки — имя формы, которую мы хотим открыть внутри этой обработки.
Чтобы форма внешней обработки могла корректно получить эти произвольные параметры, их необходимо явно объявить в конструкторе формы на вкладке "Параметры" с теми же именами, что и ключи в передаваемой структуре. Например, если мы передавали "ДатаДокумента" и "ДополнительныйРежим", то в форме обработки мы должны:
Затем в модуле формы внешней обработки, в процедуре ПриСозданииНаСервере, мы сможем получить доступ к этим значениям через свойство Параметры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Автоматически переданный объект назначения (если он был в структуре Параметры)
Если Параметры.Свойство("ОбъектыНазначения") И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
ОбъектНазначения = Параметры.ОбъектыНазначения[0];
// Теперь ОбъектНазначения содержит ссылку на документ 'ПеремаркировкаТоваровИСМП'
КонецЕсли;
// Получаем произвольные параметры
Если Параметры.Свойство("ДатаДокумента") Тогда
МояДата = Параметры.ДатаДокумента;
// Используем МояДата в логике заполнения
КонецЕсли;
Если Параметры.Свойство("ДополнительныйРежим") Тогда
РежимРаботы = Параметры.ДополнительныйРежим;
// Используем РежимРаботы для определения логики
КонецЕсли;
// ... дальнейшая логика заполнения табличной части на основе полученных параметров ...
КонецПроцедуры
В ходе нашего анализа мы выяснили, что основная причина отсутствия команды внешней обработки кроется в определяемом типе ОбъектСДополнительнымиКомандами. Мы настоятельно рекомендуем всегда использовать расширения для модификации типового функционала, так как это позволяет сохранить возможность беспроблемного обновления конфигурации.
При отладке внешних обработок, особенно если они ведут себя непредсказуемо, помните, что платформа 1С может использовать их кэшированные копии. В таких случаях, чтобы убедиться, что отлаживается актуальная версия, попробуйте:
%LOCALAPPDATA%\1C\1CE\ и %APPDATA%\1C\1CE\).Надеемся, что это подробное руководство поможет вам успешно интегрировать внешние обработки заполнения в командный интерфейс ваших документов в 1С:Комплексная автоматизация и эффективно использовать их функционал!