ПОНЯТИЕ О ЗАПРОСЕ

ПОНЯТИЕ О ЗАПРОСЕ - 1c-esse

Каждый автомобиль однозначно идентифицируется VIN кодом, используем это для того,
чтобы случайно не завести один и тот же автомобиль дважды.
Добавим в справочник Автомобили новый реквизит VIN тип Строка 20 (pic 8.1)

8gl7g8001
Создадим форму элемента и форму списка. (если вы не знаете как это сделать смотрите предыдущие главы)
Установим свойство Проверка заполнения в Выдавать ошибку(pic 8.2)

8gl7g8002
Зайдем в окно редактирование формы элемента, вызовем свойство формы и сформируем заготовку процедуры ПередЗаписьюНаСервере (pic 8.3)

8gl7g8003
В этой процедуре мы будем проверять VIN на уникальность.
Внутри заготовки процедуры нажимаем правую кнопку мыши, выбираем пункт Конструктор запроса с обработкой результата (pic 8.4)

8gl7g8004
Соглашаемся с предложением системы (pic 8.5)

8gl7g8005
В открывшемся конструкторе запроса выбираем Обход результата. (pic 8.6)

8gl7g8006
Заходим на вкладку Таблицы и поля и там выбираем таблицу Автомобили (pic 8.7)

8gl7g8007
Из таблицы Автомобили выбираем поле VIN (pic 8.8)

8gl7g8008
Переходим на вкладку Условия, перетаскиваем мышкой вправо поля Ссылка, затем VIN, в выражении Автомобили.Ссылка =Ссылка, выбираем <> (pic 8.9)

8gl7g8009
Конструктор сформировал нам запрос с обходом результатов. (pic 8.10)

8gl7g8010
Сам запрос довольно простой.
Мы выбираем все VIN коды, которые равны некому введенному VIN коду в текущем элементе справочника.
Чтобы запрос не затрагивал текущий элемент справочника мы поставили условие Автомобили.Ссылка <>&Ссылка.
Такой значок в запросе & означает, что в момент выполнения в запрос будут подставлены внешние данные,
которые мы передадим через конструкцию Запрос.УстановитьПараметр.
Поправим слегка текст запроса. Во-первых, доступ к реквизитам формы элемента возможен только через элемент Объект,
поэтому вместо VIN напишем Объект.VIN, вместо Ссылка – Объект.Ссылка.
Во-вторых, нам нет нужды обходить результаты запроса.
Если в запросе будет хотя бы одно значение – это ошибка, VIN существует и записать автомобиль с таким VIN нельзя.
Что бы проверить есть ли в запросе результаты мы используем метод Пустой()
В результате наш запрос будет выглядеть так: (pic 8.11)

8gl7g8011
Если VIN существует, мы сообщим об этом пользователю и не станем записывать элемент.
Кроме VIN неплохо бы еще знать государственный регистрационный номер автомобиля.
С учетом того, что рег. Номер может меняться за время эксплуатации автомобиля, поэтому определим его  переодическим.
Перодические значения мы храним в переодическом регистре сведений.
Создадим новый регистр сведений с именем РегистрационныйНомер, перодический в пределах дня.(pic 8.12)

8gl7g8012
Добавим измерение Автомобиль тип СправочникСсылка.Автомобили и ресурс ГосНомер с типом строка длиной 10 символов. (pic 8.13)

8gl7g8013
Вернемся в окно редактирования формы элемента и добавим два реквизита ГосНомер тип строка длиной 10 символов и ДатаГосномера тип Дата (pic 8.14)

8gl7g8014
В левом окне добавим группу- Страницы, группу -Страница, группу –Обычная группа со свойством выравнивание по горизонтали (pic 8.15)

8gl7g8015
Перетащим мышкой влево в группу 3 реквизиты ГосНомер и ДатаГосНомера (pic 8.16)

8gl7g8016
Теперь нам нужно создать механизм чтения и записи регистра сведений РегистрационныйНомер.
В самом начале мы создали общий модуль под названием ЧтениеРегистраСведений.
Напишем в нем процедуру и функцию для работы с регистром сведений РегистрационныйНомер.
Процедура записи в регистр сведений РегистрационныйНомер будет аналогична процедуре ЗаписатьЗначениеДолжности (pic 8.17)

8gl7g8017
А вот функцию чтения из регистра сведений РегистрационныйНомер  мы напишем с использованием запроса.
Создадим пустую функцию
<strong> Функция ПрочитатьЗначениеГосНомера(Авто,Дт)    Экспорт   </strong>
<strong> КонецФункции </strong>
Установим курсор внутри функции и через контекстное меню вызовем Конструктор запроса с обработкой результата.
На вкладке Таблицы и поля выберем таблицу РегистрационныйНомер и из нее поле ГосНомер (pic 8.18 )

