Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Оптимизация процедуры проведения документа Оказ...doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
838.14 Кб
Скачать

Оптимизация документа ОказаниеУслуги

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

Также следует удалить соответствующую колонку из табличного поля, расположенного в форме.

После этого можно полностью удалить содержимое обработчика события ОбработкаПроведения в модуле документа и создать в нем заготовку процедуры проведения. Текст запроса, выполняемого в режиме оперативного проведения, будет отличаться от запроса, выполняемого при неоперативном проведении. Поэтому формирование текста запроса мы включим в условие Если … Иначе … КонецЕсли: (листинг 3).

Листинг 3. «Заготовка» процедуры проведения

Запрос = Новый Запрос;

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

Запрос.Текст =

;

Иначе

Запрос.Текст =

;

КонецЕсли;

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

  • Номенклатура;

  • Количество;

  • Номенклатура.ВидНоменклатуры;

  • Сумма.

Эти поля будут нужны нам для задания значений измерений регистров и их ресурсов. Кроме того, поле ВидНоменклатуры понадобится нам для анализа того, чем является номенклатура, указанная в документе: материалом или услугой (рис. 4).

Рис. 4. Выбранные поля

Теперь задумаемся о том, что для указания значений ресурса Стоимость регистров СтоимостьМатериалов и Продажи нам понадобится рассчитать текущую стоимость номенклатуры как частное стоимости остатка этого материала и его оставшегося количества.

Поэтому добавим к списку выбранных таблиц еще две (рис. 5).

  • РегистрНакопления.СтоимостьМатериалов.Остатки;

  • РегистрНакопления.ОстаткиМатериалов.Остатки.

Рис. 5. Выбранные таблицы

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

Условие получения данных указывает, что остатки должны быть получены только по тем позициям номенклатуры, которые содержатся в проводимом документе (перед выполнением запроса мы передадим в параметр СписокНоменклатурыДокумента список всех позиций номенклатуры, содержащихся в проводимом документе) – рис. 6.

Рис. 6. Параметры виртуальных таблиц

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

Рис. 7. Выбранные поля

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

Поскольку в оперативном режиме нам понадобится контролировать остатки списываемой номенклатуры на складе, выберем еще раз виртуальную таблицу регистра накопления ОстаткиМатериаловОстатки и переименуем ее в ОстаткиМатериаловОстаткиНаСкладе (рис. 8).

Рис. 8. Выбранные таблицы

Для этой виртуальной таблицы мы также укажем параметр МоментВремени, а в условии напишем, что материал должен находиться в списке номенклатуры и склад должен быть равен складу, указанному в документе (рис. 9).

Рис. 9. Параметры таблицы ОстаткиМатериаловОстаткиНаСкладе

Теперь из этой виртуальной таблицы мы выберем поле КоличествоОстаток (рис. 10).

Рис. 10. Выбранные поля

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

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

Рис. 11а. Выбранные таблицы

Рис. 11б. Условия связи между таблицами

Теперь перейдем на закладку Дополнительно и установим флаг Для изменения. Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать чтение указанных данных (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. Это предложение дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять.

Поскольку мы с вами планируем выполнить запись регистров накопления ОстаткиМатериалов и СтоимостьМатериалов, укажем таблицы этих регистров в качестве таблиц для изменения (рис. 12).

Рис. 12. Укажем таблицы для изменения

Перейдем на закладку Условия и зададим условие отбора из таблицы документа только строк проводимого документа (ссылка на него будет передана в параметр запроса Ссылка) – рис. 6.13.

Рис. 6.13. Условие отбора из таблицы документа

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

  • НоменклатураВидНоменклатуры – ВидНоменклатуры;

  • КоличествоОстаток1 – КоличествоНаСкладе.

Нажмем ОK и посмотрим, какой текст запроса сформировал конструктор (листинг 4).

Листинг 4. Текст запроса, сформированный конструктором

ВЫБРАТЬ

ОказаниеУслугиПереченьНоменклатуры.Номенклатура,

ОказаниеУслугиПереченьНоменклатуры.Количество,

ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,

ОказаниеУслугиПереченьНоменклатуры.Сумма,

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

ОстаткиМатериаловОстатки.КоличествоОстаток,

ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоНаСкладе

ИЗ

Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

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

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

КАК ОстаткиМатериаловОстатки

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени,

Материал В (&СписокНоменклатурыДокумента) И Склад = &СкладВДокументе)

КАК ОстаткиМатериаловОстаткиНаСкладе

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстаткиНаСкладе.Материал

ГДЕ

ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка

ДЛЯ ИЗМЕНЕНИЯ

РегистрНакопления.СтоимостьМатериалов.Остатки,

РегистрНакопления.ОстаткиМатериалов.Остатки

Как видите, в запросе нет ничего сложного, за исключением, быть может, трех левых соединений с таблицей табличной части документа и использования ключевого предложения ДЛЯ ИЗМЕНЕНИЯ, значение которого было объяснено выше.

Текст запроса для случая неоперативного проведения документа будет практически таким же, за исключением того, что в нем будет отсутствовать третье левое соединение и, соответственно, поле КоличествоОстатокНаСкладе, т.к. проверку остатков в этом случае мы выполнять не будем (листинг 5).

Листинг 5. Неоперативное проведение документа

ВЫБРАТЬ

ОказаниеУслугиПереченьНоменклатуры.Номенклатура,

ОказаниеУслугиПереченьНоменклатуры.Количество,

ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,

ОказаниеУслугиПереченьНоменклатуры.Сумма,

ОстаткиМатериаловОстатки.КоличествоОстаток,

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

ИЗ

Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

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

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

КАК ОстаткиМатериаловОстатки

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал

ГДЕ

ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка

ДЛЯ ИЗМЕНЕНИЯ

РегистрНакопления.ОстаткиМатериалов.Остатки,

РегистрНакопления.СтоимостьМатериалов.Остатки;

Теперь добавим в текст обработчика задание параметров запроса (листинг 6).

Листинг 6. Задание параметров запроса