
- •Клиент-серверный вариант работы системы «1с: предприятие» методические указания
- •Часть 2
- •Лабораторная работа № 3. Механизмы управления накоплением данных
- •Актуальность задач управления накоплением данных
- •Создание Регистра накопления
- •Объект конфигурации Регистр накопления
- •Создание регистра накопления «ОстаткиМатериалов»
- •Создание движений документа «ПриходнаямНакладная»
- •Команда перехода к движениям в форме документа
- •Движения документа «Оказание услуги»
- •Создание отчета «Материалы»
- •Настройки отчета
- •Создание периодического регистра сведений
- •3.1. Назначение регистра сведений
- •3.2. Создание периодического регистра сведений «Цены»
- •3.3. Автоматическая подстановка цены в документ при выборе номенклатуры
- •3.4. Вызов функции при выборе номенклатуры и заполнение цены в документе
- •Контрольные вопросы
- •Часть 2
- •394026 Воронеж, Московский просп., 14
3.3. Автоматическая подстановка цены в документ при выборе номенклатуры
Было бы удобно, если бы при создании или изменении документа ОказаниеУслуги и при добавлении в табличную часть какой-нибудь номенклатуры услуг, одновременно подставлялась бы сразу актуальная цена, полученная из регистра сведений и соответствующая дате документа.
Для этого необходимо:
написать функцию РозничнаяЦена, которая будет возвращать актуальную цену;
вызвать функцию, когда в документ будет добавляться новая номенклатура.
Поскольку такая функция может понадобиться в дальнейшем, напишем ее в «общедоступном» месте – в общем модуле.
Создадим функцию РозничнаяЦена. Откроем конфигуратор в ветке Общие – Общие модули и добавим новый объект конфигурации Модуль с названием РаботаСоСправочниками. Установите флажок Вызов сервера, чтобы экспортные процедуры и функции этого модуля можно было бы вызвать с клиента. Поместим в него текст, приведенный ниже.
Функция РозничнаяЦена(АктуальнаяДата,ЭлементНоменклатурыУслуг)Экспорт
//Создать вспомогательный объект Отбор
Отбор = Новый Структура("НоменклатураУслуг",ЭлементНоменклатурыУслуг);
//Получить актуальные значения ресурсов регистра
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
Для получения розничной цены необходимо в функцию передать два параметра:
АктуальнаяДата– параметр типа Дата, определяет точку на оси времени, в которой нас интересует значение розничной цены;
ЭлементНоменклатурыУслуг– ссылка на элемент справочника НоменклатураУслуг, для которого необходимо получить розничную цену.
Эта структура содержит Отбор по измерениям регистра. С его помощью определяется искомое измерение регистра НоменклатураУслуг, которое равно переданной в функцию ссылке на элемент справочника.
Имя ключа структуры («НоменклатураУслуг») должна совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры (ЭлементНоменклатурыУслуг) задает отбираемое по данному измерению значение.
Во второй строке идет обращение к менеджеру регистра сведений Цены (РегистрыСведений.Цены) и выполнение метода ВыполнитьПоследнее(), который возвращает значение ресурсов самой последней записи регистра, соответствующей переданной в функцию дате (АктуальнаяДата) и значениям измерений регистра Отбор.
Метод ПолучитьПоследнее возвращает структуру, содержащую значения ресурсов, которая сохраняется в переменной ЗначенияРесурсов.
В следующей строке получаем искомую розничную цену, указав имя нужного ресурса регистра через точку (ЗначениеРесурсов.Цена) и возвращаем ее при выполнении функции.
Таким образом, данную функцию можно вызывать в некоторый момент времени.
3.4. Вызов функции при выборе номенклатуры и заполнение цены в документе
Итак, задача, которая перед нами стоит, заключается в следующем. При создании документа ОказаниеУслуги нам необходимо обеспечить автоматическое заполнение поля Цена после того, как пользователь выберет услугу. Причем цена услуги должна определяться исходя из даты создаваемого документа.
Найдем в конфигураторе документ ОказаниеУслуги и откроем его форму ФормаДокумента. Дважды щелкните на элементе формы ПереченьНоменклатурыНоменклатура или откройте палитру свойств (пункт контекстного меню Свойства). Прокрутив список до конца, найдем событие При изменении. Нажмем на кнопку с изображением лупы и в открывшейся заготовке обработчика события напишем следующий текст:
Процедура «ПереченьНоменклагурыНоменклатураПриИзменении()»
//Получить текущую строку табличной части
СтрокаТабличнойЧасти= Элементы.ПереченьНоменклатуры.ТекущиеДанные;
//Установить цену
СтрокаТабличнойЧасти.Цена= РаботаСоСправочниками.РозничнаяЦена
(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
//Пересчитать сумму строки
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Прокомментируем содержимое обработчика.
В первой строке обработчика получаем текущую строку табличной части документа, так как она понадобится в дальнейшем, и сохраняем ее в переменной.
Во второй строке устанавливаем полученную цену в документе, вызывая нашу процедуру РозничнаяЦена() из общего модуля РаботаСоСправочниками. Первым параметром передается в эту функцию дата документа, на которую необходимо получить цену. Дату документа получаем из основного реквизита формы – Объект.Дата. Вторым параметром передается ссылка на элемент справочника Номенклатура, который содержится в текущей строке табличной части документа (СтрокаТабличнойЧасти.Номенклатура).
В конце вызывается процедура РассчитатьСумму() из общего модуля РаботаСДокументами для того, чтобы она пересчитала итоговую сумму в строке нашего документа.
Проверим, как теперь работает документ. Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений Цены. Для транзистора Philips добавим новую цену:
Теперь откроем документ ОказаниеУслуги №1. Этим документом был, как раз, израсходован один такой транзистор.
Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке Номенклатура табличной части документа. Автоматически установится первое значение цены:
Изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены:
Таким образом, в документ подбирается актуальная, на момент создания документа, цена услуги.