В практике разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с загадочным поведением системы: программный код, написанный в расширении, безупречно работает при запуске из конфигуратора через F5 (в режиме отладки), но при обычном запуске тонкого или толстого клиента изменения как будто отсутствуют. Рассмотрим подробнее причины этого явления и разберем по шагам, как диагностировать и устранить данную проблему.
Ситуация, описанная автором темы, типична для серверных баз данных. При использовании аннотации &ИзменениеИКонтроль система выполняет проверку соответствия текста метода в расширении и в основной конфигурации. Если между ними есть расхождения, расширение не будет применено. Однако в режиме отладки платформа инициирует более глубокую проверку и часто принудительно обновляет контекст исполняемого кода, в то время как обычный пользовательский сеанс может использовать устаревшие скомпилированные модули из кэша.
Проанализируем пример кода, который использовался для записи данных в регистр сведений внутри расширения:
&НаСервере
&ИзменениеИКонтроль("ЗагрузитьПодготовленныеДанныеНаСервере")
Процедура Расширение_ЗагрузитьПодготовленныеДанныеНаСервере()
// ... существующий код метода
#Вставка
УстановитьПривилегированныйРежим(Истина);
// Запись в регистр сведений для временного хранения табличного документа
МенеджерЗаписи = РегистрыСведений.neganovИск_ХранилищеДляПечатиКвитанций.СоздатьМенеджерЗаписи();
МенеджерЗаписи.НаименованиеНастройки = "ИскПечКвит";
МенеджерЗаписи.ПлатежныйДокумент = Новый ХранилищеЗначения(ДанныеХранилища);
МенеджерЗаписи.Записать();
#КонецВставки
КонецПроцедуры
В данном коде используется ХранилищеЗначения для передачи данных между формами через регистр. Это рабочая схема, но если она «оживает» только в отладчике, причина кроется не в логике кода, а в окружении платформы.
Самая частая причина «эффекта наблюдателя», когда код работает только под присмотром отладчика — это залипший кэш. В 1С существует несколько уровней кэширования, и для решения проблемы их нужно «продуть».
Клиентский кэш: Хранится на локальном компьютере пользователя. Его легко очистить, удалив базу из списка в стартере 1С и добавив её заново, либо вручную удалив содержимое папок %AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.
Серверный кэш (наиболее вероятная причина): На сервере приложений 1С существует каталог snccntry (обычно находится в папке службы севера srvinfo). Там хранятся скомпилированные версии расширений и модулей. Выясним причину: при динамическом обновлении или интенсивной разработке расширений сервер может продолжать отдавать клиентам старую «версию» кода модуля, игнорируя ваши изменения. Только сеанс отладки заставляет сервер пересобрать модуль заново.
Для полной очистки серверного кэша выполним следующие действия:
C:\Program Files\1cv8\srvinfo (или ваш путь к данным сервера).Аннотация &ИзменениеИКонтроль очень чувствительна к любым изменениям в основной конфигурации. Рассмотрим ситуацию: если кто-то (или обновление поставщика) изменил текст исходной процедуры (добавил пробел, изменил комментарий, перенес строку), контрольная сумма метода меняется.
В режиме отладки конфигуратор может выдать предупреждение или попытаться сопоставить код, но в обычном режиме расширение просто тихо отключается. Чтобы проверить это, попробуем временно заменить аннотацию на &Вместо. Если код заработает в обычном режиме — значит, проблема была в неактуальности текста внутри блока &ИзменениеИКонтроль.
Расширения в 1С по умолчанию могут запускаться в безопасном режиме. Проанализируем настройки расширения в окне «Управление расширениями»:
УстановитьПривилегированныйРежим(Истина) внутри расширения будет проигнорировано. В итоге запись в регистр (как в примере автора) не произойдет из-за нехватки прав, хотя ошибок система может и не выдать.Для корректной работы кода, записывающего данные в регистры или работающего с файловой системой, снимите галочку «Безопасный режим» в настройках расширения в пользовательском режиме (Администрирование — Печатные формы, отчеты и обработки — Расширения).
Если в базе установлено несколько расширений, они могут модифицировать один и тот же метод. Посмотрим на приоритеты: расширение с более высоким номером в списке может перекрывать работу вашего кода. В режиме отладки порядок подключения может меняться в зависимости от того, какие объекты захвачены в текущем сеансе конфигуратора. Выясним, нет ли других расширений, использующих &Вместо для той же процедуры ЗагрузитьПодготовленныеДанныеНаСервере. Если такое расширение есть, оно полностью заменяет код, и ваше расширение с &ИзменениеИКонтроль просто не получит управления.
Подводя итог, если ваша обработка или расширение «стесняется» работать без отладчика, выполните следующие шаги:
&ИзменениеИКонтроль символ в символ совпадает с кодом в основной конфигурации.neganovИск_ХранилищеДляПечатиКвитанций.Использование регистра сведений для передачи ХранилищеЗначения — это надежный способ обхода ограничений временного хранилища, которое очищается при смене серверного контекста или закрытии формы. Главное — следить за тем, чтобы расширение было «валидным» с точки зрения платформы 1С.