При работе с системой 1С:Предприятие 8.3 на управляемых формах, особенно в конфигурациях, таких как 1С:Бухгалтерия, часто возникает необходимость использования внешних отчетов и обработок для решения специфических задач, которые не предусмотрены типовым функционалом. Однако многие пользователи сталкиваются с тем, что разработанные и загруженные внешние объекты не отображаются в нужных разделах интерфейса или запускаются некорректно. В этой статье мы подробно рассмотрим, как правильно зарегистрировать и настроить внешние отчеты и обработки, чтобы они были видны и доступны пользователям, а также разберем нюансы их программного размещения.
Мы выясним причины возникновения данной проблемы и предложим несколько подходов к её решению, начиная от стандартных настроек через интерфейс пользователя и заканчивая программной регистрацией для более сложных сценариев. Наша цель — дать вам полное понимание механизмов работы с внешними отчетами и обработками, чтобы вы могли уверенно управлять их жизненным циклом в 1С.
Первым шагом при добавлении внешнего отчета или обработки является их регистрация в соответствующем справочнике системы 1С. Рассмотрим этот процесс по шагам.
Открытие раздела администрирования: Нам необходимо перейти в раздел
Администрирование
Печатные формы, отчеты и обработки
Дополнительные отчеты и обработки
Здесь мы увидим список уже зарегистрированных внешних объектов. Если ваша обработка уже загружена, мы найдем ее в этом списке; в противном случае, нам потребуется добавить новую.
Создание или выбор элемента справочника: Если обработка еще не зарегистрирована, нам нужно нажать кнопку
Добавить из файла...
Указание "Вида" объекта: Это один из ключевых параметров, который определяет тип вашего внешнего файла. В поле
Вид
Дополнительная обработка
Дополнительный отчет
Правильный выбор этого параметра очень важен для корректной работы и отображения объекта в системе.
Настройка "Размещения" в интерфейсе: Перейдем на закладку
Размещение
Выбрать
Раздел
Продажи
Покупки
Отчеты
Бухгалтерия
Выбрать
Команду
СведенияОВнешнейОбработке()
Без правильно настроенного размещения ваша обработка не появится в пользовательском интерфейсе.
Определение "Назначения": Закладка
Назначение
Реализация товаров и услуг
Объекты не указаны
Пользователи
Управление доступом: На закладке
Доступ
После выполнения всех этих шагов и сохранения изменений, ваша внешняя обработка или отчет должны появиться в указанных разделах интерфейса для соответствующих пользователей.
Для того чтобы 1С могла корректно распознавать и гибко настраивать команды вашей внешней обработки или отчета, крайне желательно, чтобы в модуле объекта этой обработки (или отчета) была экспортируемая функция с предопределенным именем:
СведенияОВнешнейОбработке()
Рассмотрим подробнее, что должна возвращать эта функция и как ее правильно оформить.
Структура возвращаемого значения: Функция
СведенияОВнешнейОбработке()
Структуру
Вид
"ДополнительнаяОбработка"
"ДополнительныйОтчет"
Назначение
"Документ.РеализацияТоваровУслуг"
"Справочник.Пользователи"
Команды
Структурой
Описание команды: Для каждой команды в массиве
Команды
Представление
Идентификатор
Использование
"ОткрытиеФормы"
"ВызовСерверногоМетода"
ПоказыватьОповещение
Посмотрим на пример кода функции
СведенияОВнешнейОбработке()
Функция СведенияОВнешнейОбработке() Экспорт
// Создаем основную структуру для описания обработки
ПараметрыРегистрации = Новый Структура;
// Указываем вид объекта (обработка или отчет)
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
// Если это дополнительный отчет, то:
// ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
// Определяем назначение обработки.
// Это массив, так как назначений может быть несколько.
ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
// Пример: Доступна всем пользователям (привязка к справочнику "Пользователи")
ПараметрыРегистрации.Назначение.Добавить("Справочник.Пользователи");
// Если нужно привязать к конкретным документам, например, к "Реализации товаров и услуг":
// ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
// Или к нескольким объектам:
// ПараметрыРегистрации.Назначение.Добавить("Документ.ПриходнаяНакладная");
// Создаем массив для описания команд, которые будут доступны в интерфейсе
Команды = Новый Массив;
// Описываем первую команду
Команда1 = Новый Структура;
Команда1.Вставить("Представление", "Моя Специальная Обработка"); // Текст, который увидит пользователь
Команда1.Вставить("Идентификатор", "МояСпецОбработка"); // Уникальный идентификатор команды
Команда1.Вставить("Использование", "ОткрытиеФормы"); // Способ запуска: открываем форму обработки
Команда1.Вставить("ПоказыватьОповещение", Истина); // Показывать уведомление при запуске
Команды.Добавить(Команда1);
// Можно добавить вторую команду, если обработка имеет несколько функций
Команда2 = Новый Структура;
Команда2.Вставить("Представление", "Проверить Документы");
Команда2.Вставить("Идентификатор", "ПроверитьДокументы");
Команда2.Вставить("Использование", "ВызовСерверногоМетода"); // Способ запуска: вызов серверного метода
Команда2.Вставить("ПоказыватьОповещение", Ложь);
Команды.Добавить(Команда2);
// Вставляем массив команд в общую структуру
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
Если вы используете
Использование = "ВызовСерверногоМетода"
Идентификатор
Идентификатор = "ПроверитьДокументы"
ПроверитьДокументы() Экспорт
После добавления или корректировки этой функции в вашей внешней обработке, необходимо перезагрузить файл обработки через справочник
Дополнительные отчеты и обработки
В некоторых случаях, особенно при массовой установке или обновлении внешних объектов на нескольких базах, а также при динамическом создании и размещении, может потребоваться программное управление регистрацией. Для этих целей мы используем механизмы работы с регистрами сведений и справочниками 1С.
Основные объекты, с которыми мы будем работать:
Справочник.ДополнительныеОтчетыИОбработки
РегистрСведений.ДополнительныеОтчетыИОбработкиРазмещение
Рассмотрим пример кода, который демонстрирует, как найти уже существующую обработку (или создать, если не найдена) и затем программно разместить ее в нужном разделе интерфейса.
// Предположим, у нас есть переменные:
// ПутьКФайлуВнешнейОбработки (Строка) - полный путь к файлу .epf или .erf
// ИмяКомандыВОбработке (Строка) - Идентификатор команды, описанной в СведенияОВнешнейОбработке()
// РазделИнтерфейса (Строка) - Полное имя подсистемы, например, "Подсистема.Продажи" или "Подсистема.Отчеты"
// НаименованиеОбработки (Строка) - Желаемое наименование в справочнике "Дополнительные отчеты и обработки"
Функция ЗарегистрироватьИРазместитьВнешнююОбработку(ПутьКФайлуВнешнейОбработки, ИмяКомандыВОбработке, РазделИнтерфейса, НаименованиеОбработки) Экспорт
// 1. Поиск или создание элемента справочника "Дополнительные отчеты и обработки"
// Сначала попробуем найти обработку по ее имени файла (для уникальности)
ТекстЗапроса = "ВЫБРАТЬ
| ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
| ДополнительныеОтчетыИОбработки.ИмяФайлаОбработки = &ИмяФайлаОбработки
| И ДополнительныеОтчетыИОбработки.ПометкаУдаления = ЛОЖЬ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИмяФайлаОбработки", ИмяФайла(ПутьКФайлуВнешнейОбработки)); // Используем ИмяФайла без пути
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ПерезагружатьОбработку = Ложь;
СсылкаНаЭлементСправочника = Неопределено;
Если Выборка.Следующий() Тогда
// Обработка найдена, получаем ссылку
СсылкаНаЭлементСправочника = Выборка.Ссылка;
Сообщить("Обработка '" + НаименованиеОбработки + "' уже зарегистрирована.", СтатусСообщения.Информация);
Иначе
// Обработка не найдена, создаем новый элемент справочника
Сообщить("Обработка '" + НаименованиеОбработки + "' не найдена, создаем новый элемент.", СтатусСообщения.Информация);
НовыйЭлементСправочника = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
НовыйЭлементСправочника.Наименование = НаименованиеОбработки;
// Указываем вид - важно для определения поведения
НовыйЭлементСправочника.Вид = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка"); // или .ДополнительныйОтчет
// Загружаем файл в хранилище (это основная часть)
НовыйЭлементСправочника.ХранилищеФайла.Установить(Новый ДвоичныеДанные(ПутьКФайлуВнешнейОбработки));
НовыйЭлементСправочника.ИмяФайлаОбработки = ИмяФайла(ПутьКФайлуВнешнейОбработки);
Попытка
// Запись элементов справочника может требовать интерактивных подтверждений,
// если обработка содержит небезопасный код.
НовыйЭлементСправочника.Записать();
СсылкаНаЭлементСправочника = НовыйЭлементСправочника.Ссылка;
ПерезагружатьОбработку = Истина;
Исключение
Сообщить("Ошибка при создании элемента справочника для обработки: " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
Если СсылкаНаЭлементСправочника = Неопределено Тогда
Сообщить("Не удалось получить или создать ссылку на элемент справочника обработки.", СтатусСообщения.Ошибка);
Возврат Неопределено;
КонецЕсли;
// 2. Если файл был только что создан или обновлен,
// необходимо вызвать процедуру обработки, чтобы система считала СведенияОВнешнейОбработке().
Если ПерезагружатьОбработку Тогда
МенеджерДопОтчетовИОбработокКлиентСервер.ОбновитьОбработку(СсылкаНаЭлементСправочника);
// МенеджерДопОтчетовИОбработокКлиентСервер - это общий модуль конфигурации,
// содержит процедуру для обновления данных обработки.
КонецЕсли;
// 3. Размещение обработки в интерфейсе через регистр сведений "ДополнительныеОтчетыИОбработкиРазмещение"
// Сначала получаем набор записей для данной обработки
НаборЗаписей = РегистрыСведений.ДополнительныеОтчетыИОбработкиРазмещение.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДополнительнаяОбработка.Установить(СсылкаНаЭлементСправочника);
НаборЗаписей.Прочитать(); // Читаем существующие записи для этой обработки
НайденоРазмещение = Ложь;
Для Каждого ЗаписьРазмещения Из НаборЗаписей Цикл
// Проверяем, существует ли уже нужное нам размещение
Если ЗаписьРазмещения.Подсистема.ПолноеИмя() = РазделИнтерфейса
И ЗаписьРазмещения.Команда = ИмяКомандыВОбработке Тогда
НайденоРазмещение = Истина;
Сообщить("Размещение для команды '" + ИмяКомандыВОбработке + "' в разделе '" + РазделИнтерфейса + "' уже существует.", СтатусСообщения.Информация);
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ НайденоРазмещение Тогда
// Если такого размещения нет, добавляем новую запись
Сообщить("Добавляем новое размещение для команды '" + ИмяКомандыВОбработке + "' в раздел '" + РазделИнтерфейса + "'.", СтатусСообщения.Информация);
НоваяЗаписьРазмещения = НаборЗаписей.Добавить();
НоваяЗаписьРазмещения.ДополнительнаяОбработка = СсылкаНаЭлементСправочника;
НоваяЗаписьРазмещения.Команда = ИмяКомандыВОбработке;
// Получаем ссылку на объект метаданных Подсистема по ее полному имени
ОбъектПодсистемы = ПолучитьПодсистемуПоПолномуИмени(РазделИнтерфейса);
Если ОбъектПодсистемы <> Неопределено Тогда
НоваяЗаписьРазмещения.Подсистема = ОбъектПодсистемы;
Иначе
Сообщить("Не удалось найти подсистему с полным именем '" + РазделИнтерфейса + "'. Размещение не будет создано.", СтатусСообщения.Предупреждение);
Возврат Неопределено;
КонецЕсли;
// Представление команды в интерфейсе
НоваяЗаписьРазмещения.Представление = "Запуск: " + ИмяКомандыВОбработке;
Попытка
НаборЗаписей.Записать(); // Записываем изменения в регистр сведений
Сообщить("Размещение успешно добавлено.", СтатусСообщения.Информация);
Исключение
Сообщить("Ошибка при записи размещения обработки: " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
Возврат СсылкаНаЭлементСправочника; // Возвращаем ссылку на зарегистрированную обработку
КонецФункции
// Вспомогательная функция для получения объекта метаданных Подсистема
// по ее полному имени (например, "Подсистема.Продажи")
Функция ПолучитьПодсистемуПоПолномуИмени(ПолноеИмяПодсистемы)
Для Каждого ПодсистемаМетаданных Из Метаданные.Подсистемы Цикл
Если ПодсистемаМетаданных.ПолноеИмя() = ПолноеИмяПодсистемы Тогда
Возврат ПодсистемаМетаданных;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Важные моменты при программной регистрации:
Права доступа: Для успешного выполнения программной регистрации необходимо, чтобы у пользователя (или роли, под которой выполняется код) были соответствующие права на создание и изменение элементов справочника
ДополнительныеОтчетыИОбработки
ДополнительныеОтчетыИОбработкиРазмещение
МенеджерДопОтчетовИОбработокКлиентСервер: Процедура
ОбновитьОбработку()
СведенияОВнешнейОбработке()
ИмяФайла: При поиске существующей обработки по имени файла, мы используем функцию
ИмяФайла()
ИмяФайлаОбработки
Давайте рассмотрим несколько дополнительных советов и часто возникающих проблем, с которыми мы можем столкнуться при работе с внешними отчетами и обработками.
Перезапуск клиента 1С: Одна из самых распространенных причин, по которой внешняя обработка или отчет не появляется сразу после регистрации или изменения настроек, это отсутствие перезапуска клиента 1С:Предприятия. После любых манипуляций с дополнительными отчетами и обработками через интерфейс, или после их программной регистрации, обязательно попробуйте перезапустить клиентское приложение 1С. Это позволит системе обновить внутренние кэши и корректно отобразить все изменения.
Проверка прав пользователей (роли): Как мы уже упоминали, даже если обработка правильно зарегистрирована и размещена, пользователи могут ее не видеть из-за недостаточных прав. Мы должны всегда проверять закладку
Доступ
Отладка и анализ ошибок: Если обработка все равно не работает или не появляется, мы можем предпринять следующие шаги:
Проверить журнал регистрации: В нем могут быть записи об ошибках при загрузке или инициализации внешней обработки.
Запустить обработку в режиме отладки: Открыть внешнюю обработку в конфигураторе и запустить отладку, чтобы пошагово проанализировать выполнение кода и выявить проблемы, особенно если это касается функции
СведенияОВнешнейОбработке()
Проверить корректность файла: Убедиться, что файл
.epf
.erf
Версионность внешних обработок: При обновлении внешней обработки важно учитывать ее версионность. Если мы просто перезагружаем файл, 1С обычно обновляет его. Однако, если существенно меняется структура команд или логика, иногда бывает проще удалить старую обработку из справочника и зарегистрировать ее заново. Программный подход, как мы видели, позволяет автоматизировать этот процесс, обновляя файл и его размещение.
Совместимость режимов: Убедитесь, что ваша внешняя обработка разработана с учетом режима совместимости управляемых форм, который используется в вашей конфигурации 1С:Предприятия. Иногда старые обработки, разработанные для обычных форм, могут работать некорректно или требовать доработки.
Мы рассмотрели основные подходы к подключению и отображению внешних отчетов и обработок в 1С:Предприятие 8.3 на управляемых формах. Мы выяснили, что успешное внедрение зависит от правильной настройки в справочнике
Дополнительные отчеты и обработки
СведенияОВнешнейОбработке()