Как правильно подключить и отобразить внешние отчеты и обработки в интерфейсе 1С:Предприятие 8.3 на управляемых формах?

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

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

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

Стандартная регистрация через справочник "Дополнительные отчеты и обработки"

Первым шагом при добавлении внешнего отчета или обработки является их регистрация в соответствующем справочнике системы 1С. Рассмотрим этот процесс по шагам.

  1. Открытие раздела администрирования: Нам необходимо перейти в раздел

    
    Администрирование
    
    , затем выбрать пункт
    
    Печатные формы, отчеты и обработки
    
    и далее перейти в
    
    Дополнительные отчеты и обработки
    
    .

    Здесь мы увидим список уже зарегистрированных внешних объектов. Если ваша обработка уже загружена, мы найдем ее в этом списке; в противном случае, нам потребуется добавить новую.

  2. Создание или выбор элемента справочника: Если обработка еще не зарегистрирована, нам нужно нажать кнопку

    
    Добавить из файла...
    
    и указать путь к файлу вашей внешней обработки (или отчета). После загрузки она появится в списке. Если она уже есть, просто откроем ее для редактирования.

  3. Указание "Вида" объекта: Это один из ключевых параметров, который определяет тип вашего внешнего файла. В поле

    
    Вид
    
    мы должны выбрать соответствующее значение:

    • 
      Дополнительная обработка
      
      – для внешних обработок, которые выполняют какие-либо действия, не являющиеся формированием отчета.
    • 
      Дополнительный отчет
      
      – для внешних отчетов.

    Правильный выбор этого параметра очень важен для корректной работы и отображения объекта в системе.

  4. Настройка "Размещения" в интерфейсе: Перейдем на закладку

    
    Размещение
    
    . Именно здесь мы указываем, в каких разделах (подсистемах) интерфейса должна быть видна наша обработка или отчет. Мы можем добавить несколько размещений, если это необходимо. Для каждого размещения нам нужно:

    • Выбрать

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

    • Выбрать

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

    Без правильно настроенного размещения ваша обработка не появится в пользовательском интерфейсе.

  5. Определение "Назначения": Закладка

    
    Назначение
    
    позволяет нам определить, к каким объектам системы (документам, справочникам) привязывается данная обработка. Если обработка должна работать с конкретным типом документов, например,
    
    Реализация товаров и услуг
    
    , мы указываем это здесь. Если же обработка является общей и не привязана к конкретным данным, мы можем оставить
    
    Объекты не указаны
    
    или, в некоторых случаях, указать
    
    Пользователи
    
    .

  6. Управление доступом: На закладке

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

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

Создание функции СведенияОВнешнейОбработке() во внешней обработке/отчете

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


СведенияОВнешнейОбработке()
. Если этой функции нет, 1С попытается зарегистрировать объект с базовыми настройками, что часто приводит к негибкому размещению или отсутствию команд.

Рассмотрим подробнее, что должна возвращать эта функция и как ее правильно оформить.

  1. Структура возвращаемого значения: Функция

    
    СведенияОВнешнейОбработке()
    
    должна возвращать
    
    Структуру
    
    , содержащую метаданные о вашей обработке. Основные поля этой структуры:

    • 
      Вид
      
      (Строка): Соответствует полю "Вид" в справочнике "Дополнительные отчеты и обработки". Может быть
      
      "ДополнительнаяОбработка"
      
      или
      
      "ДополнительныйОтчет"
      
      .
    • 
      Назначение
      
      (Массив строк): Соответствует полю "Назначение". Содержит полные имена метаданных объектов, к которым привязана обработка (например,
      
      "Документ.РеализацияТоваровУслуг"
      
      ). Если обработка общая, можно добавить
      
      "Справочник.Пользователи"
      
      или оставить массив пустым.
    • 
      Команды
      
      (Массив структур): Это массив описаний команд, которые будут доступны пользователю для запуска обработки. Каждая команда также является
      
      Структурой
      
      с собственными полями.
  2. Описание команды: Для каждой команды в массиве

    
    Команды
    
    мы должны определить следующие параметры:

    • 
      Представление
      
      (Строка): Текст, который будет виден пользователю в интерфейсе (например, "Моя Специальная Обработка").
    • 
      Идентификатор
      
      (Строка): Уникальный строковый идентификатор команды, который будет использоваться для ссылки на нее (например, "МояСпецОбработка"). Это имя будет отображаться в поле "Команда" на закладке "Размещение" в справочнике.
    • 
      Использование
      
      (Строка): Определяет способ запуска команды:
      • 
        "ОткрытиеФормы"
        
        – если команда должна открывать форму внешней обработки.
      • 
        "ВызовСерверногоМетода"
        
        – если команда должна вызывать серверную процедуру/функцию внутри внешней обработки.
    • 
      ПоказыватьОповещение
      
      (Булево): Определяет, показывать ли стандартное оповещение при запуске команды (например, "Выполняется...").

