Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Автоматическая подстановка цены в документ при выборе номенклатуры





Наша задача заключается в следующем. Цена номенклатуры у нас теперь хранится в отдельном регистре сведений. Когда мы создаем или изменяем документ ОказаниеУслуги и добавляем в табличную часть какую-либо номенклатуру, нам хочется, чтобы одновременно с этим в документ подставлялась бы сразу и актуальная цена этой номенклатуры, полученная из регистра сведений и соответствующая дате документа.

Для этого нам нужно сделать две вещи.

Сначала написать некую функцию, которая будет возвращать нам актуальную цену номенклатуры, а затем вызвать эту функцию в тот момент, когда в документ добавляется номенклатура, и подставить в документ цену номенклатуры, которую вернет эта функция.

Поскольку такой «сервис» понадобится нам, скорее всего, не только в этом документе, но и в других документах, которые содержат в табличной части номенклатуру, мы разместим функцию в неко­тором «общедоступном» месте - в общем модуле.

В режиме Конфигуратор

Функция, возвращающая цену номенклатуры

Сначала мы создадим функцию РозничнаяЦена(), которая будет возвращать нам актуальную розничную цену номенклатуры, и поместим ее в общий модуль конфигурации.

Откроем конфигуратор, в ветке Общие ► Общие модули добавим новый объект конфигурации Модуль и назовем его РаботаСоСправочниками.

Мы видим, что у модуля по умолчанию установлен флажок Сервер. Это означает, что экземпляры этого модуля будут скомпилированы только на стороне сервера.

Установим флажок Вызов сервера для того, чтобы экспортные процедуры и функции этого модуля можно было вызывать с клиента (рис. 9.9).

Поместим в него следующий текст (листинг 9.1).

 

Поясним эту функцию.

Для получения розничной цены мы будем передавать в функцию два параметра:

АктуальнаяДата - параметр типа Дата, определяет точку на оси времени, в которой нас интересует значение розничной цены.

ЭлементНоменклатуры - ссылка на элемент справочника Номенклатура, для которого мы хотим получить розничную цену.

В теле функции мы сначала создаем вспомогательный объект Отбор.

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

Имя ключа структуры ("Номенклатура") должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры (ЭлементНоменклатуры) задает отбираемое по данному измерению значение.

Во второй строке мы обращаемся к менеджеру регистра сведений Цены (РегистрыСведений.Цены) и выполняем метод ПолучитьПоследнее(), который возвращает нам значения ресурсов самой поздней записи регистра, соответствующей передаваемой в функцию дате (АктуальнаяДата) и значениям измерений регистра (Отбор).

Метод ПолучитьПоследнее возвращает структуру, содержащую значения ресурсов, которая сохраняется в переменной ЗначенияРесурсов. Вообще говоря, у регистра может быть несколько ресурсов. В нашем регистре ресурс один, но все равно будет возвращена структура, содержащая единственный элемент.

Поэтому в следующей строке мы получаем искомую нами розничную цену, просто указав имя нужного нам ресурса регистра через точку (ЗначенияРесурсов.Цена) и возвращаем ее при выполнении функции.

Теперь эту функцию нужно вызвать в некоторый момент работы документа.

Вызов функции при выборе номенклатуры и заполнение цены в документе

Итак, задача, которая перед нами стоит, заключается в следующем. При редактировании документа ОказаниеУслуги нам необходимо обеспечить автоматическое заполнение поля Цена после того, как пользователь выберет услугу. Причем цена услуги должна опреде­ляться исходя из даты создаваемого документа.


Найдем в конфигураторе документ ОказаниеУслуги и откроем его форму Форма Документа.

Дважды щелкнем на элементе формы ПереченьНоменклатурыНо- менклатура или правой кнопкой мыши откроем для него палитру свойств (пункт контекстного меню Свойства). Прокрутив список до конца, найдем событие ПриИзменении, которое возникает после изменения значения поля.

Нажмем кнопку открытия В со значком лупы в поле ввода.

Система создаст шаблон процедуры обработчика этого события в модуле нашей формы и откроет закладку Модуль редактора формы.

