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