Как добавить внешнюю обработку заполнения в командный интерфейс документа "Перемаркировка товаров ИС МП" в 1С:Комплексная автоматизация 2.4?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Торговля и дистрибуция
← На главную

При работе с конфигурациями 1С, такими как 1С:Комплексная автоматизация (КА) версии 2.4, мы часто сталкиваемся с необходимостью расширить функционал типовых документов, например, добавить внешние обработки для автоматического заполнения табличных частей. Однако иногда возникает ситуация, когда правильно разработанная и зарегистрированная внешняя обработка, предназначенная для заполнения конкретного объекта, не отображается в командном интерфейсе документа. Именно с такой проблемой столкнулись мы при попытке добавить внешнюю обработку заполнения в документ "Перемаркировка товаров ИС МП".

Суть проблемы: внешняя обработка не появляется в документе

Давайте рассмотрим исходную ситуацию. Мы разработали внешнюю обработку типа "Заполнение объекта", которая должна была помочь с заполнением табличной части документа "Перемаркировка товаров ИС МП". Для этого в модуле объекта обработки мы корректно описали сведения для ее регистрации в подсистеме "Дополнительные отчеты и обработки" (БСП) следующим образом:


&НаСервере
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.6.197"); // Это пример GUID обработки
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Информация="Заполнение табличной части перемаркировки.";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПеремаркировкаТоваровИСМП"); // Указываем наш документ как объект назначения
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = '"+ПараметрыРегистрации.Информация+"'");
    НоваяКоманда.Идентификатор = "Заполнить табличную часть";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    
    ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина));
    Возврат ПараметрыРегистрации;
    
КонецФункции

После подключения этой обработки в разделе "Администрирование" -> "Печатные формы, отчеты и обработки" и попытки открыть документ "Перемаркировка товаров ИС МП", мы обнаружили, что команды заполнения не появлялись в командном интерфейсе документа. Более того, при регистрации обработки в списке "Дополнительные отчеты и обработки" в поле "Объект назначения" мы не могли выбрать нужный документ.

Выясняем причину: роль определяемого типа ОбъектСДополнительнымиКомандами

Первоначальные предположения могли бы указывать на то, что документ "Перемаркировка товаров ИС МП" каким-то образом не поддерживает дополнительные отчеты и обработки. Однако на практике ситуация оказалась гораздо проще и связана с особенностями подсистемы "Библиотека стандартных подсистем" (БСП), на которой построены многие современные конфигурации 1С.

Основная причина такого поведения заключается в том, что не все объекты метаданных в конфигурации 1С по умолчанию включены в специальный определяемый тип ОбъектСДополнительнымиКомандами. Этот тип играет роль "белого списка" для подсистемы "Дополнительные отчеты и обработки". Он указывает системе, для каких объектов (документов, справочников и т.д.) следует отображать дополнительные команды, такие как внешние обработки заполнения, дополнительные отчеты и печатные формы.

Если наш документ, в данном случае Документ.ПеремаркировкаТоваровИСМП, не включен в состав этого определяемого типа, то система просто не будет "знать", что для него нужно отображать какие-либо дополнительные команды. Таким образом, команды внешних обработок для него отображаться не будут, независимо от того, насколько корректно мы зарегистрировали саму обработку и указали для нее объект назначения.

Для решения этой проблемы нам необходимо добавить наш документ в состав определяемого типа ОбъектСДополнительнымиКомандами. Давайте рассмотрим два основных способа это сделать.

Решение 1: Прямое изменение конфигурации (не рекомендуется)

Этот подход подразумевает непосредственное изменение типовой конфигурации. Мы категорически не рекомендуем его, так как он снимает конфигурацию с поддержки поставщика. Это означает, что при каждом обновлении конфигурации нам придется либо вручную переносить свои изменения, либо использовать сложные механизмы сравнения и объединения, что существенно усложняет процесс.

  1. Откроем конфигурацию в режиме Конфигуратора.
  2. В дереве объектов конфигурации найдем раздел "Общие" -> "Определяемые типы".
  3. Раскроем его и найдем определяемый тип ОбъектСДополнительнымиКомандами.
  4. Откроем свойства этого определяемого типа (двойным кликом или через контекстное меню).
  5. На вкладке "Состав" пролистаем список доступных объектов конфигурации. Найдем наш документ Документ.ПеремаркировкаТоваровИСМП и установим для него флажок.
  6. После внесения изменений сохраним конфигурацию базы данных (клавиша F7 или меню "Конфигурация" -> "Обновить конфигурацию базы данных").

После этих действий документ будет включен в список объектов, поддерживающих дополнительные команды. Однако, как уже упоминалось, этот метод нежелателен из-за потери поддержки.

Решение 2: Использование расширений конфигурации (рекомендуемый подход)

