Карпухина Н.Н. Экономические информационные системы (1084313), страница 8
Текст из файла (страница 8)
Решим следующую задачу. Необходимо, чтобы при создании или изменении документа ОказаниеУслуги и при добавлении в табличную часть какой-нибудь номенклатуры услуг, одновременно подставлялась бы сразу актуальная цена, полученная из регистра сведений и соответствующая дате документа.
Для этого необходимо:
-
написать функцию РозничнаяЦена, которая будет возвращать актуальную цену;
-
вызвать функцию, когда в документ будет добавляться новая номенклатура.
Поскольку такая функция может понадобиться в дальнейшем, напишем ее в «общедоступном» месте – в общем модуле.
1. Создать функцию РозничнаяЦена в ветке Общие – Общие модули с названием РаботаСоСправочниками. Установить флаг Вызов сервера (чтобы экспортные процедуры и функции этого модуля можно было бы вызвать с клиента) (рис. 71а).
Рис. 71а. Свойства общего модуля
2. Поместите в модуль следующий текст.
Функция РозничнаяЦена(АктуальнаяДата,ЭлементНоменклатурыУслуг)Экспорт
//Создать вспомогательный объект Отбор
Отбор = Новый Структура("НоменклатураУслуг",ЭлементНоменклатурыУслуг);
//Получить актуальные значения ресурсов регистра
ЗначенияРесурсов=РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата,Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
Поясним функцию.
Для получения розничной цены необходимо в функцию передать два параметра:
-
АктуальнаяДата – параметр типа Дата, определяет точку на оси времени, в которой нас интересует значение розничной цены.
-
ЭлементНоменклатурыУслуг – ссылка на элемент справочника НоменклатураУслуг, для которого необходимо получить розничную цену.
Эта структура содержит Отбор по измерениям регистра. С его помощью определяется искомое измерение регистра НоменклатураУслуг, которое равно переданной в функцию ссылке на элемент справочника.
Имя ключа структуры («НоменклатураУслуг ») должна совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры (ЭлементНоменклатурыУслуг) задает отбираемое по данному измерению значение.
Во второй строке идет обращение к менеджеру регистра сведений Цены (РегистрыСведений.Цены) и выполнение метода ВыполнитьПоследнее(), который возвращает значение ресурсов самой последней записи регистра, соответствующей переданной в функцию дате (АктуальнаяДата) и значениям измерений регистра Отбор.
Метод ПолучитьПоследнее возвращает структуру, содержащую значения ресурсов, которая сохраняется в переменной ЗначенияРесурсов.
В следующей строке получаем искомую розничную цену, указав имя нужного ресурса регистра через точку (ЗначениеРесурсов.Цена) и возвращаем ее при выполнении функции.
Т.о. данную функцию можно вызывать в некоторый момент времени.
3. Далее решим задачу подстановки актуальной цены в документ.
Необходимо открыть Форму документа ВыполнениеУслуги (она была создана ранее). В Модуль формы необходимо дописать Процедуру ПриИзменении.
Для этого дважды щелкните на элемент формы ПереченьНоменклатурыУслуга (рис. 71б).
Рис. 71б. Элементы документа Выполнение услуги
В окне свойств в событии ПриИзменении создайте обработчик события, в который внесем следующий текст:
&НаКлиенте
Процедура ПереченьНоменклатурыУслугаПриИзменении(Элемент)
//Получить следующую строку табличной части
СтрокаТабличнойЧасти=Элементы.ПереченьНоменклатуры.ТекущиеДанные;
//Установить цену
СтрокаТабличнойЧасти.Цена=РаботаСоСправочниками.РозничнаяЦена(Объект.Дата,СтрокаТабличнойЧасти.Услуга);
//Пересчитать сумму
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Поясним функцию.
Первая строка уже известна: сначала получаем текущую строку табличной части документа, т.к. она понадобиться в дальнейшем, и сохраним ее в переменной СтрокаТабличнойЧасти.
Затем вызываем функцию РозничнаяЦена() из общего модуля РаботаСоСправочниками.
Первым параметром в функцию передаем дату документа, на которую необходимо получить цену. Дату документа получаем из основного реквизита формы – Объект.Дата.
Вторым параметром передаем ссылку на элемент справочника НоменклатураУслуг, который содержится в текущей строке табличной части документа (СтрокаТабличной.Услуга).
Функция возвращает последнее значение цены, и это значение присваивается полю Цена в текущей строке табличной части документа (СтрокаТабличнойЧасти.Цена).
Здесь вызывается процедура РассчитатьСумму из общего модуля РаботаСДокументами.
Обратите внимание, что процедура ПереченьНоменклатурыУслугаПриИзменении() начинает работать в модуле формы на стороне клиента, т.к. это обработчик интерактивного события формы. Создавая заготовку этой процедуры, платформа автоматически разместит перед описанием процедуры директиву компиляции &НаКлиенте.
Затем вызываем функцию РозничнаяЦена(). Т.к. эта функция не будет найдена на стороне клиента, то исполнение будет передано в общий модуль РаботаСоСправочниками, который выполняется на сервере. После завершения функции программный код продолжит исполняться на клиенте.
Проверим в работе выполненные выше действия, запустим приложение в режиме 1С: Предприятие. Поработаем с разработанной конфигурацией.
ВВОД ДАННЫХ В БД
1. Введите в приложение не менее 8-ми документов Оказание услуги.
X. ПЕРЕЧИСЛЕНИЯ
Объект конфигурации Перечисления предназначен для описания структуры хранения постоянных наборов значений, не изменяемых в процессе работы конфигурации. На основе Перечислений платформа в БД создает таблицу, в которой можно хранить набор некоторых постоянных значений.
Набор возможных значений перечислений задается при конфигурировании системы, и пользователь не может изменять ,удалять или добавлять их (например, «включая НДС», «без НДС»).
Важная особенность перечислений – значения перечисления не «обезличены» для конфигурации, на них могут описаться алгоритмы работы программы.
1. Создайте новый объект конфигурации Перечисления с именем ВидыНоменклатурыУслуг (рис. 72а).
Рис. 72а. Выбор объекта конфигурации Перечисления
2. На закладке Данные добавить два значения перечисления (рис. 72б):
-
УслугаВЦеху,
-
УслугаВОфисе.
Рис. 72б. Данные перечисления Виды номенклатуры
3. Далее привяжем номенклатуру услуг к значениям перечисления.
В режиме Конфигуратор создадим новый реквизит справочника НоменклатураУслуг – ВидыНоменклатурыУслуг с типом ПеречислениеСсылка.ВидыНоменклатурыУслуг (рис. 72в).
Рис. 72в. Данные справочника НоменклатураУслуг
Обновим конфигурацию БД и запустим ее в режиме 1С: Предприятие.
Для каждого элемента справочника Номенклатура услуг задайте соответствующее значение реквизита Вид номенклатуры.
4. Проверим в работе выполненные выше действия, запустим приложение в режиме 1С: Предприятие.
XI. ОБОРОТНЫЕ РЕГИСТРЫ НАКОПЛЕНИЯ
Создадим еще один регистр накопления, который бы учитывал сумму ,оказанной услуги, количество услуг ,которые были оказаны за определенный промежуток времени. Кроме этого интересно было бы посмотреть рейтинг услуг, какому клиенту оказывались услуги (например ,чтобы представить ему скидку) ,какой мастер предоставлял услуги (чтобы начислить ему зарплату).
Для реализации этих задач создадим «хранилище» данных – оборотный регистр накопления.
Оборотный регистр накопления очень похож на знакомый регистр остатков, но для него понятие «остаток» не имеет смысла. Оборотный регистр накапливает только обороты, остатки ему «безразличны». Поэтому единственной виртуальной таблицей, которую будет создавать система для такого регистра, будет таблица оборотов. В остальном оборотный регистр ни чем не отличается от регистра остатков.
Следует сказать об одной особенности конструирования регистров накопления, напрямую связанной с возможностью получения остатков.
При создании оборотного регистра накопления нет особой сложности в определении того, какие именно параметры должны являться измерениями регистра – можно назначить в качестве его измерений любые нужные параметры.
Совсем иная ситуация в случае регистра накопления поддерживающего накопление остатков. Для него выбор измерений должен выполняться исходя из того, что движения регистра могут быть осуществлены «в две стороны»: приход и расход. Таким образом, в качестве измерений нужно выбирать те параметры, по которым движения точно будут осуществляться как в одну, так и в другую сторону.
Для разработки оборотного регистра выполним следующие действия.
1. Создать новый регистр накопления Выполненные услуги и определить вид регистра – Обороты (рис. 73а).
Рис. 73а. Создание оборотного регистра накопления
2. На закладке Данные создадим измерения регистра:
-
Услуга, тип СправочникСсылка.НоменклатураУслуг;
-
Клиент, тип СправочникСсылка.Клиент;
-
Мастер, тип СправочникСсылка.Подразделения.
У регистра будет два ресурса:
-
Количество, Тип данных – Число, Длина – 15, Флаг – неотрицательное, Точность – 0;
-
Стоимость, Тип данных – Число, Длина – 15, Флаг – неотрицательное, Точность – 2.
После создания регистр Выполненные услуги должен выглядеть в дереве конфигурации так, как показано на рис. 73б.
Рис. 73б. Оборотный регистр накопления Выполненные услуги – Измерения и ресурсы
3. Отредактируем командный интерфейс. На закладке Подсистемы отметим, что регистр будет отображаться во всех подсистема: Бухгалтерия, Оказание услуг, Расчет зарплаты.
Откроем вначале подсистему Бухгалтерия (рис. 73в).
Рис. 73в. Подсистема Бухгалтерия
При нажатии на кнопку отразятся команды выбранной подсистемы. В группе Панель навигации.Обычное включить видимость у команды Выполненные услуги и мышью перетащим ее в группу Панель навигации.См.также (рис. 73г).
Тоже самое выполните для остальных подсистем.
Рис. 73г. Командный интерфейс подсистемы Бухгалтерия