Многие разработчики, работающие с обычными формами на платформе 1С:Предприятие 8.2 и 8.3, сталкиваются с неприятной ситуацией: при попытке отредактировать визуальные свойства штрихкода в макете (например, в конфигурации "Управление торговлей 10.3") программа закрывается с ошибкой. Эта проблема особенно актуальна для операционных систем Windows 7, 8, 10 и 11, хотя на старой Windows XP все работает корректно. В данной статье мы подробно разберем, почему это происходит, и рассмотрим все доступные методы решения проблемы — от программных "костылей" до системных настроек Windows.
Проанализируем техническую сторону вопроса. Компонента 1C: Печать штрихкодов представляет собой ActiveX-объект (библиотека 1CBarCod.dll). Ошибка возникает из-за некорректного обращения компоненты к памяти при попытке отрисовать диалоговое окно свойств через контекстное меню "Элемент управления... -> Свойства".
Современные версии Windows используют механизм DEP (Data Execution Prevention), который блокирует выполнение кода в определенных участках памяти. Поскольку библиотека была разработана достаточно давно, она нарушает правила безопасности ОС, что приводит к ошибке типа BEX или Access Violation. Фирма 1С подтверждала наличие этой ошибки, и хотя в более новых версиях (9.0 и выше) ситуация улучшилась, многие продолжают использовать старые макеты.
Если визуальный редактор свойств вызывает падение системы, мы можем полностью проигнорировать его и задать все необходимые параметры штрихкода непосредственно в коде модуля печати. Рассмотрим, как это сделать. Объект штрихкода в макете доступен через коллекцию Рисунки.
Проанализируем пример кода, который позволяет настроить тип кода, отображение текста и само значение штрихкода без открытия графического интерфейса:
// Получаем область макета, где расположен рисунок штрихкода
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Обращаемся к объекту штрихкода по имени рисунка (например, "Штрихкод")
ОбъектШК = ОбластьМакета.Рисунки.Штрихкод.Объект;
// Устанавливаем параметры программно
ОбъектШК.ТипКода = 1; // 1 соответствует EAN13, 4 - Code128 и т.д.
ОбъектШК.ОтображатьТекст = Истина;
ОбъектШК.ТекстКода = "2000000012345";
ОбъектШК.Сообщение = "2000000012345";
// Выводим область в табличный документ
ТабДок.Вывести(ОбластьМакета);
Важный нюанс: Чтобы узнать соответствие числовых значений типам кодов (ТипКода), используйте следующие данные: 1 — EAN13, 2 — EAN128, 3 — Code39, 4 — Code128, 6 — EAN8, 11 — QR-код (в новых версиях). Этот метод позволяет гарантированно избежать вылетов, так как диалоговое окно ActiveX просто не вызывается.
Мало кто знает, что свойства ActiveX-объекта можно редактировать не только через специализированное окно компоненты, но и через стандартную панель свойств 1С. Разберем этот лайфхак по шагам:
F4), чтобы открыть панель свойств справа.ТипКода, ОтображатьТекст и другие.Внимание: Если свойства не отображаются, попробуйте изменить тип элемента управления в панели свойств на любой другой и вернуть обратно. Часто это "проявляет" скрытые настройки объекта в интерфейсе 1С, не вызывая при этом падения 1cv8.exe.
Если вам критически важно открывать именно родное окно настроек компоненты, попробуем изменить параметры безопасности операционной системы. Проанализируем процесс настройки исключений DEP:
C:\Program Files (x86)\1cv8\номер_версии\bin\1cv8.exe).Также настоятельно рекомендуем запускать Конфигуратор от имени Администратора. Это дает компоненте необходимые права для регистрации и вызова своих методов в контексте текущего сеанса Windows.
Иногда сам объект штрихкода в макете может быть поврежден (например, если макет создавался в версии 8.0 или начале 8.1). В этом случае помогает простое копирование. Рассмотрим алгоритм:
Посмотрите, есть ли в вашей конфигурации другие макеты с рабочим штрихкодом (например, в обработке ПечатьЦенников или ПечатьЭтикеток). Если там свойства открываются без ошибок, просто удалите старый штрихкод из вашего макета и скопируйте туда "рабочий" экземпляр. Настройки связи данных (поле Данные) придется восстановить вручную, но сам объект будет работать стабильнее.
Если борьба с 1CBarCod.dll затянулась, проанализируем профессиональный способ печати — использование штрихкод-шрифтов (например, EAN13.ttf или Code39.ttf).
Преимущества этого метода:
DLL на каждом клиентском компьютере.Для реализации этого метода нужно установить шрифт в Windows и программно подготовить строку. Например, для EAN13 необходимо вычислить контрольное число и преобразовать цифры в специальные символы по таблице шрифта. Рассмотрим пример того, как это выглядит в коде:
// Пример подготовки текста для шрифта EAN13 (упрощенно)
Область.Параметры.ШтрихкодШрифтом = ПреобразоватьВТекстEAN13(ЗначениеШтрихкода);
// В макете у этой ячейки должен быть выбран соответствующий шрифт
Подводя итог, можно сказать: наиболее эффективным и быстрым способом решения проблемы вылета 1С при обращении к свойствам штрихкода является программная установка параметров или использование стандартной панели свойств (F4). Это избавляет от необходимости копаться в системных настройках Windows и гарантирует стабильную работу макета у всех пользователей, независимо от версии их операционной системы.