Почему не активна кнопка?

Ошибка при печати штрихкодов на х64-клиенте 1С: Компонента 1С:Печать штрихкодов не установлена на данном компьютере

Итак, буквально вчера я столкнулся с проблемой, что типовая 1С УТ 10.3 при печати формы с штрихкодом стала выдавать:

Компонента 1С:Печать штрихкодов не установлена на данном компьютере

Код, инициализирующий данную компоненту:

Попытка КомпонентШК = Новый COMОбъект(«V8.Barcod.1»); Исключение Сообщить(«Компонента 1С:Печать штрихкодов не установлена на данном компьютере!», СтатусСообщения.Важное); Возврат; КонецПопытки;

Как показал дальнейший поиск информации, проблема в том, что клиентское приложение, в котором штрихкоды не хотели печататься — 64-х разрядное (в 32-х разрядных клиентах печаталось всё как надо). Кстати, на сайте 1С так же лежит 32-х разрядная компонента, которая никак проблему не решает, а описание того, что делать в случае 64-х разрядных клиентов отсутствует.

Разумеется, самым очевидным видится решение — просто установить вместо х64 — клиента его 32-х разрядную версию. Но, мне что-то показалось это слишком простым вариантом (хотя и он полностью рабочий).

Следующее, что я решил попробовать это воспользоваться инструкцией по запуску x32 COM-объектов из x64 приложения, но ничего не заработало.

После этого, я решил посмотреть в сторону УТ11 и того как там решена эта проблема(и есть ли она там). Я развернул УТ11(11.4.5.143) и оказалось, что там такой проблемы просто нет.

В УТ11 в общем модуле «МенеджерОборудованияСерверПовтИсп» имеется функция, которая инициализирует соответствующую нативную компоненту, которая лежит в общем макете «КомпонентаПечатиШтрихкодов». Причем там лежит сразу несколько компонент — и под х32, и под х64 и под линукс (см. один из рисунков. Их все можно получить выгрузив данные из макета в каталог на диске).

Поскольку я не особенно хотел что-то кодировать, то я в свою конфигурацию просто скопировал общий макет «КомпонентаПечатиШтрихкодов», а так же несколько вспомогательных функций (я здесь приведу их полный текст, а то ведь вдруг у кого нет под рукой УТ11):

