Почему не работает код расширения в клиент-серверном варианте 1С и как это исправить?

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

Перенос информационной базы «1С:Предприятие 8» из файлового режима в клиент-серверный (например, под управлением СУБД PostgreSQL) — это стандартный шаг при росте компании и увеличении нагрузки. Однако этот процесс часто сопровождается неожиданными техническими сбоями. Один из наиболее распространенных и неприятных сюрпризов — ситуация, когда ранее исправно работавшие расширения конфигурации частично «отваливаются». Новые элементы интерфейса (например, добавленные кнопки) отображаются на форме в режиме клиента, но при попытке нажать на них код не отрабатывает, серверные вызовы игнорируются, а точки останова в конфигураторе при отладке просто не срабатывают.

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

Причина 1. Ограничения безопасного режима и логика БСП

В файловом варианте базы данных требования к безопасности выражены не так жестко. При переносе базы в клиент-серверный вариант (особенно если развертывание происходило путем загрузки резервной копии .dt на новый сервер) платформа активирует механизмы контроля безопасного режима для всех подключенных расширений.

Если для расширения в списке установлен флаг «Безопасный режим», платформа накладывает жесткие ограничения на выполнение серверных процедур:

Попытка просто снять галочку «Безопасный режим» в режиме «1С:Предприятие» (через меню «Администрирование — Расширения») в конфигурациях на базе БСП (Библиотеки Стандартных Подсистем, таких как ERP, КА, УНФ) часто приводит к тому, что система помечает расширение красным крестиком на удаление или полностью блокирует его. Это происходит из-за того, что БСП контролирует хэш-суммы и профили безопасности подключенных модулей.

Решение проблемы с безопасным режимом:

Для правильного отключения ограничений в клиент-серверном варианте выполним следующие шаги:

  1. Откроем базу в режиме «1С:Предприятие» с правами администратора (у пользователя должна быть назначена роль Администрирование и Администрирование расширений конфигурации).
  2. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Расширения (в разных конфигурациях путь может немного отличаться).
  3. Снимем флаг «Безопасный режим» непосредственно в интерфейсе программы. Если система требует перезапуска или ругается на профили безопасности, нам потребуется настроить Профиль безопасности в консоли администрирования кластера серверов 1С, разрешив расширению доступ к внешним ресурсам и серверным процедурам без ограничений.

Причина 2. Залипание серверного кэша метаданных

При импорте базы данных из файла .dt на новый сервер рабочие процессы службы 1С (rphost) создают локальный кэш конфигурации. В некоторых случаях этот кэш «залипает». Платформа считает, что структура метаданных расширения не менялась, и использует старый скомпилированный код основной конфигурации, игнорируя новые перехватчики (hooks) из расширения.

Выясним, как принудительно заставить сервер 1С полностью обновить кэш и перестроить таблицы сопоставления метаданных.

Решение проблемы через «Сравнение/Объединение» (Рецепт из практики):

Этот способ отлично зарекомендовал себя на практике и позволяет быстро «оживить» расширение без перезапуска всего сервера приложений 1С:

  1. Откроем конфигуратор нашей базы данных.
  2. Перейдем в меню Конфигурация — Управление расширениями.
  3. Выделим проблемное расширение, нажмем кнопку Сохранить конфигурацию расширения в файл... и сохраним его на диск в формате .cfe.
  4. Удалим проблемное расширение из списка в конфигураторе и обновим конфигурацию базы данных (клавиша F7).
  5. Создадим в списке абсолютно новое расширение с произвольным именем. Обратим внимание, что его свойства (назначение, режим совместимости) должны соответствовать исходному.
  6. Откроем конфигурацию этого нового расширения.
  7. В меню выберем пункт Конфигурация — Сравнить, объединить с конфигурацией из файла... и укажем сохраненный ранее файл .cfe.
  8. Важно: в открывшемся окне сравнения и объединения снимем галочку с самого верхнего элемента — Свойства. Объединять нужно только объекты метаданных, формы и программный код.
  9. Нажмем кнопку «Выполнить», применим изменения и обновим конфигурацию базы данных.

Этот обходной путь заставляет платформу сгенерировать новые уникальные идентификаторы (GUID) для объектов метаданных расширения, что гарантированно очищает старый кэш сервера приложений для данных объектов.

Причина 3. Блокировка отладки на стороне сервера приложений

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

По умолчанию при создании нового кластера серверов режим отладки выключен из соображений производительности. Проанализируем, как включить отладку на сервере под управлением ОС Windows:

  1. Откроем редактор реестра Windows (regedit).
  2. Найдем ветку службы сервера 1С. Обычно она располагается по пути:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent...
  3. Найдем параметр ImagePath, который определяет строку запуска службы ragent.exe.
  4. Добавим в конец строки параметр -debug. Строка запуска должна выглядеть примерно так:
    "C:\Program Files\1cv8\8.3.XX.XXXX\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug
  5. Перезапустим службу 1C:Enterprise 8.3 Server Agent через оснастку «Службы».

После перезапуска службы необходимо проверить настройки подключения в Конфигураторе: перейдем в меню Отладка — Подключение... и убедимся, что серверные сеансы отображаются в списке доступных для подключения предметов отладки.

Причина 4. Использование устаревшего режима совместимости

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

Рекомендуется всегда устанавливать режим совместимости расширения в значение «Не использовать» или строго сопоставлять его с режимом совместимости основной конфигурации.

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


&НаКлиенте
Процедура Расш1_ДобавленнаяКнопкаНажатие(Кнопка)
    
    // Клиентский контекст всегда работает без проблем
    ПоказатьПредупреждение(, "Вызов серверной процедуры...");
    
    // Передаем управление на сервер
    ВыполнитьДействиеНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура ВыполнитьДействиеНаСервере()
    
    // В безопасном режиме этот код будет проигнорирован платформой!
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
    
КонецПроцедуры

Сводный чек-лист для быстрой диагностики:

Если вы столкнулись с описанной проблемой после переноса базы данных на СУБД PostgreSQL, пройдите по следующим шагам:

  1. Убедитесь, что в свойствах расширения в режиме «1С:Предприятие» сняты флажки «Безопасный режим» и «Защита от опасных действий».
  2. Проверьте, запущена ли служба сервера 1С с ключом -debug, если вам требуется отладка.
  3. Выполните очистку серверного кэша. Для этого остановите службу сервера 1С, удалите содержимое каталогов кэша (папки формата snccntx в каталоге srvinfo) и запустите службу заново.
  4. Если ручная очистка кэша не помогла, примените метод «Сравнения/Объединения» расширения из внешнего файла .cfe без переноса общих свойств, чтобы принудительно обновить внутренние идентификаторы метаданных.
← На главную