Почему при выгрузке товаров на весы Штрих-Принт из 1С возникает ошибка «Нет связи» после шестой позиции?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При интеграции конфигураций 1С (таких как 1С:Управление торговлей 10.3 или 1С:Розница) с весами с печатью этикеток Штрих-Принт по интерфейсу Ethernet нередко возникает специфический сбой: тест подключения проходит успешно, небольшие порции товаров (до 5–6 штук) записываются без сбоев, но при выгрузке большего объема данных процесс прерывается сообщением «Невозможно осуществить выгрузку по следующим причинам: Нет связи». Разберем основные причины такого поведения оборудования и пошагово устраним неполадку.

Анализ причин сбоя соединения

Выясним причину, почему весы обрывают сетевое соединение именно после отправки первых нескольких позиций номенклатуры:

  1. Некорректное управление сокетами TCP/IP в цикле выгрузки. В некоторых типовых внешних обработках обслуживания оборудования методы установки связи УстановитьСвязь() и разрыва соединения вызываются на каждой итерации цикла перебора строк. Встроенный Ethernet-контроллер весов не успевает освобождать сетевые порты и очищать буфер, в результате чего стек переполняется на 6–7 пакете и связь сбрасывается.
  2. Использование параметров логического устройства по умолчанию. Если в коде обработки явно не передаются сетевые параметры (IP-адрес, порт весов, пароль администратора) перед записью каждого пакета, драйвер пытается обращаться к логическому устройству по умолчанию с системными настройками из реестра.
  3. Устаревшая версия драйвера торгового оборудования. Ранние версии драйверов Штрих-М содержат внутренние ошибки работы с сетевыми потоками в режиме COM-соединения.
  4. Заниженный таймаут ожидания ответа. При записи позиций в энергонезависимую память весов контроллеру требуется время на фиксацию данных. Если таймаут в миллисекундах слишком мал, 1С считает сеанс разорванным до получения подтверждения.
  5. Невалидные данные в карточке номенклатуры. Превышение максимальной длины наименования (стандартно не более 28 символов на строку), наличие спецсимволов или некорректный формат кода PLU могут приводить к аварийному завершению приема пакета весами.

Способ 1. Обновление драйвера весов

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

  1. Загрузим с официального сайта производителя последнюю версию драйвера весов с печатью этикеток.
  2. Удалим старый драйвер через панель управления и выполним установку обновленного пакета.
  3. Перерегистрируем COM-компоненту драйвера в операционной системе и перезапустим сеанс 1С.
  4. Проверим работу пакетной выгрузки справочника товаров.

Способ 2. Корректировка алгоритма внешней обработки 1С

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

Рассмотрим правильную структуру организации выгрузки в коде обработки:


// Подготовка параметров подключения к весам
ОбъектДрайвера.IPAddress = НастройкиВесов.IPАдрес;
ОбъектДрайвера.TCPPort = НастройкиВесов.Порт; // По умолчанию 1111 или 5001
ОбъектДрайвера.Password = 30; // Системный пароль администратора весов
ОбъектДрайвера.Timeout = 2000; // Увеличенный таймаут ожидания ответа (в мс)

// Устанавливаем связь ОДИН раз перед началом выгрузки массива данных
Если ОбъектДрайвера.Connect() <> 0 Тогда
    Сообщить("Не удалось установить связь с весами: " + ОбъектДрайвера.ResultCodeDescription);
    Возврат;
КонецЕсли;

Попытка
    Для Каждого СтрТовар Из ТаблицаВыгрузки Цикл
        // Нормализуем наименование и данные PLU
        ОбъектДрайвера.PLUNumber = СтрТовар.КодPLU;
        ОбъектДрайвера.Price = СтрТовар.Цена;
        ОбъектДрайвера.ItemCode = СтрТовар.КодТовара;
        
        // Ограничиваем длину строки до допустимого лимита протокола
        ОбъектДрайвера.Name = Лев(СокрЛП(СтрТовар.Наименование), 28);
        
        // Запись одной позиции PLU в память весов
        Если ОбъектДрайвера.SetPLU() <> 0 Тогда
            Сообщить("Ошибка записи товара " + СтрТовар.Наименование + ": " + ОбъектДрайвера.ResultCodeDescription);
            Прервать;
        КонецЕсли;
    КонецЦикла;
Исключение
    Сообщить("Критический сбой при выгрузке: " + ОписаниеОшибки());
КонецПопытки;

// Разрываем соединение строго после завершения всего цикла выгрузки
ОбъектДрайвера.Disconnect();

Способ 3. Проверка формата и корректности данных

Проанализируем передаваемые в весы данные, чтобы исключить программные отказы из-за некорректных значений:

  1. Проверка утилитой производителя. Запустим штатную утилиту «Загрузчик весов» из комплекта поставки драйвера и выполним выгрузку того же списка товаров. Если через утилиту данные проходят успешно, причина гарантированно заключается в логике обработки 1С.
  2. Контроль кода PLU. Убедимся, что номера PLU являются строго числовыми и не превышают максимальный диапазон памяти весов (зависит от объема установленной Flash/SRAM памяти).
  3. Очистка спецсимволов. Проверим, чтобы в наименованиях не присутствовали символы перевода каретки \r\n, табуляции или неразрывные пробелы, нарушающие целостность команд протокола обмена.
← На главную