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

Выделение произвольных областей модуля

страница

Выделение произвольных областей модуля

Итак, вы закончили редактирование процедуры ОбработкаПроведения() в модуле документа ОказаниеУслуги. Хотя модуль содержит всего одну процедуру, эта процедура довольно объемная (особенно для неопытного разработчика), и ее нельзя «охватить одним взглядом». Это затрудняет процесс восприятия и понимания текста процедуры, поиск в ней ошибок и т. д.

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

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

Выделите эти три области в тексте процедуры. Для этого нужно выделить текст, который надо окружить (отметить как область), и в контекстном меню нажать Окружить > #Область… В результате выделенный фрагмент будет окружен инструкциями препроцессора #Область <имя области> и #КонецОбласти.

Введите понятные вам имена областей (листинг 15.26).

**Листинг 15.**26. Процедура «ОбработкаПроведения()»

Процедура ОбработкаПроведения(Отказ, Режим)

 

Движения.ОстаткиМатериалов.Записывать = Истина;

Движения.СтоимостьМатериалов.Записывать = Истина;

Движения.Продажи.Записывать = Истина;

 

// Создать менеджер временных таблиц.

МенеджерВТ = Новый МенеджерВременныхТаблиц;

 

#Область НоменклатураДокумента

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

 

// Указать, какой менеджер временных таблиц использует этот запрос.

Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

 

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

"ВЫБРАТЬ

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

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

|    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,

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

|ПОМЕСТИТЬ НоменклатураДокумента

|ИЗ

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

|ГДЕ

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

|

|СГРУППИРОВАТЬ ПО

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

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

 

Запрос.УстановитьПараметр("Ссылка", Ссылка);

 

РезультатЗапроса = Запрос.Выполнить();

#КонецОбласти

 

#Область ДвиженияДокумента

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

Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос2.Текст = "ВЫБРАТЬ

|    НоменклатураДокумента.Номенклатура,

|    НоменклатураДокумента.ВидНоменклатуры,

|    НоменклатураДокумента.КоличествоВДокументе,

|    НоменклатураДокумента.СуммаВДокументе,

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

|    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество

|ИЗ

|    НоменклатураДокумента КАК НоменклатураДокумента

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

|              &Период,

|              Материал В (

|                   ВЫБРАТЬ

|                         НоменклатураДокумента.Номенклатура

|                   ИЗ

|                         НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки

|         ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал

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

|              &Период,

|              Материал В (

|                   ВЫБРАТЬ

|                         НоменклатураДокумента.Номенклатура

|                   ИЗ

|                         НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки

|         ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";

 

Запрос2.УстановитьПараметр("Период", МоментВремени());

 

// Установить необходимость блокировки данных в регистрах СтоимостьМатериалов и ОстаткиМатериалов.

Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;

Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;

 

РезультатЗапроса = Запрос2.Выполнить();

 

// ТЗ = РезультатЗапроса.Выгрузить();

 

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

 

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

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

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

 

Иначе

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

 

КонецЕсли;

 

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

 

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

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Период = Дата;

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

Движение.Склад = Склад;

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

 

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

Движение = Движения.СтоимостьМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Период = Дата;

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

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

 

КонецЕсли;

 

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

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

Движение.Период = Дата;

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

Движение.Клиент = Клиент;

Движение.Мастер = Мастер;

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

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

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

 

КонецЦикла;

 

Движения.Записать();

#КонецОбласти

 

#Область КонтрольОстатков

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

 

// Проверить отрицательные остатки

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

Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос3.Текст = "ВЫБРАТЬ

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

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

|ИЗ

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

|         ,

|         Материал В

|              (ВЫБРАТЬ

|                    НоменклатураДокумента.Номенклатура

|              ИЗ

|                    НоменклатураДокумента)

|              И Склад = &Склад) КАК ОстаткиМатериаловОстатки

|ГДЕ

|    ОстаткиМатериаловОстатки.КоличествоОстаток < 0";

 

Запрос3.УстановитьПараметр("Склад", Склад);

 

РезультатЗапроса = Запрос3.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

 

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

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";

Сообщение.Сообщить();

 

Отказ = Истина;

 

КонецЦикла;

 

КонецЕсли;

#КонецОбласти

 

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

В результате вы можете свернуть выделенные программные области в тексте процедуры (рис. 15.22).

Рис. 15.22. Выделение произвольных областей в модуле

Затем можно развернуть только нужную область модуля и работать с ней. Текст процедуры станет более компактным и читаемым.

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

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