8gl7g8018
На вкладке Условия выберем РегистрационныйНомер.Период<=период и РегистрационныйНомер.Автомобиль.Ссылка=Ссылка (pic 8.19)

8gl7g8019
Нажмите ОК.  После
<strong>Пока ВыборкаДетальныеЗаписи.Следующий() Цикл</strong>
Добавте
<strong>Возврат ВыборкаДетальныеЗаписи.ГосНомер;</strong>
У вас должно получиться так: (pic 8.20)

8gl7g8020
В этом запросе мы выбираем из регистра сведений РегистрационныйНомер государственный номер автомобиля на определенную дату.
Кстати, если бы нам понадобилось выбрать номер на текущую дату можно было использовать таблицу РегистрационныйНомер.СрезПоследних и не морочиться с датой. (pic 8.21)

8gl7g8021
Заходим в конструктор формы элемента, в контекстном меню выбираем свойство формы и в
создаем заготовки для событий <strong>ПриОткрытии</strong> и <strong>ПриЗаписиНаСервере<strong/>.
Заполняем эти процедуры по аналогии со справочником Сотрудники (pic 8.22)

8gl7g8022
Еще одну процедуру нам нужно сделать при изменении актуальной даты.
В реквизите формы ДатаГосНомера заходим в контекстное меню и создаем заготовку события ОбработкаВыбора (pic 8.23)

8gl7g8023
В модуле заполняем процедуру ДатаГосНомераОбработкаВыбора по аналогии со справочником Сотрудники. (pic 8.24)

8gl7g8024
Заходим в 1С (F5).
Зайдем в подсистему Механик, откроем справочник Автомобили и в нем CITROEN JUMPER, попробуем записать этот элемент.
Система должна выдать ошибку о пустом VIN, если конечно, вы установили свойство в конфигураторе для реквизита VIN-выдавать ошибку. (pic 8.25)

8gl7g8025
Введем VIN 1234567890 (pic 8.26)

8gl7g8026
Откроем второй элемент справочника CITROEN C4 и введем тот же VIN 1234567890, будет выдано сообщение, что такой VIN уже зарегистрирован. (pic 8.27)

8gl7g8027
Введем другой VIN   и гос номер.(pic 8.28)
8gl7g8028 Откроем список справочника автомобили (pic 8.29)

8gl7g8029
Для удобства выбора здесь явно не хватает гос. Номера.
Попробуем добавить его.
Заходим в конфигуратор, в окно редактирования формы списка.
Мы видим, что данные для отображения в форме берутся из  динамического списка (pic 8.30)

8gl7g8030
Раскроем этот список и обнаружим, что никакого реквизита типа гос номера в нем нет. (pic 8.31)

8gl7g8031
Добавим поле РегистрационныйНомер.
Для этого через контекстное меню зайдем в свойства динамического списка и поставим галочку напротив пункта Произвольный запрос  (pic 8.32)

8gl7g8032
Нажмем Настройка списка Открыть. Перед нами откроется текст запроса. (pic 8.33)

8gl7g8033
Изменим этот запрос так, чтобы в него включался реквизит рег.номер.
Нажмем Конструктор запроса.
Как может быть вы помните регистрационный номер у нас храниться в переодическом регистре сведений РегистрационныйНомер.
Текущее значение номера храниться в виртуальной таблице РегистрационныйНомерСрезПоследних, добавим ее в Таблицы и выберем из нее поле ГосНомер. (pic 8.34)

8gl7g8034
Зайдем на закладку Объединения/Псевдонимы и переименуем ГосНомер в Государственный Номер (pic 8.35)

8gl7g8035
Зайдем на закладку Связи и установим флажок Все напротив поля СправочникАвтомобили,
тем самым установив ЛЕВОЕ СОЕДИНЕНИЕ,  это означает, что в запрос войдут все записи таблицы
СправочникАвтомобили и выбранные записи по условию из таблицы РегистрационныйНомерСрезПоследних  (pic 8.36)

8gl7g8036
Нажимаем ОК.
У нас должен получиться следующий запрос (pic 8.37)

8gl7g8037
В окне конструктора формы раскрываем правый список, находим там поле ГосударственныйНомер и перетаскиваем его влево. (pic 8.38)

8gl7g8038
Открываем 1С, и смотрим как выглядит наш список. (pic 8.39)

8gl7g8039