Как программно добавить внешний отчет в 1С и избежать ошибок при сохранении двоичных данных?

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

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

Суть проблемы: неверное сохранение двоичных данных

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


ДвДанные = v8.NewObject("ДвоичныеДанные", ПутьКОтчету);
Отчет = v8.Справочники.ДополнительныеОтчетыИОбработки.Создатьэлемент;
Отчет.Наименование = Наименование ;
Отчет.ИмяФайла = ИмяФайла ;
НоваяКоманда = Отчет.Команды.Добавить;
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор ;
НоваяКоманда.ПоказыватьОповещение = Ложь;
НоваяКоманда.Модификатор = "";
Отчет.Ответственный = Ответсвенный;
Отчет.Записать(ДвДанные) // Здесь возникает ошибка

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

Ключевое решение: используем объект ХранилищеЗначения

Основная причина ошибки заключается в непонимании того, как 1С работает с хранением произвольных файлов. Для этих целей в платформе существует специальный тип данных — ХранилищеЗначения. Этот объект позволяет сохранять любые данные (включая двоичные) непосредственно в базу данных. Справочник «Дополнительные отчеты и обработки» имеет специальный реквизит ХранилищеОбработки, который предназначен именно для хранения файла отчета в виде ХранилищаЗначения.

Мы рассмотрим, как правильно использовать ХранилищеЗначения для корректного сохранения внешнего отчета.

  1. Сначала необходимо получить двоичные данные вашего файла отчета. Это можно сделать, например, из файла на диске.
  2. Затем эти двоичные данные следует обернуть в объект ХранилищеЗначения.
  3. Полученный объект ХранилищеЗначения присваивается реквизиту ХранилищеОбработки создаваемого элемента справочника.

Именно такой подход обеспечивает правильное сохранение файла отчета в базе данных 1С.

Пошаговая инструкция по программному добавлению отчета

Рассмотрим подробный алгоритм действий, который позволит вам программно добавить внешний отчет без ошибок:

  1. Получение двоичных данных файла отчета:

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

    
    // В случае работы через COM-объект 1С
    ДвДанные = v8.NewObject("ДвоичныеДанные", ПутьКОтчету);
    
    // В случае работы непосредственно в 1С
    // ДвДанные = Новый ДвоичныеДанные(ПутьКОтчету);
    

    Здесь ПутьКОтчету — это полный путь к файлу внешнего отчета (например, "C:\Reports\МойОтчет.erf").

  2. Создание нового элемента справочника «Дополнительные отчеты и обработки»:

    Используем метод СоздатьЭлемент() справочника для создания нового объекта.

    
    // В случае работы через COM-объект 1С
    Отчет = v8.Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент;
    
    // В случае работы непосредственно в 1С
    // Отчет = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
    
  3. Заполнение основных реквизитов:

    Необходимо заполнить такие обязательные поля, как Наименование, ИмяФайла и Вид.

    
    Отчет.Наименование = "НаименованиеОтчета"; // Укажите понятное наименование
    Отчет.ИмяФайла = "МойОтчет.erf"; // Имя файла, под которым отчет будет храниться
    Отчет.Ответственный = v8.Справочники.Пользователи.НайтиПоКоду("000000001"); // Пример заполнения ответственного
    // Или для текущего пользователя: Отчет.Ответственный = v8.ТекущийПользователь(); // При работе в 1С
    
    // Обязательно указываем вид доработки - ДополнительныйОтчет
    // В случае работы через COM-объект 1С
    Отчет.Вид = v8.Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
    
    // В случае работы непосредственно в 1С
    // Отчет.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
    

    Обратите внимание, что реквизит Вид является перечислением и очень важен для корректной работы отчета в системе.

  4. Помещение двоичных данных в ХранилищеЗначения:

    Это самый важный шаг. Мы создаем новый объект ХранилищеЗначения, передавая ему полученные ранее двоичные данные.

    
    // В случае работы через COM-объект 1С
    Хранилище = v8.NewObject("ХранилищеЗначения", ДвДанные);
    
    // В случае работы непосредственно в 1С
    // Хранилище = Новый ХранилищеЗначения(ДвДанные);
    
  5. Присвоение ХранилищаЗначения реквизиту ХранилищеОбработки:

    Теперь присваиваем созданный объект Хранилище соответствующему реквизиту нашего элемента справочника.

    Отчет.ХранилищеОбработки = Хранилище;
  6. Заполнение команд отчета (опционально, но рекомендуется):

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

    
    НоваяКоманда = Отчет.Команды.Добавить(); // Для 1С
    // Или НоваяКоманда = Отчет.Команды.Добавить; // Для COM
    
    НоваяКоманда.Представление = "Запустить Мой Отчет";
    НоваяКоманда.Идентификатор = "ЗапуститьОтчет"; // Уникальный идентификатор команды
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    НоваяКоманда.Модификатор = ""; // Может быть пустым
    

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

  7. Запись элемента справочника:

    Теперь, когда все необходимые реквизиты заполнены и двоичные данные корректно помещены в ХранилищеЗначения, мы можем безопасно записать элемент справочника в базу данных.

    Отчет.Записать(); // Без параметров!

    После этой операции отчет будет успешно добавлен в базу данных 1С и готов к использованию.

