Почему реквизит «Склад» очищается до вызова процедуры «ПриИзменении» «ВидОперации» в 1С:УНФ?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

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

Описываемая ситуация характерна для документа «Перемещение» в 1С:Управление нашей фирмой (УНФ), но принципы решения применимы к любым управляемым формам в 1С:Предприятии 8.3.

Начальная диагностика: почему стандартные методы не помогают?

Когда реквизит очищается до входа в обработчик ПриИзменении, такие методы, как «Замер производительности» или просто установка точки останова в начале процедуры ВидОперацииПриИзменении, оказываются бесполезными. Замер производительности показывает только то, что происходит после вызова этой процедуры, а точка останова срабатывает уже после того, как реквизит Склад оказывается очищен. Это означает, что причина кроется на более низком уровне, до того, как система передает управление нашему коду в обработчике.

Основные механизмы, влияющие на очистку реквизитов в управляемых формах

Чтобы найти источник проблемы, мы должны рассмотреть все возможные механизмы, которые могут влиять на значение реквизита Склад до вызова нашего обработчика:

  1. Связи параметров выбора (СвязиПараметровВыбора)
  2. Программный код в общих модулях или модулях объекта
  3. Подписки на события
  4. Особенности поведения управляемых форм и типовых конфигураций (например, УНФ)
  5. Ошибки платформы или кэша

Шаг 1: Глубокая отладка с использованием табло отладки

Первый и наиболее эффективный шаг — это использование отладчика для пошагового наблюдения за изменением значения реквизита Склад. Мы не можем поставить точку останова в ПриИзменении, но можем отслеживать значение переменной.

  1. Запускаем 1С в режиме отладки.
  2. Открываем нужный документ (в нашем случае «Перемещение»).
  3. Включаем отладчик (кнопка «Начать отладку» или F5).
  4. В окне «Табло» (часто снизу или можно вызвать через меню «Отладка» -> «Табло») добавляем наш реквизит. Для реквизитов формы это обычно выглядит как Объект.Склад или Элементы.Склад.Значение, в зависимости от того, как реквизит связан с данными. Если реквизит формы — это поле объекта, то чаще всего Объект.Склад.
  5. Не снимая отладку, нажимаем кнопку «Остановить» в отладчике. Это позволит нам пошагово проходить по внутренним механизмам платформы.
  6. Теперь, находясь в режиме остановленной отладки, изменяем значение реквизита ВидОперации на форме.
  7. После изменения, когда платформа начнет обрабатывать это действие, мы будем пошагово проходить код (F10, F11) и постоянно наблюдать за значением Склад в табло отладки. Как только значение Склад изменится на пустое, мы окажемся в том участке кода, который ответственен за очистку.
  8. Изучаем стек вызовов (окно «Стек вызовов») в этот момент. Он покажет всю цепочку процедур, которая привела к текущему местоположению и, соответственно, к очистке реквизита.

Этот метод позволяет нам перехватить момент очистки, даже если он происходит внутри системных обработчиков платформы или в неочевидных местах типовой конфигурации.

Шаг 2: Тщательная проверка Связей параметров выбора (СвязиПараметровВыбора)

Даже если мы уверены, что СвязиПараметровВыбора пусты в свойствах элемента формы, их необходимо проверить еще раз, и не только на элементе формы, но и на самом реквизите формы в конфигураторе.

  1. Свойства элемента формы: Открываем форму в конфигураторе, находим элемент Склад в дереве элементов. В его свойствах находим группу «Данные» и раскрываем «Связи параметров выбора». Убеждаемся, что там нет ничего, что могло бы вызвать очистку при изменении ВидОперации.
  2. Свойства реквизита формы: В дереве реквизитов формы находим реквизит Склад. У него также могут быть свои «Связи параметров выбора». Проверяем их.
  3. Логика Связей параметров выбора: Важно понимать, как они работают. Если у реквизита Склад есть связь, например, с ВидОперации по какому-либо отбору (например, склад должен быть определенного типа для данного вида операции), и при изменении ВидОперации текущее значение Склад перестает удовлетворять условиям отбора, платформа автоматически очистит это значение. При этом ваш обработчик ПриИзменении даже не успеет отработать, так как очистка произошла на уровне проверки доступности значения.
  4. Проверка при различных значениях ВидОперации: Попробуем выбрать разные значения для ВидОперации. Возможно, для одного значения Склад очищается, а для другого — нет. Это указывает на проблемы с условиями отбора в СвязяхПараметровВыбора или в других механизмах, зависящих от ВидОперации.

Например, в свойствах реквизита Склад в конфигураторе мы можем найти параметр выбора с отбором, зависящим от другого реквизита:

ПараметрыВыбора.Добавить("Отбор.ВидыСкладов", НеобходимыйВидСклада);

Если НеобходимыйВидСклада зависит от ВидОперации, и при изменении ВидОперации текущий Склад перестает соответствовать отбору, он будет очищен.

Шаг 3: Поиск программного кода, влияющего на реквизит

Проверка модуля объекта документа

