[Практика программирования] Управляемые формы 1С 8: не отображаются сообщения из процедур закрытия формы
 
Если в обычном интерфейсе результат действия функции Сообщить выводился всегда и в отдельном окне. То в случае ее использования в управляемом интерфейсе для отдельных задач, в частности применения в событиях закрытия форм, нужно иметь в виду конкретное замечание, иначе будет казаться, что "Сообщить()" не работает, так же может казаться, что не работает "СообщениеПользователю".

Столкнуться с данной проблемой "повезло" в контексте задачи оповещения пользователей при закрытии формы документа "Заказ клиента" конфигурации "1С: Управление торговлей, ред. 11", работающей в режиме управляемого приложения. А равно проблема может повториться в любой конфигурации, работающей в режиме управляемого приложения.

Немного подробнее о задаче. При закрытии форму документа пользователь должен получать справочно сообщения о некорректно заполненных данных в табличной части документа, конкретно для строк с указанием номеров, где содержаться некорректные данные. В частности пользователь оповещался о том, что в строках содержится ставка НДС "Без НДС", которой не должно содержаться, т.к. организация документа - на ОСН. 

1С 8, управляемый интерфейс, формы, не выводятся сообщения пользователю при закрытии формы
Рис. 1. Пример работы функционала проверки в базе конфигурации Управление торговлей 10.3

Требуется здесь разъяснить, что это не проверка заполнения на наличие незаполненных данных, а проверка заполнения некорректными данными с точки зрения ведения учета в конкретной организации. Проверка заполнения (заполнен или нет реквизит или ячейка табличной части объекта) есть в типовом механизме управляемых форм, но он не предоставляет возможности сравнивать уже заполненные значение с контрольными. К тому же в основном такой типовой функционал препятствует закрытию формы. А в задаче необходимо, чтобы форма могла быть закрыта и пользователь получил сообщения. Этот функционал конвертировался в рамках перехода с конфигурации 1С: Управление торговлей, ред. 10.3 (далее по тексту УТ 10.3) на конфигурацию 1С: Управление торговлей, ред. 11 (далее УТ 11). В УТ 10.3 все было исключительно просто в процедуре "ПередЗакрытием" формы документа содержался исполняемый код. 

Можно было бы предположить, что код проверки с функцией "Сообщить()", помещенный в процедуру "ПередЗакрытием" управляемой формы некорректно написан, поэтому и не отрабатывает. Но это было не так - по отладчику сообщения заполнялись корректно, но не отображались. Код был переделан с использованием метода "СообщениеПользователю", по отладчику отрабатывал без ошибок и должен был работать, но тоже сообщения не выводились. Чтобы окончательно проверить работу кода проверки ставок НДС был добавлен интерактивный обработчик на форму документа. По нажатию на кнопку функционал работал:

Нажатие на изображении увеличит его
1С 8, управляемые формы, не работает Сообщить, СообщениеПользователю, перед, при закрытии формы
Рис. 2. Пример работы методов "Сообщить()" и "СообщениеПользователю" в управляемой форме при ручном вызове по кнопке-команде управляемой формы.

И тут важно понимать особенности работы управляемых форм в управляемом приложении 1С 8. Окно, а даже точнее, элемент формы "Сообщения", динамически формируется для методов "Сообщить" или "СообщениеПользователю" пока форма существует и привязывается к форме, для которой вызывается. Поэтому при закрытии получается вполне логичная вещь - пользователь просто даже не успевает увидеть окно "Сообщения", как оно закрывается вместе с формой, для которой платформа его вывела. В примере - это форма документа "Заказ клиента".

Нажатие на изображении увеличит его
1С 8, почему не показываются сообщения, пользователю перед, при закрытии управляемой формы
Рис. 3. Окно "Сообщения" в управляемой форме объекта 1С 8, которое вызывается с помощью методов "СообщениеПользователю" и "Сообщить()".

Вот логически и получается, что нужно как минимум "отвязать" возникающие сообщения от текущей формы. Метод "Сообщить()" вообще не предполагает никаких других параметров кроме того, чтобы только выводить передаваемый в него текст сообщения. А вот метод "СообщениеПользователю" предоставляет возможность выводить сообщения в другую форму за счет свойства "КлючДанных".

Нажатие на изображении увеличит его
1c 8, 1C, использование метода, СообщитьПользователю, чтобы вывести в другую форму
Рис. 4. Описание свойства "КлючДанных" метода "СообщениеПользователю".