Пример полного программного кода

Соберем все шаги в единый фрагмент кода для наглядности. Представленный код адаптирован для использования через COM-объект 1С, что часто встречается при интеграции или автоматизации из внешних приложений. Если вы работаете непосредственно в среде 1С:Предприятия, достаточно заменить v8.NewObject(...) на Новый ...(...) и убрать префикс v8. у глобальных объектов.


// Предполагается, что 'v8' - это уже инициализированный COM-объект 1С
// Пример: v8 = New COMObject("V81C.Application");

// --- Параметры для отчета ---
ПутьКОтчету = "C:\МоиОтчеты\МойВнешнийОтчет.erf"; // Укажите фактический путь
НаименованиеОтчета = "Отчет по продажам за месяц (Прог)";
ИмяФайлаОтчета = "ПродажиЗаМесяц.erf";
ПредставлениеКоманды = "Открыть Отчет по Продажам";
ИдентификаторКоманды = "ОткрытьОтчет"; // Должен соответствовать имени функции в отчете
КодОтветственного = "000000001"; // Код пользователя-ответственного

Попытка
    // 1. Получаем двоичные данные файла
    ДвДанные = v8.NewObject("ДвоичныеДанные", ПутьКОтчету);

    // 2. Создаем новый элемент справочника "ДополнительныеОтчетыИОбработки"
    Отчет = v8.Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент;

    // 3. Заполняем основные реквизиты
    Отчет.Наименование = НаименованиеОтчета;
    Отчет.ИмяФайла = ИмяФайлаОтчета;
    
    // Ищем пользователя-ответственного
    Ответственный = v8.Справочники.Пользователи.НайтиПоКоду(КодОтветственного);
    Если Ответственный <> Неопределено Тогда
        Отчет.Ответственный = Ответственный;
    Иначе
        Сообщить("Внимание! Пользователь с кодом " + КодОтветственного + " не найден. Поле 'Ответственный' не заполнено.");
    КонецЕсли;

    // Указываем вид доработки: ДополнительныйОтчет
    Отчет.Вид = v8.Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;

    // 4. Помещаем двоичные данные в ХранилищеЗначения
    Хранилище = v8.NewObject("ХранилищеЗначения", ДвДанные);

    // 5. Присваиваем ХранилищеЗначения реквизиту ХранилищеОбработки
    Отчет.ХранилищеОбработки = Хранилище;

    // 6. Добавляем команду для запуска отчета
    НоваяКоманда = Отчет.Команды.Добавить;
    НоваяКоманда.Представление = ПредставлениеКоманды;
    НоваяКоманда.Идентификатор = ИдентификаторКоманды;
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    НоваяКоманда.Модификатор = "";

    // 7. Записываем элемент справочника
    Отчет.Записать();

    Сообщить("Внешний отчет '" + НаименованиеОтчета + "' успешно добавлен в базу.");

Исключение
    Сообщить("Ошибка при добавлении внешнего отчета: " + ОписаниеОшибки());
КонецПопытки;

Важные аспекты, которые следует учесть

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

  1. Функция СведенияОВнешнейОбработке():

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

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

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

  3. Права пользователя и режим безопасности:

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

  4. "Хранилище вариантов" отчета:

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

  5. Отладка внешних отчетов:

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

  6. Библиотека стандартных подсистем (БСП):

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

  7. Сжатие данных:

    ХранилищеЗначения поддерживает сжатие данных, что может быть очень полезно для больших файлов отчетов, помогая уменьшить объем базы данных. Для этого при создании ХранилищаЗначения можно передать второй параметр Новый СжатиеДанных().

    
    // В случае работы через COM-объект 1С с сжатием данных
    Хранилище = v8.NewObject("ХранилищеЗначения", ДвДанные, v8.NewObject("СжатиеДанных"));
    
    // В случае работы непосредственно в 1С с сжатием данных
    // Хранилище = Новый ХранилищеЗначения(ДвДанные, Новый СжатиеДанных());
    

Заключение

Программное добавление внешних отчетов в 1С — это мощный инструмент для автоматизации и расширения функциональности системы. Мы выяснили, что ключ к успешному решению этой задачи лежит в правильном использовании объекта ХранилищеЗначения для сохранения двоичных данных отчета в реквизит ХранилищеОбработки справочника «Дополнительные отчеты и обработки», а также в заполнении всех необходимых реквизитов, включая Вид и команды. Следуя этой подробной инструкции и учитывая дополнительные рекомендации, вы сможете эффективно управлять внешними отчетами и обработками в своих проектах 1С.

← На главную