Наиболее предпочтительным, безопасным и гибким способом решения данной проблемы является использование механизма расширений конфигурации. Расширения позволяют изменять и дополнять функционал типовой конфигурации без снятия ее с поддержки, что значительно упрощает процесс обновления.

Шаг 1: Добавляем документ в определяемый тип ОбъектСДополнительнымиКомандами через расширение

Для того чтобы добавить наш документ в состав определяемого типа ОбъектСДополнительнымиКомандами, используя расширение, мы выполним следующие шаги:

  1. Создадим или откроем расширение: В режиме Конфигуратора откроем уже существующее расширение или создадим новое, если у нас его еще нет.
  2. Заимствуем определяемый тип: В дереве объектов расширения найдем раздел "Общие" -> "Определяемые типы". Нажмем правую кнопку мыши на "Определяемые типы" и выберем пункт "Добавить" -> "Из существующего".
  3. Выбираем ОбъектСДополнительнымиКомандами: В открывшемся окне "Добавление объектов из конфигурации" найдем и выберем определяемый тип ОбъектСДополнительнымиКомандами из основной конфигурации. Это действие называется "заимствованием" объекта, то есть мы включаем его в расширение для последующей модификации.
  4. Изменяем состав типа в расширении: После того как ОбъектСДополнительнымиКомандами появится в нашем расширении, откроем его свойства (двойным кликом).
  5. Добавляем наш документ: На вкладке "Состав" найдем наш документ Документ.ПеремаркировкаТоваровИСМП и установим для него флажок. В контексте расширения это означает, что мы дополняем состав типового определяемого типа нашим документом.
  6. Сохраняем расширение: После внесения изменений сохраним расширение (кнопка сохранения или меню "Конфигурация" -> "Расширения конфигурации" -> "Сохранить расширение").

После выполнения этих шагов наш документ будет включен в состав определяемого типа ОбъектСДополнительнымиКомандами, и подсистема "Дополнительные отчеты и обработки" начнет "видеть" его как объект, для которого могут быть показаны дополнительные команды. Важно, что все это сделано без прямого изменения основной конфигурации, сохраняя ее на поддержке.

Шаг 2: Добавляем необходимые процедуры в формы документа (при необходимости)

Даже после добавления документа в ОбъектСДополнительнымиКомандами, его формы (форма списка, форма объекта) должны содержать специальный код, который отвечает за обработку и отображение дополнительных команд. В большинстве типовых форм, которые должны поддерживать внешние обработки, эти процедуры уже присутствуют. Однако, если команды всё ещё не появляются, возможно, потребуется добавить стандартные обработчики в модули форм документа ПеремаркировкаТоваровИСМП через расширение.

  1. Заимствуем формы документа: В расширении заимствуем необходимые формы документа Документ.ПеремаркировкаТоваровИСМП. Обычно это ФормаДокумента (форма объекта) и ФормаСписка.
  2. Модифицируем модуль формы объекта: Откроем модуль заимствованной формы, например, ФормаДокумента.
  3. Проверяем вызов в ПриСозданииНаСервере: Убедимся, что в процедуре ПриСозданииНаСервере или аналогичной (например, ПриСозданииНаСервереПосле) вызывается метод подсистемы дополнительных отчетов и обработок. Если его нет, добавим следующий вызов:
  4. 
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // ... существующий код формы ...
        ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтотОбъект); // Инициализация подсистемы для формы
        // ... продолжение существующего кода формы ...
    КонецПроцедуры
    

    Этот вызов гарантирует, что подсистема "Дополнительные отчеты и обработки" будет инициализирована для текущей формы документа.

  5. Добавляем обработчики команд: Также нам потребуются стандартные обработчики команд, которые БСП использует для выполнения внешних отчетов и обработок. Проверим их наличие и, если их нет, добавим в модуль формы через расширение:
  6. 
    &НаКлиенте
    Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
        ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКоманду(Команда, ЭтотОбъект);
    КонецПроцедуры
    
    &НаСервере
    Функция Подключаемый_ПриКомпоновкеРезультата(ИмяКоманды, КомпоновщикМакета, ДополнительныеПараметры)
        Возврат ДополнительныеОтчетыИОбработкиСервер.ПриКомпоновкеРезультата(ЭтотОбъект, ИмяКоманды, КомпоновщикМакета, ДополнительныеПараметры);
    КонецФункции
    
    &НаКлиенте
    Процедура Подключаемый_ВыполнитьВнешнююКоманду(Команда)
        ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьВнешнююКоманду(Команда);
    КонецПроцедуры
    

    Мы должны понимать, что состав необходимых процедур может варьироваться в зависимости от версии Библиотеки стандартных подсистем (БСП), используемой в нашей конфигурации, и конкретного функционала, который мы хотим задействовать (например, выполнение отчетов, обработок или печатных форм).

Шаг 3: Обновление вспомогательных данных

После внесения всех изменений, особенно при активной работе с расширениями и подсистемой "Дополнительные отчеты и обработки", иногда требуется обновить вспомогательные данные этой подсистемы. Это гарантирует, что все новые настройки и зарегистрированные обработки будут корректно учтены системой.