Описание свойства "КлючДанных": в управляемой форме клиентского приложения, в случае выполнения просмотра сообщения, выполняется описанный далее механизм обработки. Если у сообщения свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы (ссылкой объекта или ключом записи регистра сведений), то:

  • открывается новая форма объекта, соответствующая значению свойства КлючДанных;
  • если у сообщения свойство ПутьКДанным не заполнено, то в него проставляется имя основного реквизита открытой формы объекта;
  • вызывается показ сообщения в только что открытой форме;
  • выполняется перенос всех соответствующих сообщений из окна первой формы в новую форму (с таким же значением свойств КлючДанных, как у выбранного сообщения). При этом перенесенным сообщениям аналогичным образом проставляется свойство ПутьКДанным, если оно не установлено.

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

Нажатие на изображении увеличит его
1С 8, управляемый интерфейс, приложение, отображение сообщений пользователю при закрытии формы
Рис. 5. Создание произвольной формы для документа для вывода сообщений пользователю

Далее в коде надо, исходя из описания для "КлючДанных" и/или "ПутьКДанным" определить значения. Но для них они должны быть конкретными: для "КлючДанных" - это должна быть ссылка на объект информационной базы, к которому это сообщение относится, или ключ записи, а "ПутьКДанным" должен быть представлен в виде строки, содержащей указание на путь в форме, которая будет отображать сообщение, до объекта, связанного с этим сообщением. "КлючДанных" не подходит, т.к. документ-ссылка и его форма закрыта, открывать ее нет смысла. И надо подбирать/перебирать варианты для "ПутьКДанным". Проще обратиться к методу "УстановитьДанные" метода "СообщениеПользователю". 

Нажатие на изображении увеличит его
1С 8,
Рис. 6. Использование метода "УстановитьДанные" для "СообщениеПользователю".

Параметр, передаваемый в "УстановитьДанные" может быть произвольным, поэтому в него можно передать предварительно открытую форму:

Нажатие на изображении увеличит его

Рис. 7. Пример результирующего кода для вывода сообщений пользователю в 1С 8 после закрытия управляемой формы.

1 | СП = Новый СообщениеПользователю;
2 | ФормаСообщений = ОткрытьФорму("Документ.ЗаказКлиента.Форма.ДопМФ_ФормаСообщений");
3 | СП.УстановитьДанные(ФормаСообщений);
4 | СП.Текст = "В строке " + Строка(Стр) + " указано неверное значение ""Ставка НДС""";
5 | СП.Сообщить();

И, в конечном счете получим несложный результат:

Нажатие на изображении увеличит его
1C 8, как вывести сообщения пользователю при закрытии или перед закрытием управляемой формы
Рис. 8. Пример успешного результата вывода сообщений пользователю после закрытия управляемой формы в отдельную форму.

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

Конечно, предложенное решение не может претендовать на звание "единственно верного". Как известно, что в программировании возможны различные способы решения одной и той же задачи, но надо понимать, что разные способы - это разная скорость выполнения задачи. Но это в контексте данной темы не главное. Главное, чтобы сложилось правильное понимание поведения управляемых форм в 1С 8, начиная с версии 8.2, и событий, с ними связанных, чтобы преодолевать подобные сложности при конфигурировании. Т.к. в начале профессиональной деятельности связанной с управляемым интерфейсом основная проблема программистов - осознание, какие процессы протекают на стороне сервера &НаСервере, а какие на стороне клиентского приложения &НаКлиенте.

Оцените, оказалась ли эта публикация полезна для Вас?

© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

30-12-2016

Журавлев А.С. (Сайт www.azhur-c.ru)

Назад

 
 

Здесь можно
приобрести лицензии

1С 8
​ и типовые решения

ural-rosaudit.ru - Аудит в сфере ЖКХ, www.ural-rosaudit.ru
azhur-blog.ru - мошенничество в интернете, www.azhur-blog.ru
info-compas.ru - каталог, инфокурсы, видеокурсы, видео курсы, обучение он-лайн, www.info-compas.ru
https://vk.com/effective_ideas - Группа вКонтакте Методы заработка и работы при помощи Интернет

 

Проверить аттестат
Cистема приема платежей, касса для сайта
Cистема управления контентом Santafox&trade. Санкт-Петербург, Ленинский проспект, д. 23 (812) 545-47-48
Яндекс.Метрика