При разработке различных систем автоматизации проектирования (САПР), интеграции с инженерными базами данных или при необходимости вывода крупных схем, технологических карт и чертежей, разработчики 1С часто сталкиваются с жестким ограничением. Формат А0 имеет физический размер 841 × 1189 мм. Традиционные офисные пакеты, такие как Microsoft Word или Excel, имеют внутреннее ограничение на максимальный размер страницы (например, в MS Word этот предел равен 55,87 см или 22 дюймам). Попытка передать макет формата А0 в Word через механизмы COM-соединения неизбежно приведет к ошибке разметки или усечению полей.
В рамках этой статьи мы подробно разберем несколько профессиональных и надежных подходов к формированию и печати документов формата А0 непосредственно из 1С. Мы откажемся от «кустарных» методов ручного подбора шрифтов и масштабирования сетки и рассмотрим решения, гарантирующие сохранение пропорций, толщины линий по ГОСТу и корректный вывод на широкоформатные плоттеры.
Многие разработчики ошибочно полагают, что объект ТабличныйДокумент ограничен стандартным набором принтерных пресетов (А4, А3, А2). На самом деле, платформа 1С позволяет программно задавать абсолютно любые произвольные размеры печатного листа. Это делается с помощью перевода свойства РазмерСтраницы в режим ручного указания.
Рассмотрим, как правильно сконфигурировать свойства табличного документа для формата А0. Важно помнить, что размеры задаются в миллиметрах. Для портретной ориентации ширина составит 841 мм, а высота — 1189 мм.
ТабДок = Новый ТабличныйДокумент;
// Отключаем стандартные шаблоны и переводим в режим ручной настройки
ТабДок.РазмерСтраницы = "Custom";
ТабДок.ШиринаСтраницы = 841; // Размер в миллиметрах
ТабДок.ВысотаСтраницы = 1189; // Размер в миллиметрах
// Устанавливаем минимальные поля, чтобы чертеж или рамка не обрезались плоттером
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
// Включаем автоматическое масштабирование, чтобы макет заполнил всю область
ТабДок.АвтоМасштаб = Истина;
// Отключаем вывод колонтитулов
ТабДок.ВыводитьИмяРисунков = Ложь;
ТабДок.ПоказыватьСетку = Ложь;
Важный нюанс: Прямая отправка такого документа на печать из 1С на физический плоттер может вызвать сбой, если на локальном компьютере пользователя или на сервере приложений 1С не установлен драйвер устройства, поддерживающего физическую печать А0. Чтобы избежать проблем с совместимостью драйверов, мы рекомендуем сохранять сформированный макет в формат PDF. Встроенный PDF-принтер платформы 1С (начиная с версий 8.3) отлично обрабатывает кастомные размеры страниц и формирует векторный файл без потери качества.
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Полученный PDF-файл можно открыть в любой программе для просмотра (например, Adobe Acrobat Reader) и отправить на печать. Плоттер автоматически распознает векторные границы документа и подберет нужный рулон бумаги.
Если вам требуется сложная текстовая верстка с использованием таблиц, рамок, штампов ГОСТ и различных стилей, а MS Word использовать невозможно из-за его ограничений, отличной альтернативой послужит офисный пакет LibreOffice (или OpenOffice). Эти программные продукты распространяются бесплатно, поддерживают полноценное COM-управление и, что самое главное, не имеют лимита в 55 см на размеры листа.
Проанализируем особенности работы с API LibreOffice. Все геометрические параметры страниц (ширина, высота, отступы полей) во внутреннем представлении офисного пакета измеряются в сотых долях миллиметра (1/100 мм). Таким образом, для формата А0 значение ширины составит 84100 единиц, а высоты — 118900 единиц.
Разберем по шагам пример создания текстового документа А0 в LibreOffice Writer через 1С:
// Шаг 1. Инициализируем менеджер сервисов LibreOffice
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
Предупреждение("Не удалось подключиться к LibreOffice. Убедитесь, что система установлена.");
Возврат;
КонецПопытки;
// Шаг 2. Создаем объект Desktop для работы с документами
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
// Шаг 3. Подготавливаем параметры для открытия нового пустого документа Writer
ПараметрыОткрытия = Новый COMSafeArray("String", 1);
// Создаем пустой текстовый документ
Документ = Desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ПараметрыОткрытия);
// Шаг 4. Получаем доступ к коллекции стилей страниц
StyleFamilies = Документ.getStyleFamilies();
PageStyles = StyleFamilies.getByName("PageStyles");
// Получаем стандартный (дефолтный) стиль текущего документа
DefaultStyle = PageStyles.getByName("Standard");
// Шаг 5. Задаем размеры формата А0 в сотых долях миллиметра
DefaultStyle.Width = 84100; // 841 мм
DefaultStyle.Height = 118900; // 1189 мм
// Настраиваем поля документа (например, по 15 мм со всех сторон)
DefaultStyle.LeftMargin = 1500;
DefaultStyle.RightMargin = 1500;
DefaultStyle.TopMargin = 1500;
DefaultStyle.BottomMargin = 1500;
// Шаг 6. Наполнение документа контентом
// Получаем объект Text для записи данных
ТекстДокумента = Документ.getText();
Курсор = ТекстДокумента.createTextCursor();
ТекстДокумента.insertString(Курсор, "Чертеж формата А0. Сгенерировано из системы 1С:Предприятие.", Ложь);
// Шаг 7. Программный экспорт в формат PDF
// Для сохранения нам необходимо передать массив свойств фильтра экспорта
ПараметрыСохранения = Новый COMSafeArray("String", 1);
// Настраиваем фильтр для PDF
СвойствоФильтра = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
СвойствоФильтра.Name = "FilterName";
СвойствоФильтра.Value = "writer_pdf_Export"; // Специальный фильтр экспорта в PDF для Writer
// Передаем структуру в массив параметров
ПараметрыСохранения.SetValue(0, СвойствоФильтра);
ПутьКФайлуPDF = "file:///" + СтрЗаменить("C:\Temp\Drawing_A0.pdf", "\", "/");
Документ.storeToURL(ПутьКФайлуPDF, ПараметрыСохранения);
// Закрываем документ без сохранения исходного шаблона ODT
Документ.close(Истина);
Данное решение работает стабильно, не зависит от наличия лицензий MS Office и позволяет верстать многостраничные или широкоформатные документы любой сложности.
Для производственных, строительных и проектных организаций наиболее изящным решением является работа с векторным форматом DXF (Drawing Exchange Format). Это открытый формат, разработанный компанией Autodesk для обмена чертежами между различными САПР (AutoCAD, nanoCAD, КОМПАС-3D).
Главное преимущество DXF заключается в том, что он представляет собой структурированный текстовый файл в кодировке ASCII. Это значит, что для его создания в 1С нам вообще не нужны никакие сторонние библиотеки, COM-объекты или установленное офисное ПО. Мы можем генерировать чертежи программно "на лету" прямо на стороне сервера 1С.
Разберем по шагам методологию создания чертежей через шаблоны:
#НОМЕР#, #ДАТА#, #РАЗРАБОТАЛ#.Рассмотрим пример реализации этого алгоритма на встроенном языке 1С:
// Ссылка на объект метаданных (например, документ "ЗаказНаПроизводство")
СсылкаНаОбъект = Выборка.Ссылка;
ПутьКШаблонуDXF = "C:\Templates\Frame_A0_Template.dxf";
ПутьКГотовомуЧертежу = "C:\Output\Output_Drawing_A0.dxf";
// Считываем текстовый файл шаблона
ШаблонТекст = Новый ТекстовыйДокумент;
Попытка
ШаблонТекст.Прочитать(ПутьКШаблонуDXF, КодировкаТекста.ANSI);
Исключение
ВызватьИсключение "Не удалось прочитать шаблон чертежа DXF! Проверьте путь к файлу.";
КонецПопытки;
ПолныйТекстЧертежа = ШаблонТекст.ПолучитьТекст();
// Производим замену маркеров на реальные данные из нашей информационной базы 1С
ПолныйТекстЧертежа = СтрЗаменить(ПолныйТекстЧертежа, "#НОМЕР#", СсылкаНаОбъект.Номер);
ПолныйТекстЧертежа = СтрЗаменить(ПолныйТекстЧертежа, "#ДАТА#", Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy"));
ПолныйТекстЧертежа = СтрЗаменить(ПолныйТекстЧертежа, "#РАЗРАБОТАЛ#", СсылкаНаОбъект.Ответственный.Наименование);
ПолныйТекстЧертежа = СтрЗаменить(ПолныйТекстЧертежа, "#НАИМЕНОВАНИЕ#", СсылкаНаОбъект.НоменклатураИзделия.Наименование);
// Записываем измененный файл
НовыйЧертеж = Новый ЗаписьТекста(ПутьКГотовомуЧертежу, КодировкаТекста.ANSI);
НовыйЧертеж.Записать(ПолныйТекстЧертежа);
НовыйЧертеж.Закрыть();
Этот метод гарантирует 100% точность размеров рамки и штампа по ГОСТу. Полученный файл без проблем откроется в любом просмотрщике чертежей (например, бесплатном DWG TrueView) и будет напечатан на плоттере в масштабе 1:1.
Современные версии платформы 1С:Предприятие 8.3 отлично поддерживают работу с векторным форматом SVG (Scalable Vector Graphics). SVG представляет собой стандартный XML-документ, описывающий геометрические примитивы (линии, прямоугольники, многоугольники, текст).
Мы можем сформировать чертеж А0 в виде SVG-кода. Это идеальный вариант для вывода интерактивных карт, схем технологических процессов или планов помещений на форму 1С с последующей бесшовной печатью.
Для понимания масштаба: при стандартном разрешении печати в 150 DPI размер листа А0 составит примерно 4960 × 7016 пикселей. При 300 DPI — 9933 × 14043 пикселей. Давайте посмотрим на пример генерации простого макета формата А0 с использованием объекта ЗаписьXML:
ИмяФайлаSVG = "C:\Temp\Drawing_A0.svg";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаSVG, "UTF-8");
// Пишем корневой тег SVG с указанием физических размеров в миллиметрах
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("svg");
ЗаписьXML.ЗаписатьАтрибут("width", "841mm");
ЗаписьXML.ЗаписатьАтрибут("height", "1189mm");
// Задаем внутреннюю координатную сетку (например, 1 мм = 10 единиц)
ЗаписьXML.ЗаписатьАтрибут("viewBox", "0 0 8410 11890");
ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://www.w3.org/2000/svg");
// Рисуем внешнюю рамку (отступ 20 мм слева, по 5 мм с остальных сторон)
// Координаты: x=200, y=50, ширина = 8410 - 250 = 8160, высота = 11890 - 100 = 11790
ЗаписьXML.ЗаписатьНачалоЭлемента("rect");
ЗаписьXML.ЗаписатьАтрибут("x", "200");
ЗаписьXML.ЗаписатьАтрибут("y", "50");
ЗаписьXML.ЗаписатьАтрибут("width", "8160");
ЗаписьXML.ЗаписатьАтрибут("height", "11790");
ЗаписьXML.ЗаписатьАтрибут("fill", "none");
ЗаписьXML.ЗаписатьАтрибут("stroke", "black");
ЗаписьXML.ЗаписатьАтрибут("stroke-width", "20"); // Толстая линия рамки
ЗаписьXML.ЗаписатьКонецЭлемента(); // rect
// Добавляем тестовую надпись внутри чертежа
ЗаписьXML.ЗаписатьНачалоЭлемента("text");
ЗаписьXML.ЗаписатьАтрибут("x", "4205"); // Центр по горизонтали
ЗаписьXML.ЗаписатьАтрибут("y", "5945"); // Центр по вертикали
ЗаписьXML.ЗаписатьАтрибут("font-family", "Arial");
ЗаписьXML.ЗаписатьАтрибут("font-size", "150");
ЗаписьXML.ЗаписатьАтрибут("text-anchor", "middle");
ЗаписьXML.ЗаписатьАтрибут("fill", "black");
ЗаписьXML.ЗаписатьТекст("СХЕМА ТЕХНОЛОГИЧЕСКОГО ПРОЦЕССА");
ЗаписьXML.ЗаписатьКонецЭлемента(); // text
ЗаписьXML.ЗаписатьКонецЭлемента(); // svg
ЗаписьXML.Закрыть();
Этот файл может быть выведен на управляемую форму 1С через реквизит типа "Строка" с установленным видом "Поле HTML документа", либо сохранен на диск. Векторный SVG легко масштабируется и распечатывается из любого браузера без размытия текста и пикселизации линий.
Рассмотрим сценарий, когда в компании требуется полностью автоматизировать процесс: бухгалтер или конструктор нажимает кнопку в 1С, и плоттер в цеху молча начинает печатать рулон А0. Отправлять напрямую из 1С на печать через системный диалог Windows небезопасно — сложные инженерные драйверы плоттеров часто вызывают зависание сеанса 1С.
Наиболее надежный двухэтапный архитектурный подход заключается в следующем:
Проанализируем пример кода для фонового запуска печати:
// 1. Формируем путь к файлу PDF и утилите
ПутьКPDF = "C:\Temp\Ready_Drawing.pdf";
ИмяПлоттера = "\\PRINTSERVER\HP_DesignJet_T120_A0";
ПутьКУтилите = "C:\Program Files\SumatraPDF\SumatraPDF.exe";
// 2. Формируем командную строку запуска
// Ключ -print-to-default отправляет на принтер по умолчанию,
// но мы воспользуемся ключом -print-to для явного указания плоттера
СтрокаЗапуска = """" + ПутьКУтилите + """ -print-to """ + ИмяПлоттера + """ -print-settings ""fit"" """ + ПутьКPDF + """";
// Ключ "fit" указывает утилите автоматически вписать чертеж в физические границы листа А0 плоттера
// 3. Вызываем выполнение команды в фоновом режиме без открытия окон
КомандаВыполнена = ЗапуститьПриложение(СтрокаЗапуска, , Истина);
Если Не КомандаВыполнена Тогда
ЗаписьЖурналаРегистрации("ПечатьЧертежей", СистемнаяИнформацияПовышеннаяОпасность.Ошибка, , , "Ошибка отправки на плоттер.");
КонецЕсли;
Использование внешней консольной утилиты полностью изолирует процесс печати от сеанса 1С. Даже в случае сбоя или отсутствия бумаги в плоттере сеанс пользователя не "зависнет", а задание останется в стандартном диспетчере очереди печати Windows.
Мы подробно разобрали различные ситуации и способы решения проблемы печати формата А0 в 1С. Подведем итоги:
ТабличныйДокумент с параметром РазмерСтраницы = "Custom" (ширина 841, высота 1189) и последующим экспортом в PDF.