Изменение процедуры проведения
страницаИзменение процедуры проведения
Теперь создайте движения документа ОказаниеУслуги.
В список регистров, в которых документ ОказаниеУслуги будет создавать движения, добавьте еще один регистр СтоимостьМатериалов.
Ранее в разделе «Регистрация расхода только той номенклатуры, которая является материалом» вы изменили процедуру проведения документа ОказаниеУслуги так, чтобы движения в регистрах накопления формировались с помощью запроса к данным документа и чтобы в регистры попадали записи только о той номенклатуре, которая является материалом.
Откройте модуль документа ОказаниеУслуги. Процедура ОбработкаПроведения(), находящаяся в этом модуле, сейчас выглядит следующим образом (листинг 12.15).
Листинг 1****2.15. Процедура «ОбработкаПроведения()»
Процедура ОбработкаПроведения(Отказ,Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
// регистр ОстаткиМатериалов – Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Теперь вам нужно добавить в цикл обхода записей результата запроса формирование движений по регистру СтоимостьМатериалов.
Но, в отличие от приходной накладной, здесь измерение регистра Стоимость должно вычисляться как произведение стоимости и количества, указанных в табличной части документа.
Поэтому вам нужно немного изменить запрос к табличной части документа, чтобы получать из нее значение поля Стоимость.
Для того чтобы изменить уже имеющийся запрос, установите курсор внутрь текста запроса и в контекстном меню нажмите Конструктор запроса. Конструктор заполнит все вкладки исходя из существующего текста запроса.
На закладке Таблицы и поля добавьте поле Стоимость в список полей, выбранных из табличной части ПереченьНоменклатуры документа ОказаниеУслуги (рис. 12.17).

Рис. 12.17. Выбранные поля
Конструктор сразу же сигнализирует вам об ошибке появлением пиктограммы
рядом с выбранным полем. При наведении курсора на это поле появится окно с подсказкой – «Поле должно присутствовать в секции СГРУППИРОВАТЬ ПО».
Действительно, поскольку в табличной части документа одна и та же номенклатура может встречаться несколько раз, данные в запросе сгруппированы по полям Номенклатура и ВидНоменклатуры.
Поэтому на закладке Группировка перетащите поле Стоимость в список суммируемых полей. Вместо стандартной функции Сумма укажите, что будете рассчитывать по нему, например, функцию Максимум (рис. 12.18).

Рис. 12.18. Группировка строк таблицы документа
На самом деле подразумевается, что для разных строк одной и той же номенклатуры стоимость будет одинаковой, поэтому функция Максимум нужна вам лишь для того, чтобы получить одно из имеющихся значений стоимости.
Нажмите ОК. В результате конструктор изменит текст запроса следующим образом (листинг 12.16).
Листинг 1****2.16. Текст запроса
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
Теперь в самом конце цикла обхода записей результата запроса перед строкой КонецЕсли добавьте строки кода, создающие движения регистра СтоимостьМатериалов, производимые документом ОказаниеУслуги (листинг 12.17).
**Листинг 12.**17. Движения документа «ОказаниеУслуги» (фрагмент)
// Регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * ВыборкаДетальныеЗаписи.Стоимость;
В начало процедуры проведения добавьте строку, в которой свойство Записывать набора записей этого регистра устанавливается в значение Истина.
В результате процедура ОбработкаПроведения будет выглядеть следующим образом (листинг 12.18).
**Листинг 12.**18. Движения документа «ОказаниеУслуги»
Процедура ОбработкаПроведения(Отказ,Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
// регистр ОстаткиМатериалов – Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
// Регистр СтоимостьМатериалов – Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * ВыборкаДетальныеЗаписи.Стоимость;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В заключение установите видимость команды СтоимостьМатериалов в панели навигации формы документа.