Ошибка при удалении элемента управления
Внешняя компонента для 1С:Предприятия 7.7 «Йоксель» реализует возможность создавать на формах 1С:Предприятия элементы управления, отображающие табличные документы. Существуют также другие внешние компоненты, которые позволяют создавать на формах 1С:Предприятия различные другие элементы управления. Часто бывает, что подобные компоненты содержат ошибки, которые приводят к невозможности некоторых вариантов совместной работы этих компонент с Йокселем. В результате подобной несовместимости может произойти аварийный выход из программы и потеря несохраненных данных. Для наиболее раннего выявления подобных проблем в компоненту Йоксель встроена система обнаружения ошибочных ситуаций, связанных с элементом управления. В случае обнаружения ошибочной ситуации будет выдано следующее сообщение:
При получении данного сообщения рекомендуется сохранить измененные данные и как можно быстрее перезапустить программу.
Примечания для программистов 1С
Элементы управления Йокселя и других внешних компонент обычно создаются на основе существующих элементов управления формы: «надписи» или «кнопки». Ошибочная ситуация, приведенная выше, может возникать при одновременном выполнении следующих условий:
- На форме был создан элемент управления Йокселя на основе какого-либо элемента управления.
- На основе этого же элемента управления создается новый элемент управления при помощи сторонней ВК. Если ВК содержит ошибки, то произойдет ошибочное удаление объекта Йокселя, что может привести в дальнейшем к обращению к несуществующему объекту и аварийному завершению программы.
Поэтому, в случае получения вышеуказанного сообщения, необходимо устранить ситуацию, когда на основе элемента управления Йокселя создается объект некорректно написанной ВК.
Технические подробности (для авторов ВК)
Создание элемента управления, как известно, происходит в несколько этапов:
- Поиск объекта CWnd, соответствующему идентификатору элемента формы
- Удаление старого окна.
- Создание нового окна внешней компоненты с идентификатором окна равным идентификатору старого окна.
Ошибку обычно делают на этапе удаления старого окна: для полученного объекта CWnd просто вызывают delete:
Этого делать не следует. Для удаления окна нужно использовать метод CWnd::DestroyWindow. При этом все будет корректно: элементы управления 1С самостоятельно удаляют соответствующий им объект CWnd при удалении окна.
В случае же с Йокселем происходит следующее:
- Объект 1С внутри содержит указатель на CWnd.
- Некорректная ВК удаляет этот CWnd.
- Любое последующее обращение к объекту 1С может привести к Access violation. При удалении объекта 1С (при закрытии формы) произойдет удаление уже удаленного объекта с некорректными последствиями.
Если же все сделать правильно – вызвать CWnd::DestroyWindow, то объект CWnd останется существовать и обращения к нему из 1С будут корректно обрабатываться. А при закрытии формы объект будет корректно удален.
В общем, нужно использовать правило: «не ты создал, не тебе удалять».
Страницы, ссылающиеся на данную:
Новости/Релиз010100