Обновление можно выполнить одним из следующих способов:

  1. Через стандартную обработку: Использовать специальную обработку ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf, которая часто входит в состав Библиотеки стандартных подсистем (БСП) и может быть найдена на ИТС.
  2. Через меню конфигурации: В режиме 1С:Предприятие перейти в раздел "Администрирование" -> "Обслуживание". Там найти пункт "Обновление вспомогательных данных" (или схожий по названию) и выполнить его.

После этих действий и перезапуска программы 1С:Предприятие, команды внешней обработки заполнения должны появиться в командном интерфейсе документа "Перемаркировка товаров ИС МП".

Передача параметров в форму внешней обработки

После того как внешняя обработка успешно интегрирована и вызывается из документа, мы можем столкнуться с необходимостью передать в ее форму дополнительные параметры, помимо самого объекта-владельца (документа).

Автоматическая передача контекста объекта

При вызове обработки заполнения из формы документа, сама ссылка на документ, для которого вызывается обработка, автоматически передается в форму обработки. Этот объект будет доступен в процедуре ПриСозданииНаСервере формы внешней обработки через параметр Параметры.ОбъектыНазначения[0]. Мы всегда можем получить к нему доступ для получения данных или выполнения действий.

Передача произвольных параметров

Если нам необходимо передать дополнительные, произвольные параметры (например, дату документа, режим работы, информацию о текущем пользователе и т.п.), мы можем это сделать, немного модифицировав способ вызова формы обработки.

  1. В форме документа, из которой вызывается обработка:

    Для передачи произвольных параметров нам потребуется создать собственную команду в форме документа (или модифицировать существующую) и в ее обработчике использовать метод ОткрытьФорму или ПолучитьФорму, передавая в качестве параметра структуру с нужными данными. Это означает, что мы не будем полагаться на стандартный механизм вызова БСП для этой конкретной команды, а реализуем свой.

    Например, если у нас есть кнопка "Заполнить табличную часть", мы можем сделать следующее в модуле формы документа:

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

    Здесь ИмяВашейОбработки — это имя вашей внешней обработки в списке подключенных дополнительных отчетов и обработок, а ФормаОбработки — имя формы, которую мы хотим открыть внутри этой обработки.

  2. В форме внешней обработки (получение параметров):

    Чтобы форма внешней обработки могла корректно получить эти произвольные параметры, их необходимо явно объявить в конструкторе формы на вкладке "Параметры" с теми же именами, что и ключи в передаваемой структуре. Например, если мы передавали "ДатаДокумента" и "ДополнительныйРежим", то в форме обработки мы должны:

    1. Открыть форму внешней обработки в Конфигураторе.
    2. Перейти на вкладку "Параметры".
    3. Добавить новые параметры. Для "ДатаДокумента" укажем тип "Дата", для "ДополнительныйРежим" — "Строка". Важно, чтобы имена параметров точно соответствовали ключам структуры, которую мы передаем.

    Затем в модуле формы внешней обработки, в процедуре ПриСозданииНаСервере, мы сможем получить доступ к этим значениям через свойство Параметры:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Автоматически переданный объект назначения (если он был в структуре Параметры)
        Если Параметры.Свойство("ОбъектыНазначения") И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
            ОбъектНазначения = Параметры.ОбъектыНазначения[0];
            // Теперь ОбъектНазначения содержит ссылку на документ 'ПеремаркировкаТоваровИСМП'
        КонецЕсли;
    
        // Получаем произвольные параметры
        Если Параметры.Свойство("ДатаДокумента") Тогда
            МояДата = Параметры.ДатаДокумента;
            // Используем МояДата в логике заполнения
        КонецЕсли;
    
        Если Параметры.Свойство("ДополнительныйРежим") Тогда
            РежимРаботы = Параметры.ДополнительныйРежим;
            // Используем РежимРаботы для определения логики
        КонецЕсли;
    
        // ... дальнейшая логика заполнения табличной части на основе полученных параметров ...
    КонецПроцедуры
    

Общие рекомендации и отладка

В ходе нашего анализа мы выяснили, что основная причина отсутствия команды внешней обработки кроется в определяемом типе ОбъектСДополнительнымиКомандами. Мы настоятельно рекомендуем всегда использовать расширения для модификации типового функционала, так как это позволяет сохранить возможность беспроблемного обновления конфигурации.

При отладке внешних обработок, особенно если они ведут себя непредсказуемо, помните, что платформа 1С может использовать их кэшированные копии. В таких случаях, чтобы убедиться, что отлаживается актуальная версия, попробуйте:

Надеемся, что это подробное руководство поможет вам успешно интегрировать внешние обработки заполнения в командный интерфейс ваших документов в 1С:Комплексная автоматизация и эффективно использовать их функционал!

← На главную