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

Справочники

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Проверка заполнения реквизита справочника, фильтрация

Расширим справочник Контрагенты, добавим в состав его реквизитов еще один – назовем его ОсновноеКонтактноеЛицо, тип – СправочникСсылка.ПредставителиКонтрагентов. Смысл этого поля заключается в хранении ссылки на представителя контрагента, который является "основным" для данного контрагента. Если нужно связаться с контрагентом, можно открыть его карточку и тут же увидеть, какой представитель является основным. Создадим форму элемента справочника Контрагенты и посмотрим на нее, попытавшись установить новое полеОсновное контактное лицо, рис. 4.18.

Попытка заполнения реквизита Основное контактное лицо

увеличить изображение
Рис. 4.19. Попытка заполнения реквизита Основное контактное лицо

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

В открывшейся палитре свойств найдем свойство Связи параметров выбора и нажмем на кнопку с тремя точками около этого поля. Появится окно Связи параметров выбора, рис. 4.20.

Окно Связи параметров выбора

Рис. 4.20. Окно Связи параметров выбора

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

Окно Связи параметров выбора с настроенным параметром

Рис. 4.21. Окно Связи параметров выбора с настроенным параметром

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

Настройки в окне Связи параметров выбора

Рис. 4.22. Настройки в окне Связи параметров выбора

После того, как эта настройка выполнена, мы можем нажать ОК в окне Связи параметров выбора и проверить функциональность решения – при заполнении поля ОсновноеКонтактноеЛицо список выбора ограничивается подчиненными элементами.

Добавим в справочник Контрагенты еще один реквизитТелефонКонтактногоЛица. Зададим тип – Строка, длина100. Этот реквизит соответствует реквизиту КонтактныеСведения справочника ПредставителиКонтрагентов. Он нужен нам исключительно для удобства – для того, чтобы, когда в форме контрагента указано основное контактное лицо, пользователю не пришлось бы, для поиска телефона контактного лица, заглядывать в его карточку.

После добавления реквизита в справочник Контрагенты, запустим режим 1С:Предприятие и откроем форму одного из элементов этого справочника. Если присмотреться к этой форме на данном этапе работы, окажется, что реквизита ТелефонКонтактногоЛица на ней не наблюдается. Все дело в том, что, создав собственную форму элемента для справочника, мы отказываемся от автоматического механизма создания форм, который, если бы не наша, самостоятельно созданная ранее форма, автоматически построил бы форму с новым реквизитом.

Добавим элемент управления для реквизита ТелефонКонтактногоЛица на форму. Откроем форму элемента справочника Контрагенты для редактирования и перетащим реквизит ТелефонКонтактногоЛица с вкладки Реквизиты на вкладку Элементы, рис. 4.23.

Реквизит ТелефонКонтактногоЛица нужно переместить со вкладки Реквизиты на вкладку Элементы

увеличить изображение
Рис. 4.23. Реквизит ТелефонКонтактногоЛица нужно переместить со вкладки Реквизиты на вкладку Элементы

В справочнике ПредставителиКонтрагентов есть реквизит, который указывает на то, что представитель контрагента работает в организации-контрагенте – это реквизит логического типа ПредставительРаботает. Нам нужно реализовать следующий функционал. Если пользователь, заполняя карточку элемента справочника Контрагенты выбирает в качестве реквизита ОсновноеКонтактноеЛицо сотрудника, у которого флаг ПредставительРаботает не установлен – мы предупреждаем пользователя об этом, выводя сообщение.

Для этого нам понадобится перехватить событие изменения поля ОсновноеКонтактноеЛицо, после чего проверить, установлен ли у выбранного контактного лица флаг ПредставительРаботает, и если такой флаг не установлен – вывести сообщение пользователю.

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

Все это реализовано с помощью нижеприведенного кода:

