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

Документ "Оказание услуги"

страница

Документ «Оказание услуги»

В режиме «Конфигуратор»

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

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

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

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

В заключение в окне редактирования объекта конфигурации Документ ОказаниеУслуги на закладке Прочее откроем модуль объекта.

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

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

…

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

…

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

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

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

…

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

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

…

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

 

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

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

 

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

"ВЫБРАТЬ

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

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

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

...

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

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

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

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

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

| НоменклатураДокумента.НаборСвойств КАК НаборСвойств,

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

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

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

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

|ИЗ

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

…

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

Листинг 15.6. Контроль отрицательных остатков при оперативном проведении

…

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

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

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

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

|ИЗ

| РегистрНакопления.ОстаткиМатериалов.Остатки( , (Материал, НаборСвойств) В

| (ВЫБРАТЬ

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

| НоменклатураДокумента.НаборСвойств

| ИЗ

| НоменклатураДокумента) И Склад = &Склад)

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

|ГДЕ

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

 

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

 

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

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

 

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

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

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

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

 

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

 

КонецЦикла;

…