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

В 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. Движения документа «ОказаниеУслуги»

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

 

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

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

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

 

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

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

"ВЫБРАТЬ

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

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

 

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

 

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

 

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

 

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

КонецЕсли;

 

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

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

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

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

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

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

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

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

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

 

КонецЦикла;

 

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

Все добавленные конструкции вам уже хорошо известны.

Обратите внимание лишь на то, что у оборотного регистра отсутствует свойство ВидДвижения, поскольку отражение вида движения (приход или расход) имеет смысл лишь при учете остатков. В случае регистра оборотов вас интересует только значение, которое должно быть записано в ресурс регистра.

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

В заключение установите видимость команды Продажи в панели навигации формы документа.