Как правильно передать значение переменной в строку при работе с маркировкой в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

В процессе интеграции системы 1С:Предприятие 7.7 с современным торговым оборудованием, в частности с контрольно-кассовой техникой (ККТ) для работы с маркированным товаром, программисты часто сталкиваются с трудностями при передаче строковых параметров. Одной из наиболее распространенных проблем является некорректная передача GTIN и серийного номера в объект драйвера. Рассмотрим подробно, почему стандартные подходы могут не срабатывать и как гарантированно передать данные в нужном формате.

Анализ проблемы типизации данных в 1С 7.7

В платформе 1С 7.7 типизация переменных является «мягкой», что иногда приводит к неожиданным результатам при взаимодействии с внешними COM-объектами (драйверами АТОЛ, Штрих-М и др.). Когда мы пытаемся присвоить свойству объекта значение переменной, система пытается самостоятельно определить тип передаваемых данных. Если в переменной GTIN хранится значение, похожее на число, 1С может передать его именно как числовой тип, в то время как драйвер ожидает строго BSTR (строку).

Использование встроенной функции Строка(Переменная) не всегда решает проблему, так как для больших чисел или строк со спецсимволами преобразование может добавить нежелательные пробелы-разделители или исказить содержимое. Проанализируем ситуацию: если мы пишем Объект.GTIN = "0290000..." (в кавычках), все работает, а если Объект.GTIN = Строка(GTIN) — драйвер выдает ошибку. Это явный признак того, что формат данных в переменной не соответствует ожиданиям драйвера.

Эффективные методы преобразования в строку

Разберем наиболее надежный способ «принудительного» приведения к строковому типу, который часто называют «конкатенацией с пустой строкой». Посмотрим на пример кода:


// Вместо этого:
Объект.GTIN = Строка(GTIN);

// Используем этот подход:
Объект.GTIN = "" + СокрЛП(GTIN);
Объект.SerialNumber = "" + СокрЛП(SerialNumber);

Добавление "" + в начале выражения заставляет интерпретатор 1С 7.7 привести весь результат к типу Строка еще до передачи в COM-объект. Функция СокрЛП (сокращение левых и правых пробелов) здесь обязательна, так как она гарантирует отсутствие невидимых символов, которые могут помешать валидации кода маркировки на стороне кассы или ОФД.

Разбор кода маркировки (DataMatrix)

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


Если ПустоеЗначение(СокрЛП(СписокТоваров.Маркировка)) = 0 Тогда
    // Полный код маркировки (КМ)
    КМ = СокрЛП(СписокТоваров.Маркировка);
    
    // Выделяем GTIN (обычно это 14 символов, начиная с 3-й позиции после идентификатора '01')
    GTIN = Сред(КМ, 3, 14);                            
    
    // Выделяем серийный номер (начинается после идентификатора '21')
    // В зависимости от товарной группы позиции могут отличаться
    SerialNumber = Сред(КМ, 19, 13);
    
    // Передаем данные в объект драйвера
    Объект.GTIN = GTIN;
    Объект.SerialNumber = SerialNumber;
    
    // Вызываем метод отправки данных в ФН
    Объект.FNSendItemCodeData(); 
КонецЕсли;

Важный нюанс: GTIN часто начинается с нулей. При преобразовании в число эти нули теряются. Поэтому всегда храните и передавайте GTIN исключительно как строку. Если вы все же работаете с ним как с числом, используйте функцию Формат(Значение, "Ч(0)14") для восстановления лидирующих нулей до длины в 14 символов.

Особенности взаимодействия с драйвером ККТ

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

В современных реалиях ФФД (формата фискальных данных) рекомендуется следующая последовательность:

  1. Вызов метода FNOperation() для инициализации фискальной операции.
  2. Заполнение свойств GTIN и SerialNumber.
  3. Установка типа маркировки (например, Объект.MarkingType = 1748).
  4. Вызов метода FNSendItemCodeData() для передачи кода в ФН.

Как показала практика, использование метода FNOperation вместо устаревших методов регистрации продажи позволяет корректно связать код маркировки с товарной позицией в чеке.

Отладка и типичные ошибки логики

Если в отладчике значение переменной выглядит корректно (например, "0290000..."), но драйвер все равно возвращает «неверный формат», следует проверить следующее:

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

Резюме: Для стабильной работы с маркировкой в 1С 7.7 используйте явное приведение к строке через конкатенацию "" + СокрЛП(Значение), внимательно следите за позициями символов при обрезке строки через Сред() и соблюдайте последовательность команд драйвера ККТ в соответствии с требованиями ФФД.

← На главную