&НаКлиенте
Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)
Если НЕ ПроверитьЗаполнениеРеквизита() Тогда
 Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+", не работает у контрагента.");
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПроверитьЗаполнениеРеквизита()
 Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);  
КонецФункции

Кроме того, зададим автоматический механизм переноса в реквизит ТелефонКонтактногоЛица сведений из элемента справочника ПредставителиКонтрагентов, который указан в поле ОсновноеКонтактноеЛицо. В частности, дополним обработчик события для поля ОсновноеКонтактноеЛицо ПриИзменении():

Подготовим серверную процедуру, которая будет работать с реквизитами объекта, она будет иметь следующий вид:

&НаСервере
Процедура УстановитьНомерПредставителя()
 Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения;
КонецПроцедуры

Вызовем эту процедуру в уже существующем обработчике ПриИзменении, код модуля приобретет вид, показанный на рис. 4.24.

Кроме того, в окне его свойств отредактируем свойство Вид – выберем его значение Поле надписи. Пользователь не будет ничего в это поле вводить самостоятельно, поэтому поле надписи нас вполне устроит.

Код модуля формы элемента справочника Контрагенты

увеличить изображение
Рис. 4.24. Код модуля формы элемента справочника Контрагенты

При выборе "неподходящего" представителя окно элемента справочника Контрагенты примет следующий вид, рис. 4.25.

Сообщение о выборе неподходящего контактного лица

увеличить изображение
Рис. 4.25. Сообщение о выборе неподходящего контактного лица

Предположим, нам нужно, чтобы полное наименование организации было бы не короче 5-ти символов.

В предыдущей лекции, работая с формами, мы рассматривали проверку заполнения реквизитов справочника на стороне клиента. Такой подход возможен, но если говорить о производительности решения, предполагая работу конфигурации на сравнительно маломощном клиенте, лучше выполнять подобные проверки на стороне сервера. Как мы уже говорили, для проверки заполненности реквизита можно использовать стандартное свойство Проверка заполнения. Но если вам нужны более сложные проверки, если их достаточно много (например, при проверке производится манипулирование с табличными частями, получение каких-то дополнительных данных из базы, при этом алгоритмы достаточно сложны), лучше всего для проверки заполнения реквизитов воспользоваться процедурой ОбработкаПроверкиЗаполнения (), которая объявляется на уровне модуля объекта.

Объявим эту процедуру, открыв модуль объекта (закладка Прочее окна редактирования свойств объекта, кнопка Модуль объекта) выбором из списка Процедуры и функции панели инструментов модуль процедуры ОбработкаПроверкиЗаполнения().

Эта процедура работает на сервере, мы можем напрямую обращаться к реквизитам объекта.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
 Если СтрДлина(ПолноеНаименование) < 5 И НЕ ЭтотОбъект.ЭтоГруппа Тогда
   Отказ=Истина;
   Сообщить("Полное наименование организации должно быть не короче 5-ти символов");
 КонецЕсли;
КонецПроцедуры

Передаваемый в процедуру параметр Отказ можно установить в значение Истина для того, чтобы показать, что проверка не пройдена. ПроверяемыеРеквизиты – это массив, он содержит реквизиты для автоматической проверки, в частности, там находятся те реквизиты, для которых включена автоматическая проверка заполнения. По умолчанию это – реквизит Наименование. В этом можно убедиться, просмотрев содержимое переменной в отладчике.

Выводы

В данной лекции мы познакомились с иерархическими и подчиненными справочниками, а так же рассмотрели некоторые программные механизмы работы со справочниками. В частности, реализовали автоматическое заполнение при создании элемента справочника, проверку вводимых реквизитов на этапе ввода данных, рассмотрели применение процедуры ОбработкаПроверкиЗаполнения().

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Лариса Дятчина
Лариса Дятчина

Код 

&НаКлиенте

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

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

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

КонецЕсли;

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

 

&НаСервере

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

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

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

&НаСервере

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

 

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

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

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

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

 

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

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