При обновлении технологической платформы «1С:Предприятие 8.3» или переходе на новые релизы конфигураций разработчики часто сталкиваются с неприятной проблемой. Старая, исправно работавшая годами печатная форма внезапно перестает формироваться, завершаясь аварийной ошибкой выполнения кода:
Поле объекта не обнаружено (типкода) или Поле объекта не обнаружено (сообщение).
При этом детальный анализ строки кода, вызывающей ошибку, указывает на стандартное обращение к свойствам рисунка штрихкода в макете:
ОбластьМакета.Рисунки.ШтрихКод1.объект.типкода = 2;
Давайте подробно разберем, почему возникает эта ошибка, как разрядность платформы влияет на работу внешних компонент и какие современные способы решения проблемы существуют на сегодняшний день.
Главная причина кроется в переходе на 64-разрядную версию клиентского приложения 1С. Старая компонента печати штрихкодов 1CBarcode (файл 1CBarCod.dll), которая использовалась во множестве старых конфигураций (например, в УПП 1.3, БП 2.0 и самописных решениях на обычных формах), представляет собой классический 32-разрядный COM/ActiveX-объект.
В архитектуре операционных систем Windows существует жесткое ограничение: 64-разрядный процесс не может загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL). Когда 64-битный сеанс «1С:Предприятия» пытается инициализировать встроенный в макет ActiveX-объект, операционная система блокирует это действие. В результате свойство Объект рисунка макета возвращает значение Неопределено. Попытка обратиться к свойству Неопределено.типкода закономерно вызывает исключение платформы.
Проанализируем интересное поведение отладчика, которое часто вводит разработчиков в заблуждение. Во время отладки в Конфигураторе свойство ОбластьМакета.Рисунки.ШтрихКод1.объект может по-прежнему определяться как ActiveX-объект. Это происходит потому, что сам Конфигуратор долгое время оставался исключительно 32-битным приложением и работал в рамках 32-битного потока. Однако в режиме реального пользовательского 64-битного сеанса этот объект инициализировать невозможно.
Если печатную форму необходимо вернуть в рабочее состояние немедленно, а времени на переписывание программного кода нет, самым простым решением будет принудительный запуск базы под 32-разрядным клиентом 1С.
Для этого выполним следующие шаги:
После этого старый ActiveX-объект снова начнет успешно инициализироваться и выполнять свои функции.
Использование устаревшего ActiveX — это тупиковый путь развития. Фирма «1С» уже давно отказалась от этой технологии в пользу кроссплатформенных внешних компонент, работающих по технологии Native API. Новая компонента печати штрихкодов поставляется в виде общего макета и отлично работает на любых конфигурациях, независимо от разрядности клиента (x86 или x64) и операционной системы (Windows или Linux).
Рассмотрим подробнее процесс перевода печатной формы на новую технологию:
Нам потребуется изменить способ визуализации штрихкода в самом макете:
ШтрихКод1, который вызывал ошибку).ИмяРисункаШтрихкода.Теперь полностью перепишем код заполнения области макета. Вместо прямого присвоения параметров объекту макета, мы будем подключать внешнюю компоненту программно, генерировать картинку штрихкода в памяти и передавать готовое изображение в созданный на предыдущем шаге рисунок макета.
Посмотрим на пример реализации данного алгоритма:
// Определим процедуру вывода штрихкода на новой компоненте
Процедура ВывестиШтрихкодНаМакет(ОбластьМакета, ЗначениеШтрихкода)
// 1. Пытаемся подключить компоненту из общего макета (например, взятого из БСП)
// Если общего макета нет, его можно предварительно создать и загрузить туда новую DLL
ИмяПутиККомпоненте = "ОбщийМакет.КомпонентаПечатиШтрихкодов";
Если ПодключитьВнешнююКомпоненту(ИмяПутиККомпоненте, "BarcodeRenderer", ТипВнешнейКомпоненты.Native) Тогда
// Создаем экземпляр объекта компоненты
КомпонентаПечати = Новый("AddIn.BarcodeRenderer.Barcode");
// 2. Устанавливаем параметры штрихкода через свойства новой компоненты
КомпонентаПечати.ТипКода = 2; // Соответствует EAN13 (в соответствии со спецификацией компоненты)
КомпонентаПечати.Сообщение = ЗначениеШтрихкода;
КомпонентаПечати.Ширина = 400;
КомпонентаПечати.Высота = 150;
КомпонентаПечати.ОтображатьТекст = Истина;
// 3. Генерируем изображение штрихкода
ДвоичныеДанныеКартинки = КомпонентаПечати.ПолучитьШтрихкод();
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Преобразуем двоичные данные в объект Картинка 1С
НоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
// 4. Помещаем картинку в подготовленный рисунок на макете
ОбластьМакета.Рисунки.ИмяРисункаШтрихкода.Картинка = НоваяКартинка;
КонецЕсли;
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту для печати штрихкодов!";
EndЕсли;
КонецПроцедуры
Если вы работаете в современной типовой конфигурации, содержащей в себе Библиотеку стандартных подсистем (БСП) или Библиотеку подключаемого оборудования (БПО), вам вообще не нужно вручную заботиться о подключении и инициализации внешних компонент.
В таких конфигурациях уже присутствуют готовые программные модули. Например, в БСП за это отвечает общий модуль ГенерацияШтрихкода. Разработчику достаточно вызвать готовую функцию, которая вернет картинку штрихкода нужного формата.
Посмотрим на пример использования функционала БСП:
// Подготовим структуру параметров для генерации
ПараметрыШК = Новый Структура;
ПараметрыШК.Вставить("Ширина", 350);
ПараметрыШК.Вставить("Высота", 120);
ПараметрыШК.Вставить("ТипКода", 2); // EAN-13
ПараметрыШК.Вставить("ОтображатьТекст", Истина);
// Формируем картинку стандартными средствами БСП
КартинкаШтрихкода = ГенерацияШтрихкода.ИзображениеШтрихкода(ЗначениеШтрихкода, ПараметрыШК);
// Передаем полученное изображение в макет
ОбластьМакета.Рисунки.ИмяРисункаШтрихкода.Картинка = КартинкаШтрихкода;
Такой подход максимально безопасен, автономен и гарантирует стабильную работу печатных форм при любых обновлениях платформы или миграциях серверов 1С между различными операционными системами. Регулярное автоматическое обновление, архивация и тестирование 1С по расписанию упрощает техническое сопровождение системы при частой смене релизов.
Еще один альтернативный метод вывода штрихкода без использования внешних компонент и ActiveX-объектов — это применение специализированных шрифтов (например, EanGnivc, Code39). Суть метода заключается в том, что текстовая строка определенным образом преобразуется (кодируется специальными стартовыми и стоповыми символами) и выводится в обычную ячейку табличного документа, для которой установлен данный шрифт.
Преимуществом данного метода является абсолютная независимость от разрядности платформы 1С. Однако у него есть существенный недостаток — необходимость обязательной установки данного шрифта на всех рабочих станциях пользователей и серверах печати.