Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 70064.doc
Скачиваний:
2
Добавлен:
01.05.2022
Размер:
384.51 Кб
Скачать

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

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

Для этого необходимо:

  1. написать функцию РозничнаяЦена, которая будет возвращать актуальную цену;

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

Поскольку такая функция может понадобиться в дальнейшем, напишем ее в «общедоступном» месте – в общем модуле.

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

Функция РозничнаяЦена(АктуальнаяДата,ЭлементНоменклатурыУслуг)Экспорт

//Создать вспомогательный объект Отбор

Отбор = Новый Структура("НоменклатураУслуг",ЭлементНоменклатурыУслуг);

//Получить актуальные значения ресурсов регистра

ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

Возврат ЗначенияРесурсов.Цена;

КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

Процедура «ПереченьНоменклагурыНоменклатураПриИзменении()»

//Получить текущую строку табличной части

СтрокаТабличнойЧасти= Элементы.ПереченьНоменклатуры.ТекущиеДанные;

//Установить цену

СтрокаТабличнойЧасти.Цена= РаботаСоСправочниками.РозничнаяЦена

(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);

//Пересчитать сумму строки

РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);

КонецПроцедуры

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

В первой строке обработчика получаем текущую строку табличной части документа, так как она понадобится в дальнейшем, и сохраняем ее в переменной.

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

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

Проверим, как теперь работает документ. Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений Цены. Для транзистора Philips добавим новую цену:

Теперь откроем документ ОказаниеУслуги №1. Этим документом был, как раз, израсходован один такой транзистор.

Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке Номенклатура табличной части документа. Автоматически установится первое значение цены:

Изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены:

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