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