ПОНЯТИЕ О ЗАПРОСЕ - 1c-esse
Каждый автомобиль однозначно идентифицируется VIN кодом, используем это для того,
чтобы случайно не завести один и тот же автомобиль дважды.
Добавим в справочник Автомобили новый реквизит VIN тип Строка 20 (pic 8.1)
Создадим форму элемента и форму списка. (если вы не знаете как это сделать смотрите предыдущие главы)
Установим свойство Проверка заполнения в Выдавать ошибку(pic 8.2)
Зайдем в окно редактирование формы элемента, вызовем свойство формы и сформируем заготовку процедуры ПередЗаписьюНаСервере (pic 8.3)
В этой процедуре мы будем проверять VIN на уникальность.
Внутри заготовки процедуры нажимаем правую кнопку мыши, выбираем пункт Конструктор запроса с обработкой результата (pic 8.4)
Соглашаемся с предложением системы (pic 8.5)
В открывшемся конструкторе запроса выбираем Обход результата. (pic 8.6)
Заходим на вкладку Таблицы и поля и там выбираем таблицу Автомобили (pic 8.7)
Из таблицы Автомобили выбираем поле VIN (pic 8.8)
Переходим на вкладку Условия, перетаскиваем мышкой вправо поля Ссылка, затем VIN, в выражении Автомобили.Ссылка =Ссылка, выбираем <> (pic 8.9)
Конструктор сформировал нам запрос с обходом результатов. (pic 8.10)
Сам запрос довольно простой.
Мы выбираем все VIN коды, которые равны некому введенному VIN коду в текущем элементе справочника.
Чтобы запрос не затрагивал текущий элемент справочника мы поставили условие Автомобили.Ссылка <>&Ссылка.
Такой значок в запросе & означает, что в момент выполнения в запрос будут подставлены внешние данные,
которые мы передадим через конструкцию Запрос.УстановитьПараметр.
Поправим слегка текст запроса. Во-первых, доступ к реквизитам формы элемента возможен только через элемент Объект,
поэтому вместо VIN напишем Объект.VIN, вместо Ссылка – Объект.Ссылка.
Во-вторых, нам нет нужды обходить результаты запроса.
Если в запросе будет хотя бы одно значение – это ошибка, VIN существует и записать автомобиль с таким VIN нельзя.
Что бы проверить есть ли в запросе результаты мы используем метод Пустой()
В результате наш запрос будет выглядеть так: (pic 8.11)
Если VIN существует, мы сообщим об этом пользователю и не станем записывать элемент.
Кроме VIN неплохо бы еще знать государственный регистрационный номер автомобиля.
С учетом того, что рег. Номер может меняться за время эксплуатации автомобиля, поэтому определим его переодическим.
Перодические значения мы храним в переодическом регистре сведений.
Создадим новый регистр сведений с именем РегистрационныйНомер, перодический в пределах дня.(pic 8.12)
Добавим измерение Автомобиль тип СправочникСсылка.Автомобили и ресурс ГосНомер с типом строка длиной 10 символов. (pic 8.13)
Вернемся в окно редактирования формы элемента и добавим два реквизита ГосНомер тип строка длиной 10 символов и ДатаГосномера тип Дата (pic 8.14)
В левом окне добавим группу- Страницы, группу -Страница, группу –Обычная группа со свойством выравнивание по горизонтали (pic 8.15)
Перетащим мышкой влево в группу 3 реквизиты ГосНомер и ДатаГосНомера (pic 8.16)
Теперь нам нужно создать механизм чтения и записи регистра сведений РегистрационныйНомер.
В самом начале мы создали общий модуль под названием ЧтениеРегистраСведений.
Напишем в нем процедуру и функцию для работы с регистром сведений РегистрационныйНомер.
Процедура записи в регистр сведений РегистрационныйНомер будет аналогична процедуре ЗаписатьЗначениеДолжности (pic 8.17)
А вот функцию чтения из регистра сведений РегистрационныйНомер мы напишем с использованием запроса.
Создадим пустую функцию
<strong> Функция ПрочитатьЗначениеГосНомера(Авто,Дт) Экспорт </strong>
<strong> КонецФункции </strong>
Установим курсор внутри функции и через контекстное меню вызовем Конструктор запроса с обработкой результата.
На вкладке Таблицы и поля выберем таблицу РегистрационныйНомер и из нее поле ГосНомер (pic 8.18 )
На вкладке Условия выберем РегистрационныйНомер.Период<=период и РегистрационныйНомер.Автомобиль.Ссылка=Ссылка (pic 8.19)
Нажмите ОК. После
<strong>Пока ВыборкаДетальныеЗаписи.Следующий() Цикл</strong>
Добавте
<strong>Возврат ВыборкаДетальныеЗаписи.ГосНомер;</strong>
У вас должно получиться так: (pic 8.20)
В этом запросе мы выбираем из регистра сведений РегистрационныйНомер государственный номер автомобиля на определенную дату.
Кстати, если бы нам понадобилось выбрать номер на текущую дату можно было использовать таблицу РегистрационныйНомер.СрезПоследних и не морочиться с датой. (pic 8.21)
Заходим в конструктор формы элемента, в контекстном меню выбираем свойство формы и в
создаем заготовки для событий <strong>ПриОткрытии</strong> и <strong>ПриЗаписиНаСервере<strong/>.
Заполняем эти процедуры по аналогии со справочником Сотрудники (pic 8.22)
Еще одну процедуру нам нужно сделать при изменении актуальной даты.
В реквизите формы ДатаГосНомера заходим в контекстное меню и создаем заготовку события ОбработкаВыбора (pic 8.23)
В модуле заполняем процедуру ДатаГосНомераОбработкаВыбора по аналогии со справочником Сотрудники. (pic 8.24)
Заходим в 1С (F5).
Зайдем в подсистему Механик, откроем справочник Автомобили и в нем CITROEN JUMPER, попробуем записать этот элемент.
Система должна выдать ошибку о пустом VIN, если конечно, вы установили свойство в конфигураторе для реквизита VIN-выдавать ошибку. (pic 8.25)
Введем VIN 1234567890 (pic 8.26)
Откроем второй элемент справочника CITROEN C4 и введем тот же VIN 1234567890, будет выдано сообщение, что такой VIN уже зарегистрирован. (pic 8.27)
Введем другой VIN и гос номер.(pic 8.28)
Откроем список справочника автомобили (pic 8.29)
Для удобства выбора здесь явно не хватает гос. Номера.
Попробуем добавить его.
Заходим в конфигуратор, в окно редактирования формы списка.
Мы видим, что данные для отображения в форме берутся из динамического списка (pic 8.30)
Раскроем этот список и обнаружим, что никакого реквизита типа гос номера в нем нет. (pic 8.31)
Добавим поле РегистрационныйНомер.
Для этого через контекстное меню зайдем в свойства динамического списка и поставим галочку напротив пункта Произвольный запрос (pic 8.32)
Нажмем Настройка списка Открыть. Перед нами откроется текст запроса. (pic 8.33)
Изменим этот запрос так, чтобы в него включался реквизит рег.номер.
Нажмем Конструктор запроса.
Как может быть вы помните регистрационный номер у нас храниться в переодическом регистре сведений РегистрационныйНомер.
Текущее значение номера храниться в виртуальной таблице РегистрационныйНомерСрезПоследних, добавим ее в Таблицы и выберем из нее поле ГосНомер. (pic 8.34)
Зайдем на закладку Объединения/Псевдонимы и переименуем ГосНомер в Государственный Номер (pic 8.35)
Зайдем на закладку Связи и установим флажок Все напротив поля СправочникАвтомобили,
тем самым установив ЛЕВОЕ СОЕДИНЕНИЕ, это означает, что в запрос войдут все записи таблицы
СправочникАвтомобили и выбранные записи по условию из таблицы РегистрационныйНомерСрезПоследних (pic 8.36)
Нажимаем ОК.
У нас должен получиться следующий запрос (pic 8.37)
В окне конструктора формы раскрываем правый список, находим там поле ГосударственныйНомер и перетаскиваем его влево. (pic 8.38)