Почему при вызове ПоказатьВопрос во внешней обработке окно появляется дважды?

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

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

Причины возникновения проблемы

В основе проблемы лежит механизм взаимодействия формы объекта и внешней обработки. Когда пользователь нажимает кнопку заполнения, система сначала проверяет состояние объекта. Если объект был изменен (модифицирован), типовой механизм БСП принудительно инициирует его запись. В этот момент происходит несколько событий:

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

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

Способ 1: Использование программного флага выполнения

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

Рассмотрим, как это реализовать на практике:


// В модуле формы внешней обработки добавим переменную
Перем ВыполняетсяОбработка Экспорт;

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    Если ВыполняетсяОбработка Тогда
        Возврат;
    КонецЕсли;

    ВыполняетсяОбработка = Истина;
    
    // Ваш код вызова вопроса
    ОписаниеОповещения = Новый ОписаниеОповещения("ВопросЗавершение", ЭтотОбъект, ОбъектНазначения);
    ПоказатьВопрос(ОписаниеОповещения, "Продолжить?", РежимДиалогаВопрос.ДаНет, 60);
КонецПроцедуры

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

Способ 2: Проверка модифицированности объекта

Еще один способ — это анализ статуса объекта перед началом действий. Если форма уже «поняла», что объект записан, вы можете ограничить выполнение кода. Мы можем проверить состояние объекта на клиенте, чтобы убедиться, что мы находимся в нужном контексте.

Однако, будьте внимательны: после записи Модифицированность объекта автоматически сбрасывается в Ложь. Мы можем использовать это как условие:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    Если НЕ Объект.Модифицированность Тогда
        // Выполняем логику, так как объект уже записан или чист
        ВыполнитьНашуПроцедуру();
    Иначе
        // Обработка случая, если объект требует записи
    КонецЕсли;
КонецПроцедуры

Способ 3: Обновление конфигурации и БСП

Как показывает практика, многие подобные «глюки» являются следствием ошибок в реализации механизмов БСП конкретных релизов. Если вы используете устаревшую версию 1С:Комплексная автоматизация или другой конфигурации на базе БСП, наиболее правильным решением будет обновление до актуального релиза.

В большинстве случаев после обновления проблема исчезает сама собой, так как разработчики 1С исправляют циклическую обработку событий форм в стандартных механизмах взаимодействия с внешними отчетами и обработками.

Рекомендации

Прежде чем внедрять сложные обходные пути, мы рекомендуем:

  1. Выполнить очистку кэша 1С:Предприятия. Иногда устаревшие файлы метаданных вызывают странное поведение форм.
  2. Провести отладку, чтобы увидеть, заходит ли выполнение в ВыполнитьКоманду два раза. Если заходит — используйте Способ №1 с флагом.
  3. Если проблема наблюдается только на определенных версиях конфигурации, проверьте наличие обновлений на портале 1С:ИТС.

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

← На главную