Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

УзнАй больше!




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

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

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

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

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


Нажмем кнопку Запрос и посмотрим, какой текст запроса сформи- ровал конструктор (листинг 14. 25).

листинг 14. 25. Текст запроса

 

Тем самым мы добавили к выбранным ранее полям стоимость номенклатуры (рис. 14. 23).

 

Рис. 14. 23. Создание второго запроса

 

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

Перейдем на закладку Связи и зададим связь между таблицами.


Из временной таблицы будем выбирать все записи, и поле Номенкла- тура временной таблицы должно быть равно полю Материал таблицы остатков (рис. 14. 24).

 

 

Также зададим параметры виртуальной таблицы ОстаткиМатериа- ловОстатки.

В параметр Условие внесем следующий текст (листинг 14. 26).

листинг 14. 26. Условие виртуальной таблицы

Материал В (ВЫБРАТЬ НоменклатураДокумента. Номенклатура ИЗ НоменклатураДокумента)      

В результате мы получим следующий текст запроса (листинг 14. 27).

листинг 14. 27. Текст запроса

 


Тем самым мы добавили к выбранным ранее полям остатки номенклатуры на всех складах (рис. 14. 25).

 

Рис. 14. 25. Создание второго запроса

 

В заключение перейдем на закладку Объединения/Псевдонимы

и зададим следующие псевдонимы полей (рис. 14. 26):

„ СтоимостьОстаток – Стоимость;

„ КоличествоОстаток – Количество.

 

 

В результате мы получим следующий текст запроса (листинг 14. 28).


листинг 14. 28. Текст запроса

 

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

В такой ситуации левые соединения с виртуальными таблицами не вернут ничего. На языке запросов это значит, что в полях Стоимость и Количество будут значения NULL.

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

Для этого мы применим функцию ЕСТЬNULL() к полям Стоимость

и Количество. Если значение этого поля будет NULL, функция вернет

0. В остальных случаях функция вернет само значение этого поля.

Перейдем на закладку Таблицы и поля, выделим поле СтоимостьМате- риаловОстатки. СтоимостьОстаток и нажмем кнопку Изменить текущий элемент (рис. 14. 27).

В открывшемся окне отредактируем значение поля следующим образом (листинг 14. 29), рис. 14. 28.


 

листинг 14. 29. Выражение для расчета поля в запросе

ЕСТЬNULL(СтоимостьМатериаловОстатки. СтоимостьОстаток, 0)                                                               

 

 

Аналогично поступим и с другим полем: ОстаткиМатериаловОстат- ки. КоличествоОстаток.

Нажмем ОК – текст запроса будет вставлен в модуль (листинг 14. 30).

листинг 14. 30. Текст запроса

 


Нам останется всего лишь дописать после него оператор выполнения запроса (листинг 14. 31).

листинг 14. 31. Фрагмент процедуры «ОбработкаПроведения()»

 

Теперь разберемся с записью движений.

Все операторы, которые были написаны нами ранее, будут работать без изменений.

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

Стоимость материала равна частному от деления всей стоимости, полученной запросом (Стоимость), на общее количество материала на всех складах (Количество).

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


листинг 14. 32. Фрагмент процедуры «ОбработкаПроведения()»

 

Теперь заменим расчет стоимости в движениях регистров Стои- мостьМатериалов и Продажи (листинг 14. 33).

листинг 14. 33. Фрагмент процедуры «ОбработкаПроведения()»

Пока ВыборкаДетальныеЗаписи. Следующий() Цикл

Если ВыборкаДетальныеЗаписи. Количество = 0 Тогда СтоимостьМатериала = 0;

Иначе

СтоимостьМатериала =

ВыборкаДетальныеЗаписи. Стоимость / ВыборкаДетальныеЗаписи. Количество;

КонецЕсли;

Если ВыборкаДетальныеЗаписи. ВидНоменклатуры =

Перечисления. ВидыНоменклатуры. Материал Тогда

// Регистр ОстаткиМатериалов Расход

Движение = Движения. ОстаткиМатериалов. Добавить(); Движение. ВидДвижения = ВидДвиженияНакопления. Расход; Движение. Период = Дата;

Движение. Материал = ВыборкаДетальныеЗаписи. Номенклатура; Движение. Склад = Склад;

Движение. Количество = ВыборкаДетальныеЗаписи. Количество;

// Регистр СтоимостьМатериалов Расход

Движение = Движения. СтоимостьМатериалов. Добавить(); Движение. ВидДвижения = ВидДвиженияНакопления. Расход; Движение. Период = Дата;

Движение. Материал = ВыборкаДетальныеЗаписи. Номенклатура; Движение. Стоимость = ВыборкаДетальныеЗаписи. КоличествоВДокументе *

СтоимостьМатериала;

КонецЕсли;

// Регистр Продажи

Движение = Движения. Продажи. Добавить(); Движение. Период = Дата;

Движение. Номенклатура = ВыборкаДетальныеЗаписи. Номенклатура; Движение. Клиент = Клиент;


Теперь все вроде бы хорошо, но остался один важный момент.

Если проводить этот документ в первый раз, то результат получится правильный.

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

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

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

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

В нашем случае такими регистрами являются регистры накопления

СтоимостьМатериалов и ОстаткиМатериалов.

Поэтому перед выполнением второго запроса добавим следующие две строки:

листинг 14. 33а. Фрагмент процедуры «ОбработкаПроведения()»

 


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...