close

Вход

Забыли?

вход по аккаунту

?

Лабраб4

код для вставкиСкачать
2.4 Лабораторная работа № 4. Регистры сведений
Цель работы. Получение навыков работы с регистрами сведений.
2.4.1 Теоретические сведения Объект конфигурации "Регистр сведений" является прикладным объектом и предназначен для описания структуры хранения данных в разрезе нескольких измерений. На основе этого объекта платформа создает в базе данных информационную структуру, в которой может храниться произвольная информация "привязанная" к набору измерений.
Основная задача регистра сведений - хранить существенную для прикладной задачи информацию, состав которой развернут по определенной комбинации значений и, при необходимости, развернут во времени. Например, если мы хотим хранить информацию о ценах конкурентов на продаваемые нами товары, то собранная информация о ценах разворачивается по товарам и конкурентам. А если мы хотим отслеживать динамику изменений цен, и будем заносить их периодически, то хранимая информация разворачивается также и во времени. Эта информация хранится в регистре в виде записей. На запись нельзя сделать ссылку из информационной базы. В системе может быть только одна запись с определенной комбинацией измерений и периодом.
В системе "1С: Предприятие" для хранения подобных данных и работы с ними используется специальный механизм - регистры сведений.
Важной особенностью регистра сведений является его способность (при необходимости) хранить данные с привязкой ко времени. Благодаря этому регистр сведений может хранить не только актуальные значения данных, но и историю их изменения во времени. Регистр сведений, использующий привязку ко времени называют обычно периодическим регистром сведений.
Периодичность регистра сведений можно определить одним из следующих значений:
* в пределах секунды,
* в пределах дня,
* в пределах месяца,
* в пределах квартала,
* в пределах года.
* в пределах регистратора (если установлен режим записи -
"Подчинение регистратору").
Периодический регистр сведений всегда содержит служебное поле "Период", добавляемое системой автоматически. Оно имеет тип Дата, и служит для указания факта принадлежности записи к какому-либо периоду. При записи данных в регистр, платформа всегда приводит значение этого поля к началу того периода, в который он попадает. Например, если в регистр сведений с периодичностью в пределах месяца записать данные, в которых период указан как 08.04.2004, то регистр сохранит эти данные со значением периода равным 01.04.2004.
Регистр сведений, фактически, представляет собой массив данных, необходимый, чтобы реализовать функцию, которая может выдать необходимую информацию по определенному набору аргументов. Аргументы функции называются измерениями, а результат функции - ресурсами. В приведенном выше примере регистр "ЦеныКонкурентов" будет содержать измерения "Конкурент" и "Товар", и ресурс "Цена". Ресурсов может быть больше чем один: например, можно хранить оптовую и розничную цены.
Для разворота этой информации во времени используется поле "Период" регистра. Оно не вносится в качестве измерения, а добавляется системой автоматически при создании периодического регистра.
Для периодических регистров сведений система поддерживает такие стандартные операции, как получение наиболее позднего или наиболее раннего значения по определенной комбинации измерений (например, получение последней введенной цены по конкретному товару и конкретному конкуренту), а также получения среза наиболее поздних или ранних значений. Например, могут быть получены все последние введенные цены по различным товарам и конкурентам.
Наиболее характерный пример периодической величины - курс валюты. При выполнении каких-либо расчетов (например, при определении рублевой цены пересчетом валютной цены по курсу) важно знать его величину на момент вычисления.
Особенно важно знать курс валюты при выполнении каких-либо расчетов "задним числом" - в этом случае необходимо "вспоминать" курс за уже прошедшие даты.
Чтобы иметь возможность получать подобные сведения, необходимо создать таблицу, графами в которой были бы, очевидно, наименование валюты, дата курса, и сама величина курса. Строки такой таблицы содержат курс определенной валюты на конкретную дату.
Дата ВалютаКурс 31.01.2002 USD30,137231.01.2002EUR26,545628.02.2002USD 30,940428.02.2002EUR26,712030.03.2002USD31,1192 30.03.2002EUR27,1515 При обращении к подобной таблице следует иметь в виду, что в колонке "Курс" хранятся конкретные величины курса на определенную дату, и подразумевается, что на все последующие даты, до новой величины курса, курс не меняется. Поэтому для получения курса на какую-то промежуточную дату следует брать величину курса на ближайшую предыдущую дату, на которую существует записанный курс.
Также следует понимать, что различные значения валют в колонке "Валюта" фактически означают, что ведется параллельная история курсов нескольких валют. Иначе говоря, приведенную выше таблицу можно отобразить по-другому:
Дата Курс USD Курс EUR 31.01.200230,137226,545628.02.200230,940426,712030.03.2002 31,119227,1515 Подобных колонок курсов в таблице может быть столько, сколько курсов разных валют требуется хранить.
Если регистр не периодический, то поле "Период" для него не создается. В приведенном примере регистр "ЦеныКонкурентов" может быть непериодическим, если мы не хотим хранить историю изменения цен, а хотим иметь только актуальные цены. Тогда функция регистра сможет ответить на вопрос "какая сейчас цена у такого-то конкурента на такой-то товар", но не сможет ответить на вопрос "какая была цена у такого-то конкурента на такой-то товар в начале года".
Из описанных принципов работы регистра сведений вытекает то, что в системе может быть только одна запись с определенным набором и периодом измерений. Действительно, по одному товару по одному конкуренту может быть только одна цена. Если по какой-либо причине мы можем получить несколько цен и хотим занести эту информацию в базу данных, то нам нужно создать еще одно измерение для хранения того значения, по которому эти цены могут различаться. Например, можно завести измерение "ИсточникИнформации". Тогда можно будет вводить цены конкурентов в разрезе источников.
Как и для других регистров, система контролирует уникальность записей для регистра сведений. Однако, если для прочих регистров уникальным идентификатором записи является регистратор и номер строки, то для регистра сведений применяется другой принцип формирования ключевого значения.
Ключом записи, однозначно идентифицирующим запись, является в данном случае совокупность значений измерений регистра и периода (в случае, если регистр сведений периодический). Регистр сведений не может содержать несколько записей с одинаковыми ключами.
Регистр сведений предоставляет больше свободы в редактировании хранимых данных по сравнению с другими типами регистров. Наряду с тем, что регистр сведений может использоваться в режиме подчинения регистратору (когда записи регистра сведений "привязаны" к документу-регистратору), регистр сведений может использоваться и в независимом режиме, в котором пользователю предоставляется полная свобода интерактивной работы с данными регистра. Регистр сведений, не использующий подчинение регистратору, называют независимым регистром сведений.
Строки регистра сведений, содержащие информацию о значениях ресурсов для определенных значений измерений и конкретного периода, называются записями. Записи в регистр сведений можно вносить двумя способами: вручную или документами.
Эти два варианта влияют на способ внесения информации, а не на основную логику работы регистра.
Документ, которым вносится запись в регистр сведений, называется регистратором.
Регистры, записываемые независимо, могут свободно редактироваться вручную или средствами встроенного языка. При этом, если измерение такого регистра назначено как "ведущее" и значением измерения является ссылка на объект базы данных, то будет считаться, что запись регистра имеет смысл, только пока существует этот объект. Например, если назначить ведущим измерение "Конкурент", то считается, что запись имеет смысл только как информация по данному конкуренту. Соответственно, при удалении конкурента записи по нему будут удалены автоматически.
Если регистр записывается регистратором, то это значит, что записи будут жестко подчинены регистраторам - документам. Обычно это значит, что записи будут порождаться при проведении документов. Соответственно, при удалении документа записи будут удаляться автоматически. В отличие от ведущих измерений, регистратор может быть только один.
2.4.1.1 Регистр сведений "КурсыВалют"
Создайте справочник "Валюты", определите реквизит "ПолноеНаименование", настройте форму списка. Справочник без иерархии, не подчиненный, принадлежит подсистеме "Торговля".
После этого создайте регистр сведений "КурсыВалют". У него определите одно измерение "Валюта" ("ведущее") - ссылка на справочник "Валюты", ресурс "Кратность" - число (10,3), определите режим редактирования "в диалоге", настройте форму списка, форму записи регистра.
Рис. 98 Создание ресурса сведений
Рис. 99 Задание измерений ресурса
Рис. 100 Задание ресурсов регистра
Рис. 101 Создание форм для регистра сведений
Перейдем в пользовательский режим и там зададим несколько типов валют и значений их курсов на разные даты ("Операции" - "Регистр сведений").
Рис. 102 Задание значений курсов валют на разные даты
2.4.1.2 Отбор в диалоге
Добавим в форму списка возможность непосредственно из самой формы управлять отборами, для этого модифицируем форму списка, добавим на форму два флажка и три поля ввода ("Форма"-"Вставить Элемент Управления"):
* Флажок1 - Отбор.Валюта.Использование;
* Флажок2 - Отбор.Период.Использование;
* ПолеВвода1 - Отбор.Валюта.Значение;
* ПолеВвода2 - Отбор.Период.ВидСравнения;
* ПолеВвода3 - Отбор.Период.Значение.
Рис. 103 Размещение в диалоге флажка 1
Рис. 104 Размещение в диалоге флажка 2 Рис. 105 Размещение в диалоге поля ввода 1
Рис. 106 Размещение в диалоге поля ввода 2
Рис. 107 Размещение в диалоге поля ввода 3
Далее в свойствах необходимо указать:
* для флажка "по валюте" в свойстве "Данные" необходимо выбрать "РегистрСведенийСписок.Отбор.Валюта.Использование";
Рис. 108 Настройка флажка 1
* для флажка "по валюте" в свойстве "Данные" необходимо выбрать "РегистрСведенийСписок.Отбор.Период.Использование";
Рис. 109 Настройка флажка 2
* Для поля ввода "Условие" в свойстве "Данные" необходимо выбрать "РегистрСведенийСписок.Отбор.Валюта.Значение";
Рис. 110 Настройка поля ввода 1
* Для поля ввода 2 в свойстве "Данные" необходимо выбрать "РегистрСведенийСписок.Отбор.Период.ВидСравнения";
Рис. 111 Настройка поля ввода 2
* Для поля ввода 3 в свойстве "Данные" необходимо выбрать "Отбор. Период. Значение".
Рис. 112 Настройка поля ввода 3
В результате получается следующая форма списка:
Рис. 113 Форма списка с отбором
Запустите "1С: Предприятие" в пользовательском режиме и посмотрите на работу регистра сведений "Валюты".
Рис. 114 Форма списка с отбором в пользовательском режиме
2.4.1.3 Чтение значения курса валют
Модифицируем документ "ПриходнаяНакладная" для добавления возможностей учета документов, составленных в разных валютах. Для этого в документ добавим реквизиты "Валюта" типа "СправочникСсылка.Валюты" и "Курс" типа число(10,3). В форму документа поместим реквизит данных "Валюта" и добавим реквизит формы "Курс" в виде надписи. Определим обработчик события "ПриИзменении" для поля ввода, связанного с валютой.
Рис. 115 Обработчик события "ПриИзменении"
Следует отметить, что курс будет показываться только после выбора валюты, а при открытии уже заполненного документа этого происходить не будет. Подобный результат определяется событием, которое выбрали для заполнения реквизита формы "Курс", но этот недостаток можно устранить следующим образом, превратив надпись "Валюта" в гиперссылку.
Рассмотрим пример на программное открытие формы списка регистра сведений. В форме документа "ПриходнаяНакладная" в надписи "Валюта" отметим флажок "Гиперссылка". После этого у этой надписи определим обработчик "Нажатие".
Рис. 116 Настройка надписи как гиперссылки
Рис. 117 Процедура обработчика гиперссылки
Проверьте этот механизм на практике, открывая форму списка регистра сведений с установленным отбором из разных документов, меняя значение реквизита "Валюта".
2.4.1.4 Регистр сведений "Цены поставщиков"
В предыдущем примере мы рассмотрели основы работы с регистром сведений, у которого был ручной способ записи. Теперь рассмотрим пример, когда запись ведется регистратором.
Поставим перед собой задачу создать механизм, позволяющий отслеживать приходные цены номенклатуры в разрезе поставщиков.
Создадим регистр сведений "ЦеныПоставщиков". Регистр сведений периодический (по позиции регистратора), режим записи "Подчинение регистратору". Рис. 118 Создание регистра сведений "ЦеныПоставщиков"
У него два измерения "Поставщик" типа "СправочникСсылка.Контрагенты", "Номенклатура" типа "СправочникСсылка.Номенклатура" и один ресурс "Цена" типа "Число(15,2)". Рис. 119 Заданий измерений и ресурсов регистра
Настройте форму списка и форму набора записей.
Так как запись ведется регистратором (по смыслу документом "ПриходнаяНакладная"), необходимо модифицировать данный документ, а именно: разрешить проведение и указать, что документ является регистратором по регистру "ЦеныПоставщиков".
Рис. 120 Задание регистраторов регистра
С помощью конструктора движений настроим порядок проведения документа. Конструктор движений документа вызывается на вкладке "Движения" того документа, который будет проводиться, для этого надо щелкнуть по кнопке "Конструктор движений". В ответ откроется диалог с данными регистра и данными документа. В этом диалоге надо указать используемую табличную часть, а затем щелкнуть по кнопке "Заполнить выражения", и одноименные поля регистра и документа заполнятся автоматически. Те поля, что не заполнились автоматически, надо заполнить вручную, затем щелкнуть по кнопке "ОК", и конструктор вставит в модуль документа текст процедуры "ОбработкаПроведения".
Рис. 121 Вызов конструктора движений
Рис. 122 Работа конструктора движений
Рис. 123 Процедура обработки проведения
Проверьте работоспособность созданного вами механизма. Для этого в пользовательском режиме перезапишите несколько документов "ПриходнаяНакладная". Движения документа (записи в регистр) можно посмотреть, воспользовавшись кнопкой командной панели "Перейти".
2.4.1.5 Регистр сведений "Цены номенклатуры"
Обратим внимание на документ "ОказаниеУслуги". Как вы помните, в этом документе мы выбираем услугу, которая оказывается, и затем указываем цену.
Очевидно, что на любом предприятии существует перечень услуг, который определяет стоимость каждой услуги. Казалось бы, что стоимость услуги является неотъемлемым свойством самой услуги и поэтому стоимость услуги следует добавить в качестве реквизита справочника "Номенклатура".
Однако стоимость услуг имеет особенность меняться со временем, и может сложиться такая ситуация, что когда нам потребуется внести изменения или уточнения в один из ранее проведенных документов "ОказаниеУслуги", мы не сможем получить правильную стоимость услуги, поскольку в реквизите справочника будет храниться последнее введенное значение.
Кроме того, не исключена ситуация, что руководство предприятия пожелает видеть, как зависит прибыль предприятия от изменения стоимости оказываемых услуг. В этом случае просто необходимо будет иметь возможность анализировать изменение стоимости услуг во времени, поэтому для хранения стоимости услуг мы используем объект - регистр сведений.
Приступим к созданию периодического регистра сведений, который будет хранить развернутые во времени розничные цены материалов и стоимости услуг, оказываемых предприятием.
Откроем конфигуратор и создадим новый объект конфигурации Регистр сведений. Назовем его "ЦеныНоменклатуры". Установим периодичность этого регистра в пределах секунды.
Рис. 124 Создание регистра сведений "ЦеныНоменклатуры"
Перейдем на закладку "Данные" и создадим измерение регистра "Номенклатура" с типом СправочникСсылка.Номенклатура. Укажем, что это измерение будет ведущим. Свойство "Ведущее" имеет смысл использовать лишь тогда, когда измерение имеет тип ссылки на объект базы данных. Установка свойства "Ведущее" будет говорить о том, что запись регистра сведений представляет интерес, только пока существует этот объект. При удалении объекта, все записи регистра сведений по этому объекту тоже будут автоматически удалены. Кроме того, в форме списка справочника появляется кнопка командной панели "Перейти", по которой возможен переход к записям регистра, отобранным по значению выбранного элемента справочника.
После этого создадим новый ресурс "Цена", тип Число, длина 15, точность 2, неотрицательное.
Рис. 125 Задание измерений и ресурсов регистра
Теперь запустим 1С:Предприятие в режиме отладки и посмотрим, как работает наш периодический регистр сведений ЦеныНоменклатуры.
После этого зададим розничные цены на материалы:
Рис. 126 Задание значений периодического регистра сведений
Зададим стоимость услуг нашего предприятия, после этого зададим отпускные цены на материалы.
Итак, мы с вами имеем очень полезную возможность в нашей программе - возможность установки цен на услуги и материалы. Поскольку цены хранятся с привязкой к дате, мы можем заранее установить новые цены и быть уверенными в том, что новые цены вступят в действие не раньше указанной для них даты.
Теперь посмотрим, как можно использовать заданные нами цены в Документе "ОказаниеУслуги".
2.4.1.6 Создание функции РозничнаяЦена()
Создадим функцию, которая будет возвращать нам актуальную розничную цену номенклатуры. Откроем конфигуратор, в ветке "Общие | Общие модули" создадим новый объект конфигурации Модуль и назовем его "РаботаСоСправочниками".
Разместим в нем следующий текст:
Рис. 127 Функция получения отпускной цены
Для получения розничной цены мы будем передавать в функцию два параметра:
* АктуальнаяДата - параметр типа Дата, который будет
определять точку на оси времени, на которую нас интересует
значение розничной цены
* ЭлементНоменклатуры - ссылка на элемент справочника
"Номенклатура", для которого мы хотим получить розничную
цену.
В теле процедуры мы создаем сначала вспомогательный объект Отбор, с помощью которого определяем, что нас будут интересовать записи регистра, в которых измерение "Номенклатура" равно переданной в процедуру ссылке на элемент справочника.
Во второй строке мы обращаемся к менеджеру регистра сведений "Цены" (РегистрыСведений.ЦеныНоменклатуры) и выполняем метод ПолучитьПоследнее(), который возвращает нам значения ресурсов наиболее поздней записи регистра, которая соответствует передаваемой дате ("АктуальнаяДата") и значениям измерений регистра ("Отбор").
Значения ресурсов возвращаются в структуре, поэтому в
следующей строке мы получаем искомую нами розничную цену
просто указав имя нужного нам ресурса регистра через точку
(ЗначенияРесурсов.Цена).
2.4.1.7 Автоматическое заполнение цены в документе "ОказаниеУслуги"
Теперь проверим, как работает эта функция. Задача, которая перед нами стоит, заключается в следующем. При создании документа "ОказаниеУслуги" нам необходимо обеспечить автоматическое заполнение поля "Цена" после того, как пользователь выберет услугу. Причем цена услуги должна определяться исходя из даты создаваемого документа.
Найдем в конфигураторе документ "ОказаниеУслуги" и откроем его форму "ФормаДокумента". Откроем свойства поля ввода, расположенного в колонке "Номенклатура" табличной части "ПереченьНоменклатуры" и внизу списка найдем событие "При изменении". Нажмем на кнопку с лупой и в открывшейся заготовке обработчика события напишем текст соответствующей процедуры, аналогичные действия проделаем для табличной части "Услуги":
Рис. 128 Обработчики выбора номенклатуры
Прокомментируем содержимое обработчика.
Первая строка обработчика вам уже знакома - мы получаем текущую строку табличной части документа, так как она нам понадобится в дальнейшем.
Во второй мы устанавливаем полученную цену в документе, вызывая нашу процедуру "РозничнаяЦена". Первым параметром мы передаем дату документа, на которую необходимо получить цену, а вторым параметром мы передаем ссылку, которую отображает элемент управления формой, вызвавший это событие (Элемент.Значение), т.е. ссылку на элемент справочника "Номенклатура".
В заключение мы вызываем нашу процедуру "РассчитатьСумму" из общего модуля "РаботаСДокументами" для того, чтобы она пересчитала итоговую сумму в строке нашего документа.
Проверим, как теперь работает наш документ. Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений "Цены". Для транзистора Philips добавим следующим числом новую цену.
Теперь откроем документ ОказаниеУслуги №1. Давайте этим документом мы как раз "израсходуем" один такой транзистор.
Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке "Номенклатура" табличной части документа. Автоматически установится первое значение цены.
Теперь изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены.
Таким образом, в документ подбирается актуальная, на момент создания документа, цена услуги.
2.4.2 Задание на лабораторную работу
1. Создайте справочник "Валюты" с кодом типа "Строка(5)", наименованием типа "Строка(25)", определите реквизит "ПолноеНаименование" типа "Строка(25)", настройте форму списка. Справочник без иерархии, не подчиненный, принадлежит подсистеме "Торговля".
2. Создайте регистр сведений "КурсыВалют". У него определите одно измерение "Валюта" ("ведущее") - ссылка на справочник "Валюты", ресурс "Кратность" - число (10,3), определите режим редактирования "в диалоге", настройте форму списка с отбором, форму записи регистра.
3. Модифицируйте документы "ПриходнаяНакладная", "Счет", "Доверенность", "РасходнаяНакладная", "ОказаниеУслуг", "ПриходныйКассовыйОрдер", "РасходныйКассовыйОрдер", введя в них дополнительные реквизиты "Валюта" типа "СправочникСсылка.Валюты" и "Курс" типа "Число (10,3)". Настройте формы документов для работы с этими реквизитами.
4. Создайте регистр сведений "ЦеныПоставщиков", периодический (по позиции регистратора), режим записи "Подчинение регистратору", с двумя измерениями "Поставщик" типа "СправочникСсылка.Контрагенты", "Номенклатура" типа "СправочникСсылка.Номенклатура" и одним ресурсом "Цена" типа "Число(15,2)". Настройте для него форму списка с отбором и форму набора записей.
5. Создайте регистр сведений "ЦеныНоменклатуры", периодический (в пределах секунды). У него определите измерение "Номенклатура" ("ведущее") - ссылка на справочник "Номенклатура", ресурс "Цена" - число (15,2), определите режим редактирования "в диалоге", настройте форму списка с отбором, форму записи регистра.
6. Модифицируйте документ "ПриходнаяНакладная" для выполнения движений по регистру сведений "ЦеныПоставщиков".
7. Модифицируйте документы "Счет", "РасходнаяНакладная", "ОказаниеУслуги" для подстановки в них при выборе материалов или услуг актуальных цен номенклатуры.
8. Определите непериодический регистр сведений "График", который будет содержать данные о количестве рабочих часов в указанный день. 2.4.3 Контрольные вопросы
1. Основное предназначение регистров сведений.
2. Особенности объекта конфигурации "регистр сведений".
3. Когда удобнее использовать регистры, несмотря на то, что необходимая информация содержится в других объектах?
4. Что такое периодический регистр сведений?
5. Что такое независимый регистр сведений?
6. Какие поля определяют ключ уникальности регистра сведений?
7. Для чего нужны измерения, ресурсы и реквизиты регистра?
8. Что такое ведущее измерение регистра? 9. Что такое движения регистра?
10. Что такое регистратор?
Документ
Категория
Рефераты
Просмотров
154
Размер файла
9 410 Кб
Теги
лабраб
1/--страниц
Пожаловаться на содержимое документа