1С:ExcelReport — COM компонента для вывода в Excel в стиле 1С

Когда необходимо создать из 1С файл Excel с богатым форматированием и встроенными в ячейки формулами, приходится писать на языке 1С довольно объемный код. Предлагаемая компонента позволяет создать макет Excel и вывести отчет «как в 1С», с использованием простого задания параметров и вывода/присоединения секций.

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

Писать сложный код по построению отчета через OLE Automation нудно, долго и не интересно. Программисты зачастую плохо знают объектную модель Excel т.к. это другая специализация и другой язык программирования (VBA). Поэтому приятней делать все на знакомом языке используя привычные приемы.

Используя данную компоненту программист может создавать отчет Excel почти так же, как он создает его средствами . Полностью исключается необходимость знать язык VBA. Более того, переделка отчета в отчет Excel практически не потребует переделки кода, всего-лишь небольшой доработки (это касается 1С версии 7.7, т.к. в версии 8 этот подход применяется редко из-за наличия СКД)…

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

Экс=СоздатьОбъект("rsa1CExtRep.ExcelAs1CReport");
Экс.ИсходнаяТаблица(КаталогИБ()+"ExtFormsШаблонЭкономОтчетПоКиеву.xls", "Шаблон");
//Выводим ШАПКУ отчета
Экс.УстановитьЗначениеПеременной("Период",ПериодСтр(Дата1,Дата2));
Экс.ВывестиСекцию("Шапка");
БИ.ВыбратьСубконто(1);
Пока БИ.ПолучитьСубконто(1)=1 Цикл
Наим=Строка(БИ.Субконто(1));
Кво=БИ.ДО("К");
Сумма=БИ.ДО("С");
Цена="=RC[1]/RC[-1]";
Экс.УстановитьЗначениеПеременной("Кво",Кво);
Экс.УстановитьЗначениеПеременной("Сумма",Сумма);
Экс.УстановитьЗначениеПеременной("Цена",Цена);
Экс.УстановитьЗначениеПеременной("Наименование",Наим);
//Выводим СТРОКУ отчета
Экс.ВывестиСекцию("Строка");
КонецЦикла;
//Выводим ПОДВАЛ отчета
Экс.УстановитьЗначениеПеременной("Сумма",БИ.ДО("С"));
Экс.ВывестиСекцию("Подвал");
//Вызов выходного отчета в окно просмотра и редактирования.
Экс.СохранитьКак(ИмяФайлаВыгрузки);
Экс.Показать();

Поддерживается вывод и присоединение секций к таблице Excel, а из незнакомых методов только УстановитьЗначениеПеременной(ИмяПеременной,ЗначениеПеременной), что так же можно не комментировать, всем понятно без объяснений.

Небольшое пояснение к способу создания в Excel таблиц-шаблонов: Можно задать только прямоугольные блоки задавая имена областям таблицы. В этой версии не поддерживается синтаксис пересечения секций (например, «Строка|Наименование» и т.д.), но это компенсируется тем, что в Excel можно именовать любые области таблицы.

Пример приведен для 1С 7.7, но компонента прекрасно работает в версиях 8.2 и 8.3, проверено на практике. За несколько лет использования на разных версиях Windows, в том числе в терминальном режиме, а так же с разными версиями Excel, проблем не замечено.

7 Comments

  1. Perfolenta

    Пример для 1с 8:

    Попытка
    Экс = ПолучитьCOMОбъект(«», «rsa1CExtRep.ExcelAs1CReport»);
    Исключение
    Сообщить(«Не получилось создать объект «»rsa1CExtRep.ExcelAs1CReport»»!»);
    Возврат;
    КонецПопытки;
    Экс.ИсходнаяТаблица(«d:ШаблоныШаблон отчета.xls», «Лист1»);
    
    Экс.УстановитьЗначениеПеременной(«ИмяОтчета», «Отчет по затратам»);
    
    Экс.ВывестиСекцию(«Отчет»);
    
    Экс.СохранитьКак(«d:»+ИмяПользователя()+»Отчет.xls»);
    Экс.Показать();

    Показать

    Reply
  2. Perfolenta

    Пример для восьмерки:

    Reply
  3. agdam_m

    А что из себя представляет данная компонента? Какой у нее API?

    Reply
  4. Perfolenta

    (3) вы наверное имели ввиду не API, а технологию, на которой работает компонента? Технология COM, а точнее OLE Automation, написана на Vb 6. Написана давно и с тех пор постоянно мной применяется… пережила 7.7 и успешно живет на 8.3…

    API компоненты это те методы и свойства, которые она предоставляет. Если вы все же имели ввиду API компоненты, то документации я не делал… API можно посмотреть в любом Object Browser, например, в Word или Excel.

    В компоненте 2 класса:

    ExcelAs1CReport — для создания отчета, как описано в статье

    ExcelTo1CReader — для чтения данных из Excel по именам колонок, но этот класс можно считать устаревшим, т.к. технология чтения из Excel со времен 7.7 очень развилась и в 8.3 врядли у кого-то с этим проблемы… хотя эта компонента сама ищет заголовки колонок и в некоторых случаях может быть полезна, если пользователи присылают таблицы в которых заголовки все время в разных колонках и столбцах…

    ExcelAs1CReport имеет следующие методы:

    — Public Sub УстановитьФормулуЯчейки(Строка As Long, Колонка As Long, Формула As String)

    — Public Sub ИсходнаяТаблица(ПутьКФайлуШаблонаТаблицы As String, ИмяТаблицы As String)

    — Public Sub ВывестиСекцию(ИмяСекции As String, Optional ИзмШиринуКолонок As Long = 1, Optional ИзмВысотуСтрок As Long = 1)

    — Public Sub ПрисоединитьСекцию(ИмяСекции As String, Optional ИзмШиринуКолонок As Long = 1)

    — Public Sub НоваяСтраница()

    — Public Sub Показать()

    — Public Sub СохранитьКак(ПутьКФайлу As String)

    — Public Sub УстановитьЗначениеПеременной(ИмяПеременной As String, Значение As Variant)

    — Public Function ПоказатьОшибки() As String

    — Public Function ЛистШаблона() As Object

    — Public Function ЛистОтчета() As Object

    — Public Function ТекущаяСтрока() As Long

    — Public Function ТекущаяКолонка() As Long

    — Public Function ТекущаяВысотаСекции() As Long

    Если вам компонента действительно нужна, то спрашивайте, что не понятно, буду отвечать…

    Reply
  5. Perfolenta

    (3) кстати, только сейчас заметил, что в статье, в примере, есть ошибка…

    там в поле Цена устанавливается формула, а не значение и должно быть:

    не Экс.УстановитьЗначениеПеременной(«Цена»,Цена);

    а Экс.УстановитьФормулуЯчейки(НомерСтроки, НомерКолонки, Цена);

    где НомерСтроки, НомерКолонки надо посчитать при выводе….

    Reply
  6. acanta

    Макет можно сделать в 1с(mxl), или нужно создавать файл excel?

    Reply
  7. Perfolenta

    макет надо делать в Эксель, в этом и был смысл компоненты… в mxl нельзя создать формулы в ячейках… да и форматирование точно скопировать из mxl в эксель трудно, хотя последние версии 1с не плохо с этим справляются, но не все равно не на 100%… а сам макет эксель можно зашить в конфигурацию и копировать во временный файл перед использованием, в этом проблемы нет…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *