Разработка в среде 1С:Предприятие 8.3 часто преподносит неприятные сюрпризы, когда идеально работающий функционал в тестовой базе напрочь отказывается функционировать после переноса в рабочую среду. Особенно часто это случается с механизмом расширений конфигурации. Рассмотрим типичную ситуацию: программист создает обработчик события ПриЗаписи для документа в расширении, успешно тестирует его на нескольких копиях, но при внедрении в «боевую» базу ERP событие просто не вызывается.
В этой статье мы подробно разберем, почему так происходит, проанализируем влияние серверного кэша, безопасного режима и специфических багов платформы (особенно версии 8.3.17), а также разработаем пошаговый алгоритм восстановления работоспособности вашего расширения.
Прежде чем приступать к активным действиям, давайте разберем основные причины, по которым программный слой расширения может не «подцепиться» к объекту метаданных в рабочей базе:
Простое закрытие и открытие клиента пользователем часто недостаточно. Нам необходимо принудительно заставить сервер пересобрать дерево метаданных с учетом нашего расширения. Проанализируем правильный порядок действий:
C:\Program Files\1cv8\srvinfo).snccntxt. Именно здесь хранятся данные сеансов и временные кэшированные состояния, которые часто мешают корректному применению расширений.Важный момент: если вы проводили обновление расширения в тот момент, когда в базе находились пользователи, риск возникновения «фантомного» кэша возрастает многократно. Старайтесь всегда обновлять расширения в монопольном режиме.
Давайте выясним, не блокирует ли платформа выполнение кода из-за ограничений безопасности. По умолчанию при загрузке нового расширения флаг «Безопасный режим» установлен в значение Истина.
Для диагностики выполните следующие действия:
ПриЗаписи.Если после этих действий событие начало отрабатывать, значит, внутри вашего обработчика есть вызовы, недопустимые в безопасном режиме. Вам либо придется оставить режим безопасности выключенным, либо настроить профиль безопасности для этого расширения.
Чтобы понять, видит ли вообще система ваш программный код, мы можем использовать консоль запросов или небольшую внешнюю обработку. Проверим, доступны ли реквизиты, добавленные расширением (если они есть), и каков статус расширения в текущем сеансе.
Рассмотрим пример кода для проверки состояния расширения:
СписокРасширений = РасширенияКонфигурации.Получить();
Для Каждого ТекущееРасширение Из СписокРасширений Цикл
Если ТекущееРасширение.Имя = "ВашеИмяРасширения" Тогда
Сообщить("Расширение найдено. Активно: " + ТекущееРасширение.Активно);
Сообщить("Состояние: " + ТекущееРасширение.Состояние);
КонецЕсли;
КонецЦикла;
Если ТекущееРасширение.Состояние возвращает что-то отличное от Применено, загляните в Журнал регистрации. Отфильтруйте события по уровню «Ошибка» и метаданным «Расширения конфигурации». Там вы найдете подробное описание того, почему расширение не смогло «взлететь» (например, из-за несовпадения типов или структуры метаданных).
Иногда расширение «зависает» из-за того, что документ был заимствован некорректно или его структура в рабочей базе незначительно отличается. Разберем метод «перезаимствования»:
Этот метод часто помогает устранить проблемы с внутренними идентификаторами (UUID), которые могли возникнуть при простом сравнении/объединении расширений.
Если борьба с расширением затягивается, а бизнес требует работающего решения, проанализируем более надежный архитектурный подход. Как отмечают опытные специалисты, расширения — инструмент капризный. В критически важных узлах, таких как событие ПриЗаписи основных документов ERP, надежнее использовать Подписки на события в основной конфигурации.
Рассмотрим, как это реализовать:
ОбщийМодуль (например, _ИТ_ОбработчикиСобытий). Установите свойства «Сервер», «Внешнее соединение».ПриЗаписи). В качестве обработчика укажите созданную процедуру в общем модуле.Пример кода обработчика в общем модуле:
Процедура _ИТ_ПриЗаписиДокументаПриЗаписи(Источник, Отказ) Экспорт
// Источник — это сам документ, который записывается
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Ваша логика здесь
// Например:
// Если Источник.СуммаДокумента > 10000 Тогда
// ...
// КонецЕсли;
КонецПроцедуры
Этот метод практически не создает проблем при обновлениях (так как вы добавляете свои объекты, а не меняете типовые) и работает гораздо стабильнее, чем перехват событий через &После или &Вместо в расширениях.
Для исправления неработающего расширения в первую очередь перезагрузите службу 1С и очистите папку snccntxt. Если это не помогло, проверьте Безопасный режим и наличие ошибок в Журнале регистрации. В случае повторения проблем рассмотрите возможность переноса логики в Подписку на события основной конфигурации — это сэкономит вам время при последующих обновлениях системы.