Посмотрим на пример кода функции


СведенияОВнешнейОбработке()
для внешней обработки:


Функция СведенияОВнешнейОбработке() Экспорт
    // Создаем основную структуру для описания обработки
    ПараметрыРегистрации = Новый Структура;

    // Указываем вид объекта (обработка или отчет)
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); 
    // Если это дополнительный отчет, то:
    // ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");

    // Определяем назначение обработки. 
    // Это массив, так как назначений может быть несколько.
    ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
    // Пример: Доступна всем пользователям (привязка к справочнику "Пользователи")
    ПараметрыРегистрации.Назначение.Добавить("Справочник.Пользователи"); 
    // Если нужно привязать к конкретным документам, например, к "Реализации товаров и услуг":
    // ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
    // Или к нескольким объектам:
    // ПараметрыРегистрации.Назначение.Добавить("Документ.ПриходнаяНакладная");

    // Создаем массив для описания команд, которые будут доступны в интерфейсе
    Команды = Новый Массив;

    // Описываем первую команду
    Команда1 = Новый Структура;
    Команда1.Вставить("Представление", "Моя Специальная Обработка"); // Текст, который увидит пользователь
    Команда1.Вставить("Идентификатор", "МояСпецОбработка");       // Уникальный идентификатор команды
    Команда1.Вставить("Использование", "ОткрытиеФормы");          // Способ запуска: открываем форму обработки
    Команда1.Вставить("ПоказыватьОповещение", Истина);            // Показывать уведомление при запуске
    Команды.Добавить(Команда1);

    // Можно добавить вторую команду, если обработка имеет несколько функций
    Команда2 = Новый Структура;
    Команда2.Вставить("Представление", "Проверить Документы");
    Команда2.Вставить("Идентификатор", "ПроверитьДокументы");
    Команда2.Вставить("Использование", "ВызовСерверногоМетода"); // Способ запуска: вызов серверного метода
    Команда2.Вставить("ПоказыватьОповещение", Ложь);
    Команды.Добавить(Команда2);
    
    // Вставляем массив команд в общую структуру
    ПараметрыРегистрации.Вставить("Команды", Команды);

    Возврат ПараметрыРегистрации;
КонецФункции

Если вы используете


Использование = "ВызовСерверногоМетода"
, то в модуле вашей внешней обработки должна быть экспортируемая серверная функция или процедура с именем

Идентификатор
из структуры команды. Например, для команды с

Идентификатор = "ПроверитьДокументы"
, должна быть функция

ПроверитьДокументы() Экспорт
.

После добавления или корректировки этой функции в вашей внешней обработке, необходимо перезагрузить файл обработки через справочник


Дополнительные отчеты и обработки
(или создать новый элемент). Система перечитает метаданные и предложит обновленные команды для размещения.

Программное управление регистрацией и размещением внешних отчетов и обработок

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

Основные объекты, с которыми мы будем работать:

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


// Предположим, у нас есть переменные:
// ПутьКФайлуВнешнейОбработки (Строка) - полный путь к файлу .epf или .erf
// ИмяКомандыВОбработке (Строка) - Идентификатор команды, описанной в СведенияОВнешнейОбработке()
// РазделИнтерфейса (Строка) - Полное имя подсистемы, например, "Подсистема.Продажи" или "Подсистема.Отчеты"
// НаименованиеОбработки (Строка) - Желаемое наименование в справочнике "Дополнительные отчеты и обработки"

