Почему 1С зависает при печати ценников со штрихкодами и как это исправить?

Программист 1С v8.3 (Управляемые формы)
← На главную

Зависание системы при выводе на печать этикеток или ценников — одна из наиболее коварных проблем в 1С. Ситуация часто выглядит так: пользователь отправляет на печать небольшую партию ценников, после чего 1С «замирает», а на сервере приложений процесс rphost.exe начинает потреблять значительные ресурсы или, наоборот, полностью блокирует работу сеансов. При этом перезапуск службы 1С может не помогать с первого раза, а в журналах Windows фиксируется ошибка обращения к памяти в модуле 1CBarcod.dll. Разберем по шагам, почему это происходит и как стабилизировать работу системы.

Анализ симптомов и выявление причины

Прежде всего, нам необходимо убедиться, что проблема локализована именно в компоненте печати штрихкодов. Рассмотрим типичную запись из журнала событий Windows (Event Viewer), которая сопровождает такие зависания. Как правило, это ошибка Application Error с кодом исключения 0xc0000005. Этот код означает нарушение прав доступа к памяти (Access Violation) — ситуация, когда программа пытается прочитать или записать данные в адресное пространство, которое ей не принадлежит.

Проанализируем пример лога:

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

Способ 1. Обновление платформы 1С

Многие ошибки взаимодействия с внешними библиотеками исправляются разработчиками в новых релизах платформы. Практика показывает, что на версиях платформы ниже 8.3.18.1363 проблемы с печатью штрихкодов возникают значительно чаще. Рассмотрим статистику стабильности: пользователи отмечают, что переход на релизы 8.3.20.1674 и выше во многих случаях полностью устраняет проблему зависаний без внесения изменений в код конфигурации.

Важный нюанс: при обновлении платформы крайне важно очистить кэш сервера 1С и временные файлы пользователя, под которым запущена служба 1C:Enterprise 8.3 Server Agent. Компоненты штрихкодирования часто «застревают» в папках v8_XXXX внутри системного профиля, и старая битая библиотека может продолжать использоваться даже после обновления основного софта.

Способ 2. Замена внешней компоненты в конфигурации

Если обновление платформы нецелесообразно или не помогло, проанализируем саму компоненту. В современных типовых решениях (УТ 11, Розница 2, ERP) компонента печати штрихкодов хранится в ОбщиеМакеты под именем КомпонентаПечатиШтрихкода. Выясним, как произвести её замену.

  1. Откроем конфигуратор и перейдем в ветку Общие -> Общие макеты.
  2. Найдем макет КомпонентаПечатиШтрихкода.
  3. Нажмем правой кнопкой мыши и выберем «Загрузить из файла».
  4. Нам необходимо заменить текущую библиотеку (например, версии 9.0.12.8) на более стабильную (часто советуют версию 9.0.12.7 или даже более ранние варианты, работающие через Native API).

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

Посмотрим, как программно может выглядеть вызов компоненты, если мы решим проверить её работоспособность:


// Пример инициализации компоненты
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкода");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкода", "Barcode", ТипВнешнейКомпоненты.Native);
ОбъектШК = Новый("AddIn.Barcode.Barcode");

Способ 3. Решение проблемы «непотокобезопасности»

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

Разберем, как можно нивелировать эту проблему программно. Мы можем использовать механизм блокировок или мьютексов (Mutex), чтобы в один момент времени только один сеанс мог обращаться к функциям отрисовки картинки штрихкода. Рассмотрим схематичный пример использования ГлобальноеМьютекс (через внешние скрипты или ВК), но на уровне штатной 1С это можно реализовать через Блокировку данных или специальный флаг в регистре сведений, который будет «занимать» очередь на печать ШК.

Если мы работаем в клиент-серверном варианте, попробуйте изменить настройки кластера 1С: установите параметр «Количество соединений на один процесс» в меньшее значение (например, 10–15). Это заставит систему создавать больше процессов rphost, и падение одного из них из-за штрихкода не так фатально скажется на всех остальных пользователях.

Способ 4. Проверка системного окружения (Print Spooler и права)

Иногда причина кроется не в 1С, а в операционной системе Windows Server. Проанализируем настройки сервера:

Способ 5. Переход на нативную генерацию штрихкодов

В последних версиях БСП (Библиотеки Стандартных Подсистем) 1С реализовала возможность формирования штрихкодов без использования внешних DLL-файлов. Это наиболее надежный путь. Рассмотрим, как это работает: платформа предоставляет объект ТипРисункаТабличногоДокумента.Штрихкод.

Посмотрим на пример кода, который добавляет штрихкод в макет напрямую средствами платформы:


Область = Макет.ПолучитьОбласть("Строка");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Штрихкод);
Рисунок.Объект.ТипКода = ТипШтрихкода.EAN13;
Рисунок.Объект.Сообщение = "4601234567890";
// Настройка отображения
Рисунок.Объект.ОтображатьТекст = Истина;

Этот метод работает внутри самой платформы и не вызывает внешних исключений в памяти. Если ваша конфигурация позволяет, рекомендуем постепенно перевести все печатные формы на этот механизм, отказавшись от 1CBarcod.dll.

Подведем итоги

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

  1. Обновим платформу до стабильного релиза (рекомендуется 8.3.20.1674+).
  2. Если обновление не помогает, заменим компоненту в Общих макетах на версию 9.0.12.7.
  3. Очистим кэш сервера и временные папки профиля пользователя сервера 1С.
  4. Убедимся, что на сервере активна служба печати и настроен принтер по умолчанию.
  5. В перспективе рассмотрим переход на использование встроенного объекта Рисунок.Штрихкод.

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

← На главную