Как исправить ошибку «Поле объекта не обнаружено (типкода)» при обращении к штрихкоду в макете 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При обновлении технологической платформы «1С:Предприятие 8.3» или переходе на новые релизы конфигураций разработчики часто сталкиваются с неприятной проблемой. Старая, исправно работавшая годами печатная форма внезапно перестает формироваться, завершаясь аварийной ошибкой выполнения кода:

Поле объекта не обнаружено (типкода) или Поле объекта не обнаружено (сообщение).

При этом детальный анализ строки кода, вызывающей ошибку, указывает на стандартное обращение к свойствам рисунка штрихкода в макете:

ОбластьМакета.Рисунки.ШтрихКод1.объект.типкода = 2;

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

Выясняем причину: конфликт разрядности (x86 vs x64)

Главная причина кроется в переходе на 64-разрядную версию клиентского приложения 1С. Старая компонента печати штрихкодов 1CBarcode (файл 1CBarCod.dll), которая использовалась во множестве старых конфигураций (например, в УПП 1.3, БП 2.0 и самописных решениях на обычных формах), представляет собой классический 32-разрядный COM/ActiveX-объект.

В архитектуре операционных систем Windows существует жесткое ограничение: 64-разрядный процесс не может загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL). Когда 64-битный сеанс «1С:Предприятия» пытается инициализировать встроенный в макет ActiveX-объект, операционная система блокирует это действие. В результате свойство Объект рисунка макета возвращает значение Неопределено. Попытка обратиться к свойству Неопределено.типкода закономерно вызывает исключение платформы.

Проанализируем интересное поведение отладчика, которое часто вводит разработчиков в заблуждение. Во время отладки в Конфигураторе свойство ОбластьМакета.Рисунки.ШтрихКод1.объект может по-прежнему определяться как ActiveX-объект. Это происходит потому, что сам Конфигуратор долгое время оставался исключительно 32-битным приложением и работал в рамках 32-битного потока. Однако в режиме реального пользовательского 64-битного сеанса этот объект инициализировать невозможно.

Решение 1. Быстрый временный обход (Использование 32-разрядного клиента)

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

Для этого выполним следующие шаги:

  1. Откроем список информационных баз в стартере 1С.
  2. Выберем нужную базу и нажмем кнопку Изменить.
  3. Перейдем на последнюю страницу настроек («Параметры запуска»).
  4. В поле Разрядность принудительно укажем значение 32 (x86) вместо «Выбирать автоматически» или «64 (x64)».
  5. Убедимся, что на компьютере пользователя установлена 32-разрядная версия платформы аналогичного релиза.

После этого старый ActiveX-объект снова начнет успешно инициализироваться и выполнять свои функции.

Решение 2. Кардинальное и современное (Переход на кроссплатформенную Native-компоненту)

Использование устаревшего ActiveX — это тупиковый путь развития. Фирма «1С» уже давно отказалась от этой технологии в пользу кроссплатформенных внешних компонент, работающих по технологии Native API. Новая компонента печати штрихкодов поставляется в виде общего макета и отлично работает на любых конфигурациях, независимо от разрядности клиента (x86 или x64) и операционной системы (Windows или Linux).

Рассмотрим подробнее процесс перевода печатной формы на новую технологию:

Шаг 1. Подготовка макета печатной формы

Нам потребуется изменить способ визуализации штрихкода в самом макете:

  1. Откроем макет нашей печатной формы в Конфигураторе.
  2. Полностью удалим старый рисунок-объект ActiveX (тот самый ШтрихКод1, который вызывал ошибку).
  3. Вместо него вставим обычную картинку: через меню Таблица — Рисунки — Вставить картинку... (при этом не нужно выбирать конкретный файл, создаем пустой объект-картинку).
  4. В свойствах созданного рисунка зададим понятное имя, например, ИмяРисункаШтрихкода.

Шаг 2. Программное подключение Native-компоненты и генерация изображения

Теперь полностью перепишем код заполнения области макета. Вместо прямого присвоения параметров объекту макета, мы будем подключать внешнюю компоненту программно, генерировать картинку штрихкода в памяти и передавать готовое изображение в созданный на предыдущем шаге рисунок макета.

Посмотрим на пример реализации данного алгоритма:


// Определим процедуру вывода штрихкода на новой компоненте
Процедура ВывестиШтрихкодНаМакет(ОбластьМакета, ЗначениеШтрихкода)
    
    // 1. Пытаемся подключить компоненту из общего макета (например, взятого из БСП)
    // Если общего макета нет, его можно предварительно создать и загрузить туда новую DLL
    ИмяПутиККомпоненте = "ОбщийМакет.КомпонентаПечатиШтрихкодов";
    
    Если ПодключитьВнешнююКомпоненту(ИмяПутиККомпоненте, "BarcodeRenderer", ТипВнешнейКомпоненты.Native) Тогда
        
        // Создаем экземпляр объекта компоненты
        КомпонентаПечати = Новый("AddIn.BarcodeRenderer.Barcode");
        
        // 2. Устанавливаем параметры штрихкода через свойства новой компоненты
        КомпонентаПечати.ТипКода = 2; // Соответствует EAN13 (в соответствии со спецификацией компоненты)
        КомпонентаПечати.Сообщение = ЗначениеШтрихкода;
        КомпонентаПечати.Ширина = 400;
        КомпонентаПечати.Высота = 150;
        КомпонентаПечати.ОтображатьТекст = Истина;
        
        // 3. Генерируем изображение штрихкода
        ДвоичныеДанныеКартинки = КомпонентаПечати.ПолучитьШтрихкод();
        
        Если ДвоичныеДанныеКартинки <> Неопределено Тогда
            // Преобразуем двоичные данные в объект Картинка 1С
            НоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
            
            // 4. Помещаем картинку в подготовленный рисунок на макете
            ОбластьМакета.Рисунки.ИмяРисункаШтрихкода.Картинка = НоваяКартинка;
        КонецЕсли;
        
    Иначе
        ВызватьИсключение "Не удалось подключить внешнюю компоненту для печати штрихкодов!";
    EndЕсли;
    
КонецПроцедуры

Решение 3. Использование готовых механизмов БСП или БПО

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

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

Посмотрим на пример использования функционала БСП:


// Подготовим структуру параметров для генерации
ПараметрыШК = Новый Структура;
ПараметрыШК.Вставить("Ширина", 350);
ПараметрыШК.Вставить("Высота", 120);
ПараметрыШК.Вставить("ТипКода", 2); // EAN-13
ПараметрыШК.Вставить("ОтображатьТекст", Истина);

// Формируем картинку стандартными средствами БСП
КартинкаШтрихкода = ГенерацияШтрихкода.ИзображениеШтрихкода(ЗначениеШтрихкода, ПараметрыШК);

// Передаем полученное изображение в макет
ОбластьМакета.Рисунки.ИмяРисункаШтрихкода.Картинка = КартинкаШтрихкода;

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

Решение 4. Использование шрифтов штрихкодов (Barcode Fonts)

Еще один альтернативный метод вывода штрихкода без использования внешних компонент и ActiveX-объектов — это применение специализированных шрифтов (например, EanGnivc, Code39). Суть метода заключается в том, что текстовая строка определенным образом преобразуется (кодируется специальными стартовыми и стоповыми символами) и выводится в обычную ячейку табличного документа, для которой установлен данный шрифт.

Преимуществом данного метода является абсолютная независимость от разрядности платформы 1С. Однако у него есть существенный недостаток — необходимость обязательной установки данного шрифта на всех рабочих станциях пользователей и серверах печати.

← На главную