// Функция выполняет подключение внешней компоненты и ее первоначальную настройку. // Возвращаемое значение: НЕОПРЕДЕЛЕНО — компоненту не удалось загрузить. Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(«ОбщийМакет.КомпонентаПечатиШтрихкодов», «КартинкаШтрихкода», ТипВнешнейКомпоненты.Native); // Создадим объект внешней компоненты. Если ПодключениеВыполнено Тогда ВнешняяКомпонента = Новый(«AddIn.КартинкаШтрихкода.Barcode»); Иначе Возврат Неопределено; КонецЕсли; // Если нет возможности рисовать. Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда // То картинку сформировать не сможем. Возврат Неопределено; Иначе // Установим основные параметры компоненты. // Если в системе установлен шрифт Tahoma. Если ВнешняяКомпонента.НайтиШрифт(«Tahoma») Тогда // Выбираем его как шрифт для формирования картинки. ВнешняяКомпонента.Шрифт = «Tahoma»; Иначе // Шрифт Tahoma в системе отсутствует. // Обойдем все доступные компоненте шрифты. Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл // Получим очередной шрифт, доступный компоненте. ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч); // Если шрифт доступен Если ТекущийШрифт <> Неопределено Тогда // Они и будет шрифтом для формирования штрихкода. ВнешняяКомпонента.Шрифт = ТекущийШрифт; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; // Установим размер шрифта ВнешняяКомпонента.РазмерШрифта = 12; Возврат ВнешняяКомпонента; КонецЕсли; КонецФункции Функция ОпределитьТипШтрихкода(Штрихкод) Экспорт ТипШтрихкодаЗнач = «»; ДлинаШтрихкода = СтрДлина(Штрихкод); Если ДлинаШтрихкода = 0 Тогда Возврат ТипШтрихкодаЗнач; КонецЕсли; Сумма = 0; Если ДлинаШтрихкода = 14 Тогда // ITF14 Коэффициент = 1; Для Сч = 1 По 13 Цикл ВремКодСимвола = КодСимвола(Штрихкод, Сч); Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда Прервать; КонецЕсли; Сумма = Сумма + Коэффициент * (ВремКодСимвола — 48); Коэффициент = 4 — Коэффициент; КонецЦикла; Сумма = (10 — Сумма % 10) % 10; Если КодСимвола(Штрихкод, 14) = Сумма + 48 Тогда ТипШтрихкодаЗнач = «ITF14»; КонецЕсли; ИначеЕсли ДлинаШтрихкода = 13 Тогда // EAN13 EAN13 = Истина; Коэффициент = 1; Для Сч = 1 По 12 Цикл ВремКодСимвола = КодСимвола(Штрихкод, Сч); Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда EAN13 = Ложь; Прервать; КонецЕсли; Сумма = Сумма + Коэффициент * (ВремКодСимвола — 48); Коэффициент = 4 — Коэффициент; КонецЦикла; Сумма = (10 — Сумма % 10) % 10; ПроверочныйСимвол = Символ(Сумма + 48); Если EAN13 И ПроверочныйСимвол = Прав(Штрихкод, 1) Тогда ТипШтрихкодаЗнач = «EAN13»; КонецЕсли; ИначеЕсли ДлинаШтрихкода = 8 Тогда // EAN8 EAN8 = Истина; Коэффициент = 3; Для Сч = 1 По 7 Цикл ВремКодСимвола = КодСимвола(Штрихкод, Сч); Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда EAN8 = Ложь; Прервать; КонецЕсли; Сумма = Сумма + Коэффициент * (ВремКодСимвола — 48); Коэффициент = 4 — Коэффициент; КонецЦикла; Сумма = (10 — Сумма % 10) % 10; Если EAN8 И (КодСимвола(Штрихкод, 8) = Сумма + 48) Тогда ТипШтрихкодаЗнач = «EAN8»; КонецЕсли; КонецЕсли; Если ТипШтрихкодаЗнач= «» Тогда // CODE39 CODE39 = Истина; Для Сч = 1 По ДлинаШтрихкода Цикл ВремКодСимвола = КодСимвола(Штрихкод, Сч); Если (ВремКодСимвола <> 32) И (ВремКодСимвола < 36 Или ВремКодСимвола > 37) И (ВремКодСимвола <> 43) И (ВремКодСимвола < 45 Или ВремКодСимвола > 57) И (ВремКодСимвола < 65 Или ВремКодСимвола > 90) Тогда CODE39 = Ложь; Прервать; КонецЕсли; КонецЦикла; Если CODE39 Тогда ТипШтрихкодаЗнач = «CODE39»; КонецЕсли КонецЕсли; Если ТипШтрихкодаЗнач= «» Тогда // CODE128 // CODE128 символы ASCII от 0 до 127 (цифры от «0» до «9», буквы от «A» до «Z» и от «a» до «z») и специальные символы; CODE128 = Истина; Для Сч = 1 По ДлинаШтрихкода Цикл ВремКодСимвола = КодСимвола(Штрихкод, Сч); Если (ВремКодСимвола > 127) Тогда CODE128 = Ложь; Прервать; КонецЕсли; КонецЦикла; Если CODE128 Тогда ТипШтрихкодаЗнач = «CODE128»; КонецЕсли КонецЕсли; Если ТипШтрихкодаЗнач = «CODE128» Тогда // EAN128 // В коде EAN128 регламентирован словарь CODE128 но регламентированы группы кодов. Если КодСимвола(Штрихкод, 1) = 40 Тогда ТипШтрихкодаЗнач = «EAN128»; КонецЕсли; КонецЕсли; Возврат ТипШтрихкодаЗнач; КонецФункции Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт //ВнешняяКомпонента = МенеджерОборудованияСерверПовтИсп.ПодключитьВнешнююКомпонентуПечатиШтрихкода(); ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода(); Если ВнешняяКомпонента = Неопределено Тогда ВызватьИсключение НСтр(«ru = ‘Ошибка подключения внешней компоненты печати штрихкода.'»); КонецЕсли; // Зададим размер формируемой картинки. ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина); ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота); ВнешняяКомпонента.АвтоТип = Ложь; Если ПараметрыШтрихкода.ТипКода = 99 Тогда ТипШтрихкодаВрем = ОпределитьТипШтрихкода(ПараметрыШтрихкода.Штрихкод); Если ТипШтрихкодаВрем = «EAN8» Тогда ВнешняяКомпонента.ТипКода = 0; ИначеЕсли ТипШтрихкодаВрем = «EAN13» Тогда ВнешняяКомпонента.ТипКода = 1; // Если код содержит контрольный символ, обязательно указываем. ВнешняяКомпонента.СодержитКС = СтрДлина(ПараметрыШтрихкода.Штрихкод) = 13; ИначеЕсли ТипШтрихкодаВрем = «EAN128» Тогда ВнешняяКомпонента.ТипКода = 2; ИначеЕсли ТипШтрихкодаВрем = «CODE39» Тогда ВнешняяКомпонента.ТипКода = 3; ИначеЕсли ТипШтрихкодаВрем = «CODE128» Тогда ВнешняяКомпонента.ТипКода = 4; ИначеЕсли ТипШтрихкодаВрем = «ITF14» Тогда ВнешняяКомпонента.ТипКода = 11; ИначеЕсли ТипШтрихкодаВрем = «QR» Тогда ВнешняяКомпонента.ТипКода = 16; ИначеЕсли ТипШтрихкодаВрем = «EAN13Addon2» Тогда ВнешняяКомпонента.ТипКода = 14; ИначеЕсли ТипШтрихкодаВрем = «EAN13Addon5» Тогда ВнешняяКомпонента.ТипКода = 15; Иначе ВнешняяКомпонента.АвтоТип = Истина; КонецЕсли; Иначе ВнешняяКомпонента.АвтоТип = Ложь; ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода; КонецЕсли; Если ПараметрыШтрихкода.Свойство(«ПрозрачныйФон») Тогда ВнешняяКомпонента.ПрозрачныйФон = ПараметрыШтрихкода.ПрозрачныйФон; КонецЕсли; ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст; // Формируем картинку штрихкода. ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод; // Угол поворота штрихкода. ВнешняяКомпонента.УголПоворота = ?(ПараметрыШтрихкода.Свойство(«УголПоворота»), ПараметрыШтрихкода.УголПоворота, 0); // Уровень коррекции QR кода (L=0, M=1, Q=2, H=3). ВнешняяКомпонента.УровеньКоррекцииQR = ?(ПараметрыШтрихкода.Свойство(«УровеньКоррекцииQR»), ПараметрыШтрихкода.УровеньКоррекцииQR, 1); // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; КонецЕсли; // Если установленная нами высота меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; КонецЕсли; Если ПараметрыШтрихкода.Свойство(«РазмерШрифта») И (ПараметрыШтрихкода.РазмерШрифта > 0) И (ПараметрыШтрихкода.ОтображатьТекст) И (ВнешняяКомпонента.РазмерШрифта <> ПараметрыШтрихкода.РазмерШрифта) Тогда ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта; КонецЕсли; // Сформируем картинку ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод(); // Если картинка сформировалась. Если ДвоичныеДанныеКартинки <> Неопределено Тогда // Формируем из двоичных данных. Возврат Новый Картинка(ДвоичныеДанныеКартинки); КонецЕсли; Возврат Неопределено; КонецФункции