Внесем в него следующий текст (листинг 9.2).

Прокомментируем содержимое обработчика.

Первая строка обработчика вам уже знакома по процедурам Пе- реченьНоменклатурыКоличествоПриИзменении и ПереченьНоменкла- турыЦенаПриИзменении. Сначала мы получаем текущую строку табличной части документа, так как она нам понадобится в даль­нейшем, и сохраняем ее в переменной СтрокаТабличнойЧасти.

Затем мы вызываем нашу функцию РозничнаяЦена() из общего модуля РаботаСоСправочниками.

Первым параметром мы передаем в эту функцию дату документа, на которую необходимо получить цену. Дату документа мы получаем из основного реквизита формы - Объект.Дата.

Вторым параметром мы передаем ссылку на элемент справочника Номенклатура, который содержится в текущей строке табличной части документа (СтрокаТабличнойЧасти.Номенклатура).

Функция возвращает последнее значение цены, и это значение мы присваиваем полю Цена в текущей строке табличной части документа (СтрокаТабличнойЧасти.Цена).

Затем мы вызываем процедуру РассчитатьСумму из общего модуля РаботаСДокументами. Эту процедуру мы создали с вами на преды­дущих занятиях для того, чтобы при изменении цены или количества в документе пересчитывать сумму в строке документа.

Заметьте, что сама процедура ПереченьНоменклатурыНоменклату- раПриИзменении() начинает работать в модуле формы на стороне клиента, так как это обработчик интерактивного события формы. Создавая заготовку этой процедуры, платформа автоматически разместила перед описанием процедуры директиву компиляции &НаКлиенте.

Затем вызывается функция РозничнаяЦена(). Поскольку эта функция не будет найдена на стороне клиента, то исполнение будет передано в общий модуль РаботаСоСправочниками, который выполняется на сервере. После завершения функции программный код продолжит исполняться на клиенте.

Почему в данном случае использована такая «хитрость»? Зачем было передавать исполнение кода на сервер?

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

Такие действия можно выполнить только на сервере, и если посмот­реть в синтакс-помощнике описание метода ПолучитьПоследнее() регистра сведений, то можно заметить, что этот метод доступен только на сервере, в толстом клиенте и во внешнем соединении.

Толстый клиент и внешнее соединение - это клиентские приложения прежней версии платформы, которые существуют для совместимости с прежними прикладными решениями.

Мы же с вами разрабатываем совершенно новое прикладное решение, которое работает в тонком клиенте или в веб-клиенте. Поэтому в нашем случае для получения каких-либо данных из базы данных нужно передать исполнение кода на сервер, там получить нужные данные и вернуть эти данные на клиента. Что мы и сделали.

В режиме 1С:Предприятие

Проверим, как теперь работает наш документ.

Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений Цены.

Для транзистора Philips добавим другим числом новую цену (рис. 9.10).

Теперь откроем документ Оказание услуги № 1. Как вы помните, этим документом мы как раз «израсходовали» один такой транзистор.

Оставим дату документа без изменения и повторим выбор тран­зистора в колонке Номенклатура табличной части документа. Автоматически установится значение цены транзистора от 01.07.2009. Это последнее значение цены на дату документа (рис. 9.11).

 

Теперь изменим дату документа на 13.07.2009 и снова повторим выбор транзистора. Будет установлено новое значение цены, последнее на эту дату (рис. 9.12).

Таким образом, в документе появляется актуальная на момент создания документа цена услуги.

 


Контрольные вопросы

1. Для чего предназначен объект конфигурации Регистр сведений.

2. Какими особенностями обладает объект конфигурации Регистр сведений.

3. В чем главные отличия регистра сведений от регистра накопления.

4. Какие поля определяют ключ уникальности регистра накопления.

5. Что такое периодический регистр сведений и что такое независимый регистр сведений.

6. Как создать периодический регистр сведений.

7. Что такое ведущее измерение регистра.

8. Как получить значения ресурсов наиболее поздних записей регистра средствами встроенного языка.

Date: 2016-05-25; view: 4974; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию