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

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

страница

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

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

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

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

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

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

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

 

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

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

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

 

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

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

 

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

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

 

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

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

 

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

"ВЫБРАТЬ

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

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

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

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

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

|ИЗ

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

|ГДЕ

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

|

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

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

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

 

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

 

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

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

 

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

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

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

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

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

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

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

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

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

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

|ИЗ

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

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

| ,

| Материал В

| (ВЫБРАТЬ

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

| ИЗ

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

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

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

| ,

| Материал В

| (ВЫБРАТЬ

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

| ИЗ

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

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

 

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

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

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

 

// Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе

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

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

 

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

 

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

 

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

 

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

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

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

 

Иначе

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

 

КонецЕсли;

 

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

КонецЕсли;

 

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

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

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

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

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

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

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

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

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

 

КонецЦикла;

 

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

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

 

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

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

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

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

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

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

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

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

|ИЗ

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

| ,

| Материал В

| (ВЫБРАТЬ

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

| ИЗ

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

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

|ГДЕ

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

 

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

 

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

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

 

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

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

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

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

 

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

 

КонецЦикла;

 

КонецЕсли;

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

 

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

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

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

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

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

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