Функция ЗарегистрироватьИРазместитьВнешнююОбработку(ПутьКФайлуВнешнейОбработки, ИмяКомандыВОбработке, РазделИнтерфейса, НаименованиеОбработки) Экспорт
    
    // 1. Поиск или создание элемента справочника "Дополнительные отчеты и обработки"
    // Сначала попробуем найти обработку по ее имени файла (для уникальности)
    ТекстЗапроса = "ВЫБРАТЬ
                    |    ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
                    |ИЗ
                    |    Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
                    |ГДЕ
                    |    ДополнительныеОтчетыИОбработки.ИмяФайлаОбработки = &ИмяФайлаОбработки
                    |    И ДополнительныеОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ";

    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("ИмяФайлаОбработки", ИмяФайла(ПутьКФайлуВнешнейОбработки)); // Используем ИмяФайла без пути

    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    ПерезагружатьОбработку = Ложь;
    СсылкаНаЭлементСправочника = Неопределено;

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

    Если СсылкаНаЭлементСправочника = Неопределено Тогда
        Сообщить("Не удалось получить или создать ссылку на элемент справочника обработки.", СтатусСообщения.Ошибка);
        Возврат Неопределено;
    КонецЕсли;

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

    // 3. Размещение обработки в интерфейсе через регистр сведений "ДополнительныеОтчетыИОбработкиРазмещение"
    // Сначала получаем набор записей для данной обработки
    НаборЗаписей = РегистрыСведений.ДополнительныеОтчетыИОбработкиРазмещение.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ДополнительнаяОбработка.Установить(СсылкаНаЭлементСправочника);
    НаборЗаписей.Прочитать(); // Читаем существующие записи для этой обработки

    НайденоРазмещение = Ложь;
    Для Каждого ЗаписьРазмещения Из НаборЗаписей Цикл
        // Проверяем, существует ли уже нужное нам размещение
        Если ЗаписьРазмещения.Подсистема.ПолноеИмя() = РазделИнтерфейса 
           И ЗаписьРазмещения.Команда = ИмяКомандыВОбработке Тогда
            НайденоРазмещение = Истина;
            Сообщить("Размещение для команды '" + ИмяКомандыВОбработке + "' в разделе '" + РазделИнтерфейса + "' уже существует.", СтатусСообщения.Информация);
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

    Возврат СсылкаНаЭлементСправочника; // Возвращаем ссылку на зарегистрированную обработку
КонецФункции

// Вспомогательная функция для получения объекта метаданных Подсистема
// по ее полному имени (например, "Подсистема.Продажи")
Функция ПолучитьПодсистемуПоПолномуИмени(ПолноеИмяПодсистемы)
    Для Каждого ПодсистемаМетаданных Из Метаданные.Подсистемы Цикл
        Если ПодсистемаМетаданных.ПолноеИмя() = ПолноеИмяПодсистемы Тогда
            Возврат ПодсистемаМетаданных;
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

Важные моменты при программной регистрации:

Дополнительные рекомендации и часто встречающиеся проблемы

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

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

  2. Проверка прав пользователей (роли): Как мы уже упоминали, даже если обработка правильно зарегистрирована и размещена, пользователи могут ее не видеть из-за недостаточных прав. Мы должны всегда проверять закладку

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

  3. Отладка и анализ ошибок: Если обработка все равно не работает или не появляется, мы можем предпринять следующие шаги:

    • Проверить журнал регистрации: В нем могут быть записи об ошибках при загрузке или инициализации внешней обработки.

    • Запустить обработку в режиме отладки: Открыть внешнюю обработку в конфигураторе и запустить отладку, чтобы пошагово проанализировать выполнение кода и выявить проблемы, особенно если это касается функции

      
      СведенияОВнешнейОбработке()
      
      или серверных вызовов.

    • Проверить корректность файла: Убедиться, что файл

      
      .epf
      
      или
      
      .erf
      
      не поврежден и открывается в конфигураторе без ошибок.

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

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

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


Дополнительные отчеты и обработки
, корректной реализации функции

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

← На главную