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

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

Рис. 13.2. Группировка строк таблицы документа
Благодаря этому в результате запроса значения номенклатуры повторяться не будут, и для каждого из них будут посчитаны суммарные значения по полю Сумма, если в табличной части документа содержится несколько строк с одинаковой номенклатурой.
На закладке Объединения/Псевдонимы задайте псевдоним для поля Сумма как СуммаВДокументе просто для облегчения чтения запроса (рис. 13.3).

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