Зависание системы при выводе на печать этикеток или ценников — одна из наиболее коварных проблем в 1С. Ситуация часто выглядит так: пользователь отправляет на печать небольшую партию ценников, после чего 1С «замирает», а на сервере приложений процесс rphost.exe начинает потреблять значительные ресурсы или, наоборот, полностью блокирует работу сеансов. При этом перезапуск службы 1С может не помогать с первого раза, а в журналах Windows фиксируется ошибка обращения к памяти в модуле 1CBarcod.dll. Разберем по шагам, почему это происходит и как стабилизировать работу системы.
Прежде всего, нам необходимо убедиться, что проблема локализована именно в компоненте печати штрихкодов. Рассмотрим типичную запись из журнала событий Windows (Event Viewer), которая сопровождает такие зависания. Как правило, это ошибка Application Error с кодом исключения 0xc0000005. Этот код означает нарушение прав доступа к памяти (Access Violation) — ситуация, когда программа пытается прочитать или записать данные в адресное пространство, которое ей не принадлежит.
Проанализируем пример лога:
rphost.exe1CBarcodWin64_9_0_12_8.dll (или аналогичная версия)AppData\Local\TempЭто прямое свидетельство того, что внешняя компонента, встроенная в конфигурацию 1С для генерации штрихкодов, работает некорректно в текущем окружении или конфликтует с версией платформы. Выясним основные способы решения этой проблемы.
Многие ошибки взаимодействия с внешними библиотеками исправляются разработчиками в новых релизах платформы. Практика показывает, что на версиях платформы ниже 8.3.18.1363 проблемы с печатью штрихкодов возникают значительно чаще. Рассмотрим статистику стабильности: пользователи отмечают, что переход на релизы 8.3.20.1674 и выше во многих случаях полностью устраняет проблему зависаний без внесения изменений в код конфигурации.
Важный нюанс: при обновлении платформы крайне важно очистить кэш сервера 1С и временные файлы пользователя, под которым запущена служба 1C:Enterprise 8.3 Server Agent. Компоненты штрихкодирования часто «застревают» в папках v8_XXXX внутри системного профиля, и старая битая библиотека может продолжать использоваться даже после обновления основного софта.
Если обновление платформы нецелесообразно или не помогло, проанализируем саму компоненту. В современных типовых решениях (УТ 11, Розница 2, ERP) компонента печати штрихкодов хранится в ОбщиеМакеты под именем КомпонентаПечатиШтрихкода. Выясним, как произвести её замену.
КомпонентаПечатиШтрихкода.После замены обязательно обновим конфигурацию базы данных. Если мы не хотим снимать конфигурацию с поддержки, рассмотрим альтернативный вариант — создание Расширения. В расширении мы можем переопределить макет с компонентой, и система будет использовать библиотеку из нашего расширения, не затрагивая основной замок конфигурации.
Посмотрим, как программно может выглядеть вызов компоненты, если мы решим проверить её работоспособность:
// Пример инициализации компоненты
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкода");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкода", "Barcode", ТипВнешнейКомпоненты.Native);
ОбъектШК = Новый("AddIn.Barcode.Barcode");
Одной из скрытых причин падения rphost.exe является то, что библиотека штрихкодирования 1С не всегда корректно обрабатывает одновременные запросы от нескольких пользователей (потоков). Если два кладовщика одновременно нажмут «Печать», компонента может вызвать конфликт в памяти.
Разберем, как можно нивелировать эту проблему программно. Мы можем использовать механизм блокировок или мьютексов (Mutex), чтобы в один момент времени только один сеанс мог обращаться к функциям отрисовки картинки штрихкода. Рассмотрим схематичный пример использования ГлобальноеМьютекс (через внешние скрипты или ВК), но на уровне штатной 1С это можно реализовать через Блокировку данных или специальный флаг в регистре сведений, который будет «занимать» очередь на печать ШК.
Если мы работаем в клиент-серверном варианте, попробуйте изменить настройки кластера 1С: установите параметр «Количество соединений на один процесс» в меньшее значение (например, 10–15). Это заставит систему создавать больше процессов rphost, и падение одного из них из-за штрихкода не так фатально скажется на всех остальных пользователях.
Иногда причина кроется не в 1С, а в операционной системе Windows Server. Проанализируем настройки сервера:
1CBarcod.dll. Попробуем добавить rphost.exe в список исключений DEP.USR1CV8), должен иметь полные права на свою временную папку Temp и права на чтение папки C:\Windows\Fonts, так как штрихкод использует шрифты для отрисовки цифр.В последних версиях БСП (Библиотеки Стандартных Подсистем) 1С реализовала возможность формирования штрихкодов без использования внешних DLL-файлов. Это наиболее надежный путь. Рассмотрим, как это работает: платформа предоставляет объект ТипРисункаТабличногоДокумента.Штрихкод.
Посмотрим на пример кода, который добавляет штрихкод в макет напрямую средствами платформы:
Область = Макет.ПолучитьОбласть("Строка");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Штрихкод);
Рисунок.Объект.ТипКода = ТипШтрихкода.EAN13;
Рисунок.Объект.Сообщение = "4601234567890";
// Настройка отображения
Рисунок.Объект.ОтображатьТекст = Истина;
Этот метод работает внутри самой платформы и не вызывает внешних исключений в памяти. Если ваша конфигурация позволяет, рекомендуем постепенно перевести все печатные формы на этот механизм, отказавшись от 1CBarcod.dll.
Проанализировав ситуацию, мы видим, что «наглухо» зависающая 1С при печати — это комплексная проблема. Для её решения выполним следующие действия:
Общих макетах на версию 9.0.12.7.Рисунок.Штрихкод.Применяя эти методы, мы добьемся стабильной работы склада и розничных точек, исключив аварийные завершения сеансов при подготовке ценников к печати.