В практике разработчика 1С иногда возникает загадочная и неприятная ситуация: после очередного обновления конфигурации или внесения доработок в работающей годами форме перестают срабатывать события. Чаще всего это касается события ПриИзменении. Вы вносите данные в поле, например, «Организация» или «ВидОперации», но ничего не происходит — программный код, привязанный к этому действию, просто игнорируется платформой. При этом, если создать рядом новое поле и привязать его к той же процедуре, оно работает идеально. Рассмотрим подробнее, почему так происходит и как эффективно диагностировать и лечить подобные сбои.
Ситуация обычно выглядит следующим образом: в управляемой форме документа (например, «Списание с расчетного счета») стандартные реквизиты перестают реагировать на действия пользователя. Разработчик проверяет конфигуратор и видит, что связь между элементом формы и процедурой &НаКлиенте установлена. Однако в режиме «1С:Предприятие» событие не вызывается. Интересный факт: временное переименование элемента формы в конфигураторе (например, из Организация в Организация1) часто «оживляет» событие. Это прямой признак того, что проблема кроется не в коде, а в механизмах связи интерфейса и метаданных.
Разберем по шагам основные причины, которые могут привести к такому поведению системы. Понимание физики процесса поможет нам выбрать правильный метод лечения.
ПриСозданииНаСервере. Если в ходе ваших доработок в общем модуле или модуле объекта возникла «тихая» ошибка (внутри блока Попытка...Исключение), инициализация формы БСП может прерваться. В итоге визуально форма отрисовывается, но механизмы подписки на события не отрабатывают.Прежде чем глубоко переписывать код, выполним стандартные регламентные действия, которые помогают в 90% случаев. Проанализируем последовательность очистки системы.
Во-первых, необходимо очистить не только локальный кэш пользователя, но и временные файлы сервера 1С:Предприятие. Для этого остановите службу 1C:Enterprise 8.3 Server Agent, перейдите в папку srvinfo (путь по умолчанию: C:\Program Files\1cv8\srvinfo) и удалите содержимое папок reg_1541 (кроме файлов конфигурации кластера). Это заставит платформу заново пересобрать формы всех объектов при первом обращении.
Во-вторых, если вы подозреваете сбой GUID, воспользуйтесь методом «перерегистрации» обработчика:
ПриИзменении).Если ручная перепривязка не помогла, проанализируем ситуацию с программной точки зрения. В типовых конфигурациях события могут перехватываться общими модулями. Рассмотрим пример кода, который часто встречается в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Стандартные вызовы БСП
ОбщегоНазначенияБП.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
// Если здесь возникнет ошибка, дальнейшая настройка формы сорвется
МояДоработка_Интеграция.ИнициализироватьСобытия(ЭтаФорма);
КонецПроцедуры
Посмотрим на пример, как можно программно потерять событие. Если в коде используется метод УстановитьДействие, убедитесь, что имя процедуры указано верно и она доступна в контексте клиента:
// Опасный момент: если процедура "ИмяВашейПроцедуры" не существует,
// платформа может сбросить текущий обработчик.
ЭтаФорма.Элементы.Организация.УстановитьДействие("ПриИзменении", "ИмяВашейПроцедуры");
Проанализируем ситуацию с модулем объекта. Автор темы упоминал, что вносил правки в модуль объекта. Если вы добавили в модуль объекта экспортные переменные или методы, чьи имена совпадают с именами реквизитов формы или встроенными функциями, это может вызвать конфликт имен на уровне сервера. Выясним причину через отладчик: установите точку останова в самом начале ПриСозданииНаСервере и пройдите по шагам все вызовы общих модулей. Ищите места, где выполнение уходит в блок Исключение без вывода сообщения пользователю.
Если «магия» продолжается, попробуем применить метод «выталкивания» старых метаданных. Иногда помогает внесение фиктивного изменения в форму. Добавьте на форму любой невидимый декоративный элемент (например, пустую группу или надпись), сохраните конфигурацию, запустите предприятие, а затем удалите этот элемент. Это заставляет систему выполнить полную ревалидацию структуры формы.
Также стоит проверить влияние Функциональных опций. Если ваши доработки затронули логику функциональных опций, привязанных к документу, платформа может динамически изменять видимость и доступность реквизитов. В некоторых версиях платформы 8.3 это приводило к тому, что обработчики событий отключались, если функциональная опция считалась «выключенной» в момент инициализации, но поле оставалось видимым по другим причинам.
Подведем итоги нашего исследования. Если события формы в 1С перестали работать без видимых причин после обновления, действуйте по следующему алгоритму:
ПриСозданииНаСервере.snccntx и reg_1541).Помните, что в управляемом приложении визуальная часть (XML-описание формы) и логическая часть (Модуль формы) связаны через внутренние идентификаторы платформы. Любой сбой при обновлении конфигурации базы данных может нарушить эту связь, и только последовательная диагностика позволит найти «слабое звено».