Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Автоматическая подстановка цены в документ при выборе номенклатуры ⇐ ПредыдущаяСтр 2 из 2 Наша задача заключается в следующем. Цена номенклатуры у нас теперь хранится в отдельном регистре сведений. Когда мы создаем или изменяем документ ОказаниеУслуги и добавляем в табличную часть какую-либо номенклатуру, нам хочется, чтобы одновременно с этим в документ подставлялась бы сразу и актуальная цена этой номенклатуры, полученная из регистра сведений и соответствующая дате документа. Для этого нам нужно сделать две вещи. Сначала написать некую функцию, которая будет возвращать нам актуальную цену номенклатуры, а затем вызвать эту функцию в тот момент, когда в документ добавляется номенклатура, и подставить в документ цену номенклатуры, которую вернет эта функция. Поскольку такой «сервис» понадобится нам, скорее всего, не только в этом документе, но и в других документах, которые содержат в табличной части номенклатуру, мы разместим функцию в некотором «общедоступном» месте - в общем модуле. В режиме Конфигуратор Функция, возвращающая цену номенклатуры Сначала мы создадим функцию РозничнаяЦена(), которая будет возвращать нам актуальную розничную цену номенклатуры, и поместим ее в общий модуль конфигурации. Откроем конфигуратор, в ветке Общие ► Общие модули добавим новый объект конфигурации Модуль и назовем его РаботаСоСправочниками. Мы видим, что у модуля по умолчанию установлен флажок Сервер. Это означает, что экземпляры этого модуля будут скомпилированы только на стороне сервера. Установим флажок Вызов сервера для того, чтобы экспортные процедуры и функции этого модуля можно было вызывать с клиента (рис. 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. Как получить значения ресурсов наиболее поздних записей регистра средствами встроенного языка.
|