При работе с управляемыми формами в 1С:Предприятии мы часто сталкиваемся с ситуациями, когда поведение реквизитов формы оказывается неочевидным. Одна из таких проблем — это автоматическая очистка значения реквизита формы, например, «Склад», в момент изменения другого связанного реквизита, например, «ВидОперации», причем очистка происходит до того, как мы даже успеваем войти в процедуру обработки события ПриИзменении для «ВидОперации». Давайте подробно разберем, почему это может происходить, и какие шаги необходимо предпринять для диагностики и устранения данной проблемы.
Описываемая ситуация характерна для документа «Перемещение» в 1С:Управление нашей фирмой (УНФ), но принципы решения применимы к любым управляемым формам в 1С:Предприятии 8.3.
Когда реквизит очищается до входа в обработчик ПриИзменении, такие методы, как «Замер производительности» или просто установка точки останова в начале процедуры ВидОперацииПриИзменении, оказываются бесполезными. Замер производительности показывает только то, что происходит после вызова этой процедуры, а точка останова срабатывает уже после того, как реквизит Склад оказывается очищен. Это означает, что причина кроется на более низком уровне, до того, как система передает управление нашему коду в обработчике.
Чтобы найти источник проблемы, мы должны рассмотреть все возможные механизмы, которые могут влиять на значение реквизита Склад до вызова нашего обработчика:
СвязиПараметровВыбора)Первый и наиболее эффективный шаг — это использование отладчика для пошагового наблюдения за изменением значения реквизита Склад. Мы не можем поставить точку останова в ПриИзменении, но можем отслеживать значение переменной.
Объект.Склад или Элементы.Склад.Значение, в зависимости от того, как реквизит связан с данными. Если реквизит формы — это поле объекта, то чаще всего Объект.Склад.ВидОперации на форме.Склад в табло отладки. Как только значение Склад изменится на пустое, мы окажемся в том участке кода, который ответственен за очистку.Этот метод позволяет нам перехватить момент очистки, даже если он происходит внутри системных обработчиков платформы или в неочевидных местах типовой конфигурации.
СвязиПараметровВыбора)Даже если мы уверены, что СвязиПараметровВыбора пусты в свойствах элемента формы, их необходимо проверить еще раз, и не только на элементе формы, но и на самом реквизите формы в конфигураторе.
Склад в дереве элементов. В его свойствах находим группу «Данные» и раскрываем «Связи параметров выбора». Убеждаемся, что там нет ничего, что могло бы вызвать очистку при изменении ВидОперации.Склад. У него также могут быть свои «Связи параметров выбора». Проверяем их.Склад есть связь, например, с ВидОперации по какому-либо отбору (например, склад должен быть определенного типа для данного вида операции), и при изменении ВидОперации текущее значение Склад перестает удовлетворять условиям отбора, платформа автоматически очистит это значение. При этом ваш обработчик ПриИзменении даже не успеет отработать, так как очистка произошла на уровне проверки доступности значения.ВидОперации: Попробуем выбрать разные значения для ВидОперации. Возможно, для одного значения Склад очищается, а для другого — нет. Это указывает на проблемы с условиями отбора в СвязяхПараметровВыбора или в других механизмах, зависящих от ВидОперации.Например, в свойствах реквизита Склад в конфигураторе мы можем найти параметр выбора с отбором, зависящим от другого реквизита:
ПараметрыВыбора.Добавить("Отбор.ВидыСкладов", НеобходимыйВидСклада);
Если НеобходимыйВидСклада зависит от ВидОперации, и при изменении ВидОперации текущий Склад перестает соответствовать отбору, он будет очищен.
Изучим модуль объекта документа «Перемещение». В нем могут быть обработчики событий, которые срабатывают до отображения формы или ее обновления:
ПриЧтенииНаСервере: Выполняется при чтении данных объекта из базы данных. Если здесь есть логика, зависящая от ВидОперации, она может модифицировать Склад.ОбработкаЗаполнения: Выполняется при создании нового объекта или заполнении его на основании другого. Если вы работаете с новым документом, здесь может быть логика.ПриУстановкеНовогоНомера, ПередЗаписью, ПослеЗаписи: Хотя эти обработчики обычно срабатывают при записи, они могут быть задействованы в сложной логике, которая косвенно влияет на отображение или обновление данных формы.В типовых конфигурациях подписки на события — это мощный механизм для централизованного управления поведением объектов. Они могут быть настроены на изменение реквизитов и срабатывать в самые неожиданные моменты.
ВидОперации или Склад.ПриИзменении или ПередЗаписью для объектов.Склад или изменения его значения, зависящего от ВидОперации.Пример кода в общем модуле, вызванном подпиской, который может очищать реквизит:
// В общем модуле, процедура-обработчик подписки
Процедура ОбработкаИзмененияВидаОперации(Источник, Отказ) Экспорт
Если Источник.Метаданные().Имя = "Документ.Перемещение" Тогда
Если Источник.ВидОперации = Справочники.ВидыОпераций.НеобходимаяОперация Тогда
// Если текущий склад не подходит для этой операции, очищаем его
Если Не СоответствуетВидуОперации(Источник.Склад, Источник.ВидОперации) Тогда
Источник.Склад = Справочники.Склады.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Типовые конфигурации, такие как УНФ, активно используют общие модули для размещения основной бизнес-логики. Возможно, существуют функции или процедуры, которые вызываются из различных мест и обрабатывают изменения ключевых реквизитов.
Склад и ВидОперации в контексте документа «Перемещение». Обращаем внимание на места, где Склад присваивается значение ПустаяСсылка().Документ «Перемещение» в 1С:УНФ является многофункциональным и может использоваться для разных видов операций (перемещение, списание, передача в эксплуатацию и т.д.). ВидОперации является ключевым реквизитом, который кардинально меняет логику работы документа, состав доступных реквизитов и движения по регистрам. Возможно, в УНФ есть внутренняя логика, которая при смене ВидОперации автоматически сбрасывает Склад, если он не применим к новому виду операции, или если для нового вида операции требуется его обязательный перевыбор.
Мы должны проверить следующие аспекты:
ВидеОперации. Если реквизит Склад становится недоступным, его значение может быть очищено платформой.В управляемых формах платформа может автоматически сбрасывать значения реквизитов, если они теряют свою актуальность или не соответствуют новым условиям, заданным через программный код или свойства формы. Это может происходить, когда:
СвязямиПараметровВыбора).Проанализируем события формы, которые срабатывают до ПриИзменении реквизита: ПриСозданииНаСервере, ПриЧтенииНаСервере, ПриОткрытии. Хотя в данном случае проблема возникает при изменении реквизита, эти события могут устанавливать начальные условия, которые затем приводят к очистке при последующих изменениях.
Хотя это менее вероятно для таких стандартных механизмов, как очистка реквизита, иногда проблемы могут быть вызваны:
Для успешного решения этой проблемы мы должны применить систематический подход:
Склад. Это самый критичный шаг.СвязиПараметровВыбора: И на элементе формы, и на самом реквизите в конфигураторе, учитывая, что невалидное значение будет очищено автоматически.ВидОперации в УНФ — это мощный переключатель логики документа.Только планомерное прохождение всех этих шагов позволит нам точно определить причину автоматической очистки реквизита и найти правильное решение, будь то корректировка СвязейПараметровВыбора, изменение кода в подписке на событие, или даже обновление платформы.