ПРАКТИЧЕСКАЯ РАБОТА Тема: Оборотные регистры. Теоретическая часть Зачем нужно создавать еще один регистр Продолжим рассматривать работу документа ОказаниеУслуги. До сих пор вы создавали в регистрах накопления движения только для строк документа, которые содержат материалы. Услуги, содержащиеся в документе, вы никак не учитывали. Дело в том, что при учете услуг важны совершенно другие критерии, нежели при учете материалов. Прежде всего, бессмысленно говорить о том, сколько услуг было и сколько их осталось, важны только сумма и количество услуг, которые были оказаны за определенный промежуток времени. Кроме того, интересны следующие моменты: какие именно услуги были оказаны (чтобы составить рейтинг услуг); какому именно клиенту оказывались услуги (чтобы, например, предоставить ему скидку от объема оплаченных ранее услуг); какой мастер предоставлял услуги (чтобы начислить ему заработную плату). Очевидно, что существующие регистры накопления совершенно не подходят для решения таких задач. Поэтому вы создадите еще одно хранилище данных, которое будет использоваться в вашей программе, – оборотный регистр накопления Продажи. Что такое оборотный регистр накопления Когда вы создавали регистры ОстаткиМатериалов и СтоимостьМатериалов, в книге специально не заострялось внимание на видах регистров накопления, которые существуют в системе «1С:Предприятие». Сейчас пришло время сказать об этом несколько слов. Регистры накопления могут быть регистрами остатков и регистрами оборотов. Существующие в вашей учебной конфигурации регистры и СтоимостьМатериалов являются регистрами остатков. ОстаткиМатериалов Если вы помните, при создании отчета Материалы в конструкторе запроса вы видели, что для таких регистров система создает три виртуальные таблицы: таблицу остатков, таблицу оборотов и совокупную таблицу остатков и оборотов. Оборотный регистр накопления очень похож на знакомый уже вам регистр остатков, но для него понятие «остаток» не имеет смысла. Оборотный регистр накапливает только обороты, остатки ему безразличны. Поэтому единственной виртуальной таблицей, которую будет создавать система для такого регистра, будет таблица оборотов. В остальном оборотный регистр ничем не отличается от регистра остатков. Следует сказать об одной особенности конструирования регистров накопления, напрямую связанной с возможностью получения остатков. При создании оборотного регистра накопления нет особой сложности в определении того, какие именно данные должны являться измерениями регистра: вы можете назначить в качестве его измерений любые нужные вам данные. Совсем иная ситуация в случае регистра накопления, поддерживающего накопление остатков. Для него выбор измерений должен выполняться исходя из того, что движения регистра могут быть осуществлены в две стороны: приход и расход. Таким образом, в качестве измерений нужно выбирать те данные, по которым движения точно будут осуществляться как в одну, так и в другую сторону. Например, если ведется учет материалов в разрезах номенклатуры и склада, очевидно, что и номенклатура, и склад могут быть измерениями, поскольку как приход, так и расход материалов всегда будут осуществляться с указанием конкретной номенклатуры и конкретного склада. Если же в этой ситуации появляется желание отразить учет материалов еще и в разрезе поставщика, то здесь уже нужно исходить из конкретной схемы учета, принятой на предприятии. Скорее всего, при поступлении материалов поставщик будет указан, а вот при расходовании материалов с большой долей вероятности поставщик указываться не будет. В большинстве случаев это совершенно лишняя информация. Значит, поставщика следует добавить не как измерение, а как реквизит регистра накопления. Если же при расходе материалов поставщик будет указываться наверняка, имеет смысл добавить поставщика в измерения регистра. Иными словами, по каждому из измерений регистра накопления остатков ресурсы обязательно должны изменяться в обе стороны: приход и расход. Не должно существовать таких измерений, по которым осуществляется только приход или только расход. Нарушение этого принципа построения регистров накопления будет вести к непроизводительному использованию ресурсов системы и как следствие – к замедлению работы и падению производительности. Для реквизитов же регистра этот принцип не важен. По реквизитам регистра ресурсы могут только приходоваться или только расходоваться. Практическая часть Добавление оборотного регистра накопления Теперь, когда вы знаете практически все о регистрах накопления, добавьте объект конфигурации – регистр накопления с именем Продажи. Установите свойство Вид регистра – Обороты. Кроме того, задайте свойство регистра Расширенное представление списка как Движения по регистру Продажи. Включите регистр в подсистемы Бухгалтерия, Учет материалов и Оказание услуг. Регистр будет иметь следующие измерения: Номенклатура, тип СправочникСсылка.Номенклатура; Клиент, тип СправочникСсылка.Клиенты; Мастер, тип СправочникСсылка.Сотрудники. У регистра будет три ресурса: Количество, тип Число, длина 15, точность 3; Выручка, тип Число, длина 15, точность 2; Стоимость, тип Число, длина 15, точность 2. В разделах Бухгалтерия, Учет материалов и Оказание услуг включите видимость команды Продажи и мышью перетащите ее в группу Панель навигации.См.также. Проведение документа «Оказание услуги» по трем регистрам В этом разделе вы сначала измените процедуру проведения документа ОказаниеУслуги, а затем в прикладном решении перепроведете эти документы, чтобы отработал новый, измененный вами алгоритм проведения документов Оказание услуги. В 1C:EDT В список регистров, в которых документ ОказаниеУслуги будет создавать движения, добавьте еще один регистр Продажи. На предыдущем занятии вы изменили процедуру проведения документа ОказаниеУслуги так, чтобы движения в регистрах накопления формировались с помощью запроса к данным документа. Откройте модуль документа ОказаниеУслуги. Процедура ОбработкаПроведения(), находящаяся в этом модуле, сейчас выглядит следующим образом (листинг 13.1). Листинг 13.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. Движения документа «ОказаниеУслуги» Процедура ОбработкаПроведения(Отказ,Режим) Движения.ОстаткиМатериалов.Записывать = Истина; Движения.СтоимостьМатериалов.Записывать = Истина; Движения.Продажи.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОказаниеУслугиПереченьНоменклатуры.Номенклатура, | ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе, | МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость, | СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе |ИЗ | Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры |ГДЕ | ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка |СГРУППИРОВАТЬ ПО | ОказаниеУслугиПереченьНоменклатуры.Номенклатура, | ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклат уры.Материал Тогда // регистр ОстаткиМатериалов – Расход Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.Период = Дата; Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; // Регистр СтоимостьМатериалов – Расход Движение = Движения.СтоимостьМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * Выб оркаДетальныеЗаписи.Стоимость; КонецЕсли; // Регистр Продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Клиент = Клиент; Движение.Мастер = Мастер; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе; Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * В ыборкаДетальныеЗаписи.Стоимость; КонецЦикла; КонецПроцедуры Все добавленные конструкции вам уже хорошо известны. Обратите внимание лишь на то, что у оборотного регистра отсутствует свойство ВидДвижения, поскольку отражение вида движения (приход или расход) имеет смысл лишь при учете остатков. В случае регистра оборотов вас интересует только значение, которое должно быть записано в ресурс регистра. Также заметьте, что вы разместили команды, создающие движения в регистре Продажи, в конце цикла обхода результата запроса, после условия выполнения цикла только для материалов. Это важно, так как движения в этом регистре создаются как для материалов, так и для услуг. В заключение установите видимость команды Продажи в панели навигации формы документа. В прикладном решении В прикладном решении вам нужно провести еще раз (перепровести) все документы об оказании услуг. Это необходимо для того, чтобы эти документы создали новые записи в регистрах в соответствии с алгоритмом проведения, который вы только что изменили. Запустите проект в режиме отладки. Откройте список документов об оказании услуг, выделите и перепроведите все документы. Теперь откройте по очереди каждый документ Оказание услуги и перейдите к списку движений этих документов по регистру Продажи. Они должны иметь следующий вид (рис. 13.4, 13.5, 13.6). Рис. 13.4. Движения документа «Оказание услуги № 1» в регистре «Продажи» Рис. 13.5. Движения документа «Оказание услуги № 2» в регистре «Продажи» Рис. 13.6. Движения документа «Оказание услуги № 3» в регистре «Продажи» На рисунках видно, что в регистр Продажи попадают записи о любой номенклатуре, которая является как материалом, так и услугой. Теперь у вас есть практически вся необходимая информация для анализа деятельности ООО «На все руки мастер». На следующем занятии вы создадите несколько отчетов, предоставляющих вам итоговую информацию о работе предприятия. Контрольные вопросы Что такое оборотный регистр накопления? В чем различие между регистром накопления остатков и оборотным регистром накопления? Как выбирать реквизиты и измерения при создании регистров накопления? Как создать оборотный регистр накопления?