При переходе на 64-разрядную версию платформы 1С:Предприятие многие пользователи и администраторы сталкиваются с критической ошибкой при попытке печати регламентированной отчетности: "Печать бланка формы с двухмерным штрихкодом PDF417 поддерживается только в 32-разрядной версии платформы". Эта проблема вызвана тем, что классическая компонента печати, разработанная ГНИВЦ ФНС РФ, представляет собой 32-битный ActiveX (библиотека v7_pdf417.dll), который физически не может быть загружен в адресное пространство 64-битного процесса 1С.
В данной статье мы подробно разберем, как обойти это ограничение, проанализируем различные подходы — от административных настроек до глубокой модификации программного кода — и выясним причину возникновения сложностей с правами доступа.
Наиболее технологичным решением является использование специального приложения-посредника print-nd-pdf417.exe, которое поставляется разработчиками ГНИВЦ. Эта утилита работает как отдельный процесс, что позволяет 64-битной платформе 1С передавать данные для формирования штрихкода внешней программе, не вызывая конфликта разрядностей. Рассмотрим подробнее программную реализацию этого метода в типовых конфигурациях (например, УПП, БП или ЗУП).
Для внедрения этого механизма нам потребуется модифицировать общий модуль РегламентированнаяОтчетность. Проанализируем изменения в процедурах вывода формы.
Во-первых, нам необходимо добавить файл print-nd-pdf417.exe в состав конфигурации как двоичные данные (макет). После этого в функции ВыгрузитьШаблоныПечатиВКаталог следует реализовать сохранение этой утилиты во временную папку пользователя:
// Фрагмент модификации функции выгрузки шаблонов
Попытка
лМакет = ПолучитьОбщийМакет("Print_ND_pdf417_exe");
лМакет.Записать(ВремКаталог + "print-nd-pdf417.exe");
Исключение
Сообщить("Не удалось выгрузить исполняемый файл печати PDF417 во временный каталог!"
+ Символы.ПС + ОписаниеОшибки, СтатусСообщения.Внимание);
КонецПопытки;
Во-вторых, разберем по шагам изменение логики в функции ВывестиМашиночитаемуюФорму. Вместо стандартного вызова 32-битной компоненты через Новый COMОбъект, мы будем запускать внешнее приложение:
// Пример модификации логики вывода формы
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
Попытка
// Определяем параметры запуска утилиты
ПараметрыЗапуска = "/шаблоны:""" + ВремКаталог + """ /файл:""" + ВремФайл
+ """ /ифнс:""" + НаименованиеИФНС + """ /действие:просмотр";
// Запускаем внешнее приложение и ждем завершения
ЗапуститьПриложение(ВремКаталог + "print-nd-pdf417.exe " + ПараметрыЗапуска, , Истина);
Результат = Истина;
Исключение
Предупреждение("Ошибка запуска внешней утилиты печати PDF417!");
Результат = Ложь;
КонецПопытки;
Иначе
// Стандартный вызов для 32-битной платформы
ТаксДокПринт = СоздатьОбъектДляФормированияМашичитаемойФормы();
// ... дальнейший типовой код
КонецЕсли;
Если вы не хотите вносить изменения в конфигурацию, существует административный путь. На компьютер пользователя можно одновременно установить две версии платформы: 64-битную для повседневной работы с тяжелыми отчетами и 32-битную исключительно для печати налоговых бланков. Проанализируем, как правильно настроить запуск нужной версии.
Начиная с версии платформы 8.3.12, в окне выбора информационных баз появилась возможность указать предпочтительную разрядность. Рассмотрим этот алгоритм:
Важно помнить: если установлена только 64-битная платформа, выбор этой опции не даст результата — система просто выдаст ошибку отсутствия нужных файлов. Проверьте наличие папки C:\Program Files (x86)\1cv8\... перед изменением настроек.
Существует альтернативная разработка компоненты, выполненная по технологии Native API. В отличие от COM/ActiveX, она поддерживает работу в 64-битных процессах напрямую. Рассмотрим подробнее процесс ее подключения.
Поскольку компонента написана на Native API, её не нужно регистрировать в реестре Windows через regsvr32. Достаточно поместить файл в общий макет конфигурации и использовать встроенный язык 1С для работы с ним. Проанализируем пример кода для подключения такой компоненты:
&НаКлиенте
Процедура ПодключитьИнициализироватьКомпоненту()
// Указываем путь к макету, где хранится dll
ПутьККернел = "ОбщийМакет.КомпонентаПечатиPDF417_64";
Результат = ПодключитьВнешнююКомпоненту(ПутьККернел, "PDF417", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
ОбъектШК = Новый("AddIn.PDF417.BarcodePrinter");
// Теперь объект доступен для формирования картинки штрихкода
КонецЕсли;
КонецПроцедуры
Этот метод часто используется в самописных конфигурациях, где разработчик имеет возможность полностью контролировать процесс формирования табличного документа.
В некоторых ситуациях штрихкод PDF417 не является обязательным (например, для внутренних нужд организации или если отчет сдается в электронном виде, а бумажная копия нужна лишь для архива). В типовых решениях (Бухгалтерия предприятия 3.0, ЗУП 3.1) предусмотрена штатная возможность отключения этой функции.
Рассмотрим, как найти эту настройку (по аналогии с тем, как настраивается печать квитанции по форме ПД-4 с Qr-кодом):
После активации этой опции при нажатии кнопки "Печать" система предложит выбор: сформировать бланк с двухмерным кодом или обычный печатный лист.
Часто проблема не исчезает даже после установки 32-битного клиента. Выясним причину этой ситуации. Компонента ГНИВЦ при установке создает папку C:\Program Files (x86)\gnivc. Для корректной работы обычный пользователь Windows должен обладать правами на чтение и запуск из этой директории.
Рекомендуемые действия по настройке прав (инструмент проверка прав):
gnivc и все вложенные файлы.HKEY_CLASSES_ROOT.Visual C++ Redistributable (x86), так как старые версии ActiveX зависимы от конкретных рантайм-библиотек.Проанализировав все вышеперечисленные методы, можно сделать вывод: наиболее стабильным и современным решением для крупных компаний является использование внешней утилиты print-nd-pdf417.exe, так как она полностью снимает вопрос разрядности платформы 1С и минимизирует количество административных манипуляций на рабочих местах пользователей.