Изучим модуль объекта документа «Перемещение». В нем могут быть обработчики событий, которые срабатывают до отображения формы или ее обновления:

  1. ПриЧтенииНаСервере: Выполняется при чтении данных объекта из базы данных. Если здесь есть логика, зависящая от ВидОперации, она может модифицировать Склад.
  2. ОбработкаЗаполнения: Выполняется при создании нового объекта или заполнении его на основании другого. Если вы работаете с новым документом, здесь может быть логика.
  3. ПриУстановкеНовогоНомера, ПередЗаписью, ПослеЗаписи: Хотя эти обработчики обычно срабатывают при записи, они могут быть задействованы в сложной логике, которая косвенно влияет на отображение или обновление данных формы.

Подписки на события

В типовых конфигурациях подписки на события — это мощный механизм для централизованного управления поведением объектов. Они могут быть настроены на изменение реквизитов и срабатывать в самые неожиданные моменты.

  1. Открываем конфигуратор.
  2. Переходим в ветку «Общие» -> «Подписки на события».
  3. Ищем подписки, которые:
    • Касаются документов типа «Документ.Перемещение».
    • Касаются реквизитов, схожих с ВидОперации или Склад.
    • Используют источники событий вроде ПриИзменении или ПередЗаписью для объектов.
  4. В каждой найденной подписке смотрим, какая процедура-обработчик вызывается. Переходим к этой процедуре (обычно она находится в общем модуле) и анализируем ее код на предмет очистки реквизита Склад или изменения его значения, зависящего от ВидОперации.

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


// В общем модуле, процедура-обработчик подписки
Процедура ОбработкаИзмененияВидаОперации(Источник, Отказ) Экспорт
    Если Источник.Метаданные().Имя = "Документ.Перемещение" Тогда
        Если Источник.ВидОперации = Справочники.ВидыОпераций.НеобходимаяОперация Тогда
            // Если текущий склад не подходит для этой операции, очищаем его
            Если Не СоответствуетВидуОперации(Источник.Склад, Источник.ВидОперации) Тогда
                Источник.Склад = Справочники.Склады.ПустаяСсылка();
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Общие модули и модули расширений

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

  1. Поиск по всей конфигурации: Ищем в конфигураторе по всему тексту модулей (Ctrl+Shift+F) упоминания реквизита Склад и ВидОперации в контексте документа «Перемещение». Обращаем внимание на места, где Склад присваивается значение ПустаяСсылка().
  2. Модули расширений: Если используются расширения конфигурации, обязательно проверяем их. Код в расширениях может перехватывать события или добавлять свою логику, которая изменяет поведение реквизитов.

Шаг 4: Анализ специфики УНФ и управляемых форм

Настройки учета в 1С:УНФ для документа «Перемещение»

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

Мы должны проверить следующие аспекты:

  1. Зависимость доступности полей: Некоторые реквизиты могут становиться недоступными или невидимыми при определенном ВидеОперации. Если реквизит Склад становится недоступным, его значение может быть очищено платформой.
  2. Функциональные опции: Доступность и поведение реквизитов могут зависеть от функциональных опций, настроенных в конфигурации. Например, использование нескольких складов или ячеистых складов может влиять на то, как система обрабатывает выбор склада.

Особенности поведения управляемых форм

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

  1. Реквизит формы связан с полем объекта, которое было изменено на сервере без соответствующего обновления на клиенте, или наоборот.
  2. Значение реквизита становится недействительным после изменения связанного реквизита (как в случае с СвязямиПараметровВыбора).

Проанализируем события формы, которые срабатывают до ПриИзменении реквизита: ПриСозданииНаСервере, ПриЧтенииНаСервере, ПриОткрытии. Хотя в данном случае проблема возникает при изменении реквизита, эти события могут устанавливать начальные условия, которые затем приводят к очистке при последующих изменениях.

Шаг 5: Проверка на проблемы платформы или кэша

Хотя это менее вероятно для таких стандартных механизмов, как очистка реквизита, иногда проблемы могут быть вызваны:

  1. Ошибками платформы: Устаревшая или нестабильная версия платформы 1С может содержать ошибки, проявляющиеся в подобном непредсказуемом поведении. Мы должны убедиться, что используем актуальную, стабильную версию платформы.
  2. Проблемами с кэшем: Поврежденный кэш конфигурации на клиентской или серверной стороне может вызывать аномалии в работе формы. Попробуем очистить кэш 1С (удалить содержимое каталогов кэша для информационной базы или создать новую базу с тем же путем).

Итог: систематический подход к решению

Для успешного решения этой проблемы мы должны применить систематический подход:

  1. Начинаем с глубокой отладки: Используем «Табло» и пошаговый режим отладчика, чтобы точно определить момент и место очистки реквизита Склад. Это самый критичный шаг.
  2. Проверяем СвязиПараметровВыбора: И на элементе формы, и на самом реквизите в конфигураторе, учитывая, что невалидное значение будет очищено автоматически.
  3. Ищем программный код: В модулях объекта, общих модулях и подписках на события. Используем поиск по всей конфигурации.
  4. Учитываем специфику УНФ: Помним, что ВидОперации в УНФ — это мощный переключатель логики документа.
  5. Исключаем внешние факторы: Проверяем версию платформы и кэш.

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

← На главную