Таким образом, теперь имеется возможность получать картинку штрихкода и вставлять её (как и раньше) прямо в макет. Я делаю это таким образом:

ОбластьШапки.Рисунки.Штрихкод.Картинка = ОбработкаШтрихкодирования.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

Правда перед самим вызовом необходимо задать параметры штрихкода:

ПараметрыШтрихкода = Новый Структура; ПараметрыШтрихкода.Вставить(«Ширина», Окр(РисунокШтрихкода.Ширина / 0.1)); ПараметрыШтрихкода.Вставить(«Высота», Окр(РисунокШтрихкода.Высота / 0.1)); ПараметрыШтрихкода.Вставить(«Штрихкод», Штрихкод); //здесь д.б. наша строка ШК ПараметрыШтрихкода.Вставить(«ТипКода», 4); //ПараметрыШтрихкода.Вставить(«GS1DatabarКоличествоСтрок», GS1DatabarКоличествоСтрок); ПараметрыШтрихкода.Вставить(«МонохромныйШрифт», Истина); //ПараметрыШтрихкода.Вставить(«УголПоворота», УголПоворота); ПараметрыШтрихкода.Вставить(«ОтображатьТекст», Истина); ПараметрыШтрихкода.Вставить(«РазмерШрифта», 15); ПараметрыШтрихкода.Вставить(«Масштабировать», Истина); //ПараметрыШтрихкода.Вставить(«СохранятьПропорции», СохранятьПропорции); //ПараметрыШтрихкода.Вставить(«ВертикальноеВыравнивание», ВертикальноеВыравнивание);

Подробный перечень параметров и то, как с ними работать, а также их описание можно посмотреть на сайте 1С (в т.ч. и по первой ссылке из статьи — там многие параметры повторяются), ну и в самой УТ11. Для моих же целей оказался вполне пригоден представленный код.

