PDF в 1С через COM: скрипт для папки со сканами и 4 места, где он падает
Загрузить PDF в 1С через COM можно скриптом PowerShell: он создаёт объект V83.COMConnector, подключается к базе, читает файлы из папки и передаёт каждый в процедуру общего модуля, которая прикрепляет его к нужному документу. Скрипт кладёт файл как вложение, но не создаёт документ из содержимого. Чтобы из скана получился документ, нужно распознавание.
Что загружает скрипт: вложение, а не документ 📎
Поставщик присылает счёт на почту. Бухгалтер сохраняет PDF в папку «Сканы», потом открывает документ в 1С, жмёт скрепку и ищет файл в проводнике. К концу недели в папке лежит куча файлов без привязки к документам, а когда приходит запрос на подтверждение сделки, их собирают вручную, по одному.
COM-скрипт закрывает именно эту часть. Он берёт файлы из папки, находит в базе документ-владельца и прикрепляет PDF к нему. Но содержимого файла скрипт не знает: сумма, контрагент и номер для него просто байты. Поэтому расхожее «загрузил PDF, значит счёт в учёте» неверно. В базе появился файл, а остатки, НДС и взаиморасчёты остались прежними.
Получается два разных проекта. Первый: прикрепить сканы к уже заведённым документам, для него хватит скрипта из этой статьи. Второй: создать документ поступления из самого скана. Для него нужно распознавание УПД из скана, а COM остаётся только транспортом.
Шаг 1. Принимающая процедура в базе ⚙️
Скрипт может обращаться к объектам базы напрямую, но тогда вся логика живёт в его тексте и ломается при каждом обновлении конфигурации. Надёжнее держать её в 1С. Создайте общий модуль, например ЗагрузкаPDF, отметьте в его свойствах флаги «Сервер» и «Внешнее соединение» и добавьте экспортную функцию ДобавитьPDF с двумя параметрами: двоичные данные и имя файла. Владельца функция ищет сама.
Сначала она разбирает имя по договорённому шаблону, например Счет_0045_12-03.pdf, и находит документ по номеру и дате. Затем проверяет, нет ли у документа вложения с тем же именем и размером. Только после этого прикрепляет файл. В конфигурациях на БСП для этого есть подсистема присоединённых файлов, в остальных создаётся элемент справочника файлов с ХранилищеЗначения. Результат функция возвращает строкой: «Прикреплено», «Дубль» или текст ошибки. По ней скрипт решает, куда переложить файл, и пишет лог.
Отдельно заведите пользователя, скажем ЗагрузкаФайлов, с правами только на нужные справочники и документы. Его пароль окажется в тексте скрипта, поэтому учётку администратора туда ставить нельзя: любой, кто откроет файл, получит полный доступ к базе.
Шаг 2. Скрипт на PowerShell по порядку
Скрипт запускается на машине, где стоит платформа 1С. Разрядность PowerShell должна совпадать с разрядностью платформы, а подходящую версию ОС проверьте по системным требованиям 1С. Порядок действий:
- ✓Создать коннектор: New-Object -ComObject V83.COMConnector.
- ✓Подключиться: $base = $connector.Connect('Srvr=имя_сервера;Ref=имя_базы;Usr=ЗагрузкаФайлов;Pwd=пароль'). Для файловой базы вместо Srvr и Ref указывают File=путь_к_каталогу_базы.
- ✓Перебрать файлы в папке Входящие командой Get-ChildItem с фильтром *.pdf.
- ✓Для каждого файла собрать двоичные данные: $data = $base.NewObject('ДвоичныеДанные', $file.FullName). Путь читается с диска той машины, где запущен скрипт, а не с сервера 1С.
- ✓Вызвать модуль и получить ответ: $result = $base.ЗагрузкаPDF.ДобавитьPDF($data, $file.Name).
- ✓Если ответ «Прикреплено» или «Дубль», перенести файл в папку Обработано, иначе в папку Ошибки, а причину записать в лог.
- ✓В блоке finally освободить соединение: [System.Runtime.InteropServices.Marshal]::ReleaseComObject($base).
Запуск ставьте в планировщик заданий Windows: днём файлы копятся в папке, ночью скрипт их разбирает. Соединение открывайте один раз на весь пакет, а не на каждый PDF. Так скрипт занимает одну лицензию и не тратит время на повторные подключения.
Многостраничный скан передаётся по сети целиком, поэтому на медленном канале до сервера 1С загрузка идёт заметно дольше, чем копирование той же папки. Если база стоит в другом офисе или в дата-центре, запускайте скрипт как можно ближе к серверу.
4 места, где скрипт падает ⚠️
Скрипт редко ломается на проверке. Он ломается на пятую ночь, когда за ним никто не смотрит. Вот четыре сбоя, на которых спотыкаются первыми.
Класс не зарегистрирован
Скрипт отладили вручную, всё работало. Поставили в планировщик, и в логе появилось «Класс не зарегистрирован». Причин две: PowerShell запущен в 64 разрядах, а платформа 1С 32-разрядная (или наоборот), либо платформу обновили, а comcntr.dll остался зарегистрированным от старой версии. Лечится командой regsvr32 comcntr.dll от имени администратора из каталога bin нужной версии и запуском скрипта в совпадающей разрядности.
Но сама ошибка дешёвая, дорого обходится тишина после неё. Ночная загрузка не отработала, к утру папка полна, а о сбое никто не знает, пока кому-то не понадобится конкретный документ. Поэтому в обработчик ошибок сразу добавьте отправку сообщения в Telegram.
Зависшая лицензия
В 9:00 бухгалтер открывает 1С и видит отказ: нет свободных лицензий. Вчерашний скрипт упал на середине пакета, не вызвав ReleaseComObject, и процесс соединения остался в памяти вместе с занятой клиентской лицензией. Каждое COM-соединение занимает лицензию, поэтому освобождение в finally обязательно, а в планировщике стоит задать предельное время выполнения задачи. Если лицензий в обрез, одно зависшее соединение отнимает рабочее место у живого сотрудника.
Двойные вложения
Скрипт прикрепил файл, но упал до переноса в Обработано. На следующем запуске тот же PDF уходит в базу снова, и у документа два одинаковых вложения. Потом аудитор открывает карточку и спрашивает, какой из них настоящий. Защита стоит в двух местах: принимающая функция сравнивает имя и размер, а скрипт переносит файл только после ответа от 1С.
Папка видна вам, но не планировщику
Сетевой диск Z: подключён в вашей сессии, а задание идёт под служебной учётной записью, которая его не видит. Скрипт стартует, находит ноль файлов и завершается без единой ошибки. Используйте полный сетевой путь (UNC) вместо буквы диска и выдайте служебной записи права на чтение и перенос файлов. Тот же молчаливый сбой даёт имя файла не по шаблону: функция не находит документ, поэтому такие PDF должны уходить в Ошибки с записью в лог, а не оседать во Входящих.
COM, HTTP-сервис или задание внутри 1С: сравнение 📊
COM подходит не везде. Если база стоит на арендованном сервере, платформа на машине скрипта и доступ к кластеру из офиса превращаются в отдельную задачу. Ниже четыре способа положить PDF в базу и то, где каждый ломается.
| Способ | Где работает код | Что нужно | Слабое место | Когда брать |
|---|---|---|---|---|
| COM-скрипт | Скрипт на отдельной машине, обработка в общем модуле базы | Платформа 1С, зарегистрированный comcntr.dll, клиентская лицензия | Разрядность, версия платформы, зависшие соединения | База на вашем сервере, ночная загрузка из папки |
| HTTP-сервис в 1С | Приём файла внутри базы, отправить может любой клиент | Публикация базы на веб-сервере | Лимит веб-сервера на размер запроса, настройка доступа | Арендованная база, отправка из почтового робота или другой системы |
| Регламентное задание в 1С | Всё внутри базы, файлы читает сервер 1С | Доступ сервера 1С к папке с файлами | Папка должна лежать там, где её видит сервер | Файлы уже складываются на сервер с базой |
| Распознавание УПД | На стороне сервиса, документ создаётся в базе | Подключение базы к сервису | Работает для УПД и счетов, а не для произвольных PDF | Нужен документ поступления, а не вложение |
Для базы на сервере 1С от 1 100 ₽/мес за пользователя удобнее HTTP-сервис: платформу на стороне отправителя ставить не нужно, а файл отправит и скрипт, и почтовый робот. Актуальные условия по серверам смотрите в тарифах.
У HTTP-сервиса своя ловушка: веб-сервер по умолчанию ограничивает размер запроса, и многостраничный скан может не пройти. Лимит поднимают в настройках публикации, но знать о нём нужно до запуска, а не после первого отказа.
Сколько стоит и когда свой скрипт не нужен
Скрипт с принимающей функцией не пишется за вечер, если делать его с логами, защитой от дублей и уведомлениями. Мы смотрим вашу конфигурацию: есть ли БСП, куда складывать файлы, как называются документы. Договариваемся о шаблоне имён и собираем решение: функцию в базе, скрипт с журналом, сообщение в Telegram при любом сбое. Запуск проверяем на копии базы, а не на рабочей. Разовую доработку 1С мы оцениваем после просмотра конфигурации, потому что стоимость зависит от числа типов документов и способа хранения файлов.
Когда скрипт уже работает, его надо кому-то держать в живых: после обновления платформы проверить регистрацию компоненты, посмотреть на папку Ошибки, поправить права. Сопровождение 1С и сисадмин стоят 3800 руб/час, и платите вы только за часы, которые реально ушли.
Если на деле вам нужен не файл в карточке, а проведённый документ, скрипт вам не нужен. Распознавание УПД от 3900 руб/мес читает скан и создаёт документ в базе, а исходный PDF можно оставить вложением. Писать и поддерживать распознавание самостоятельно придётся долго, а ошибки в суммах хуже пропущенных вложений.
Что именно подходит вам, зависит от содержимого папки. Если там сканы разных документов под разными именами, а в учёте вы ждёте проведённые документы, посмотрите страницу загрузка PDF в 1С: на ней разобраны оба сценария. Пришлите пример имён файлов и название конфигурации, и сразу видно, хватит ли скрипта.
❓ Частые вопросы
Можно ли загружать PDF через COM без общего модуля в базе?
Технически можно: через COM скрипт получает доступ к объектам базы и создаёт элементы справочника напрямую. Но логика привязки к документу и защита от дублей окажутся в тексте скрипта и сломаются при смене конфигурации. Надёжнее держать её в общем модуле с флагом «Внешнее соединение», а скрипту оставить передачу файлов.
Почему COM-скрипт выдаёт ошибку «Класс не зарегистрирован»?
Платформа 1С не зарегистрировала COM-компоненту нужной разрядности или версии. Проверьте, что разрядность PowerShell совпадает с разрядностью платформы, и выполните regsvr32 comcntr.dll от администратора из каталога bin установленной версии. Часто ошибка появляется сразу после обновления платформы, когда регистрация осталась от старой версии.
Занимает ли COM-соединение лицензию 1С?
Да, каждое COM-соединение занимает клиентскую лицензию, пока не закрыто. Поэтому скрипт открывает одно соединение на весь пакет файлов и освобождает его в блоке finally. Если скрипт упал и процесс завис, лицензия остаётся занятой, и утром сотрудник может получить отказ при входе в базу.
Что выбрать для арендованной базы: COM или HTTP-сервис?
Для арендованной базы удобнее HTTP-сервис: платформа 1С на стороне отправителя не нужна, а файл может отправить любой скрипт или почтовый робот. COM требует установленной платформы на машине скрипта и доступа к кластеру серверов 1С, что в офисной сети с арендованным сервером настраивается дольше.
Сколько стоит настроить загрузку PDF в 1С?
Стоимость доработки зависит от конфигурации и числа типов документов, поэтому оценку мы называем после просмотра базы. Сопровождение 1С и работа сисадмина стоят 3800 руб/час. Если вместо вложения нужен готовый документ поступления, подойдёт распознавание УПД от 3900 руб/мес.
Или позвоните: +7 906 045-28-27 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

