584 документа
← К списку

Автоматический расчет стоимости

страница

Автоматический расчет стоимости

До сих пор стоимость расходуемых материалов вносилась вручную в документ Оказание услуги при его создании.

Теперь же стоимость номенклатуры будет определяться по среднему: для каждой номенклатуры нужно разделить ее общую, суммарную стоимость на то количество этой номенклатуры, которое имеется на складах ООО «На все руки мастер», и таким образом получить среднюю стоимость одной единицы этой номенклатуры.

Чтобы выполнить такой расчет, вам понадобятся дополнительные данные, которых у вас сейчас нет.

Для каждой номенклатуры из табличной части вам понадобятся:

  • ее стоимость, хранящаяся в регистре СтоимостьМатериалов;
  • общее ее количество на всех складах, хранящееся в регистре ОстаткиМатериалов.

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

Таким образом, запрос должен возвращать следующие поля для каждой номенклатуры, которая есть в документе (рис. 15.2).

Рис. 15.2. Описание полей запроса

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

  • стоимость – из регистра СтоимостьМатериалов;
  • остатки на всех складах – из регистра ОстаткиМатериалов (рис. 15.3).

Рис. 15.3. Описание полей и таблиц запроса

Это значит, что ваш запрос должен содержать два левых соединения таблицы документа с другими таблицами: одно – с таблицей РегистрНакопления.СтоимостьМатериалов.Остатки, другое – с таблицей РегистрНакопления.ОстаткиМатериалов.Остатки.

Казалось бы, все готово для того, чтобы составить запрос.

Но обратите внимание на важную деталь: в предложенной схеме виртуальные таблицы будут возвращать стоимость и остатки номенклатуры абсолютно для всей номенклатуры. А вас интересует только та номенклатура, которая указана в вашем документе.

На маленькой базе эта особенность может почти не проявляться: количество различных элементов номенклатуры в справочнике сравнимо с количеством различных элементов номенклатуры в документе.

Но представьте реальную базу. В справочнике Номенклатура – 15 000 наименований, например. А в документе – всего 5 наименований. Получится, что сначала виртуальная таблица остатков будет усиленно трудиться и рассчитывать вам стоимость (или остатки) по всем 15 000 наименованиям номенклатуры, а в результате, когда вы левым соединением станете соединять ее с таблицей документа, вы из этих 15 000 строк стоимости (или остатков) возьмете всего лишь 5 строк – для той номенклатуры, которая указана в документе. Остальные 14 995 строк будут просто отброшены – система напрасно их рассчитывала.

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

В результате схема вашего запроса будет выглядеть следующим образом (рис. 15.4).

Рис. 15.4. Схема запроса

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

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

Выполнить эту задачу вам помогут временные таблицы.

Таким образом, схема вашего запроса приобретает следующий вид (рис. 15.5).

Рис. 15.5. Схема запроса