На этом всё, надеюсь статья была вам полезна.

  • 5поделились
  • 0Facebook
  • 5Twitter
  • 0VKontakte
  • 0Odnoklassniki

Встроенное средство управления дисками Windows 7/10 существенно уступает в плане функциональности сторонним менеджерам разделов, но для простого изменения размера томов этот инструмент вполне подходит. Он позволяет уменьшить размер раздела с помощью опции «Сжать том» или увеличить его через пункт «Расширить том». Здесь, однако, пользователь может столкнуться с рядом ограничений.

Так, увеличение раздела через штатную оснастку Windows допускается только за счет нераспределенного пространства, которое должно располагаться в «правильном» месте. В противном случае пользователь обнаружит, что кнопка «Расширить том» не активна в контекстном меню выбранного им раздела, а, значит, операцию выполнить не получится. Существует и еще несколько причин, препятствующих расширению тома. О них и поговорим ниже.

Конфигурация нераспределенной области

Как уже было сказано, увеличить размер раздела средствами Windows можно только путем присоединения к нему нераспределенного пространства, но, во-первых, оно должно располагаться справа от расширяемого раздела, во-вторых, оно должно примыкать к его границе. Иначе расширить том в Windows 7/10 не получится. Например, если вы хотите увеличить размер системного раздела C, вам придется полностью удалить пользовательский раздел D. Не сжать, а именно удалить, потому что при сжатии образовавшаяся свободная область будет находиться справа от сжатого раздела, то есть без примыкания к границе раздела C. Вот почему нельзя расширить том диска С путем сжатия диска D.

Если же вы захотите получить дополнительное место на пользовательском разделе за счет раздела системного, то тоже не сможете этого сделать, так как нераспределенное пространство визуально окажется слева от диска D и будет доступно только для расширения диска С.

Не поддерживается файловая система

Не получится увеличить раздел средствами встроенной утилиты diskmgmt.msc и в том случае, если он будет отформатирован в файловую систему, отличную от NTFS. Диски формата FAT32 или exFAT штатная утилита расширить не позволит. Если вы хотите расширить FAT-раздел, либо переводите его в NTFS, либо используйте сторонние дисковые менеджеры, позволяющие обходить эти ограничения.

Расположение томов на разных физических дисках

Не активна кнопка «Расширить том» в Windows 7/10 будет и тогда, когда расширяемый раздел и свободная нераспределенная область располагаются на разных физических дисках. Объединить тома в такой ситуации можно только путем создания программного RAID-массива или пула дисков.

Исключения из правил

Выше мы рассмотрели основные причины того, что опция «Расширить том» бывает не активна в Windows 7/10. Есть, однако, из этого свода правил и требований интересные исключения, о которых следует знать. К примеру, если том является логическим (такие тома в diskmgmt.msc помечаются ярко-синим цветом), то для его расширения можно использовать нераспределенное пространство, не примыкающее непосредственно к границам.

Свои особенности расширения томов имеют и помечаемые оливковым цветом динамические диски. Расширять на динамических дисках можно любые тома, в том числе за счет пространства, находящегося на другом физическом диске. Результатом такого расширения будет создание составного тома – единого логического пространства под одной буквой.

Сдача отчетности в налоговые и другие проверяющие органы все чаще происходит в электронном виде. Для тех своих клиентов, которые еще не перешли на использование современного сервиса передачи данных, разработчики 1С создали возможность, предусматривающую печать из 1С с двумерным штрих-кодом PDF417. В одном таком коде может быть зашифровано несколько страниц текста, поэтому он и стал широко применяться контролирующими органами.

PDF417: двумерный штрих-код в 1С

В интерфейсе экранных форм отчетов двумерные коды не отображаются. Чтобы увидеть форму PDF417, необходимо или отправить на печать отчет, или запустить просмотр отчета перед печатью. Без специального сканера у вас не получиться разобрать зашифрованную информацию, но вы хотя бы удостоверитесь, что PDF417 на месте. В ином случае проверяющие органы не допустят ваши данные к проверке.

Рис.1 PDF417

Среди клиентов 1С немало компаний, предпочитающих не обновлять собственные конфигурации и платформу. В связи с этим они могут столкнуться с проблемами, когда запустят печать из 1С с двумерным штрих-кодом PDF417. ФНС Российской Федерации периодически вносит изменения в шаблон этого штрих-кода и требует, чтобы все контрагенты учитывали это. Если у пользователя актуальная версия программы 1С, то она самостоятельно обновит шаблон печати PDF417. В ином случае этим потребуется заняться пользователю.

