В работе с платформой 1С:Предприятие 7.7 часто возникает задача динамически добавлять на печатные формы различные изображения: факсимильную подпись руководителя, печать организации или водяные знаки. Одним из самых известных инструментов для этого была ActiveX компонента bmp_1c.ocx (ActiveBMP). Рассмотрим, как найти эту компоненту, почему ее использование сегодня может быть опасным, и какие существуют современные и надежные альтернативы.
На форуме один из участников поделился ссылкой на искомую компоненту. Однако, прежде чем спешить ее устанавливать, необходимо учесть серьезные риски, связанные с ее использованием на современных операционных системах (Windows 7, 10, 11 и серверных версиях).
Критически важная проблема: утечка GDI-дескрипторов.
Как справедливо было замечено в обсуждении и подтверждается практикой, компонента bmp_1c.ocx имеет серьезный недостаток — она "течет" по GDI-дескрипторам. Давайте разберемся, что это значит.
Каждое окно, кнопка, шрифт или изображение в Windows использует системные ресурсы, называемые GDI-объектами. Для каждого такого объекта система выделяет уникальный идентификатор — дескриптор. Когда программа завершает работу с объектом, она должна освободить дескриптор. Если этого не происходит (из-за ошибки в коде компоненты), возникает утечка.
В случае с bmp_1c.ocx, при интенсивном создании и обработке изображений (например, при массовой печати документов с печатью) количество занятых GDI-дескрипторов процессом 1С начинает неуклонно расти. У операционной системы есть лимит на количество таких дескрипторов для одного процесса (обычно 10 000). Как только этот лимит достигается, происходит сбой: система больше не может отрисовывать новые окна. Это приводит к зависанию 1С и других приложений, а иногда и к полной неработоспособности графической оболочки Windows до перезагрузки.
Вывод: Использовать bmp_1c.ocx можно только на свой страх и риск, преимущественно на старых ОС (Windows XP) и при очень низкой интенсивности операций. Для современных систем этот метод категорически не рекомендуется.
Это более современный, стабильный и мощный подход. Суть его заключается в том, чтобы перенести задачу обработки изображений из 1С во внешние, специализированные утилиты. Процесс полностью автоматизируется из кода 1С.
Нам понадобятся две бесплатные программы с открытым исходным кодом:
Рассмотрим весь процесс по шагам:
Формирование PDF из 1С. Первым делом, из 1С необходимо сохранить нужную печатную форму в формате PDF. Если у вашей конфигурации нет встроенной функции сохранения в PDF, можно установить любой виртуальный PDF-принтер (например, Bullzip PDF Printer, PDFCreator) и настроить его на сохранение файла в определенную папку без вывода диалоговых окон.
Разбивка PDF на страницы. С помощью Ghostscript, запущенного из командной строки, мы преобразуем полученный PDF в отдельные файлы-изображения для каждой страницы. Команда может выглядеть так:
gswin64c.exe -sDEVICE=png16m -r300 -o "C:\Temp\page_%03d.png" "C:\Temp\mydocument.pdf"
Здесь:
gswin64c.exe - исполняемый файл Ghostscript.-sDEVICE=png16m - указывает формат выходных файлов (в данном случае, PNG).-r300 - задает разрешение (качество) в 300 DPI.-o "C:\Temp\page_%03d.png" - шаблон для имен выходных файлов (page_001.png, page_002.png и т.д.)."C:\Temp\mydocument.pdf" - путь к исходному PDF-файлу.Наложение изображения. Теперь, когда у нас есть страницы в виде картинок, используем ImageMagick для наложения печати. Предположим, печать нужно наложить на первую страницу (page_001.png), и сама печать хранится в файле stamp.png с прозрачным фоном.
magick composite -gravity SouthEast -geometry +50+50 "C:\Temp\stamp.png" "C:\Temp\page_001.png" "C:\Temp\page_001_stamped.png"
Здесь:
magick composite - команда для наложения одного изображения на другое.-gravity SouthEast - указывает "точку привязки" в правом нижнем углу.-geometry +50+50 - задает отступ в 50 пикселей от правого и нижнего краев.Сборка обратно в PDF. После обработки всех нужных страниц, их можно собрать обратно в единый PDF-документ с помощью того же ImageMagick.
magick convert "C:\Temp\page_001_stamped.png" "C:\Temp\page_002.png" "C:\Temp\final_document.pdf"
Все эти команды можно вызывать из 1С 7.7 с помощью объекта WScript.Shell и его метода Run, дожидаясь завершения каждой операции. Этот способ полностью избавляет от проблем с утечками памяти и дескрипторов, так как вся "грязная" работа выполняется в отдельных, независимых процессах.
Один из участников форума поделился ссылкой на собственную разработку — аналог bmp_1c.ocx, написанный на C# (.NET). Это решение создавалось как раз для того, чтобы избавиться от проблемы с утечкой GDI-дескрипторов.
Преимущества:
bmp_1c.ocx интерфейс, что может упростить переход.Возможные недостатки:
Этот вариант подходит для тех, кто готов к экспериментам и хочет работать с COM-объектами напрямую из 1С, но без рисков, которые несет оригинальная компонента. Найти проект можно на GitHub по названию "BMP1C.Net".
Итоговые рекомендации:
Подводя итог, настоятельно рекомендуем отказаться от использования устаревшей компоненты bmp_1c.ocx в пользу более современных и стабильных методов. Наиболее надежным и универсальным решением является использование внешних утилит ImageMagick и Ghostscript. Этот подход, хотя и требует первоначальной настройки, гарантирует стабильную работу системы и предоставляет практически неограниченные возможности по обработке изображений и документов.