Опубликован: 06.12.2011 | Уровень: для всех | Доступ: платный
Лекция 4:

Справочники, разработка форм

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

Клиентские методы в модуле формы

Теперь перейдем к написанию кода, в котором будем формировать наименование. Для этого нам нужно понимать, что конфигурации 1С:Предприятие управляются событиями – и сейчас нас интересуют события формы.

Выделим форму в окне Элементы, откроем окно ее свойств и рассмотрим группу свойств События, рис. 3.18.. Наименование должно быть сформировано до того, как данные объекта будут записаны. Для достижения нашей цели нам вполне подойдет событие ПередЗаписью. Здесь же можно выполнить какие-либо пользовательские проверки полей перед формированием наименования. Хотя, если говорить о производительности решения, лучше подобные проверки производить на сервере, например, с помощью обработчика события ОбработкаПроверкиЗаполнения, который создается в модуле объекта.

Выбор события для выполнения запланированных действий

увеличить изображение
Рис. 3.18. Выбор события для выполнения запланированных действий

Нажмем на кнопку с увеличительным стеклом в поле события ПередЗаписью – автоматически будет открыт модуль формы и создан пустой обработчик события ПередЗаписью. Он имеет следующий вид:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
  // Вставить содержимое обработчика.
КонецПроцедуры>

Из директивы компиляции &НаКлиенте понятно, что процедура это клиентская, она имеет два параметра – нас сейчас интересует параметр Отказ – благодаря этому параметру, а именно, установив его в значение Истина, мы можем отказаться от записи объекта в том случае, если выполняется какое-либо условие, препятствующее записи. В нашем случае записи объекта могут воспрепятствовать незаполненные или неправильно заполненные поля Фамилия, Имя или Отчество. Проверку на незаполненность реквизита мы можем доверить и системе – для этого можно установить свойство Проверка заполнения для нужных реквизитов в значение Выдавать ошибку, делается это в списке реквизитов объекта в окне редактирования объекта или в дереве конфигурации, рис. 3.19. Не будем включать проверку заполнения, выполним ее и еще некоторые проверки самостоятельно.

Настройка проверки заполнения

увеличить изображение
Рис. 3.19. Настройка проверки заполнения

Параметры и процедуры в системе 1С:Предприятие по умолчанию передаются по ссылке – передав в процедуру некую переменную, мы, на самом деле, передаем ссылку на нее, то есть – при модификации соответствующего этой переменной параметра внутри процедуры, фактически, происходит и модификация переменной. Вернемся к нашей процедуре ПередЗаписью.

В этой процедуре мы сначала проверим поля Фамилия, Имя и Отчество на заполненность (возможны и более сложные проверки), после чего, если хотя бы одно поле не заполнено – сообщим об этом пользователю и выйдем из процедуры, если все поля заполнены – сформируем наименование. Вот какой код позволяет реализовать эту задачу:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
 //Переменная для хранения текста сообщения пользователю
 Перем ТекстСообщения;
 //Запишем пустую строку в переменную
 ТекстСообщения="";
  //Если не введена фамилия...
 Если ПустаяСтрока(Объект.Фамилия) Тогда
   //Формируем строку сообщения
   ТекстСообщения=ТекстСообщения+"Не заполнено поле Фамилия;";  
 КонецЕсли;
  //Если не введено имя...
 Если ПустаяСтрока(Объект.Имя) Тогда
   ТекстСообщения=ТекстСообщения+" Не заполнено поле Имя;";  
 КонецЕсли;
 //Если не введено отчество...
 Если ПустаяСтрока(Объект.Отчество) Тогда
   ТекстСообщения=ТекстСообщения+" Не заполнено поле Отчество;";  
 КонецЕсли;
  //Если строка сообщения не пуста, то есть - содержит
  //сообщения о незаполненных полях
  Если НЕ ПустаяСтрока(ТекстСообщения) Тогда
   //Выводим сообщение
   Сообщить(ТекстСообщения);
   //Отказываемся от записи объекта
   Отказ=Истина;
   //Выходим из процедуры
   Возврат;
 КонецЕсли;
 //Если все поля заполнены, выхода из процедуры не произошло,
 //формируем наименование
 Объект.Наименование=Объект.Фамилия+" "+ ВРег(Лев(Объект.Имя,1))+". "+ВРег(Лев(Объект.Отчество,1))+".";
КонецПроцедуры

Строковая функция Лев позволяет получить заданное количество символов из строки, начиная с самого левого. Строковая функция ВРег переводит символы в верхний регистр – на тот случай, если пользователь случайно ввел имя, фамилию или отчество с маленькой буквы. Конечно, здесь можно предусмотреть еще множество проверок и автоматических корректировок (например, можно исправить первую букву во введенных фамилии, имени и отчестве, если она случайно введена в нижнем регистре), мы ограничимся тем, что сделано сейчас.

В итоге мы получаем следующие сообщения об ошибках при незаполненности полей, рис. 3.20.

Сообщение об ошибке

увеличить изображение
Рис. 3.20. Сообщение об ошибке

После успешного выполнения процедуры ПередЗаписью, наименование выглядит следующим образом. Мы намеренно ввели отчество с маленькой буквы – как было пояснено выше, наш код готов к такому повороту событий, рис. 3.21.

Новая запись в справочнике Физические лица

увеличить изображение
Рис. 3.21. Новая запись в справочнике Физические лица
< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Лариса Дятчина
Лариса Дятчина

Код 

&НаКлиенте

Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)

Если НЕ ПроверитьЗаполнениеРеквизита() Тогда

 Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента.");

КонецЕсли;

КонецПроцедуры

 

&НаСервере

Функция ПроверитьЗаполнениеРеквизита()

 Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);  

КонецФункции

&НаСервере

Процедура УстановитьНомерПредставителя()

 

 Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения;

КонецПроцедуры

При проверке выдает ошибку:

{Справочник.Контрагенты.Форма.ФормаСписка.Форма(12,11)}: Переменная не определена (Объект)
 Возврат (<<?>>Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);   (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,2)}: Переменная не определена (Объект)
 <<?>>Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,32)}: Переменная не определена (Объект)
 Объект.ТелефонКонтактногоЛица=<<?>>Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(6,41)}: Переменная не определена (Объект)
 Сообщить("Выбранное контактное лицо, "+<<?>>Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента."); (Проверка: Тонкий клиент)

 

работаю на версии 1С:Предприятие 8.3 (8.3.10.2650)

максим матасов
максим матасов
Леонид Альбрехт
Леонид Альбрехт
Россия, Екатеринбург, 10, 2004
Оксана Максимова
Оксана Максимова
Россия, Екатеринбург, Уральский государственный университет им. А. М. Горького, 2013