Скачать последний актуальный шаблон PDF417 можно на сайте «ГНИИВЦ» в разделе «Информационное обеспечение» в перечне шаблонов форм. Скачанный архив необходимо распаковать и подготовиться к установке нового шаблона. Для этого необходимо закрыть все интерфейсы регламентированной отчетности, после чего запустить на исполнение файл «PDF417.msi».

Если исправно обновлять платформу и конфигурацию, то проблемы с печатью PDF417 могут быть, только если специальный модуль не установлен или удален. Исправить это достаточно легко двумя способами:

  1. Во-первых, при попытке распечатать декларацию или отчет с PDF417, 1С предложит установить компонент. Ответив на запрос утверждающе, вы запустите процесс инсталляции модуля печати;
  2. Во-вторых, в форме настроек регламентированной и финансовой отчетности есть пункт «Для переустановки компоненты печати машиночитаемых форм нажмите здесь». При нажатии запуститься процесс регистрации модуля печати PDF417.

Следуя простым инструкциям, вы быстро и без проблем установите модуль печати двумерного штрих-кода в 1С. Обратите внимание на невысокие системные требования данного компонента. Если не проверить, что ваше рабочее место полностью удовлетворяет заявленным требованиям, то при установке могут быть проблемы.

Использование двумерного штрих-кода

Наиболее часто формат PDF417 используется при отправке отчетности в проверяющие органы. В подобных ситуациях помните про ограничения:

  1. Не допускается печать с обеих сторон листа бумаги;
  2. Необходимо высокое качество печати, так как распознавать печать НД с PDF417 будет специальный сканер, а не человек. Любые пятна, полосы, дефекты или размытости могут оказаться фатальными при проверке данных;
  3. Размеры штрих-кода должны быть неизменяемы;
  4. Отчетность недопустимо скреплять степлером или скоросшивателем.

Многие компании при отправлении отчетности печатают два варианта, чтобы на одном из них инспекторы поставили отметку о приеме документов. Для «своего» варианта необязательно использовать PDF417, так как его проверять сканером не будут. Он просто является гарантией того, что ваши данные не потеряются в налоговой.

Рис.2 Использование двумерного штрих-кода

Кроме шифровки данных при отсылке в проверяющие органы, PDF417 используют и в качестве элегантного способа зашифровать большой объем информации в небольшом коде. В двумерный штрих-код можно закодировать до 2710 символов. Кодировать можно текстовые, числовые, двоичные, графические данные, отпечатки, EDI и даже передавать файлы настройки определенного оборудования. Этим стали пользоваться при печати медицинских карт, партий и артикулов продукции, разнообразных билетов и в других областях.

На сегодняшний день ГНИИВЦ выпустило только 32–битную версию модуля печати штрих-кодов. Именно по этой причине многие пользователи 1С не переходят на 64-битную версию платформы. Хотя с помощью стороннего ПО можно успешно печатать двумерный штрих-код в 1С и на 64-битном приложении.

Решение проблемы при печати бланка формы с двумерным штрих-кодом PDF417 при использовании 64-разрядной версии платформы

Если при использовании 64-х разрядной версии платформы требуется печатать двумерного кода PDF417, то при использовании модуля печати двумерного штрих-кода от издателя «ФГУП ГНИВЦ ФСН РФ в ПФО» у пользователя появится сообщение об ошибке.

Рис.3 Сообщение об ошибке

Самым простым способом решения данной проблемы является установка отдельной 32-х разрядной платформы, которая позволит пользоваться модулем печати двумерного штрих-кода. Для ее настройки необходимо выполнить редактирование настроек запуска информационной базы данных по кнопке «Изменить».

Рис.4 Настройка отдельной 32-х разрядной платформы

Во втором окне в поле «Разрядность» нужно указать разрядность той версии платформы 1С, которая должна быть запущена при запуске информационной базы.

Рис.5 Поле «Разрядность»

Настройка разрядности запускаемого приложения доступна только при запуске файла «1cestart.exe», который размещается в папке «C:\Program Files\1cv8\common». После запуска данной информационной базы данных у пользователя появится возможность печати двумерных штрих-кодов PDF417.

Рис.6 PDF417

Наличие одновременно двух платформ 1С (32-х и 64-х разрядной) не скажется отрицательно на функциональности или работоспособности информационной базы, установленной на пользовательском компьютере. А чтобы понять разрядность запущенного в данный момент приложения 1С, необходимо воспользоваться диспетчером задач.

Рис.7 Диспетчер задач

Для всех приложений, которые работают в режиме 32-х битной разрядности, в наименовании приложения будет указано «(32 бита)».