Документ "Оказание услуги"
страницаДокумент «Оказание услуги»
В режиме «Конфигуратор»
Теперь аналогичным образом доработаем документ ОказаниеУслуги.
Для того чтобы при расходовании материалов пользователь мог указывать набор свойств для каждого расходуемого материала, откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и на закладке Данные добавим в табличную часть документа новый реквизит НаборСвойств с типом СправочникСсылка.ВариантыНоменклатуры.
У этого реквизита заполним свойство Связи параметров выбора. Перенесем из списка доступных реквизитов в список параметров реквизит ПереченьНоменклатуры.Номенклатура. Тем самым мы задали, что при выборе в поле НаборСвойств будет всегда открываться список элементов справочника Варианты номенклатуры, подчиненных материалу, выбранному в колонке Номенклатура.
После этого расположим этот реквизит в табличной части формы документа. Откроем форму документа и с помощью мыши перетащим его из окна реквизитов формы в окно элементов формы. Новый элемент расположим в структуре элементов формы после поля Номенклатура.
В заключение в окне редактирования объекта конфигурации Документ ОказаниеУслуги на закладке Прочее откроем модуль объекта.
Откроем процедуру обработчика события ОбработкаПроведения и добавим к формируемым движениям присвоение значения измерению НаборСвойств регистра ОстаткиМатериалов (листинг 15.4).
Листинг 15.4. Фрагмент процедуры «ОбработкаПроведения()»
…
// регистр ОстаткиМатериалов Расход
…
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств;
Движение.Склад = Склад;
…
Поскольку на предыдущем занятии мы оптимизировали процедуру проведения документа и получали все данные документа с помощью запроса, то в текст запроса нужно также добавить строки для получения нового реквизита документа (листинг 15.5).
Листинг 15.5. Фрагмент процедуры «ОбработкаПроведения()»
…
Запрос = Новый Запрос;
// Укажем, какой менеджер временных таблиц использует этот запрос
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| ОказаниеУслугиПереченьНоменклатуры.НаборСвойств КАК НаборСвойств,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры,
| ОказаниеУслугиПереченьНоменклатуры.НаборСвойств";
...
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура КАК Номенклатура,
| НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
| НоменклатураДокумента.НаборСвойств КАК НаборСвойств,
| НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
| НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
| ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
…
Кроме этого, понадобится изменить последний запрос, который при оперативном проведении проверяет, не появились ли отрицательные остатки. Теперь мы будем получать остатки не «вообще» для номенклатуры из табличной части документа, а для номенклатуры именно с тем набором свойств, который указан в строках документа (листинг 15.6).
Листинг 15.6. Контроль отрицательных остатков при оперативном проведении
…
Запрос3.Текст = "ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал КАК Материал,
| ОстаткиМатериаловОстатки.НаборСвойств КАК НаборСвойств,
| ОстаткиМатериаловОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки( , (Материал, НаборСвойств) В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.НаборСвойств
| ИЗ
| НоменклатураДокумента) И Склад = &Склад)
| КАК ОстаткиМатериаловОстатки
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос3.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """" + " из набора свойств """ + ВыборкаДетальныеЗаписи.НаборСвойств + """";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
…