Многие специалисты, поддерживающие базы на платформе 1С:Предприятие 7.7, сталкиваются с неприятной проблемой: при сохранении сформированной печатной формы в формат Excel сбиваются параметры страницы. Заданные в макете значения полей, ориентация страницы и масштаб попросту игнорируются, а в самом Excel подставляются настройки по умолчанию (например, задали поле слева 5, а открывается 1.9). Если документов много и их необходимо отправлять по почте в утвержденном виде, ручная корректировка каждого файла становится критичной.
Рассмотрим, почему возникает эта проблема. Штатный механизм платформы 1С 7.7 при выгрузке табличного документа использует очень старый формат Excel 95 (BIFF5). Из-за ограниченной совместимости внутренней библиотеки 1С (Moxel.dll) с современными версиями табличных процессоров (начиная с Office 2007 и новее), формат физически не может корректно передать новые атрибуты масштабирования, колонтитулы и точные размеры полей в сантиметрах. Кроме того, сохранение объемных таблиц (от 5000 строк) средствами 1С 7.7 часто вызывает долгое зависание программы со 100% загрузкой процессора. Также могут искажаться числа из-за различий в региональных настройках (точки и запятые).
Разберем подробнее рабочие способы решения этой задачи, которые помогут автоматизировать процесс и избавиться от рутины.
Самое разумное программное решение, если требуется получить именно редактируемый файл Excel — сразу после стандартного сохранения файла из 1С вызывать Excel через COM-соединение, открывать только что сохраненный документ, принудительно задавать ему нужные параметры страницы и пересохранять.
Проанализируем специфическую проблему, с которой сталкиваются программисты при реализации этого метода в 1С 7.7. Для того чтобы таблица автоматически сжималась по ширине листа (свойства FitToPagesWide и FitToPagesTall), в Excel требуется отключить фиксированный масштаб, установив свойству Zoom значение False. Однако прямая попытка сделать это из 1С 7.7 приведет к ошибке: «Нельзя установить свойство Zoom класса PageSetup». Это связано с тем, что свойство ожидает тип данных Variant/Boolean, который устаревшая платформа 1С передать не умеет.
Обойдем эту ошибку с помощью вспомогательного COM-объекта MSScriptControl.ScriptControl. Мы можем передать в него объект параметров страницы и выполнить присвоение через VBScript или JavaScript:
// Открываем сохраненный файл
ExcelApp = СоздатьОбъект("Excel.Application");
Workbook = ExcelApp.Workbooks.Open(ПутьКФайлу);
Sheet = Workbook.ActiveSheet;
// Настраиваем поля и ориентацию
Sheet.PageSetup.LeftMargin = ExcelApp.CentimetersToPoints(5);
Sheet.PageSetup.Orientation = 2; // xlLandscape
// Обходим ошибку свойства Zoom через ScriptControl
ScriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
ScriptCtrl.Language = "VBScript";
ScriptCtrl.AddObject("PageSetup", Sheet.PageSetup);
ScriptCtrl.Eval("PageSetup.Zoom = False");
// Задаем размещение на 1 страницу в ширину
Sheet.PageSetup.FitToPagesWide = 1;
Sheet.PageSetup.FitToPagesTall = False;
// Сохраняем и закрываем
Workbook.Save();
ExcelApp.Quit();
Если в базе генерируется большое количество сложных отчетов, отличным выходом станет использование специализированной внешней компоненты «Йоксель» (Yoksel). Этот инструмент специально разрабатывался для расширения возможностей работы с табличными документами в 1С 7.7.
Посмотрим на ее преимущества в контексте нашей задачи:
Если конечная цель заключается лишь в том, чтобы отправить документы клиентам или руководству по электронной почте, и их дальнейшее редактирование в Excel не предполагается, то использование формата XLS не оправдано. Гораздо надежнее и проще перевести документооборот на PDF-формат.
Для этого в системе устанавливается виртуальный PDF-принтер (например, CutePDF, doPDF или PDFCreator версий 1.7.X). Вывод настраивается следующим образом: вместо сохранения табличного документа из 1С в файл, вызывается печать на этот виртуальный принтер. PDF-документ полностью и до миллиметра сохранит внешний вид, разбивку по страницам и шрифты, которые вы видите на экране в 1С.
Рассмотрим современную альтернативу, которая позволяет полностью избавиться от проблем штатного экспорта — формирование документа в формате .xlsx (Excel 2007+) напрямую, минуя визуальный табличный документ 1С.
Данный подход реализуется с помощью технологии ADO. Вы можете создать пустой шаблон Excel, подключаться к нему из 1С через ADO-провайдер и с помощью SQL-запросов (INSERT INTO) вставлять данные напрямую в ячейки или листы. При этом шаблон в Excel уже будет содержать все необходимые корпоративные стили, логотипы, правильные поля и колонтитулы. Этот способ работает мгновенно даже на десятках тысяч строк и исключает зависания платформы.
Применяя один из описанных методов, вы сможете полностью автоматизировать процесс выгрузки документов из старой платформы и перестанете тратить время на ручное форматирование файлов в Excel.