[Практика программирования] Управляемые формы 1С 8: не отображаются сообщения из процедур закрытия формы
Если в обычном интерфейсе результат действия функции Сообщить выводился всегда и в отдельном окне. То в случае ее использования в управляемом интерфейсе для отдельных задач, в частности применения в событиях закрытия форм, нужно иметь в виду конкретное замечание, иначе будет казаться, что "Сообщить()" не работает, так же может казаться, что не работает "СообщениеПользователю".
Столкнуться с данной проблемой "повезло" в контексте задачи оповещения пользователей при закрытии формы документа "Заказ клиента" конфигурации "1С: Управление торговлей, ред. 11", работающей в режиме управляемого приложения. А равно проблема может повториться в любой конфигурации, работающей в режиме управляемого приложения. Немного подробнее о задаче. При закрытии форму документа пользователь должен получать справочно сообщения о некорректно заполненных данных в табличной части документа, конкретно для строк с указанием номеров, где содержаться некорректные данные. В частности пользователь оповещался о том, что в строках содержится ставка НДС "Без НДС", которой не должно содержаться, т.к. организация документа - на ОСН.
Требуется здесь разъяснить, что это не проверка заполнения на наличие незаполненных данных, а проверка заполнения некорректными данными с точки зрения ведения учета в конкретной организации. Проверка заполнения (заполнен или нет реквизит или ячейка табличной части объекта) есть в типовом механизме управляемых форм, но он не предоставляет возможности сравнивать уже заполненные значение с контрольными. К тому же в основном такой типовой функционал препятствует закрытию формы. А в задаче необходимо, чтобы форма могла быть закрыта и пользователь получил сообщения. Этот функционал конвертировался в рамках перехода с конфигурации 1С: Управление торговлей, ред. 10.3 (далее по тексту УТ 10.3) на конфигурацию 1С: Управление торговлей, ред. 11 (далее УТ 11). В УТ 10.3 все было исключительно просто в процедуре "ПередЗакрытием" формы документа содержался исполняемый код. Можно было бы предположить, что код проверки с функцией "Сообщить()", помещенный в процедуру "ПередЗакрытием" управляемой формы некорректно написан, поэтому и не отрабатывает. Но это было не так - по отладчику сообщения заполнялись корректно, но не отображались. Код был переделан с использованием метода "СообщениеПользователю", по отладчику отрабатывал без ошибок и должен был работать, но тоже сообщения не выводились. Чтобы окончательно проверить работу кода проверки ставок НДС был добавлен интерактивный обработчик на форму документа. По нажатию на кнопку функционал работал: Нажатие на изображении увеличит его И тут важно понимать особенности работы управляемых форм в управляемом приложении 1С 8. Окно, а даже точнее, элемент формы "Сообщения", динамически формируется для методов "Сообщить" или "СообщениеПользователю" пока форма существует и привязывается к форме, для которой вызывается. Поэтому при закрытии получается вполне логичная вещь - пользователь просто даже не успевает увидеть окно "Сообщения", как оно закрывается вместе с формой, для которой платформа его вывела. В примере - это форма документа "Заказ клиента". Нажатие на изображении увеличит его Вот логически и получается, что нужно как минимум "отвязать" возникающие сообщения от текущей формы. Метод "Сообщить()" вообще не предполагает никаких других параметров кроме того, чтобы только выводить передаваемый в него текст сообщения. А вот метод "СообщениеПользователю" предоставляет возможность выводить сообщения в другую форму за счет свойства "КлючДанных". Нажатие на изображении увеличит его Описание свойства "КлючДанных": в управляемой форме клиентского приложения, в случае выполнения просмотра сообщения, выполняется описанный далее механизм обработки. Если у сообщения свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы (ссылкой объекта или ключом записи регистра сведений), то:
К какой-либо другой форме привязаться сложно, т.к. в любой момент времени мы не можем знать, какая иная форма может быть открыта. Поэтому остается создать пустую форму для объекта - в этом примере это произвольная форма документа без каких-либо дополнительных элементов. Нажатие на изображении увеличит его Далее в коде надо, исходя из описания для "КлючДанных" и/или "ПутьКДанным" определить значения. Но для них они должны быть конкретными: для "КлючДанных" - это должна быть ссылка на объект информационной базы, к которому это сообщение относится, или ключ записи, а "ПутьКДанным" должен быть представлен в виде строки, содержащей указание на путь в форме, которая будет отображать сообщение, до объекта, связанного с этим сообщением. "КлючДанных" не подходит, т.к. документ-ссылка и его форма закрыта, открывать ее нет смысла. И надо подбирать/перебирать варианты для "ПутьКДанным". Проще обратиться к методу "УстановитьДанные" метода "СообщениеПользователю". Нажатие на изображении увеличит его Параметр, передаваемый в "УстановитьДанные" может быть произвольным, поэтому в него можно передать предварительно открытую форму: Нажатие на изображении увеличит его
И, в конечном счете получим несложный результат: Нажатие на изображении увеличит его При необходимости можно усложнить вывод в форму для сообщений, переделав ее, передавая параметры в нее. Можно передавать не в форму, а в другой объект. Но это не основная цель этой публикации. Главное реализовать простой пример для демонстрации работы в привязке к решению прикладной задачи. Конечно, предложенное решение не может претендовать на звание "единственно верного". Как известно, что в программировании возможны различные способы решения одной и той же задачи, но надо понимать, что разные способы - это разная скорость выполнения задачи. Но это в контексте данной темы не главное. Главное, чтобы сложилось правильное понимание поведения управляемых форм в 1С 8, начиная с версии 8.2, и событий, с ними связанных, чтобы преодолевать подобные сложности при конфигурировании. Т.к. в начале профессиональной деятельности связанной с управляемым интерфейсом основная проблема программистов - осознание, какие процессы протекают на стороне сервера &НаСервере, а какие на стороне клиентского приложения &НаКлиенте. Оцените, оказалась ли эта публикация полезна для Вас?
© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу. 30-12-2016 Журавлев А.С. (Сайт www.azhur-c.ru) |
|
||||||||||||||||||||||||||||
Copyright 2013-. Azhur-c.ru
ИП Журавлев Александр Сергеевич ИНН 667000271590 ОГРНИП 312667014300041 |