Периодический регистр сведений

В этой главе мы с вами познакомимся с объектом конфигурации Регистр сведений, а точнее с одним из его видов – периодическим регистром сведений. Вы узнаете, для чего предназначен этот объект конфигурации, и какова его структура.

Мы создадим с вами один периодический регистр сведений, который будет использоваться в нашей конфигурации, и покажем, каким образом можно использовать его данные средствами встроенного языка.

Зачем нужен периодический регистр сведений?

Начнем мы с того, что обратим ваше внимание на документ ОказаниеУслуги. Как вы помните, в этом документе мы выбираем услугу, которая оказывается, и затем указываем цену.

Очевидно, что в ООО «На все руки мастер» существует перечень услуг, который определяет стоимость каждой услуги. Казалось бы, стоимость услуги является неотъемлемым свойством самой услуги, и поэтому ее следует добавить в качестве реквизита справочника Номенклатура.

Однако стоимость услуг имеет особенность меняться со временем. И может сложиться такая ситуация, когда нам потребуется внести изменения или уточнения в один из ранее проведенных документов ОказаниеУслуги. В этом случае мы не сможем получить правильную стоимость услуги, поскольку в реквизите справочника будет храниться последнее введенное значение.

Кроме того, не исключено, что руководство ООО «На все руки мастер» пожелает видеть, как зависит прибыль предприятия от изменения стоимости оказываемых услуг. В этом случае просто необходимо будет иметь возможность анализировать изменение стоимости услуг во времени.

Поэтому для хранения стоимости услуг мы используем новый пока еще для нас объект – регистр сведений.

 

Объект конфигурации Регистр сведений

Объект конфигурации Регистр сведений является прикладным и предназначен для описания структуры хранения данных в разрезе нескольких измерений. На основе объекта конфигурации Регистр сведений платформа создает в базе данных информационную структуру, в которой может храниться произвольная информация, «привязанная» к набору измерений.

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

Следующей важной особенностью регистра сведений является его способность (при необходимости) хранить данные с привязкой ко времени. Благодаря этому регистр сведений может хранить не только актуальные значения данных, но и историю их изменения во времени. Регистр сведений, использующий привязку ко времени, называют обычно периодическим регистром сведений.

Периодичность регистра сведений можно определить одним из следующих значений:

  • §     в пределах секунды;
  • §     в пределах дня;
  • §     в пределах месяца;
  • §     в пределах квартала;
  • §     в пределах года;
  • §     в пределах регистратора (если установлен режим записи –Подчинение регистратору).

Периодический регистр сведений всегда содержит служебное поле Период, добавляемое системой автоматически. Оно имеет тип Дата и служит для указания факта принадлежности записи к какому-либо периоду. При записи данных в регистр платформа всегда приводит значение этого поля к началу периода, в который он попадает. Например, если в регистр сведений с периодичностью в пределах месяца записать данные, в которых период указан как 08.14.2004, то регистр сохранит эти данные со значением периода, равным 01.04.2004.

Как и для других регистров, система контролирует уникальность записей для регистра сведений. Однако если для прочих регистров уникальным идентификатором записи является регистратор и номер строки, то для регистра сведений применяется другой принцип формирования ключевого значения.

Ключом записи, однозначно идентифицирующим запись, является в данном случае совокупность значений измерений регистра и периода (в случае, если регистр сведений периодический). Регистр сведений не может содержать несколько записей с одинаковыми ключами.

Если продолжать сравнение с регистром накопления, то можно сказать, что регистр сведений предоставляет больше свободы в редактировании хранимых данных. Наряду свозможностью использования в режиме подчинения регистратору (когда записи регистра сведений «привязаны» к документу-регистратору) регистр сведений может применяться и в независимом режиме, в котором пользователю предоставляется полная свобода интерактивной работы с данными регистра. Регистр сведений, не использующий подчинение регистратору, называют независимым регистром сведений.

 

Создание периодического регистра сведений Цены

Приступим к созданию периодического регистра сведений, который будет хранить развернутые во времени розничные цены материалов и стоимости услуг, оказываемых нашим ООО «На все руки мастер».

Откроем конфигуратор и создадим новый объект конфигурации Регистр сведений. Назовем его Цены. Установим периодичность этого регистра в пределах секунды.

Перейдем на закладку Данные и создадим измерение регистра Номенклатура с типом СправочникСсылка.Номенклатура. Укажем, что это измерение будет ведущим (рис 1.1.).

 

Рис. 1.1. Создадим измерение Номенклатура и укажем, что оно будет ведущим
Рис. 1.1. Создадим измерение Номенклатура и укажем, что оно будет ведущим

Свойство Ведущее имеет смысл использовать лишь тогда, когда измерение имеет тип ссылки на объект базы данных. Установка свойства Ведущее будет говорить о том, что запись регистра сведений представляет интерес, пока существует этот объект. При удалении объекта все записи регистра сведений по этому объекту тоже будут автоматически удалены. Кроме того, в форме списка справочника появляется кнопка командной панели Перейти. По ней возможен переход к записям регистра, отобранным по значению выбранного элемента справочника.

После этого создадим новый ресурс Цена, тип Число, длина 15, точность 2, неотрицательное.

Теперь запустим 1С:Предприятие в режиме отладки и посмотрим, как работает наш периодический регистр сведений Цены.

Зададим стоимость услуг ООО «На все руки мастер» следующим образом (рис. 1.2):

 

Рис. 1.2. Регистр сведений Цены
Рис. 1.2. Регистр сведений Цены

После этого зададим розничные цены на материалы (рис. 1.3).

 

Рис. 1.3. Регистр сведений Цены
Рис. 1.3. Регистр сведений Цены

Итак, мы с вами имеем очень полезную возможность в нашей программе – возможность установки цен на услуги и материалы. Поскольку цены хранятся с привязкой к дате, мы можем заранее установить новые цены и быть уверены в том, что новые цены вступят в действие не раньше указанной для них даты.

Теперь посмотрим, как можно использовать заданные нами цены в документе ОказаниеУслуги.

Создание функции РозничнаяЦена()

Сначала мы создадим функцию, которая будет возвращать нам актуальную розничную цену номенклатуры.

Откроем конфигуратор, в ветке Общие  Общие модули создадим новый объект конфигурации Модуль и назовем его РаботаСоСправочниками.

Поместим в нем следующий текст (листинг 1.1):

Листинг 1.1. Функция РозничнаяЦена()

Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт

 

// Создать вспомогательный объект Отбор

Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);

  

// Получить актуальные значения ресурсов регистра

ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

 

Возврат ЗначенияРесурсов.Цена;

 

КонецФункции

 

В версии 8 и выше в палитре свойств общего модуля РаботаСоСправочниками отметить флажками настройки "Сервер" и "Вызов сервера". Остальные настройки не должны иметь флажков.

Для получения розничной цены мы будем передавать в функцию два параметра:

  • §     АктуальнаяДата – параметр типа Дата определяет точку на оси времени, в которой нас интересует значение розничной цены.
  • §     ЭлементНоменклатуры – ссылка на элемент справочника Номенклатура, для которого мы хотим получить розничную цену.

В теле процедуры мы сначала создаем вспомогательный объект Отбор. С его помощью определяем, что нас будут интересовать записи регистра, в которых измерение Номенклатура равно переданной в процедуру ссылке на элемент справочника.

Во второй строке мы обращаемся к менеджеру регистра сведений Цены (РегистрыСведений.Цены) и выполняем метод ПолучитьПоследнее(), который возвращает нам значения ресурсов наиболее поздней записи регистра, соответствующей передаваемой дате (АктуальнаяДата) и значениям измерений регистра (Отбор).

Значения ресурсов возвращаются в объекте Структура, поэтому в следующей строке мы получаем искомую нами розничную цену, просто указав имя нужного нам ресурса регистра через точку (ЗначенияРесурсов.Цена).

Теперь проверим, как работает эта функция.

Автоматическое заполнение цены в документе ОказаниеУслуги

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

Найдем в конфигураторе документ ОказаниеУслуги и откроем его форму ФормаДокумента. Откроем свойства поля ввода, расположенного в колонке Номенклатура, и внизу списка найдем событие При изменении. Нажмем на кнопку с лупой и в открывшейся заготовке обработчика события напишем следующий текст (листинг 1.2):

Листинг 1.2. Процедура ПереченьНоменклатурыНоменклатура ПриИзменении()

// Получить текущую строку табличной части

СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;

 

// Установить цену

СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Дата,Элемент.Значение);

 

// Пересчитать сумму строки

РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);

 

В версии 8 и выше следует написать:

СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
                                                 
 СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата,СтрокаТабличнойЧасти.Номенклатура);
   
   
    РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);

Прокомментируем содержимое обработчика.

Первая строка обработчика вам уже знакома: мы получаем текущую строку табличной части документа, так как она нам понадобится в дальнейшем.

Во второй мы устанавливаем полученную цену в документе, вызывая нашу процедуру РозничнаяЦена. Первым параметром мы передаем дату документа, на которую необходимо получить цену.Вторым параметром мы передаем ссылку, которую отображает элемент управления формой, вызвавший это событие (Элемент.Значение), то есть ссылку на элемент справочника Номенклатура.

В заключение мы вызываем нашу процедуру РассчитатьСумму из общего модуля РаботаСДокументами, чтобы она пересчитала итоговую сумму в строке нашего документа.

Проверим, как теперь работает наш документ. Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений Цены. Для транзистора Philips добавим следующим числом новую цену (рис. 1.4):

 

Рис. 1.4. Регистр сведений Цены
Рис. 1.4. Регистр сведений Цены

Теперь откроем документ Оказаниеуслуги №1. Как вы помните, этим документом мы как раз «израсходовали» один такой транзистор.

Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке Номенклатура табличной части документа. Автоматически установится первое значение цены (рис. 1.5).

 

Рис. 1.5. Заполнение документа Оказание услуги
Рис. 1.5. Заполнение документа Оказание услуги


 

Теперь изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены (рис. 1.6).

 

Рис. 1.6. Заполнение документа Оказание услуги
Рис. 1.6. Заполнение документа Оказание услуги

Таким образом, в документе появляется актуальная на момент создания документа цена услуги.

Контрольные вопросы

q     для чего предназначен объект конфигурации Регистр сведений?

q     какими особенностями обладает объект конфигурации Регистр сведений?

q     в чем главные отличия регистра сведений от регистра накопления?

q     какие поля определяют ключ уникальности регистра накопления?

q     что такое периодический регистр сведений и что такое независимый регистр сведений?

q     как создать периодический регистр сведений?

q     что такое ведущее измерение регистра?

q     как получить значения ресурсов наиболее поздних записей регистра средствами встроенного языка?

 

Перечисление

До сих пор мы с вами не обращали внимания на то, что у нас нет никакого признака, по которому мы могли бы сказать, чем является конкретный элемент справочника Номенклатура: материалом или услугой. То, что все элементы справочника разложены у нас по некоторым группам, не может являться надежным критерием оценки: группы можно удалить, переименовать, сгруппировать элементы по другим принципам…

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

В этой главе мы создадим у справочника Номенклатура специальный реквизит, тип значения которого образуется новым пока еще для нас объектом конфигурации Перечисление. Это поможет нам в дальнейшем легко определять, чем является элемент справочника Номенклатура: услугой или материалом. Кроме этого, мы скорректируем процедуру проведения документа ОказаниеУслуги и покажем, как работать с перечислением средствами встроенного языка.

Объект конфигурации Перечисление

Объект конфигурации Перечисление является прикладным и предназначен для описания структуры хранения постоянных наборов значений, не изменяемых в процессе работы конфигурации. На основе объекта конфигурации Перечисление платформа создает в базе данных информационную структуру, в которой может храниться набор некоторых постоянных значений.

В реальной жизни этому объекту может соответствовать, например, перечисление вариантов указания цены (включая НДС, без НДС).

Набор всех возможных значений, которые содержит перечисление, задается при конфигурировании системы, и пользователь не может изменять их, удалять или добавлять новые.

Из этого следует важная особенность перечисления: значения перечисления не «обезличены» для конфигурации, на них могут опираться алгоритмы работы программы.

Реорганизация справочника «Номенклатура»

Откроем конфигуратор и создадим сначала новый объект конфигурации Перечисление с именем ВидыНоменклатуры.

На закладке Данные добавим два значения перечисления: Материал и Услуга (рис. 2.1).

 

Рис. 2.1. Данные перечисления «ВидыНоменклатуры»
Рис. 2.1. Данные перечисления «ВидыНоменклатуры»

Затем добавим в справочник Номенклатура новый реквизит ВидНоменклатуры с типом ПеречислениеСсылка.ВидыНоменклатуры (рис. 2.2).

 

Рис. 2.2. Данные справочника «Номенклатура»
Рис. 2.2. Данные справочника «Номенклатура»

После этого запустим 1С:Предприятие в режиме отладки и зададим для каждого элемента справочника Номенклатура соответствующее значение реквизита ВидНоменклатуры (рис. 2.3).

 

Рис. 2.3. Данные справочника «Номенклатура»
Рис. 2.3. Данные справочника «Номенклатура»

Теперь посмотрим, как можно применить новые данные, полученные благодаря использованию перечисления ВидыНоменклатуры.

Изменение процедуры проведения документа «Оказание услуги»

Если вы помните, в первой части книги, когда создавались движения документа ОказаниеУслуги по регистру накопления ОстаткиМатериалов, мы сказали, что они не совсем правильные, поскольку в регистр будут попадать не только записи об израсходованных материалах, но и записи об оказанных услугах.

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

Более эффективный вариант обработки проведения этого документа мы рассмотрим после изучения главы, рассказывающей о механизме запросов 1С:Предприятия 8.1.

Скорректируем движения документа, исключив из обработки те строки табличной части, в которых находятся услуги. Для этого в обработчик события ОбработкаПроведения, расположенный в модуле документа ОказаниеУслуги, добавим следующий текст (текст следует добавить в начало цикла обхода табличной части документа после строки Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл (листинг 2.1)):

Листинг 2.1. Движения документа «ОказаниеУслуги»

Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Материал Тогда

Продолжить;

КонецЕсли;

Добавленный текст исключает из выполнения операторов цикла те строки документа, в которых номенклатура не является материалом. К значению перечисления Материал мы обращаемся, используя менеджер перечисления ВидыНоменклатуры (Перечисления.ВидыНоменклатуры)и указывая в качестве его свойства имя нужного нам значения перечисления.

Запустим 1С:Предприятие в режиме отладки и проверим работу процедуры проведения документа ОказаниеУслуги.

Откроем документ ОказаниеУслуги №1 и внесем в него следующие изменения (обратите внимание, что изменен не только состав номенклатуры в табличной части, но и время документа) – рис. 2.4.

 

Рис. 2.4. Измененный документ «ОказаниеУслуги №1»
Рис. 2.4. Измененный документ «ОказаниеУслуги №1»

Перед тем как провести документ, откроем список регистра Остатки материалов, содержащий движения этого документа. Для этого выполним команду Перейти  Остатки материалов из командной панели списка документа.

Проведем документ и убедимся, что в движения по регистру ОстаткиМатериалов включаются только строки, содержащие материалы (рис. 2.5).

 

Рис. 2.5. Записи регистра «ОстаткиМатериалов»
Рис. 2.5. Записи регистра «ОстаткиМатериалов»

Контрольные вопросы

q     для чего предназначен объект конфигурации Перечисление?

q     как создать новое перечисление?

q     как с помощью перечисления задать принадлежность элементов справочника к той или иной смысловой группе?

q     как обратиться к значению перечисления средствами встроенного языка?

 

Проведение документа по нескольким регистрам

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

В ходе изучения этой главы мы создадим еще один регистр накопления нашей конфигурации и изменим процедуру проведения документов так, чтобы они записывали необходимые данные как в один, так и в другой регистр и подготовим базу для изучения следующей главы.

Зачем нужно проведение документа по нескольким регистрам?

До сих пор мы с вами учитывали только количественное движение материалов в ООО «На все руки мастер». Для этих целей мы создали регистр накопления ОстаткиМатериалов. Однако, как вы, наверное, догадываетесь, одного только количественного учета совершенно недостаточно для нужд нашего ООО.

Очевидно, что необходимо также знать, какие денежные средства были затрачены на приобретение тех или иных материалов, и каковы материальные запасы ООО «На все руки мастер» в денежном выражении.

После того, как мы начали автоматизировать наше предприятие, руководство ООО «На все руки мастер» высказало пожелание, чтобы весь суммовой учет материалов велся бы теперь по средней стоимости. То есть при закупке материалов они должны учитываться в ценах приобретения, а при расходе – по средней стоимости, которая рассчитывается исходя из общей суммы закупок данного материала и общего количества этого материала, находящегося в ООО.

Поскольку подобная информация имеет совершенно другую структуру, нежели количественный учет, для хранения данных об общей стоимости тех или иных материалов мы будем использовать еще один регистр накопления СтоимостьМатериалов.

Таким образом, документы ПриходнаяНакладная и ОказаниеУслуги должны будут создавать движения не только в регистре ОстаткиМатериалов, но одновременно и в регистре СтоимостьМатериалов, отражая изменения суммового учета.

Создание регистра «Стоимость материалов»

Регистр СтоимостьМатериалов совсем не сложен, поэтому мы не будем подробно останавливаться на его создании. Этот регистр будет иметь всего одно измерение – Материал с типом СправочникСсылка.Номенклатура и один ресурс – Стоимость с длиной 15 и точностью 2.

После создания регистр СтоимостьМатериалов должен выглядеть в дереве конфигурации следующим образом (рис. 3.1):

 

Рис. 3.1. Регистр «СтоимостьМатериалов»
Рис. 3.1. Регистр «СтоимостьМатериалов»

Теперь мы можем приступить к внесению изменений в процедуры проведения документов.

Начнем с самого простого – документа ПриходнаяНакладная.

 

Изменение процедуры проведения документа «Приходная накладная»

Откроем в конфигураторе окно редактирования объекта конфигурации Документ ПриходнаяНакладная и перейдем на закладку Движения. В списке регистров отметим, что документ будет создавать теперь движения и по регистру СтоимостьМатериалов. Запустим конструктор движений и согласимся с тем, что существующая процедура ОбработкаПроведения будет замещена.

Перед нами откроется окно конструктора движений, которое будет содержать созданные нами ранее движения документа по регистру ОстаткиМатериалов. Добавим в список регистров, по которым формируются движения, еще один – СтоимостьМатериалов. Выберем для него ту же табличную часть Материалы и заполним выражения.

Для ресурса Стоимость выберем значения реквизита табличной части Сумма (рис. 3.2).

 

 

Рис. 3.2. Добавим в список регистров новый регистр
Рис. 3.2. Добавим в список регистров новый регистр

Нажмем OK и посмотрим на текст, который сформировал конструктор (листинг 3.1).

Листинг 3.1. Процедура ОбработкаПроведения()

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

 

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора,

// внесенные вручную изменения будут утеряны!!!

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

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

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

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

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

       Движение.Материал = ТекСтрокаМатериалы.Материал;

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

       Движение.Количество = ТекСтрокаМатериалы.Количество;

КонецЦикла;

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

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

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

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

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

       Движение.Материал = ТекСтрокаМатериалы.Материал;

       Движение.Стоимость = ТекСтрокаМатериалы.Сумма;

КонецЦикла;

 

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

 

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

Как вы видите, конструктор создал два цикла обхода табличной части документа – отдельно для каждого регистра. Так происходит потому, что в общем случае документ может иметь несколько табличных частей, и информация, содержащаяся в каждой из них, может предназначаться для своего отдельного регистра.

В нашем случае табличная часть всего одна, поэтому можно объединить эти два цикла в один, закомментировав следующие строки (листинг 3.2):

Листинг 3.2. Объединение двух циклов в один

   // КонецЦикла;

   // Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

Запустим 1С:Предприятие в режиме отладки и перепроведем документы ПриходнаяНакладная №1 и №2.

Затем откроем Приходную накладную №1 и убедимся, что документ создает желаемые записи в регистрах накопления (рис. 3.3, 3.4, 3.5).

 

Рис. 3.3. «ПриходнаяНакладная №1»
Рис. 3.3. «ПриходнаяНакладная №1»
Рис. 3.4. Записи регистра «ОстаткиМатериалов»
Рис. 3.4. Записи регистра «ОстаткиМатериалов»
Рис. 3.5. Записи регистра «СтоимостьМатериалов»
Рис. 3.5. Записи регистра «СтоимостьМатериалов»

Изменение процедуры проведения документа «Оказание услуги»

И в заключение этой главы мы внесем изменения в процедуру обработки проведения документа ОказаниеУслуги. На данном этапе мы будем исходить из пожелания, высказанного руководством ООО «На все руки мастер». Суть его заключается в том, что на первом этапе, при списании материалов, израсходованных в процессе оказания услуги, должна быть возможность указывать различную стоимость для одного и того же материала, которая рассчитана руководством исходя из текущих конъюнктурных соображений.

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

Откроем в конфигураторе окно редактирования объекта конфигурации Документ ОказаниеУслуги, перейдем на закладку Данные и создадим новый реквизит табличной части документа с именем Стоимость, типом Число, длиной 15 и точностью 2 (рис. 3.6).

 

Рис. 3.6. Изменение документа «ОказаниеУслуги»
Рис. 3.6. Изменение документа «ОказаниеУслуги»

После этого откроем форму ФормаДокумента документа ОказаниеУслуги и добавим в табличное поле колонку, отображающую новый реквизит Стоимость, расположив ее после колонки Номенклатура (рис. 3.7). Для этого выделим табличное поле и выполним команду контекстного меню Размещение данных. В окне Размещение данных отметим реквизит Стоимость и нажмем ОK. После этого с помощью мыши перетащим колонку Стоимость после колонки Номенклатура.

Рис. 3.7. Изменение формы документа «ОказаниеУслуги»
Рис. 3.7. Изменение формы документа «ОказаниеУслуги»

Теперь создадим движения документа ОказаниеУслуги таким же образом, как мы делали это для документа ПриходнаяНакладная.

Откроем в конфигураторе окно редактирования объекта конфигурации Документ ОказаниеУслуги и укажем, что он будет создавать движения по регистру накопления СтоимостьМатериалов.

Запустим конструктор движений документа и добавим в список регистров регистр СтоимостьМатериалов. Опишем движения документа следующим образом (обратите внимание, что стоимость вычисляется как произведение стоимости и количества, указанных в табличной части) – рис. 3.8:

 

Рис. 3.8. Конструктор движений документа
Рис. 3.8. Конструктор движений документа

Нажмем OK и в тексте, сформированном конструктором (листинг 3.3), восстановим изменения, внесенные нами ранее (не записывать движения, если номенклатура – не материал) Также объединим два цикла обхода табличной части документа в один (листинг 3.3).

Листинг 3.3. Процедура ОбработкаПроведения()

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

 

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора,

// внесенные вручную изменения будут утеряны!!!

 

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл

      

       Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Материал Тогда

              Продолжить;

       КонецЕсли;

    

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

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

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

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

       Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;

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

       Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

      

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

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

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

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

       Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;

       Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;

 

КонецЦикла;

 

// Записываем движения регистров

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

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

 

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

 

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

Проверим, как теперь работает проведение документа ОказаниеУслуги.

Запустим 1С:Предприятие в режиме отладки и укажем стоимость выбранных материалов в документе ОказаниеУслуги №1 (рис. 3.9).

 

Рис. 3.9. Документ «ОказаниеУслуги №1»
Рис. 3.9. Документ «ОказаниеУслуги №1»

Проведем документ ОказаниеУслуги №1 и посмотрим на движения этого документа по регистру СтоимостьМатериалов (рис. 3.10).

 

Рис.3.10. Записи регистра «СтоимостьМатериалов»
Рис.3.10. Записи регистра «СтоимостьМатериалов»

Теперь создадим и проведем еще два документа ОказаниеУслуги. Эти документы понадобятся нам в дальнейшем, поэтому будьте внимательны и обратите внимание на то, что эти документы созданы другими датами (рис. 3.11, 3.12).

 

Рис. 3.11. Документ «ОказаниеУслуги №2»
Рис. 3.11. Документ «ОказаниеУслуги №2»
Рис. 3.12. Документ «ОказаниеУслуги №3»
Рис. 3.12. Документ «ОказаниеУслуги №3»

Движения документов ОказаниеУслуги №2 и №3 должны выглядеть соответственно следующим образом (рис. 3.13, 3.14):

 

Рис. 3.13. Движения документа «ОказаниеУслуги №2»
Рис. 3.13. Движения документа «ОказаниеУслуги №2»
Рис. 3.14. Движения документа «ОказаниеУслуги №3»
Рис. 3.14. Движения документа «ОказаниеУслуги №3»

Контрольные вопросы

q     для чего может понадобиться проведение документа по нескольким регистрам?

q     как с помощью конструктора создать движения документа по нескольким регистрам?

q     исходя из каких соображений, конструктор формирует текст процедуры проведения по нескольким регистрам?

 

Оборотный регистр накопления

В этой главе мы с вами познакомимся с еще одним видом регистра накопления – оборотным регистром накопления.

Вы узнаете о некоторых важных принципах выбора измерений и реквизитов регистров накопления. Мы с вами создадим оборотный регистр накопления и добавим в один из наших документов движения еще и по этому регистру.

Зачем нужно создавать еще один регистр?

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

Дело в том, что при учете услуг важны совершенно другие критерии, нежели при учете материалов. Прежде всего, бессмысленно говорить о том, сколько услуг было и сколько их осталось, важна только сумма и количество услуг, которые были оказаны за определенный промежуток времени. Кроме этого интересны следующие моменты:

  • §     какие именно услуги были оказаны (чтобы составить рейтинг услуг);
  • §     какому именно клиенту оказывались услуги (чтобы предоставить ему скидку от объема оплаченных ранее услуг, например);
  • §     какой мастер предоставлял услуги (чтобы начислить ему заработную плату).

Очевидно, что существующие регистры накопления совершенно не подходят для решения таких задач. Поэтому мы создадим еще одно «хранилище» данных, которое будет использоваться в нашей программе, – оборотный регистр накопления Продажи.

Создание оборотного регистра накопления «Продажи»

Когда мы создавали регистры ОстаткиМатериалов и СтоимостьМатериалов, мы специально не останавливались на двух видах регистров накопления, которые существуют в системе 1С:Предприятие. Сейчас пришло время сказать об этом пару слов.

Регистры накопления могут быть регистрами остатков и регистрами оборотов.

Существующие в нашей учебной конфигурации регистры ОстаткиМатериалов и СтоимостьМатериалов являются регистрами остатков. Если вы помните, при создании отчета Материалы в конструкторе запроса мы видели, что для таких регистров система создает три виртуальные таблицы: таблица остатков, оборотов и совокупная таблица остатков и оборотов.

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

В остальном оборотный регистр ничем не отличается от регистра остатков.

Следует сказать об одной особенности конструирования регистров накопления, напрямую связанной с возможностью получения остатков.

При создании оборотного регистра накопления нет особой сложности в определении того, какие именно параметры должны являться измерениями регистра – мы можем назначить в качестве его измерений любые нужные нам параметры.

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

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

Скорее всего, при поступлении материалов поставщик будет указан, а вот при расходе материалов, с большой долей вероятности, поставщик указываться не будет, так как в большинстве случаев это совершенно лишняя информация. Значит, поставщика следует добавить как реквизит регистра накопления.

Если же при расходе материалов поставщик будет указываться наверняка, имеет смысл добавить поставщика в измерения регистра.

Иными словами, по каждому из измерений регистра накопления остатков изменение ресурсов обязательно должно осуществляться в обе стороны: приход и расход.

Для реквизитов регистра этот принцип неважен По реквизитам регистра ресурсы могут только приходоваться или только расходоваться.

Нарушение этого принципа построения регистров накопления будет вести к непроизводительному использованию ресурсов системы и как следствие замедлению работы и падению производительности.

Теперь, когда мы знаем «практически все» о регистрах накопления, откроем конфигуратор и создадим новый объект конфигурации Регистр накопления. Назовем его Продажи и определим вид регистра – Обороты.

На закладке Данные создадим измерения регистра:

  • §     Номенклатура, тип СправочникСсылка.Номенклатура,
  • §     Клиент, тип СправочникСсылка.Клиенты,
  • §     Мастер, тип СправочникСсылка.Сотрудники.

У регистра будет три ресурса:

  • §     Количество, тип Число, длина 15, точность 3,
  • §     Выручка, тип Число, длина 15, точность 2,
  • §     Стоимость

Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и на закладке Движения укажем, что этот документ будет создавать движения по регистру Продажи.

Запустим 1С:Предприятие в режиме отладки и откроем формы списка регистров накопления Продажи и ОстаткиМатериалов. Обратите внимание, что формы практически одинаковы, за исключением состава измерений и ресурсов.

Изменение процедуры проведения документа «Оказание услуги»

На этот раз мы не будем использовать конструктор движений документа, а внесем необходимые дополнения прямо в обработчик события ОбработкаПроведения документа ОказаниеУслуги.

Откроем в конфигураторе модуль объекта конфигурации Документ ОказаниеУслуги и найдем в нем процедуру обработчика события ОбработкаПроведения.

Сразу после окончания первого цикла создадим еще один цикл обхода табличной части и команду записи движений регистра Продажи (листинг 4.1).

Листинг 4.1. Добавление цикла обхода табличной части и записи движений регистра «Продажи»

КонецЦикла;

 

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл

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

      

КонецЦикла;     

  

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Теперь в тело созданного нами цикла вставим команды создания движений регистра Продажи (листинг 4.2).

Листинг 4.2. Команды создания движений регистра «Продажи»

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл

 

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

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

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

Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;

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

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

Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;

Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;

 

КонецЦикла;

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

Запустим 1С:Предприятие в режиме отладки и перепроведем все документы ОказаниеУслуги. Движения этих документов по регистру Продажи должны иметь следующий вид (рис. 4.1, 4.2, 4.3):

 

Рис. 4.1. Движения документа «ОказаниеУслуги №1»
Рис. 4.1. Движения документа «ОказаниеУслуги №1»
Рис. 4.2. Движения документа «ОказаниеУслуги №2»
Рис. 4.2. Движения документа «ОказаниеУслуги №2»
Рис. 4.3. Движения документа «ОказаниеУслуги №3»
Рис. 4.3. Движения документа «ОказаниеУслуги №3»

Теперь у нас есть практически вся необходимая информация для анализа деятельности ООО «На все руки мастер». И в следующей главе мы займемся с вами тем, что создадим несколько отчетов, представляющих нам итоговую информацию о работе предприятия.

Контрольные вопросы

q     что такое оборотный регистр накопления?

q     в чем отличие между регистром накопления остатков и оборотным регистром накопления?

q     как выбирать реквизиты и измерения при создании регистров накопления?

q     как создать оборотный регистр накопления?

q     как создать движения документа без использования конструктора движений?

 

Создание отчетов

Настало время, чтобы познакомиться с одним мощным инструментом платформы 1С:Предприятие – системой компоновки данных.

В этой главе мы рассмотрим построение нескольких отчетов, которые будут использоваться в нашей конфи-гурации, и на их примере объясним основные возмож-ности системы компоновки данных.

Любой отчет, как правило, подразумевает получение сложной выборки данных, сгруппированных и отсор-тированных определенным образом. Система компоновки данных представляет собой мощный и гибкий механизм, позволяющий выполнить все необходимые действия – от получения данных из различных источников, до пред-ставления этих данных в виде, удобном для пользователя.

Чаще всего исходные данные, необходимые для отчета, находятся в базе данных. Для того, чтобы указать сис-теме компоновки данных, какая информация и откуда должна быть получена, используется язык запросов системы 1С:Предприятие 8.1.

На этапе разработки отчета можно задать настройки отчета по умолчанию для того, чтобы пользователь мог сразу же запустить отчет на выполнение.

В то же время пользователь может самостоятельно из-менить настройки отчета и выполнить его. При этом сис-тема компоновки данных сгенерирует другой запрос, и другим образом представит конечные данные – в соот-ветствии с новыми настройками, заданными пользователем.

В начале этой главы мы познакомимся с общими све-дениями о языке запросов системы 1С:Предприятие 8.1 и о системе компоновки данных. Затем, на примерах соз-дания конкретных отчетов, мы научимся использовать систему компоновки данных для решения различных практических задач.

Работа с запросами

Для работы с запросами используется объект встроенного языка Запрос. Он позволяет получать информацию, хранящуюся в полях базы данных, в виде выборки, сформированной по заданным правилам.

Система компоновки данных

Система компоновки данных предназначена для создания произвольных отчетов в системе 1С:Предприятие 8.1 и состоит из нескольких основных частей.

Исходные данные для компоновки отчета содержит в себе схема компоновки данных – это наборы данных и методы работы с ними (рис. 5.2).

 

Рис. 5.2. Общая схема работы с системой компоновки данных
Рис. 5.2. Общая схема работы с системой компоновки данных

Разработчик создает схему компоновки данных, в которой описывает текст запроса, наборы данных, связи между ними, доступные поля, параметры получения данных и задает первоначальные настройки компоновки – структуру отчета, макет оформления данных и др.

Например, схема компоновки может содержать следующий набор данных (рис. 5.3):

 

Рис. 5.3. Пример схемы компоновки (набор данных и запрос, его использующий)
Рис. 5.3. Пример схемы компоновки (набор данных и запрос, его использующий)

На рисунке 5.3 показано окно конструктора схемы компоновки данных, в котором содержатся источник данных, текст запроса и поля, выбранные запросом.

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

Например, может быть задана такая структура отчета (рис. 5.4):

Рис. 5.4. Структура возможного отчета.
Рис. 5.4. Структура возможного отчета.

Сформированный отчет может иметь следующий вид (рис. 5.5):

 

Рис. 5.5. Пример отчета
Рис. 5.5. Пример отчета

В представленном отчете таблица будет состоять из записей регистра накопления ПродажиОбороты о клиентах и оказанных им услугах. Эти записи сгруппированы по мастерам, которые выполняли заказы. А в группировке будет выведен список мастеров.

В общем виде система компоновки данных представляет собой совокупность нескольких объектов. При формировании и исполнении отчета происходит последовательная передача данных от одного объекта системы компоновки данных к другому, до получения конечного результата – документа, показанного пользователю.

Алгоритм взаимодействия этих объектов выглядит следующим образом: разработчик создает схему компоновки данных и настройки по умолчанию. В общем случае на основе одной схемы компоновки данных может быть создано большое количество различных отчетов. Настройки компоновки данных – создаваемые разработчиком или изменяемые пользователем – определяют, какой именно отчет будет получен в конкретном случае.

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

Процессор компоновки данных выбирает данные из информационной базы согласно макету компоновки, агрегирует и оформляет эти данные.

Результат компоновки обрабатывается процессором вывода, и в итоге пользователь получает результирующий табличный документ.

Последовательность работы системы компоновки можно представить в виде следующей схемы (рис. 5.6):

 

Рис. 5.6. Схема работы системы компоновки
Рис. 5.6. Схема работы системы компоновки

Отчет «Реестр документов Оказание услуги»

Создадим отчет Реестр документов Оказание услуги, используя систему компоновки данных. Этот отчет будет выводить список существующих в базе данных документов ОказаниеУслуги в порядке их дат и номеров.

Создадим в конфигураторе новый объект конфигурации Отчет. Присвоим ему имя РеестрДокументовОказаниеУслуги. На закладке Основные нажмем кнопку Открыть схему компоновки данных. В открывшемся диалоговом окне конструктора макета нажмем Готово. В конструкторе схемы компоновки данных создадим Набор данных – запрос и запустим конструктор запроса.

В качестве источника данных для запроса выберем объектную (ссылочную) таблицу документов ОказаниеУслуги. Из этой таблицы выберем следующие поля (рис. 5.7):

  • §     Дата;
  • §     Номер;
  • §     Склад;
  • §     Мастер;
  • §     Клиент.
Рис. 5.7. Выбранные поля
Рис. 5.7. Выбранные поля

После этого перейдем на закладку Порядок и укажем, что результат запроса должен быть сначала упорядочен по значению поля Дата, а затем – по значению поля ОказаниеУслуги.Ссылка (рис. 5.8).

 

Рис. 5.8. Порядок вывода результата запроса
Рис. 5.8. Порядок вывода результата запроса

Нажмем ОK и посмотрим, какой запрос сформировал конструктор запроса (листинг 5.1).

Листинг 5.1. Текст запроса

ВЫБРАТЬ

ОказаниеУслуги.Дата КАК Дата,

ОказаниеУслуги.Номер,

ОказаниеУслуги.Склад,

ОказаниеУслуги.Мастер,

ОказаниеУслуги.Клиент

 

ИЗ

Документ.ОказаниеУслуги КАК ОказаниеУслуги

 

УПОРЯДОЧИТЬ ПО

Дата,

ОказаниеУслуги.Ссылка

Текст запроса начинается, как мы говорили выше, с части описания запроса (листинг 5.2).

Листинг 5.2. Описание запроса

ВЫБРАТЬ

ОказаниеУслуги.Дата КАК Дата,

ОказаниеУслуги.Номер,

ОказаниеУслуги.Склад,

ОказаниеУслуги.Мастер,

ОказаниеУслуги.Клиент

 

ИЗ

Документ.ОказаниеУслуги КАК ОказаниеУслуги

Описание запроса начинается с обязательного ключевого слова ВЫБРАТЬ. Затем следует список полей выборки. В нем описываются поля, которые должны содержаться в результате запроса. Этот список может содержать как собственно поля, так и некоторые выражения, вычисляемые на основе значений полей.

После ключевого слова ИЗ указываются источники данных – исходные таблицы запроса, содержимое которых обрабатывается в запросе. В данном случае это объектная (ссылочная) таблица Документ.ОказаниеУслуги. После ключевого слова КАК указывается псевдоним источника данных. В нашем случае это ОказаниеУслуги. В дальнейшем к этому источнику данных можно будет обращаться в тексте запроса, используя псевдоним.

Такое обращение мы видим в описании полей выборки (листинг 5.3).

Листинг 5.3. Описание полей выборки

ВЫБРАТЬ

ОказаниеУслуги.Дата КАК Дата,

ОказаниеУслуги.Номер,

ОказаниеУслуги.Склад,

ОказаниеУслуги.Мастер,

ОказаниеУслуги.Клиент

Поля выборки также могут иметь псевдонимы, по которым в дальнейшем в тексте запроса можно обращаться к этому полю. В нашем случае это псевдоним Дата.

После части описания запроса в нашем примере следует часть упорядочивания результатов (листинг 5.4).

Листинг 5.4. Упорядочивание результатов запроса

УПОРЯДОЧИТЬ ПО

Дата,

ОказаниеУслуги.Ссылка

Предложение УПОРЯДОЧИТЬ ПО позволяет сортировать строки в результате запроса. После этого ключевого предложения располагается выражение упорядочивания, которое в общем случае представляет собой перечисление полей (выражений) и порядка вывода. В нашем случае упорядочивание будет выполняться сначала по полю Дата, а потом по полю ОказаниеУслуги.Ссылка. В обоих случаях порядок сортировки будет по возрастанию (настроен по умолчанию).На этом закончим изучение текста запроса и перейдем к настройке схемы компоновки данных.

Перейдем на закладку Настройки и добавим новую группировку в структуру отчета (рис. 5.9).

 

Рис. 5.9. Командная панель закладки Настройки
Рис. 5.9. Командная панель закладки Настройки

В окне выбора поля группировки просто нажмем ОK (тем самым мы указываем, что в группировке будут выводиться детальные записи из информационной базы) и на закладке Выбранные поля зададим поля, которые будут выводиться в отчет:

  • §     Дата;
  • §     Номер;
  • §     Склад;
  • §     Мастер;
  • §     Клиент.
Рис. 5.10. Настройка структуры отчета
Рис. 5.10. Настройка структуры отчета

Теперь запустим 1С:Предприятие в режиме отладки и откроем отчет Реестр документов Оказание услуги. Нажмем Сформировать и посмотрим на результат работы нашего отчета (рис. 5.11).

 

Рис. 5.11. Отчет Реестр документов оказание услуги
Рис. 5.11. Отчет Реестр документов оказание услуги

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

 

Отчет Рейтинг услуг

Отчет Рейтинг услуг будет содержать информацию о том, выполнение каких услуг принесло ООО «На все руки мастер» наибольшую прибыль в указанном периоде. На примере отчета Рейтинг услуг мы проиллюстрируем, как отбирать данные в некотором периоде, как задавать параметры запроса и как использовать в запросе данные из нескольких таблиц и включать в результат запроса все данные одного из источников.

Создадим новый объект конфигурации Отчет. Назовем его РейтингУслуг. На закладке Основные нажмем кнопку Открыть схему компоновки данных. В открывшемся диалоговом окне конструктора макета нажмем Готово.

В конструкторе схемы компоновки данных создадим Набор данных запрос и запустим конструктор запроса.

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

Затем выберем из таблиц поля СпрНоменклатура.Ссылка и ПродажиОбороты.ВыручкаОборот (рис. 5.12).

Рис. 5.12. Выбранные поля
Рис. 5.12. Выбранные поля

Перейдем на закладку Связи и увидим, что конструктор уже создал связь между двумя выбранными таблицами – значение изменения регистра Номенклатура должно быть равно ссылке на элемент справочника Номенклатура.

Единственное, что нам останется сделать, это сбросить флаг Все у таблицы регистра и установить его у таблицы справочника (рис. 5.13).

Рис. 5.13. Установка связей таблиц
Рис. 5.13. Установка связей таблиц

Установка флага Все у таблицы справочника будет означать, что из справочника будут выбраны все элементы и этим элементам будет поставлено в соответствие значение оборота выручки из регистра. Таким образом, в результате запроса будут присутствовать все услуги, и для некоторых из них будут указаны обороты выручки. Для тех услуг, которые не оказывались в выбранном периоде, не будет указано ничего.

Перейдем на закладку Условия и зададим условия выбора элементов из справочника Номенклатура (рис. 5.14). При задании условий выбора мы будем использовать параметры запроса. Первым условием должно быть то, что выбранный элемент не является группой (для этого следует переключиться в режим Произвольное условие – установить флаг Произвольное). Затем ввести в поле условие следующий текст (листинг 5.5).

Листинг 5.5. Условие запроса

СпрНоменклатура.ЭтоГруппа = ЛОЖЬ

Вторым условием должно быть то, что выбранный элемент является услугой (это – Простое условие) (рис. 5.14).

 

Рис. 5.14. Условия выбора элементов
Рис. 5.14. Условия выбора элементов

В дальнейшем, перед выполнением запроса, мы передадим в параметр ВидНоменклатуры соответствующее значение перечисления.

Перейдем на закладку Объединения/Псевдонимы и укажем, что представление элемента справочника будет иметь псевдоним Услуга, а поле регистра будет иметь псевдоним Выручка (рис. 5.15).

 

Рис. 5.15. Объединения/Псевдонимы
Рис. 5.15. Объединения/Псевдонимы

Перейдем на закладку Порядок и укажем, что результат запроса должен быть отсортирован по убыванию значения поля Выручка. Создание запроса закончено, нажмем кнопку ОK.

Рассмотрим запрос, сформированный конструктором (листинг 5.6).

Листинг 5.6. Текст запроса

ВЫБРАТЬ

СпрНоменклатура.Ссылка КАК Услуга,

ПродажиОбороты.ВыручкаОборот КАК Выручка

 

ИЗ

Справочник.Номенклатура КАК СпрНоменклатура

       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

       ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

 

ГДЕ

СпрНоменклатура.ЭтоГруппа = ЛОЖЬ И СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

 

УПОРЯДОЧИТЬ ПО

Выручка УБЫВ

Сначала, как обычно, идет часть описания запроса, и в ней есть новые для нас конструкции.

При описании источников запроса (после ключевого слова ИЗ) использована возможность определения нескольких источников запроса (листинг 5.7).

Листинг 5.7. Определение нескольких источников запроса

ИЗ

Справочник.Номенклатура КАК СпрНоменклатура

       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

       ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

В данном случае выбираются записи из двух источников: СпрНоменклатура и ПродажиОбороты, причем ключевым предложением ЛЕВОЕ СОЕДИНЕНИЕ ПО описан способ, которым будут скомбинированы между собой записи этих двух источников.

ЛЕВОЕСОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обоих источников, которые соответствуют указанному после ключевого слова ПО условию. Кроме этого в результат запроса надо включить еще и записи из первого (указанного слева от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из второго источника.

Продолжим рассматривать текст запроса. В части описания запроса есть еще одна новая для нас конструкция – задание условий отбора данных из исходных таблиц (листинг 5.8).

Листинг 5.8. Задание условий отбора

ГДЕ

СпрНоменклатура.ЭтоГруппа = ЛОЖЬ И СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

Условию отбора всегда предшествует ключевое слово ГДЕ. После него описывается само условие. Обратите внимание, что поля исходных таблиц, на которые накладывается условие, могут и не входить в список выборки (как в нашем случае). Кроме того, в нашем условии использован параметр запроса ВидНоменклатуры.

Теперь, когда мы закончили знакомиться с текстом запроса, продолжим формирование нашей схемы компоновки данных.

Перейдем на закладку Ресурсы и нажмем кнопку >>, чтобы конструктор выбрал все доступные ресурсы, по которым можно вычислять итоги. В нашем случае – это единственный ресурс Выручка (рис. 5.16).

Рис. 5.16. Ресурсы схемы компоновки данных
Рис. 5.16. Ресурсы схемы компоновки данных

Перейдем на закладку Параметры (рис. 5.17).

Рис. 5.17. Параметры компоновки данных
Рис. 5.17. Параметры компоновки данных

На этой закладке мы увидим три параметра: НачалоПериода, КонецПериода и ВидНоменклатуры. Вы можете спросить: почему параметра три, хотя в запросе мы задавали всего один – ВидНоменклатуры?

Все дело в том, что система компоновки данных самостоятельно анализирует текст запроса и помимо тех параметров, которые указаны в нем в явном виде (ВидНоменклатуры), предоставляет возможность настроить и те параметры, которые в явном виде в запросе не указаны, но с большой долей вероятности могут быть использованы в отчете. Такими параметрами являются НачалоПериода и КонецПериода. Это первые два параметра виртуальной таблицы РегистрНакопления.Продажи.Обороты, которую мы использовали в запросе, в левом соединении.

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

Для параметра НачалоПериода зададим заголовок, который будет отображаться пользователю – Дата начала.

Здесь всегда следует помнить, что если мы передаем в качестве этих параметров дату (а в нашем случае так и будет), то дата содержит и время с точностью до секунды.

Допустим, заранее известно, что пользователя не будут интересовать результаты работы отчета в периодах, указанных с точностью до секунды. В этом случае следует учесть две особенности.

Во-первых, пользователя надо избавить от необходимости указывать время при вводе даты. Для этого мы изменим существующее описание типа для параметра НачалоПериода. Дважды щелкнем в ячейке Доступные типы, соответствующей параметру НачалоПериода, нажмем кнопку выбора () и в нижней части окна редактирования типа данных установим Состав даты в значение Дата (рис. 5.18).

Рис. 5.18. Редактирование состава даты
Рис. 5.18. Редактирование состава даты

Нажмем ОK.

Вторая особенность заключается в том, что по умолчанию время в дате установлено 00:00:00. Поэтому, если пользователь задаст период отчета с 01.03.2004 по 31.03.2004, итоги регистра будут рассчитаны с начала дня 01.03.2004 00:00:00 по начало дня 31.03.2004 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя.

Для того чтобы исключить эту ситуацию, мы добавим еще один параметр, в который пользователь будет вводить дату окончания. Значение параметра КонецПериода будем рассчитывать автоматически таким образом, чтобы оно указывало на конец дня даты, введенной пользователем. Поэтому для параметра КонецПериода установим флаг Ограничение доступности.

С помощью кнопки командной панели добавим новый параметр с именем ДатаОкончания (рис. 5.19).

Рис. 5.19. Добавление параметра ДатаОкончания
Рис. 5.19. Добавление параметра ДатаОкончания

Для этого параметра платформа автоматически сформирует заголовок – Дата окончания. Оставим его без изменений. Зададим тип значения параметра – Дата. При этом, как и для параметра НачалоПериода, укажем состав даты – Дата.

Обратите внимание, что по умолчанию добавленный нами параметр доступен для пользователя (ограничение доступности в последней колонке снято). Нас это вполне устраивает.

Перейдем к параметру КонецПериода. Для него система установила флаг ограничения доступности. Это нас также устраивает, поскольку значение этого параметра мы собираемся вычислять на основании значения, установленного пользователем для параметра ДатаОкончания.

Чтобы задать формулу, по которой будет вычисляться значение параметра КонецПериода, воспользуемся языком выражений системы компоновки данных. Он содержит функцию КонецПериода(), которая позволяет получить дату, соответствующую концу какого-либо периода, например, указанного дня.

В ячейке Выражение зададим для параметра КонецПериода следующее выражение (листинг 5.9):

Листинг 5.9. Выражение для расчета значения параметра КонецПериода

КонецПериода(&ДатаОкончания, "День")

В результате перечисленных действий параметры компоновки будут иметь следующий вид (рис. 5.20):

Рис. 5.20. Параметры системы компоновки
Рис. 5.20. Параметры системы компоновки

И в заключение настроим параметр ВидНоменклатуры. Поскольку отчет должен отображать выручку, полученную только от реализации услуг, значение параметра ВидНоменклатуры пользователь изменять не должен. Оно должно быть задано непосредственно в схеме компоновки как Перечисление.ВидыНоменклатуры.Услуга. Флаг ограничения использования у параметра ВидНоменклатуры платформа установила по умолчанию, поэтому нам остается только указать нужное значение перечисления ВидыНоменклатуры в ячейке Значение, соответствующей параметру ВидНоменклатуры (рис. 5.21).

Рис. 5.21. Установка значения параметра ВидНоменклатуры
Рис. 5.21. Установка значения параметра ВидНоменклатуры

Перейдем к формированию структуры отчета. На закладке Настройки добавим группировку и снова не укажем поле группировки. На закладке Выбранные поля укажем поля Услуга и Выручка (рис. 5.22).

Рис. 5.22. Структура отчета РейтингУслуг
Рис. 5.22. Структура отчета РейтингУслуг

В заключение перейдем на закладку Другие настройки и зададим заголовок отчета – РейтингУслуг (рис. 5.23).

Рис. 5.23. Установка заголовка отчета
Рис. 5.23. Установка заголовка отчета

Запустим 1С:Предприятие в режиме отладки.

Запустим наш отчет Рейтинг услуг, но перед тем, как нажать кнопку Сформировать, откроем Настройки и на закладке Параметры данных зададим период отчета с 01.03.2004 по 30.04.2004 (рис. 5.24).

Рис. 5.24. Настройки отчета
Рис. 5.24. Настройки отчета

Нажмем OK и сформируем отчет. Результат будет выглядеть следующим образом (рис. 5.25):

Рис. 5.25. Результат выполнения отчета
Рис. 5.25. Результат выполнения отчета

Теперь изменим дату окончания на 31.03.2004. Данные за 31 марта попадают в отчет (рис. 5.26).

Рис. 5.26. Результат выполнения отчета
Рис. 5.26. Результат выполнения отчета

Отчет Выручка мастеров

Отчет Выручка мастеров будет содержать информацию о том, какая выручка была получена ООО «На все руки мастер» благодаря работе каждого из мастеров, с детализацией по всем дням в выбранном периоде и разворотом по клиентам, обслуженным в каждый из дней. На примере этого отчета мы проиллюстрируем, как строить многоуровневые группировки в запросе и как обходить все даты в выбранном периоде.

Создадим новый объект конфигурации Отчет. Назовем его ВыручкаМастеров и запустим конструктор основной схемы компоновки данных.

Создадим Набор данных запрос и запустим конструктор запроса. Выберем виртуальную таблицу регистра накопления Продажи.Обороты.

Зададим один из параметров этой виртуальной таблицы – Периодичность. Для этого перейдем в поле Таблицы и нажмем кнопку Параметры виртуальной таблицы (рис. 5.27).

Рис. 5.27. Изменение параметров виртуальной таблицы
Рис. 5.27. Изменение параметров виртуальной таблицы

В открывшемся окне параметров зададим значение параметра ПериодичностьДень (рис. 5.28). Нажмем OK.

Рис. 5.28. Параметры виртуальной таблицы
Рис. 5.28. Параметры виртуальной таблицы

После этого выберем из таблицы следующие поля:

  • §     ПродажиОбороты.Мастер;
  • §     ПродажиОбороты.Период;
  • §     ПродажиОбороты.Клиент;
  • §     ПродажиОбороты.ВыручкаОборот
Рис. 5.29. Выбранные поля
Рис. 5.29. Выбранные поля

Теперь перейдем на закладку Объединения/Псевдонимы и зададим псевдоним Выручка для поля ПродажиОбороты.ВыручкаОборот (рис. 5.30).

Рис. 5.30. Объединения/Псевдонимы
Рис. 5.30. Объединения/Псевдонимы

На закладке Группировка определим, что группировка будет проводиться по полям Мастер, Период и Клиент, а значения поля ВыручкаОборот будут суммироваться (рис. 5.31).

Рис. 5.31. Поля группировок
Рис. 5.31. Поля группировок

На закладке Порядок определим, что результат запроса будет отсортирован по возрастанию значения поля Период. Нажмем ОK.

Рассмотрим текст запроса, сформированный конструктором (листинг 5.10).

Листинг 5.10. Текст запроса

ВЫБРАТЬ

ПродажиОбороты.Мастер,

ПродажиОбороты.Период КАК Период,

ПродажиОбороты.Клиент,

СУММА(ПродажиОбороты.ВыручкаОборот) КАК Выручка

 

ИЗ

РегистрНакопления.Продажи.Обороты( , , День, ) КАК ПродажиОбороты

 

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

ПродажиОбороты.Мастер,

ПродажиОбороты.Период,

ПродажиОбороты.Клиент

 

УПОРЯДОЧИТЬ ПО

Период

В части описания запроса обратите внимание, что у источника данных кроме задания начала и окончания периода расчета итогов задана периодичность выбираемых данных – День (листинг 5.11):

Листинг 5.11. Задание периодичности виртуальной таблицы

ИЗ

РегистрНакопления.Продажи.Обороты( , , День, ) КАК ПродажиОбороты

Именно благодаря этому у нас появляется возможность описать среди выбранных полей поле Период.

Теперь перейдем к редактированию схемы компоновки данных. На закладке Ресурсы нажмем >> и убедимся, что конструктор выбрал единственный имеющийся у нас ресурс – Выручка.

На закладке Параметры выполним те же действия, что и при создании предыдущего отчета.

Для параметра НачалоПериода зададим заголовок Дата начала. В поле Доступные типы зададим состав даты – Дата.

Для параметра КонецПериода зададим выражение (листинг 5.12) и в поле Ограничение доступности установим флаг ограничения доступности.

Листинг 5.12. Выражение для расчета параметра КонецПериода

КонецПериода(&ДатаОкончания, "День")

В заключение добавим еще один параметр – ДатаОкончания, установим его тип как Дата, состав даты – Дата.

В результате перечисленных действий параметры компоновки данных будут иметь следующий вид (рис. 5.32):

Рис. 5.32. Параметры компоновки данных
Рис. 5.32. Параметры компоновки данных

Теперь создадим структуру отчета. На закладке Настройки последовательно создадим две вложенные группировки: верхнего уровня – по полю Мастер, вложенная в нее – по полю Период. Затем добавим еще одну группировку, вложенную в группировку по полю Период,Детальные записи (без указания группировочного поля) (рис. 5.33).

Рис. 5.33. Структура отчета
Рис. 5.33. Структура отчета

Теперь, находясь на уровне глобального отчета, перейдем на закладку Выбранные поля и добавим в список поля Клиент и Выручка.

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

Рис. 5.34. Установка вывода общих итогов в начало
Рис. 5.34. Установка вывода общих итогов в начало

Запустим 1С:Предприятие в режиме отладки и посмотрим на результат работы отчета Выручка мастеров за период с 01.03.2004 по 30.04.2004 (рис. 5.35).

Рис. 5.35. Результат выполнения отчета
Рис. 5.35. Результат выполнения отчета

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

Для этого мы вернемся в режим конфигуратора и выполним более тонкую настройку структуры отчета. До сих пор все настройки структуры, которые мы выполняли, относились ко всему отчету в целом. Но система компоновки данных позволяет настраивать также и каждый элемент структуры в отдельности.

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

Рис. 5.36. Настройки группировки Период
Рис. 5.36. Настройки группировки Период

В нижней части формы будут отображены настройки, доступные для данной группировки.

Перейдем на закладку Поля группировки. Для поля Период установим Тип дополненияДень(рис. 5.37).

Рис. 5.37. Установка типа дополнения периода
Рис. 5.37. Установка типа дополнения периода

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

После этого следует указать, в каком именно периоде будет выполняться такое дополнение. В поля, расположенные строчкой ниже, можно ввести даты начала и окончания этого периода. Но указание дат в явном виде нас не устраивает, т.к. пользователь может сформировать отчет за произвольный период. И нам нужно, чтобы дополнение дат выполнялось не в некотором фиксированном периоде, а именно в том периоде, который выбрал пользователь для всего отчета.

Для того чтобы обеспечить именно такую работу отчета, войдем в режим редактирования первого поля (например, дважды кликнув на нем) и нажмем на кнопку очистки (Х). После этого, нажав на кнопку Т, мы сможем выбрать тип данных, отображаемых в этом поле. Выберем Поле компоновки данных (рис. 5.38).

Рис. 5.38. Выбор типа данных
Рис. 5.38. Выбор типа данных

Нажмем OK. Теперь нажмем в поле ввода кнопку выбора () и в открывшемся окне выбора поля отметим параметр НачалоПериода (рис. 5.39). Нажмем OK.

Рис. 5.39. Выбор поля
Рис. 5.39. Выбор поля

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

Рис. 5.40. Настройки группировки Период
Рис. 5.40. Настройки группировки Период

Запустим 1С:Предприятие в режиме отладки и выполним отчет Выручка мастеров за период с 20.03.2004 по 20.04.2004 (рис. 5.41).

Рис. 5.41. Результат выполнения отчета
Рис. 5.41. Результат выполнения отчета

На примере этого отчета мы продемонстрировали, как строить многоуровневые группировки и как установить в системе компоновки обход по всем датам в выбранном периоде.

Отчет Переченьуслуг

Отчет Перечень услуг будет содержать информацию о том, какие услуги и по какой цене оказывает ООО «На все руки мастер». На его примере мы познакомимся с возможностью получения последних значений из периодического регистра сведений и вывода иерархических справочников.

Создадим новый объект конфигурации Отчет. Назовем его ПереченьУслуг и запустим конструктор схемы компоновки данных. Создадим новый Набор данных запрос и вызовем конструктор запроса.

Выберем объектную (ссылочную) таблицу справочника Номенклатура и виртуальную таблицу регистра сведений Цены.СрезПоследних. Для того чтобы исключить неоднозначность имен в запросе, переименуем таблицу Номенклатура в СпрНоменклатура.

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

Рис. 5.42. Параметры виртуальной таблицы
Рис. 5.42. Параметры виртуальной таблицы

Затем выберем из таблиц следующие поля:

  • §     СпрНоменклатура.Родитель;
  • §     СпрНоменклатура.Ссылка;
  • §     ЦеныСрезПоследних.Цена
Рис. 5.43. Выбранные поля
Рис. 5.43. Выбранные поля

Перейдем на закладку Связи, сбросим флаг Все у таблицы регистра и установим его у таблицы справочника.

На закладке Условия зададим условие выбора элементов справочника Номенклатура - выбираемые элементы должны соответствовать виду номенклатуры, переданному в параметре запроса ВидНоменклатуры (рис. 5.44).

Рис. 5.44. Условия выбора элементов
Рис. 5.44. Условия выбора элементов

На закладке Объединения/Псевдонимы укажем, что поле Родитель будет иметь псевдоним ГруппаУслуг, а поле СсылкаУслуга (рис. 5.45).

Рис. 5.45. Объединения/Псевдонимы
Рис. 5.45. Объединения/Псевдонимы

Перейдем на закладку Группировка и укажем, что группировка будет производиться по полю СпрНоменклатура.Родитель Значения суммируемых полей задавать не станем (рис. 5.46).

Рис.5.46. Поля группировки
Рис.5.46. Поля группировки

На этом создание запроса завершено, нажмем OK. Теперь рассмотрим текст запроса, сформированный конструктором (листинг 5.13).

Листинг 5.13. Текст запроса

ВЫБРАТЬ

СпрНоменклатура.Родитель КАК ГруппаУслуг,

СпрНоменклатура.Ссылка КАК Услуга,

ЦеныСрезПоследних.Цена

 

ИЗ

Справочник.Номенклатура КАК СпрНоменклатура

       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&ДатаОтчета, ) КАК ЦеныСрезПоследних

       ПО ЦеныСрезПоследних.Номенклатура = СпрНоменклатура.Ссылка

 

ГДЕ

СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

 

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

СпрНоменклатура.Родитель,

СпрНоменклатура.Ссылка,

ЦеныСрезПоследних.Цена

Практически все конструкции, использованные в этом запросе, нам уже известны.

Перейдем к редактированию схемы компоновки данных. На закладке Ресурсы нажатием кнопки >> выберем единственный доступный ресурс Цена.

На закладке Параметры зададим значение параметра ВидНоменклатуры как Перечисление.ВидыНоменклатуры.Услуга. Кроме этого снимем ограничение доступности для параметра ДатаОтчета и зададим ему заголовок – Дата отчета. В поле Доступные типы зададим состав даты – Дата. Для параметра Период, наоборот, установим ограничение доступности (рис. 5.47).

Рис. 5.47. Параметры схемы компоновки
Рис. 5.47. Параметры схемы компоновки

Приступим к созданию структуры отчета. Перейдем на закладку Настройки и создадим группировку по полю ГруппаУслуг, указав тип группировки Иерархия. Внутри этой группировки создадим еще одну группировку без указания группового поля. Она будет содержать детальные записи отчета (рис. 5.48).

Рис. 5.48. Структура и выделенные поля отчета
Рис. 5.48. Структура и выделенные поля отчета

Перейдем на закладку Выбранные поля и укажем, что в отчет будут выводиться поля Услуга и Цена (рис. 5.49).

Рис. 5.49. Структура отчета
Рис. 5.49. Структура отчета

И в заключение настроим внешний вид отчета на закладке Другие настройки. Так как наш отчет будет представлять собой просто список оказываемых услуг, в котором интересны цены на конкретные услуги, выводить значения ресурса Цена для каждой из группировок и для всего отчета в целом не имеет смысла.

Чтобы запретить вывод общих итогов в отчете, установим параметр Расположение общих итогов по вертикали в значение Нет.

Затем перейдем к настройкам конкретной группировки – ГруппаУслуг. Для параметра Расположение итогов этой группировки укажем значение Нет. Вернемся к настройкам всего отчета в целом.

Для параметра Расположение полей группировок укажем значение Отдельно и только в итогах (так наш отчет будет лучше «читаться»). Напоследок зададим заголовок отчета – Перечень услуг.

Теперь запустим 1С:Предприятие в режиме отладки и прежде всего откроем периодический регистр Цены.

Добавим в него еще одно значение для услуги Диагностика: новая цена услуги на 01.04.2004350 (рис. 5.50). Это позволит нам протестировать отчет.

Рис. 5.50. Записи регистра «Цены»
Рис. 5.50. Записи регистра «Цены»

 

 

 

 

 

 

 

 

 

 

 

Теперь выполним отчет Перечень услуг по состоянию на 31.03.2004 (рис. 5.51).

Рис. 5.51 Результат выполнения отчета
Рис. 5.51 Результат выполнения отчета

Наш отчет правильно отражает цену услуги Диагностика на 31.03.2004200 грн.

Еще раз выполним отчет, но теперь уже на другую дату - 01.04.2004 (рис. 5.52).

Рис. 5.52. Результат выполнения отчета
Рис. 5.52. Результат выполнения отчета

Как видите, показана новая цена услуги Диагностика350 грн.

Таким образом, на примере этого отчета мы показали, как система компоновки данных получает последние значения из периодического регистра сведений и как вывести группировки по иерархии справочника.

Отчет Рейтинг клиентов

Отчет Рейтинг клиентов будет показывать, каков доход от оказания услуг каждому из клиентов за все время работы ООО «На все руки мастер». На его примере мы продемонстрируем возможность использования диаграммы для отображения результата запроса.

Диаграмма

Диаграмма является элементом управления, предназначенным для размещения в таблицах и формах диаграмм и графиков различного вида системы 1С:Предприятие.

Логически диаграмма является совокупностью точек, серий и значений серий в точке (рис. 5.53).

Рис. 5.53. Пример диаграммы
Рис. 5.53. Пример диаграммы

Как правило, в качестве точек используются моменты или объекты, для которых мы получаем значения характеристик, а в качестве серий – характеристики, значения которых нас интересуют.

Например, диаграмма продаж видов номенклатуры по месяцам будет состоять из точек – месяцев, серий – видов номенклатуры и значений – оборотов продаж.

Диаграмма как объект встроенного языка имеет три области, которые позволяют управлять оформлением диаграммы: область построения, область заголовка и область легенды (рис.5.54).

Рис. 5.54. Области диаграммы
Рис. 5.54. Области диаграммы

Диаграмма может быть вставлена в структуру отчета как отдельный элемент. В следующем отчете мы будем использовать диаграмму в структуре настроек схемы компоновки данных.

Создание отчета Рейтинг клиентов

Создадим в конфигураторе новый объект конфигурации Отчет. Назовем его РейтингКлиентов, откроем его основную схему компоновки данных.

Создадим набор данных – запрос, вызовем конструктор запроса и выберем виртуальную таблицу регистра накопления Продажи.Обороты и из нее одно поле – ПродажиОбороты.Клиент.

Затем добавим новое поле (значок Добавить в командной панели над списком полей) и при помощи построителя выражений определим его как разность между выручкой и стоимостью (рис. 5.55).

Рис. 5.55. Редактор произвольного выражения поля
Рис. 5.55. Редактор произвольного выражения поля

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В результате список выбранных полей будет иметь следующий вид (рис. 5.56):

Рис. 5.56. Выбранные поля
Рис. 5.56. Выбранные поля

На закладке Объединения/Псевдонимы укажем, что вычисляемое поле будет иметь псевдоним Доход (рис. 5.57).

Рис. 5.57. Объединения/Псевдонимы
Рис. 5.57. Объединения/Псевдонимы

На закладке Порядок укажем, что строки результата нужно упорядочивать по убыванию значения поля Доход. Нажмем OK и посмотрим, какой текст сформировал конструктор запроса (листинг 5.14).

Листинг 5.14. Текст запроса

ВЫБРАТЬ

ПродажиОбороты.Клиент,

ПродажиОбороты.ВыручкаОборот – ПродажиОбороты.СтоимостьОборот КАК Доход

 

ИЗ

РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

 

УПОРЯДОЧИТЬ ПО

Доход УБЫВ

По сравнению с предыдущими отчетами текст запроса довольно прост. Единственным интересным местом, на которое следует обратить внимание, является поле Доход, являющееся результатом вычисления выражения (листинг 5.15).

Листинг 5.15. Вычисляемое поле

ПродажиОбороты.ВыручкаОборот – ПродажиОбороты.СтоимостьОборот КАК Доход

Теперь добавим поле Доход в ресурсы схемы компоновки и перейдем на закладку Настройки для того, чтобы создать структуру отчета.

В отличие от всех предыдущих отчетов, структура которых содержала группировки, в этот раз добавим в структуру отчета диаграмму (рис. 5.58).

Рис. 5.58. Структура отчета
Рис. 5.58. Структура отчета

В точки диаграммы добавим группировку по полю Клиент. Серии диаграммы оставим без изменений.

Теперь перейдем на закладку Выбранные поля и выберем поле Доход для вывода в отчет. Структура отчета должна принять следующий вид (рис. 5.59):

Рис. 5.59. Структура отчета и настройки диаграммы
Рис. 5.59. Структура отчета и настройки диаграммы

На закладке Другие настройки зададим заголовок отчета – Рейтинг клиентов, а также выберем тип диаграммы – Круговая объемная.

Запустим 1С:Предприятие в режиме отладки и откроем отчет Рейтинг клиентов (рис. 5.60).

Рис. 5.60. Круговая объемная диаграмма в отчете
Рис. 5.60. Круговая объемная диаграмма в отчете

Обратите внимание, что при наведении курсора на сектор диаграммы появляется подсказка.

Откроем настройки отчета и изменим тип диаграммы на Измерительная. Заново сформируем отчет (рис. 5.61).

Рис. 5.61. Измерительная диаграмма в отчете
Рис. 5.61. Измерительная диаграмма в отчете

На примере этого отчета мы продемонстрировали, как можно использовать различные виды диаграмм для визуализации данных отчета.

Универсальный отчет

На примере создания универсального отчета мы узнаем, как система компоновки данных может взаимодействовать со сводной таблицей.

Создадим в конфигураторе новый объект конфигурации Отчет. Присвоим ему имя Универсальный. Откроем его основную схему компоновки данных и создадим новый набор данных – запрос. Вызовем конструктор запроса и выберем виртуальную таблицу регистра накопления Продажи.Обороты. Из этой таблицы выберем все поля (рис. 5.62).

Рис. 5.62. Выбранные поля
Рис. 5.62. Выбранные поля

На закладке Группировка с помощью кнопок >> выберем все поля, доступные для группировки, а все ресурсы добавим в Суммируемые поля (рис. 5.63).

Рис. 5.63. Поля группировки и ресурсы
Рис. 5.63. Поля группировки и ресурсы

Нажмем OK и посмотрим на текст, сформированный конструктором запроса (листинг 5.16).

Листинг 5.16. Текст запроса

ВЫБРАТЬ

ПродажиОбороты.Номенклатура,

ПродажиОбороты.Клиент,

ПродажиОбороты.Мастер,

СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот,

СУММА(ПродажиОбороты.ВыручкаОборот) КАК ВыручкаОборот,

СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот

 

ИЗ

РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

 

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

ПродажиОбороты.Клиент,

ПродажиОбороты.Мастер,

ПродажиОбороты.Номенклатура

Закончим создание схемы компоновки данных тем, что на закладке конструктора схемы компоновки Ресурсы выберем все доступные ресурсы (нажмем >>). На этом работа со схемой компоновки данных завершена, закроем ее и вернемся к окну редактирования объекта конфигурации Отчет Универсальный.

Перейдем на закладку Формы и создадим основную форму отчета, нажав на кнопку просмотра у табличного поля Основная форма отчета. Так как основная форма пока отсутствует, система вызовет конструктор форм. Согласимся с тем, что система предлагает по умолчанию, и сразу нажмем Готово.

На экране откроется основная форма отчета. Как видите, система уже вставила за нас поле табличного документа и дала ему имя Результат (рис. 5.64).

Рис.5.64. Редактирование формы отчета
Рис.5.64. Редактирование формы отчета

Мы собираемся вставить в это поле сводную таблицу. Но ячейки поля табличного документа Результат сейчас находятся в режиме Только просмотр. Для того чтобы вставить сводную таблицу, нужно снять этот режим, поэтому щелкнем на поле табличного документа и выполним Таблица  Вид  Только просмотр. Теперь мы можем редактировать табличное поле.

Установим курсор в верхнюю левую ячейку поля табличного документа и выполним Таблица  Встроенные таблицы  Вставить сводную таблицу. Система добавит в табличное поле сводную таблицу и откроет окно полей сводной таблицы (рис. 5.65).

Рис. 5.65. Сводная таблица
Рис. 5.65. Сводная таблица

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для того чтобы в сводную таблицу вывести данные, нам потребуется написать несколько строк в модуле формы. Откроем модуль формы отчета и добавим в текст переменную, которая нам понадобится (листинг 5.17).

Листинг 5.17. Объявление переменной

Перем ИсточникСводнойТаблицы;

После этого создадим обработчик события формы отчета При открытии и добавим в него следующий текст (листинг 5.18):

Листинг 5.18. Обработчик события формы отчета При открытии

Процедура ПриОткрытии()

 

ИсточникСводнойТаблицы = Новый ИсточникДанныхСводнойТаблицыКомпоновкиДанных;

ИсточникСводнойТаблицы.УстановитьСхему(СхемаКомпоновкиДанных);

ЭлементыФормы.Результат.ВстроенныеТаблицы.СводнаяТаблица1.ИсточникДанных = ИсточникСводнойТаблицы;

ИсточникСводнойТаблицы.УстановитьНастройки(КомпоновщикНастроек.Настройки);

 

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

 

Важно! Читать внимательно! В программе 1С:Предприятие слова "Процедура ... Конец процедуры" нельзя печатать вручную. Программа будет отказываться их воспринимать. Необходимо - в режиме конфигуратора, на панели инструментов "Модуль", нажать на поле со списком и выбрать "При открытии".

Если же Вы ранее закрыли эту панель инструментов, то проделайте - меню "Сервис" - "Настройка" - поставить флажок напротив пункта "Модуль" - "Закрыть".

Этим текстом мы устанавливаем сводной таблице в качестве источника данных схему компоновки данных и устанавливаем ей настройки компоновщика настроек.

Запустим 1С:Предприятие в режиме отладки и откроем отчет Универсальный. На экране появится форма отчета и окно выбора полей сводной таблицы (рис. 5.66).

Рис. 5.66. Отчет Универсальный
Рис. 5.66. Отчет Универсальный

Поместим значение ресурса ВыручкаОборот в данные, измерение Номенклатура – в строки, а измерение Мастер – в колонки. Отчет примет следующий вид (рис. 5.67):

Рис. 5.67. Результат выполнения отчета
Рис. 5.67. Результат выполнения отчета

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь в окне выбора полей сводной таблицы раскроем группу Номенклатура и добавим значение (Без иерархии) в строки, а измерение Клиент добавим в колонки. Отчет изменит свой вид (рис. 5.68).

Рис. 5.68. Результат выполнения отчета
Рис. 5.68. Результат выполнения отчета

Таким образом, используя данные схемы компоновки данных, мы предоставили пользователю альтернативную возможность самостоятельно формировать отчет по регистру ОказанныеУслуги.

 

Отчет Универсальный2

На примере создания второго универсального отчета мы рассмотрим способы непосредственного управления настройками системы компоновки и возможность формирования макетов на основе вариантов стандартного оформления.

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

Создадим новый объект конфигурации Отчет с именем Универсальный2. Откроем его основную схему компоновки данных, создадим новый набор данных – запрос и запустим конструктор запроса. Выберем все поля из виртуальной таблицы регистра накопления Продажи.Обороты и нажмем OK. На закладке Ресурсы конструктора схемы компоновки данных нажмем >> и убедимся, что система подобрала три ресурса: ВыручкаОборот, КоличествоОборот и СтоимостьОборот.

На закладке Настройки создадим новую группировку Детальные записи (не выбирая поле группировки).

Теперь на закладке Формы окна редактирования отчета Универсальный2 с помощью конструктора создадим основную форму отчета и отредактируем ее.

Растянем форму и расположим в ней две надписи с именами Поля и Порядок и с заголовками Поля: и Порядок: соответственно (рис. 5.69).

Рис. 5.69. Редактирование формы отчета
Рис. 5.69. Редактирование формы отчета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Под каждой надписью расположим табличное поле с именами ТабличноеПолеПоля и ТабличноеПолеПорядка, в обоих случаях не забудем установить флаг Вставить командную панель Это позволит нам добавить командные панели, источниками действий которых будут назначены созданные нами табличные поля (рис. 5.70).

Рис. 5.70. Форма отчета Универсальный2
Рис. 5.70. Форма отчета Универсальный2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь для табличного поля ТабличноеПолеПоля зададим источник данных как ОтчетОбъект.КомпоновщикНастроек.Настройки.Выбор (рис. 5.71).

Рис. 5.71. Зададим источник данных для табличного поля
Рис. 5.71. Зададим источник данных для табличного поля

Аналогично табличному полю ТабличноеПолеПорядок укажем источник данных ОтчетОбъект.КомпоновщикНастроек.Настройки.Порядок.

Совершив описанные действия, мы связали элементы управления, расположенные в форме с настройками системы компоновки нашего отчета, – Выбор и Порядок. Выбор позволяет управлять списком полей, которые войдут в результат отчета, а Порядок задает порядок вывода строк результата. Командные панели понадобятся пользователю для настройки значений этих полей. Используя свойства командных панелей Автозаполнение и Источник действий, мы получили автоматическое формирование команд, основанное на типе данных, содержащихся в каждом из табличных полей.

Следует сказать, что в системе 1С:Предприятие 8 имеется небольшой набор уже готовых макетов оформления для использования системой компоновки данных. Они содержатся в объекте БиблиотекаМакетовОформленияКомпоновкиДанных.

Поместим еще одну надпись с именем Оформление и заголовком Оформление, а под ним расположим поле выбора с именем ПолеВыбораОформление (рис. 5.72) без подписи.

Рис. 5.72. Редактирование формы отчета
Рис. 5.72. Редактирование формы отчета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В свойствах нашего поля выбора откроем окно Строки списка выбора и заполним его именами макетов из библиотеки макетов оформления компоновки данных (см. рис. 5.73).

Рис. 5.73. Заполнение списка значений поля выбора
Рис. 5.73. Заполнение списка значений поля выбора

Для того чтобы наше поле выбора изменяло применяемый макет оформления системы компоновки, создадим обработчик При изменении поля выбора (листинг 5.19).

Листинг 5.19. Обработчик события поля выбора При изменении

Процедура ПолеВыбораОформлениеПриИзменении(Элемент)

 

ПараметрыВывода = КомпоновщикНастроек.Настройки.ПараметрыВывода;

ПараметрМакетОформления = ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));

ПараметрМакетОформления.Использование = Истина;

ПараметрМакетОформления.Значение = ПолеВыбораОформление;

 

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

Этим текстом для параметра компоновки данных МакетОформления мы указываем имя макета, которым должен оформляться отчет, и устанавливаем признак использования макета оформления.

Запустим 1С:Предприятие в режиме отладки и откроем отчет Универсальный2.

В выбранные поля добавим следующие поля:

  • §     Мастер;
  • §     Номенклатура;
  • §     Номенклатура.ВидНоменклатуры;
  • §     ВыручкаОборот.

Зададим порядок сортировки:

  • §     Мастер по возрастанию;
  • §     Номенклатура.ВидНоменклатуры по убыванию;
  • §     Номенклатура по возрастанию.

Выберем оформление, например Зеленый, и нажмем Сформировать. Результат будет выглядеть следующим образом (рис. 5.74):

Рис. 5.74. Результат выполнения отчета
Рис. 5.74. Результат выполнения отчета

Теперь изменим условия формирования отчета. Выберем поля Клиент, Номенклатура и ВыручкаОборот. Порядок сортировки будет по возрастанию значения поля Клиент, а вариант оформления – Море. Выполним отчет (рис. 5.75).

Рис. 5.75. Результат выполнения отчета
Рис. 5.75. Результат выполнения отчета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Контрольные вопросы

q     для чего предназначен объект встроенного языка Запрос?

q     для чего предназначена система компоновки данных?

q     для чего предназначена схема компоновки данных?

q     для чего предназначены настройки компоновки данных?

q     для чего предназначен объект встроенного языка КомпоновщикНастроек?

q     в чем отличие между реальными, виртуальными и ссылочными таблицами?

q     из каких частей состоит текст запроса, какие из них являются обязательными?

q     каковы основные синтаксические конструкции языка запросов?

q     что является источником данных запроса?

q     что такое псевдонимы в языке запросов?

q     что такое параметры запроса?

q     что такое параметры виртуальной таблицы?

q     что такое левое соединение?

q     как использовать конструктор запроса?

q     как выбрать данные в некотором периоде для отчета?

q     как упорядочить данные в отчете?

q     как использовать в отчете данные нескольких таблиц?

q     как использовать группировки в структуре отчета?

q     как получить последние значения регистра сведений?

q     как вывести в отчет иерархические данные?

q     как управлять выводом итогов по группировкам и общих итогов?

q     как создать отчет, содержащий диаграмму?

q     как использовать параметры в системе компоновки данных?

q     как дополнить данные отчета всеми датами в группировке по периоду?

q     как вывести данные в сводную таблицу?

q     как использовать варианты стандартного оформления отчетов?

 

Оптимизация процедуры проведения документа ОказаниеУслуги

После изучения предыдущей главы вы уже достаточно хорошо знакомы с языком запросов, и мы наконец-то можем приступить к одной из самых важных глав нашей книги - к оптимизации документа ОказаниеУслуги, и в частности, к полному изменению его обработчика события ОбработкаПроведения.

«Зачем это нужно?» - можете спросить вы. Тому есть две причины.

Во-первых, руководство ООО «На все руки мастер» решило, наконец-то, завершить «эксперименты» по вводу стоимости расходуемых материалов руками и перейти на автоматический расчет стоимости расходуемых материалов «по среднему».

Во-вторых, в обработчике события Обработка проведения мы используем обращение к реквизиту ВидНоменклатуры справочника Номенклатура «через точку». Такое обращение может сильно замедлить скорость выполнения процедуры при больших объемах табличной части документа.

Поэтому, изменения, вносимые нами в документ ОказаниеУслуги, будут преследовать две цели:

q     определение стоимости расходуемых материалов при проведении документа,

q     повышение скорости выполнения процедуры.

Прежде, чем мы приступим непосредственно к каким-либо действиям, следует сказать несколько слов об особенностях хранения и использования ссылочных данных в системе 1С:Предприятие 8.1.

Особенности использования ссылочных данных

Термином ссылочные данные мы будем обозначать данные, хранящиеся в базе данных, доступ к которым возможен при помощи объектов встроенного языка вида Ссылка: СправочникСсылка.<имя>, ДокументСсылка.<имя> и т.д. Для того чтобы дальнейшее изложение было понятнее, мы построим объяснение на примере получения ссылки на вид номенклатуры при проведении документа ОказаниеУслуги.

Не все данные, хранящиеся в базе данных, являются ссылочными. Это связано с тем, что в модели данных 1С:Предприятия 8.1 существует деление на данные, представляющие объектные сущности (справочники, планы счетов, документы и т. д.), и данные, представляющие необъектные сущности (регистры сведений, регистры накопления и т. д.).

С точки зрения системы некоторая совокупность объектных данных определяется не только значениями своих полей, но и самим фактом своего существования. Другими словами, удалив из базы некоторую совокупность объектных данных, мы не сможем вернуть систему в то же состояние, которое было до удаления. Даже если мы заново создадим ту же самую совокупность объектных данных с теми же самыми значениями полей, с точки зрения системы это будет ДРУГАЯ совокупность объектных данных. Каждую такую совокупность объектных данных, уникальную с точки зрения системы, называют объектом базы данных. Для того чтобы система могла отличить один объект базы данных от другого, каждый объект базы данных (совокупность объектных данных) имеет внутренний идентификатор. Различные объекты базы данных всегда будут иметь разные внутренние идентификаторы. Этот идентификатор хранится вместе с остальными данными объекта в специальном поле Ссылка.

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

Таким образом, поскольку мы можем однозначно указать на каждый объект базы данных, у нас появляется возможность хранить такой указатель в полях других таблиц базы данных, выбирать его в поле ввода, указывать в параметрах запроса при поиске по ссылке и т. д. Во всех этих случаях как раз и будет использоваться объект встроенного языка вида Ссылка. Фактически этот объект хранит только внутренний идентификатор, находящийся в поле Ссылка.

Например, если взять наш документ ОказаниеУслуги, то в поле, хранящем реквизит табличной части Номенклатура, на самом деле находится внутренний идентификатор, указывающий на элемент справочника Номенклатура (рис. 6.1).

Рис. 6.1. Ссылка на элемент справочника Номенклатура
Рис. 6.1. Ссылка на элемент справочника Номенклатура

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Когда в обработчике события ОбработкаПроведения документа ОказаниеУслуги мы присваиваем значение реквизита Номенклатура табличной части какой-либо переменной, мы имеем дело с объектом ДокументОбъект.ОказаниеУслуги. Этот объект содержит в себе значения всех реквизитов документа и реквизитов его табличных частей. Поэтому обращение (листинг 6.1) приводит к тому, что мы просто читаем данные, хранящиеся в оперативной памяти (рис. 6.2).

Листинг 6.1 Обращение к реквизиту объекта

Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;

Рис. 6.2. Чтение данных из оперативной памяти
Рис. 6.2. Чтение данных из оперативной памяти

Однако когда мы обращаемся к виду номенклатуры как к реквизиту того элемента справочника, ссылка на который указана в табличной части документа (листинг 6.2), происходит буквально следующее (рис. 6.3):

 

 

 

 

 

 

 

 

 

 

 

Листинг 6.2. Обращение к реквизиту ссылки

Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Материал Тогда

Рис. 6.3. Использование кэша объектов
Рис. 6.3. Использование кэша объектов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поскольку в объекте ДокументОбъект.ОказаниеУслуги есть только ссылка на элемент справочника Номенклатура и больше никаких данных об этом элементе нет, система возьмет эту ссылку и обратится по ней в кэш объектов в надежде найти там данные того объекта, ссылка на который у нее есть. Если кэш объектов не будет иметь нужных данных, он обратится к базе данных с тем, чтобы прочитать все данные объекта, ссылкой на который он обладает. После того, как все данные, хранящиеся в реквизитах нужного элемента справочника и в реквизитах его табличных частей, будут считаны в кэш объектов, кэш объектов вернет запрашиваемую ссылку, хранящуюся в реквизите ВидНоменклатуры справочника Номенклатура.

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

Оптимизация документа Оказаниеуслуги

Первое, что мы сделаем для оптимизации документа ОказаниеУслуги, – удалим реквизит табличной части Стоимость, который нам не понадобится в будущем.

Также следует удалить соответствующую колонку из табличного поля, расположенного в форме.

После этого можно полностью удалить содержимое обработчика события ОбработкаПроведения в модуле документа и создать в нем заготовку процедуры проведения. Текст запроса, выполняемого в режиме оперативного проведения, будет отличаться от запроса, выполняемого при неоперативном проведении. Поэтому формирование текста запроса мы включим в условие Если … Иначе … КонецЕсли: (листинг 6.3).

Листинг 6.3. «Заготовка» процедуры проведения

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

   ;

Иначе

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

   ;

КонецЕсли;

Сначала составим запрос, который будет выполняться при оперативном проведении документа. Установим курсор перед точкой с запятой, из контекстного меню вызовем конструктор запроса, раскроем таблицу ПереченьНоменклатуры табличной части документа ОказаниеУслуги и выберем из нее поля:

  • §     Номенклатура;
  • §     Количество;
  • §     Номенклатура.ВидНоменклатуры;
  • §     Сумма.

Эти поля будут нужны нам для задания значений измерений регистров и их ресурсов. Кроме того, поле ВидНоменклатуры понадобится нам для анализа того, чем является номенклатура, указанная в документе: материалом или услугой (рис. 6.4).

Рис. 6.4. Выбранные поля
Рис. 6.4. Выбранные поля

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

Поэтому добавим к списку выбранных таблиц еще две (рис. 6.5).

  • §     РегистрНакопления.СтоимостьМатериалов.Остатки;
  • §     РегистрНакопления.ОстаткиМатериалов.Остатки.
Рис. 6.5. Выбранные таблицы
Рис. 6.5. Выбранные таблицы

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

Условие получения данных указывает, что остатки должны быть получены только по тем позициям номенклатуры, которые содержатся в проводимом документе (перед выполнением запроса мы передадим в параметр СписокНоменклатурыДокумента список всех позиций номенклатуры, содержащихся в проводимом документе) – рис. 6.6.

 

Рис. 6.6. Параметры виртуальных таблиц
Рис. 6.6. Параметры виртуальных таблиц

Следует внимательно подходить к использованию виртуальных таблиц запросов. В частности, необходимо уделять особое внимание максимально возможному использованию параметров этих таблиц. Например, в нашем случае можно было бы и не использовать параметр Условие, а ограничить выбранные поля уже в самом запросе, указав в условии ПО равенство номенклатуры из документа и материала из таблицы остатков. В результате мы получили бы тот же самый результат, однако по производительности этот способ сильно отличался бы от того, который мы используем.

В самом деле, в нашем варианте виртуальная таблица предоставит нам ровно столько записей, сколько различных элементов номенклатуры содержится в проводимом документе. Если же не указывать условие, виртуальная таблица предоставит нам записи по абсолютно всем элементам номенклатуры, информация о которых есть в регистре накопления. И уже в самом нашем запросе мы будем отбирать из этой огромной массы записей лишь несколько, которые нам действительно нужны.

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

Кроме того, что подобный вариант снижает производительность конфигурации, могут возникать ситуации, когда результаты, полученные одним и другим способом, будут различны. Такое, например, вполне возможно при использовании виртуальной таблицы регистра сведений СрезПоследних. Более подробно можно прочитать об этом в ИТС (информационно — технологическом сопровождении) в статье Использование отборов в запросах с виртуальными таблицами.

После того как будут заданы параметры обеих виртуальных таблиц регистров накопления, выберем из них поля СтоимостьОстаток и КоличествоОстаток (рис. 6.7).

Рис. 6.7. Выбранные поля
Рис. 6.7. Выбранные поля

Теперь вспомним о том, что документы ОказаниеУслуги могут быть проведены как в оперативном, так и в неоперативном режиме.

Поскольку в оперативном режиме нам понадобится контролировать остатки списываемой номенклатуры на складе, выберем еще раз виртуальную таблицу регистра накопления ОстаткиМатериаловОстатки и переименуем ее в ОстаткиМатериаловОстаткиНаСкладе (рис. 6.8).

Рис. 6.8. Выбранные таблицы
Рис. 6.8. Выбранные таблицы

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

Рис. 6.9. Параметры таблицы ОстаткиМатериаловОстаткиНаСкладе
Рис. 6.9. Параметры таблицы ОстаткиМатериаловОстаткиНаСкладе

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь из этой виртуальной таблицы мы выберем поле КоличествоОстаток (рис. 6.10).

Рис. 6.10. Выбранные поля
Рис. 6.10. Выбранные поля

На этом формирование списка выбранных полей закончено, и мы можем перейти к заданию условий связи между выбранными таблицами.

Каждую из виртуальных таблиц необходимо связать с таблицей документа таким образом, что для всех записей таблицы документа должны подбираться имеющиеся записи виртуальной таблицы, причем номенклатура в таблице документа должна быть равна материалу из виртуальной таблицы (рис. 6.11, а–б).

Рис. 6.11а. Выбранные таблицы
Рис. 6.11а. Выбранные таблицы
Рис. 6.11б. Условия связи между таблицами
Рис. 6.11б. Условия связи между таблицами

Теперь перейдем на закладку Дополнительно и установим флаг Для изменения. Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать чтение указанных данных (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. Это предложение дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять.

Поскольку мы с вами планируем выполнить запись регистров накопления ОстаткиМатериалов и СтоимостьМатериалов, укажем таблицы этих регистров в качестве таблиц для изменения (рис. 6.12).

Рис. 6.12. Укажем таблицы для изменения
Рис. 6.12. Укажем таблицы для изменения

Перейдем на закладку Условия и зададим условие отбора из таблицы документа только строк проводимого документа (ссылка на него будет передана в параметр запроса Ссылка) – рис. 6.13.

Рис. 6.13. Условие отбора из таблицы документа
Рис. 6.13. Условие отбора из таблицы документа

Перейдем на закладку Псевдонимы и зададим следующие псевдонимы полей:

  • §     НоменклатураВидНоменклатуры ВидНоменклатуры;
  • §     КоличествоОстаток1 КоличествоНаСкладе.

Нажмем ОK и посмотрим, какой текст запроса сформировал конструктор (листинг 6.4).

Листинг 6.4. Текст запроса, сформированный конструктором

ВЫБРАТЬ

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

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

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

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

   СтоимостьМатериаловОстатки.СтоимостьОстаток,

   ОстаткиМатериаловОстатки.КоличествоОстаток,

   ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоНаСкладе

ИЗ

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

     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

                                              КАК СтоимостьМатериаловОстатки

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

 

     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

                                              КАК ОстаткиМатериаловОстатки

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

 

     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени,

                                                                                                        Материал В (&СписокНоменклатурыДокумента) И Склад = &СкладВДокументе)

                                              КАК ОстаткиМатериаловОстаткиНаСкладе

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

 

ГДЕ

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

ДЛЯ ИЗМЕНЕНИЯ

   РегистрНакопления.СтоимостьМатериалов.Остатки,

   РегистрНакопления.ОстаткиМатериалов.Остатки

Как видите, в запросе нет ничего сложного, за исключением, быть может, трех левых соединений с таблицей табличной части документа и использования ключевого предложения ДЛЯ ИЗМЕНЕНИЯ, значение которого было объяснено выше.

Текст запроса для случая неоперативного проведения документа будет практически таким же, за исключением того, что в нем будет отсутствовать третье левое соединение и, соответственно, поле КоличествоОстатокНаСкладе, т.к. проверку остатков в этом случае мы выполнять не будем (листинг 6.5).

Листинг 6.5. Неоперативное проведение документа

ВЫБРАТЬ

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

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

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

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

   ОстаткиМатериаловОстатки.КоличествоОстаток,

   СтоимостьМатериаловОстатки.СтоимостьОстаток

ИЗ

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

   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

                                              КАК СтоимостьМатериаловОстатки

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

   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

                                              КАК ОстаткиМатериаловОстатки

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

 

ГДЕ

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

 

ДЛЯ ИЗМЕНЕНИЯ

   РегистрНакопления.ОстаткиМатериалов.Остатки,

   РегистрНакопления.СтоимостьМатериалов.Остатки;

Теперь добавим в текст обработчика задание параметров запроса (листинг 6.6).

Листинг 6.6. Задание параметров запроса

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

 

Иначе

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

   "ВЫБРАТЬ

   |   РегистрНакопления.ОстаткиМатериалов.Остатки";

КонецЕсли;

 

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));

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

Обратите внимание, что для формирования списка номенклатуры документа мы используем метод ВыгрузитьКолонку() объекта ДокументТабличнаяЧасть.ОказаниеУслуги.ПереченьНоменклатуры.

После этого добавим получение результата запроса и цикл его обхода (листинг 6.7).

Листинг 6.7. Получение результата запроса и цикл его обхода

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

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

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

      

КонецЦикла;

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

Теперь, прежде чем начать формирование движений по регистрам, нам нужно проверить наличие на складе достаточного количества номенклатуры в цикле обхода результата запроса (листинг 6.8).

Листинг 6.8. Проверка на складе достаточного количества номенклатуры

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

 

// Проверить остаток при оперативном проведении.

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

              Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);

              Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда

                    Сообщить("Материала" + СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + "имеется только" + Остаток);

                    Отказ = Истина;

                    Возврат;

              КонецЕсли;

       КонецЕсли;

КонецЕсли;

КонецЦикла;

И в заключение, после проверки остатков на складе, перед самым концом цикла, добавим формирование движений по регистрам накопления (листинг 6.9).

Листинг 6.9. Формирование движений по регистрам накопления

// Сформировать движения.

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

 

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

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

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

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

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

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

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

             

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

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

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

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

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

   // Рассчитать стоимость материала.

   СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,

                                              ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);

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

КонецЕсли;

 

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

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

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

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

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

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

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

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

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

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

Иначе

   Движение.Стоимость = 0;

КонецЕсли;

А сразу после цикла добавим запись движений регистров (листинг 6.10).

Листинг 6.10. Запись движений регистров

КонецЦикла;

 

// Записать движения регистров

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

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

   Движения.Продажи.Записать();

 

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

Запустим 1С:Предприятие в режиме отладки и проверим работу нового обработчика события ОбработкаПроведения, перепроведя все документы Оказание услуги.

В заключение следует сделать небольшое отступление, которое касается задания параметров виртуальных таблиц, использовавшихся в наших запросах.

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

Листинг 6.11. Условие, накладываемое на материал

 

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

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

Листинг 6.12. Запрос во временной таблице

ВЫБРАТЬ * ИЗ НоменклатураДокумента

При этом временная таблица должна формироваться следующим образом (листинг 6.13):

Листинг 6.13. Формирование временной таблицы

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

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

"ВЫБРАТЬ РАЗЛИЧНЫЕ

|      Номенклатура

|

|ПОМЕСТИТЬ

|      НоменклатураДокумента

|

|ИЗ

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

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

   |

|ГДЕ

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

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

Запрос.Выполнить();

Выбор решения требует сравнительных тестов и зависит от конкретной информационной базы, размеров документа, количества одновременно работающих пользователей, производительности компьютеров и т. д. Пример процедуры обработки проведения документа, использующей временные таблицы, содержится в демонстрационной конфигурации на компакт-диске.

Теперь мы можем на некоторое время отвлечься от запросов, с которыми мы достаточно плотно работали в этой главе, и обратить свое внимание на не менее интересные возможности, предоставляемые разработчику платформой 1С:Предприятие 8.1.

Контрольные вопросы

q     как система 1С:Предприятие выполняет обращение к ссылочным данным?

q     как используется кэш объектов?

q     почему для доступа к массивам данных информационной базы предпочтительнее использовать запросы?

q     как запросом получить остатки регистра накопления?

q     когда следует использовать ключевое предложение ДЛЯ ИЗМЕНЕНИЯ?

q     на что следует обращать внимание при задании параметров виртуальных таблиц запросов?

q     почему при неоперативном проведении документов не нужно контролировать остатки?

q     как и зачем можно использовать временные таблицы в параметрах виртуальной таблицы?

 

План видов характеристик

В этой главе мы познакомимся с новым объектом конфигурации – План видов характеристик – и узнаем, каким образом можно использовать этот объект для расширения возможностей нашей конфигурации.

Постановка задачи

Задача, которую мы перед собой поставим, будет заключаться в следующем: мы создадим механизм, позволяющий пользователю произвольным образом описывать материалы и, что самое главное, вести учет в разрезе всех тех описаний, которые могут быть заданы пользователем.

Описывать материалы пользователь сможет следующим образом: для каждого материала будет возможность создать некоторые (произвольные) характеристики этого материала (например, цвет, производитель и пр.). Затем, при поступлении материалов, можно будет задать конкретные значения интересующих характеристик (например, при поступлении электрических кабелей можно будет указать, что они белого цвета и их сечение равно 2,5 мм2, а при поступлении резиновых шлангов указать, что они черного цвета и произведены на фирме «Fagumit Sp. z o.o.»).

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

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

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

Объект конфигурации План видов характеристик

Объект конфигурации План видов характеристик является прикладным и предназначен для описания структуры хранения информации о характеристиках, создаваемых пользователем. На основе объекта конфигурации План видов характеристик платформа создает в базе данных информационную структуру. В ней может храниться информация существующих видах характеристик и типе значения характеристики каждого вида.

В сущности, план видов характеристик очень напоминает справочник, однако имеет более узкую «специализацию»: хранит, по сути, информацию только о том, какими видами характеристик может описываться какой-либо объект базы данных. Эта информация состоит из названия вида характеристики и ее типа. Разработчик и, что самое важное, пользователь могут задать в нем любое необходимое им количество видов характеристик.

Для того чтобы разработчик мог задать некий «набор» возможных типов значений, которые могут принимать виды характеристик, у объекта конфигурации План видов характеристик существует свойство Тип значения характеристик. Это свойство определяет составной тип данных, куда входят все типы, которые могут понадобиться при указании типа значения характеристики.

Кроме этого может случиться так, что пользователю станет недостаточно тех типов данных, которые существуют в конкретной системе (например, он захочет вести учет в разрезе цвета товаров, а справочник Цвет в конфигурации отсутствует). В этом случае он сможет воспользоваться неким вспомогательным справочником, который разработчик создаст заблаговременно и укажет в качестве свойства объекта конфигурации План видов характеристикдополнительные значения характеристик.

Тогда пользователь, создав новый вид характеристики Цвет, сможет дать необходимые значения в справочнике дополнительных значений характеристик. Примечательно, что этот справочник является подчиненным плану видов характеристик. Таким образом, если затем пользователь пожелает создать новый вид характеристик Запах и его значения, он будет создавать их в том же самом справочнике дополнительных характеристик, и они не будут «смешиваться» со значениями цвета.

Логическая связь объектов

Для реализации этого примера нам понадобятся три новых объекта конфигурации. Прежде всего, это План видов характеристик. Он будет хранить виды характеристик, которыми в принципе можно описывать материалы. Затем это Справочник, подчиненный справочнику Номенклатура, элементы которого будут идентифицировать партии материалов с некоторым фиксированным набором значений характеристик. И третий объект – это Регистр сведений, в котором собственно и будет храниться соответствие конкретных значений характеристик некоторому варианту материала (см. рис. 7.1).

В результате использования подобной логической структуры объектов мы получим возможность описывать каждую поступающую партию материала любым количеством видов характеристик, поскольку это соответствие будет храниться в регистре сведений. И вместе с тем получим возможность вести учет в разрезе видов характеристик, добавив в регистрынакопления еще одно измерение для хранения ссылки на элемент справочника, подчиненного справочнику Номенклатура (рис. 7.1).

Рис. 7.1. Логическая связь объектов
Рис. 7.1. Логическая связь объектов

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

 

Создание новых объектов конфигурации

Как мы уже говорили, нам понадобится создать несколько новых объектов конфигурации.

Создадим объект конфигурации Справочник с именем ВариантыНоменклатуры и укажем, что он будет подчинен справочнику Номенклатура.

Затем создадим еще один объект конфигурации Справочник с именем ДополнительныеСвойстваНоменклатуры.

После этого создадим объект конфигурации План видов характеристик с именем СвойстваНоменклатуры. Тип значения характеристик установим следующим (рис. 7.2):

  • §     Число, длина 15, точность 3;
  • §     Строка, длина 25;
  • §     Дата;
  • §     Булево;

СправочникСсылка.ДополнительныеСвойстваНоменклатуры.

Рис. 7.2. Редактирование типа значения характеристик плана видов характеристик
Рис. 7.2. Редактирование типа значения характеристик плана видов характеристик

Справочнику ДополнительныеСвойстваНоменклатуры укажем владельца – план видов характеристик СвойстваНоменклатуры, и на закладке Формы установим для него редактирование в списке. После этого определим, что дополнительные значения характеристик плана видов характеристик будут располагаться в справочнике ДополнительныеСвойстваНоменклатуры (рис. 7.3).

Рис. 7.3. Окно редактирования плана видов характеристик
Рис. 7.3. Окно редактирования плана видов характеристик

На закладке Формы укажем, что этот план видов характеристик будет редактироваться в списке.

В заключение создадим объект конфигурации Регистр сведений с именем ЗначенияСвойствНоменклатуры.

Измерения регистра:

  • §     НаборСвойств, ведущее, тип СправочникСсылка.ВариантыНоменклатуры;
  • §     ВидСвойства, тип ПланВидовХарактеристикСсылка.СвойстваНоменклатуры.

Ресурс регистра:

  • §     Значение, тип Характеристика.СвойстваНоменклатуры.

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

Доработка справочника Номенклатура

Прежде всего, в справочнике Номенклатура нам нужно обеспечить возможность редактирования варианта материала. Для этого укажем, что справочник Номенклатура будет редактироваться теперь обоими способами (на закладке Форма) – в списке и в диалоге, и создадим основную форму элемента при помощи конструктора. Немного раздвинем форму по ширине и высоте и добавим в нее панель (Форма  Вставить элемент управления  Панель) – (рис. 7.4).

Рис. 7.4. Редактирование формы элемента справочника Номенклатура
Рис. 7.4. Редактирование формы элемента справочника Номенклатура

После того, как мы слегка изменим положение любой из границ панели, появится вопрос (рис. 7.5).

Рис. 7.5. Редактирование формы элемента справочника Номенклатура
Рис. 7.5. Редактирование формы элемента справочника Номенклатура

На этот вопрос мы ответим утвердительно, и все элементы управления переместятся в добавленную панель (рис. 7.6).

Рис. 7.6. Редактирование формы элемента справочника Номенклатура
Рис. 7.6. Редактирование формы элемента справочника Номенклатура

Теперь мы скорректируем размеры панели и добавим в нее новую страницу (рис. 7.7, добавление страницы: контекстное меню правой кнопки мыши на поле формы – Добавить страницу…).

Рис. 7.7. Редактирование формы элемента справочника Номенклатура
Рис. 7.7. Редактирование формы элемента справочника Номенклатура

Зададим имя и заголовок новой страницы – Свойства, а первую страницу также переименуем в Основные и зададим ей такой же заголовок (группа свойств Текущая страница в палитре свойств формы – рис. 7.8).

Рис. 7.8. Редактирование формы элемента справочника Номенклатура
Рис. 7.8. Редактирование формы элемента справочника Номенклатура

После этого выделим все элементы управления, расположенные в панели, и выполним команду Форма  Центрирование  Центрировать по вертикали (рис. 7.9).

Рис. 7.9. Редактирование формы элемента справочника Номенклатура
Рис. 7.9. Редактирование формы элемента справочника Номенклатура

Теперь перейдем на страницу Свойства и добавим надпись НадписьВариантыНоменклатуры с заголовком Варианты номенклатуры:. Укажем для нее начертание шрифта Жирный (рис. 7.10).

Рис. 7.10. Редактирование формы элемента справочника Номенклатура
Рис. 7.10. Редактирование формы элемента справочника Номенклатура

Под этой надписью расположим табличное поле с командной панелью с именем Варианты и типом СправочникСписок.ВариантыНоменклатуры. Из табличного поля удалим колонку Код. Для этого табличного поля установим свойство Связь по владельцуСправочникОбъект.Ссылка (рис. 7.11).

Рис. 7.11. Редактирование формы элемента справочника Номенклатура
Рис. 7.11. Редактирование формы элемента справочника Номенклатура

Установка этого свойства обеспечивает нам следующее: для источника данных этого поля – реквизита формы Варианты, имеющего тип СправочникСписок.ВариантыНоменклатуры, – значение отбора по владельцу всегда будет равно ссылке на редактируемый элемент справочника Номенклатура. Иными словами, список справочника, содержащийся в реквизите формы НаборСвойств, всегда будет содержать только элементы, подчиненные редактируемому элементу справочника Номенклатура. А значит, и табличное поле Варианты, для которого этот реквизит является источником данных, будет отображать только элементы, подчиненные редактируемому элементу справочника Номенклатура.

Ниже поместим аналогичным образом еще одну надпись – НадписьЗначенияСвойств с заголовком Значения свойств: и начертанием шрифта Жирный (рис. 7.12).

Рис.7.12. Редактирование формы элемента справочника Номенклатура
Рис.7.12. Редактирование формы элемента справочника Номенклатура

Под ней расположим табличное поле с командной панелью с именем Свойства и типом РегистрСведенийСписок.ЗначенияСвойствНоменклатуры. Для колонки НаборСвойств снимем флаг Видимость, а для поля ввода в колонке Значение установим связь по типу – ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства (рис. 7.13).

Рис. 7.13. Редактирование формы элемента справочника Номенклатура
Рис. 7.13. Редактирование формы элемента справочника Номенклатура

Связь по типу будет обеспечивать нам ограничение типа значений, вводимых в это поле ввода, только типом характеристики, выбранной в поле Вид свойства. Однако этим мы никак не можем повлиять на само значение, хранимое в этом поле. Если не предпринять никаких дополнительных действий, то при введении в поле Значение какого-либо значения поменять его на значение другого вида характеристики не удастся. При выборе другого вида характеристики будет возникать несоответствие между типом хранимого значения и типом, которым ограничен ввод в элементе управления. В этом случае, естественно, система будет предлагать вводить тот тип, который имеет хранимое значение.

Чтобы избежать такой ситуации, необходимо при смене значения в поле Вид свойства привести значение поля Значение к типу характеристики, выбранной в поле Вид свойства.

Поэтому для поля ввода в колонке Вид свойства создадим обработчик события При изменении (листинг 7.1).

Листинг 7.1. Процедура СвойстваВидСвойстваПриИзменении()

Процедура СвойстваВидСвойстваПриИзменении(Элемент)

 

ДанныеВидСвойства = ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства;

Если ДанныеВидСвойства.ТипЗначения <> Неопределено Тогда

       ЭлементыФормы.Свойства.ТекущиеДанные.Значение = ДанныеВидСвойства.ТипЗначения.ПривестиЗначение(ЭлементыФормы.Свойства.ТекущиеДанные.Значение);

КонецЕсли;

 

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

Теперь нам нужно сделать так, чтобы в табличном поле Свойства отображались записи регистра сведений, относящиеся только к выбранному в верхнем табличном поле элементу справочника ВариантыНоменклатуры.

Поэтому для табличного поля Варианты создадим обработчик события При активизации строки (листинг 7.2).

Листинг 7.2. Процедура ВариантыПриАктивизацииСтроки()

Процедура ВариантыПриАктивизацииСтроки(Элемент)

 

ЭлементыФормы.Свойства.Значение.Отбор.НаборСвойств.Установить(Элемент.ТекущиеДанные.Ссылка, Истина);

 

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

Кроме этого, чтобы не отображать весь регистр при открытии формы, создадим обработчик события формы ПриОткрытии, содержащий следующий текст (листинг 7.3).

Листинг 7.3. Процедура ПриОткрытии()

Процедура ПриОткрытии()

 

ЭлементыФормы.Свойства.Значение.Отбор.НаборСвойств.Установить( , Истина);

 

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

 

Доработка справочника Варианты номенклатуры

Теперь нам следует доработать справочник ВариантыНоменклатуры таким образом, чтобы пользователь имел возможность создавать новые свойства материалов не только при редактировании самого материала, но и в процессе ввода документов, когда в табличную часть подбирается набор свойств.

Поэтому для справочника ВариантыНоменклатуры укажем, что он будет редактироваться обоими способами (как в списке, так и в диалоге), и создадим с помощью конструктора основную форму элемента.

Доработка формы элемента справочника ВариантыНоменклатуры будет сводиться по большому счету к тем же действиям, которые мы выполнили с формой справочника Номенклатура. В форме нам нужно будет расположить табличное поле, которое должно отображать существующие записи в регистре сведений о значениях свойств для этого элемента справочника.

Откроем основную форму элемента справочника ВариантыНоменклатуры и раздвинем форму вниз. На освободившемся пространстве поместим табличное поле с именем Свойства, типом РегистрСведенийСписок.ЗначенияСвойствНоменклатуры и командной панелью. Для колонки НаборСвойств снимем флаг видимости (рис. 7.14).

Рис. 7.14. Основная форма элемента справочника ВариантыНоменклатуры
Рис. 7.14. Основная форма элемента справочника ВариантыНоменклатуры

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Затем для поля ввода, расположенного в колонке Значение, зададим связь по типу ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства.

Для поля ввода, расположенного в колонке ВидСвойства, создадим обработчик события ПриИзменении (листинг 7.4).

Листинг 7.4. Процедура СвойстваВидСвойстваПриИзменении()

Процедура СвойстваВидСвойстваПриИзменении(Элемент)

 

ДанныеВидСвойства = ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства;

Если ДанныеВидСвойства.ТипЗначения <> Неопределено Тогда

       ЭлементыФормы.Свойства.ТекущиеДанные.Значение = ДанныеВидСвойства.ТипЗначения.ПривестиЗначение(ЭлементыФормы.Свойства.ТекущиеДанные.Значение);

КонецЕсли;

 

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

Теперь необходимо сделать так, чтобы при открытии формы устанавливался нужный нам отбор, а также, при добавлении нового элемента справочника, чтобы отбор устанавливался и после того, как элемент будет записан. Для этого мы воспользуемся возможностью назначения обработчика события Изменения данных, который будет отслеживать изменения ссылки на редактируемый элемент справочника.

Прежде всего, в модуле формы создадим обработчик события ПриИзмененииСсылки, в котором установим требуемый нам отбор (листинг 7.5).

Листинг 7.5. Процедура ПриИзмененииСсылки()

Процедура ПриИзмененииСсылки(ПутьКДанным)

 

Свойства.Отбор.НаборСвойств.Установить(Ссылка, Истина);

 

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

Затем в тело модуля формы добавим вызов этого обработчика (листинг 7.6).

Листинг 7.6. Вызов обработчика ПриИзмененииСсылки

 

ПодключитьОбработчикИзмененияДанных("СправочникОбъект.Ссылка", "ПриИзмененииСсылки");

И в заключение нужно предусмотреть возможность того, что пользователь может начать задавать новые значения свойств, не записав еще сам элемент справочника НаборыСвойств.

Поэтому создадим обработчик события табличного поля ПередНачаломДобавления: (листинг 7.7).

Листинг 7.7. Процедура СвойстваПередНачаломДобавления()

Процедура СвойстваПередНачаломДобавления(Элемент, Отказ, Копирование)

 

Если ЭтоНовый() Тогда

       Записать();

КонецЕсли;

 

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

 

Доработка регистра Остатки материалов

Чтобы обеспечить учет материалов по значениям характеристик, необходимо изменить структуру регистра накопления ОстаткиМатериалов и добавить в него новое измерение НаборСвойств с типом СправочникСсылка.ВариантыНоменклатуры (рис. 7.15). 

Рис. 7.15. Новое измерение НаборСвойств
Рис. 7.15. Новое измерение НаборСвойств

Доработка документа Приходная накладная

Последнее, что нам осталось, – доработать документ ПриходнаяНакладная. Для того чтобы при приходовании товаров пользователь мог указывать набор свойств для каждого приходуемого материала, добавим в табличную часть документа новый реквизит НаборСвойств с типом СправочникСсылка.ВариантыНоменклатуры (рис. 7.16).

Рис. 7.16. Новый реквизит НаборСвойств
Рис. 7.16. Новый реквизит НаборСвойств

После этого расположим этот реквизит в табличном поле формы документа (правая кнопка мыши – Размещение данных), рис. 7.17).

Рис. 7.17. Редактирование формы документа ПриходнаяНакладная
Рис. 7.17. Редактирование формы документа ПриходнаяНакладная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для поля ввода, расположенного в колонке НаборСвойств, снова воспользуемся свойством Связь по владельцу - ЭлементыФормы.Материалы.ТекущиеДанные.Материал. Теперь при выборе в этом поле ввода будет всегда открываться список элементов справочника ВариантыНоменклатуры, подчиненных материалу, выбранному в колонке Материал.

В заключение откроем процедуру обработки проведения в модуле документа и добавим к формируемым движениям присвоение значения измерению НаборСвойств (листинг 7.8).

Листинг 7.8. Процедура ОбработкаПроведения()

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;

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

Теперь запустим 1С:Предприятие в режиме отладки и создадим несколько наборов свойств для наших материалов.

Создание наборов свойств

Откроем элемент справочника НоменклатураКабель электрический. Перейдем на закладку Свойства и создадим набор свойств этого элемента под названием Белый (рис. 7.18).

Он будет состоять их следующих характеристик:

§      ЦветБелый,

§      Сечение, мм22,5.


Рис. 7.18. Элемент справочника Кабель электрический
Рис. 7.18. Элемент справочника Кабель электрический

Затем создадим набор свойств для элемента справочника НоменклатураШланг резиновый.

Этот набор свойств будет называться Польша и состоять из следующих характеристик (рис. 7.19):

  ЦветЧерный;

            •   ПроизводительFagumit.

Рис. 7.19. Элемент справочника Шланг резиновый
Рис. 7.19. Элемент справочника Шланг резиновый

Теперь откроем документ Приходная накладная №2 и укажем, что был закуплен белый электрический кабель в количестве 2 шт. и польский резиновый шланг.

Затем скопируем первую строку документа и укажем, что был закуплен еще и черный электрический кабель в количестве 3 шт. (в процессе ввода нам придется создать еще один набор свойств для электрического кабеля –Черный, у которого Цвет - Черный и Сечение - 2,5), рис. 7.20.

Рис. 7.20. Документ Приходнаянакладная №2
Рис. 7.20. Документ Приходнаянакладная №2

Проведем документ и посмотрим на движения документа по регистру ОстаткиМатериалов (рис. 7.21).

Рис.7.21. Движения документа Приходнаянакладная №2 по регистру
Рис.7.21. Движения документа Приходнаянакладная №2 по регистру

Кроме этого посмотрим на записи, которые содержатся в регистре сведений ЗначенияСвойствНоменклатуры (рис. 7.22).

Рис. 7.22. Записи регистра сведений
Рис. 7.22. Записи регистра сведений

Отчет Остатки материалов по свойствам

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

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

Коротко говоря, набором данных для системы компоновки данных будет довольно простой запрос к регистру ОстаткиМатериалов, и дополнительно к нему мы опишем, как «выглядит» наш механизм характеристик. На основе этих описаний система компоновки данных сама сформирует достаточно понятный и удобный интерфейс для работы с характеристиками и в зависимости от значений, выбранных пользователем, будет формировать необходимые запросы к базе данных.

Приступим к созданию отчета. Создадим новый объект конфигурации Отчет и назовем его ОстаткиМатериаловПоСвойствам. Откроем конструктор схемы компоновки данных, добавим новый набор данных – запрос и займемся конструированием запроса.

Выберем виртуальную таблицу регистра накопления ОстаткиМатериалов.ОстаткиИОбороты.

Из виртуальной таблицы регистра накопления ОстаткиМатериалов.ОстаткиИОбороты выберем следующие поля (рис. 7.23):

  • §     Материал;
  • §     НаборСвойств;
  • §     КоличествоНачальныйОстаток;
  • §     КоличествоПриход;
  • §     КоличествоРасход;
  • §     КоличествоКонечныйОстаток.
Рис. 7.23. Выбранные поля
Рис. 7.23. Выбранные поля

После этого на закладке Объединения/Псевдонимы зададим псевдонимы числовых полей без слова Количество (рис. 7.24).

Рис. 7.24. Объединения/Псевдонимы
Рис. 7.24. Объединения/Псевдонимы

На этом создание запроса завершено. Перейдем к описанию характеристик. Для этого перейдем на закладку Характеристики (рис. 7.25).

Рис. 7.25. Характеристики в конструкторе запроса
Рис. 7.25. Характеристики в конструкторе запроса

Нажмем на кнопку Добавить и приступим к описанию полей. Первое поле, которое требуется описать, – Тип значения. Здесь следует указать тип того поля, к которому будут относиться наши характеристики. В нашем случае (вспомните схему на рис. 7.1) таким полем является поле НаборСвойств регистра ОстаткиМатериалов. Поэтому в качестве типа значения мы выберем СправочникСсылка.ВариантыНоменклатуры (рис. 7.26).

Рис. 7.26. Задание типа значения
Рис. 7.26. Задание типа значения

Следующим шагом будет описание того, откуда система компоновки данных должна получать список характеристик. Для этого следует указать источник списка характеристик и описать назначение конкретных полей этого источника.

В качестве источника система компоновки данных может использовать либо имеющуюся таблицу базы данных, либо результат некоторого запроса к таблицам. В нашем случае все довольно просто: список всех характеристик хранится в плане видов характеристик СвойстваНоменклатуры. Поэтому в качестве источника мы укажем Таблица, а в поле Список характеристик выберем ПланВидовХарактеристик.СвойстваНоменклатуры (рис. 7.27).

Рис. 7.27. Описание списка характеристик
Рис. 7.27. Описание списка характеристик

Далее следует описать назначение полей источника, «поставляющего» список характеристик. В поле Идентификатор выберем Ссылка, в поле Имя выберем Наименование, а в поле ТипТипЗначения (рис. 7.28).

Рис. 7.28. Описание списка характеристик
Рис. 7.28. Описание списка характеристик

Перейдем к описанию источника значений характеристик. В нашем случае источником значений характеристик является регистр сведений ЗначенияСвойствНоменклатуры, поэтому в поле Источник мы выбираем Таблица, а в поле ЗначениеХарактеристикРегистрСведений.ЗначенияСвойствНоменклатуры.

Далее опишем назначение полей регистра. В поле Объект выберем измерение НаборСвойств, в поле ИдентификаторВидСвойства, а в поле Значение – ресурс регистра Значение (рис. 7.29).

Рис. 7.29. Описание значений характеристик
Рис. 7.29. Описание значений характеристик

На этом создание запроса закончено. Нажмем ОK и посмотрим на текст запроса, сформированный для схемы компоновки данных (рис. 7.30).

Рис. 7.30. Текст запроса
Рис. 7.30. Текст запроса

В данном запросе примечательным является секция, начинающаяся с ключевого слова ХАРАКТЕРИСТИКИ. Она как раз и описывает для системы компоновки данных те характеристики, которые будут использованы в данном отчете. Текст этой секции заключен в фигурные скобки. Это означает, что он не является частью запроса, а представляет собой инструкцию для системы компоновки данных.

Приступим к редактированию схемы компоновки данных. Прежде всего, на закладке Ресурсы выберем все доступные ресурсы (рис. 7.31).

Рис. 7.31. Описание ресурсов
Рис. 7.31. Описание ресурсов

Перейдем на закладку Настройки. Создадим структуру отчета – добавим группировку Детальные записи. Затем на закладке Выбранные поля выберем те поля, которые будут выводиться в отчет: Материал, НаборСвойств, НачальныйОстаток, Приход, Расход и КонечныйОстаток (рис. 7.32).

Рис. 7.32. Выбранные поля
Рис. 7.32. Выбранные поля

В заключение перейдем на закладку Другие настройки и зададим заголовок отчета – Остатки материалов по свойствам.

На этом создание отчета завершено. Запустим 1С:Предприятие в режиме отладки и посмотрим, какие результаты можно получить с помощью нашего отчета. Откроем отчет Остатки материалов по свойствам.

Перейдем в режим 1С:Предприятие. Сначала посмотрим, какие у нас есть материалы с сечением 2,5 мм2. Для этого нажмем Настройки, перейдем на закладку Отбор и раскроем ветку Набор свойств (рис. 7.33).

Рис. 7.33. Отбор в отчете ОстаткимМатериалов по свойствам
Рис. 7.33. Отбор в отчете ОстаткимМатериалов по свойствам

Обратите внимание, что к полям, существующим у справочника ВариантыНоменклатуры, система компоновки данных добавила все характеристики, которые определены нами для различных наборов свойств в базе данных: Производитель, Сечение и Цвет. Таким образом отбор в отчете по значениям каких-либо характеристик является достаточно простым и интуитивно понятным.

Чтобы узнать, какие у нас есть материалы с сечением 2,5 мм2, достаточно выбрать поле Сечение, мм2, и задать для него условие равенства 2,5 (рис. 7.34).

Рис. 7.34. Отбор по значению характеристики Сечение
Рис. 7.34. Отбор по значению характеристики Сечение

По окончании выполнения отчета мы получим следующий результат (рис. 7.35):

Рис. 7.35. Результат отчета
Рис. 7.35. Результат отчета

Затем посмотрим, какие у нас есть материалы черного цвета (рис. 7.36).

Рис. 7.36. Результат выполнения отчета
Рис. 7.36. Результат выполнения отчета

И в заключение, чтобы убедиться в правильности работы отчета, посмотрим, сколько у нас электрических кабелей черного цвета (рис. 7.37).

Рис. 7.37. Результат выполнения отчета
Рис. 7.37. Результат выполнения отчета

Таким образом, вы убедились в том, что при использовании данной логической схемы мы имеем теперь возможность вести учет материалов в произвольном количестве разрезов свойств и их значений.

Следует заметить, что пример, рассмотренный нами в этой главе, не является законченным решением для данной конфигурации. Мы лишь продемонстрировали возможность ведения такого учета. Для того чтобы наша конфигурация могла полноценно использовать свойства материалов, необходимо внести соответствующие изменения в остальные регистры, документы и некоторые отчеты.

Контрольные вопросы

q     для чего предназначен объект конфигурации План видов характеристик?

q     в чем принципиальное отличие плана вида характеристик от справочника?

q     что такое тип значения характеристик?

q     зачем нужны дополнительные значения характеристик?

q     как, используя план видов характеристик, организовать учет по переменному количеству характеристик?

q     как создать план видов характеристик?

q     как добавить новую панель в форму и добавить страницы?

q     как перенести элементы управления в новую панель?

q     что такое связь по типу?

q     что такое связь по владельцу?

q     как обработать конфликтные ситуации при работе со связью по типу?

q     как назначить обработчик события изменения данных?

q     как ограничить выборку виртуальной таблицы результатом вложенного запроса?

q     как описать характеристики в схеме компоновки данных?

 

Бухгалтерский учет

В этой главе мы займемся тем, что проиллюстрируем возможность ведения бухгалтерского учета средствами 1С:Предприятия. Для этого мы используем уже знакомый нам план видов характеристик и два новых объекта конфигурации – план счетов и регистр бухгалтерии.

Регистр бухгалтерии будет использоваться нами для накопления данных о совершенных хозяйственных операциях. С помощью плана счетов мы будем описывать счета, в разрезе которых ведется учет, а план видов характеристик будет служить для описания объектов аналитического учета, в разрезе которых должен вестись учет на счетах.

Сразу оговоримся, что план счетов, который мы будем использовать в нашей учебной конфигурации, очень сильно упрощен. Он содержит всего несколько условных счетов, которые, однако, позволят нам познакомиться с основными методами организации бухгалтерского учета средствами 1С:Предприятия.

Объект конфигурации План видов характеристик

Объект конфигурации План видов характеристик был подробно рассмотрен нами в предыдущей главе (см. Объект конфигурации План видов характеристик), поэтому сейчас мы проиллюстрируем только использование этого объекта в контексте бухгалтерского учета.

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

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

Создание объекта конфигурации План видов характеристик ВидыСубконто

Приступим к созданию плана видов характеристик, который будет содержать описания объектов аналитического учета – субконто.

Откроем конфигуратор и создадим новый объект конфигурации План видов характеристик. Зададим его имя – ВидыСубконто.

Поскольку нам понадобится некий вспомогательный справочник, в котором пользователи будут осуществлять «свободное творчество» по созданию значений новых объектов аналитического учета, создадим объект конфигурации Справочник и назовем его Субконто.

Затем на закладке Владельцы укажем, что этот справочник будет подчинен плану видов характеристик ВидыСубконто (рис. 8.1).

Рис.8.1. Окно редактирования справочника Субконто
Рис.8.1. Окно редактирования справочника Субконто

Закроем окно редактирования справочника и вернемся к нашему плану видов характеристик.

Зададим тип значения характеристик. Для этого нажмем на кнопку с многоточием и создадим составной тип данных, в который будут входить следующие типы (рис. 8.2):

  • §     СправочникСсылка.Клиенты;
  • §     СправочникСсылка.Номенклатура;
  • §     СправочникСсылка.Субконто.
Рис. 8.2. Выбор типа значения характеристик
Рис. 8.2. Выбор типа значения характеристик

Бухгалтерия нашего ООО «На все руки мастер» ведет учет движения денежных средств только в разрезе материалов и клиентов, но не исключено, что в дальнейшем понадобится дополнительная аналитика (поэтому мы используем и справочник Субконто). Обратите внимание, что тот справочник, который будет использован в качестве дополнительных значений характеристик, тоже должен входить в составной тип данных типа значений характеристик, иначе конфигуратор выдаст сообщение об ошибке.

Затем укажем, что дополнительные значения характеристик будут находиться в справочнике Субконто.

На закладке Формы укажем, что план видов характеристик будет редактироваться в списке.

После этого перейдем на закладку Прочее и начнем ввод предопределенных значений плана видов характеристик (рис. 8.3).

Создадим предопределенный вид субконто: Материалы, с кодом 000000001 и типом СправочникСсылка.Номенклатура, а затем создадим вид субконто: Клиенты, с кодом 000000002 и типом СправочникСсылка.Клиенты.

Рис. 8.3. Предопределенные виды характеристик
Рис. 8.3. Предопределенные виды характеристик

На этом создание видов субконто завершено, и мы можем перейти к знакомству со следующим объектом конфигурации, который будет использован нами, – Планом счетов.

Объект конфигурации План счетов

Объект конфигурации План счетов является прикладным. Он предназначен для описания структуры хранения информации о совокупности синтетических счетов предприятия, которые созданы для группировки данных о его хозяйственной деятельности. На основе объекта конфигурации План счетов платформа создает в базе данных структуры, в которых может храниться информация о том, какие счета и каким образом будет использовать предприятие. Это может быть система бухгалтерских счетов, установленная государством, план управленческих счетов или произвольный набор счетов, используемых для анализа тех или иных видов деятельности предприятия.

План счетов в системе 1С:Предприятие поддерживает иерархию субсчетов: к каждому счету первого уровня может быть открыто несколько субсчетов, которые, в свою очередь, могут иметь свои субсчета, и так далее.

По любому счету или субсчету может вестись аналитический учет в разрезе субконто, описанных в плане видов характеристик. Связь между планом счетов и планов видов характеристик задается разработчиком на этапе конфигурирования. Для описания используемых субконто система создает в плане счетов специальную табличную часть ВидыСубконто, которая не видна в конфигураторе (но доступна средствами встроенного языка).

Для каждого счета есть возможность задать несколько видов учета (например, количественный и валютный). Виды учета задаются при помощи подчиненных объектов конфигурации Признак учета.

Также существует возможность определить несколько видов учета субконто (например, суммовой, валютный или количественный). Виды учета субконто задаются при помощи подчиненных объектов конфигурации Признак учета субконто.

Помимо всего вышеперечисленного каждый счет может иметь набор свойств, которые задаются в качестве реквизитов объекта конфигурации План счетов. Они позволяют определять уникальные свойства элементов плана счетов (например, реквизит ЗапретитьИспользоватьВПроводках).

Создание объекта конфигурации План счетов Основной

Приступим к созданию плана счетов ООО «На все руки мастер». Как мы говорили в начале этой главы, бухгалтерский учет в нашем ООО сильно упрощен, и план счетов, по которому работает бухгалтерия, содержит всего три счета: Товары, Капитал и Дебиторская задолженность.

Откроем конфигуратор и создадим новый объект конфигурации План счетов. Присвоим ему имя – Основной.

На закладке Данные создадим признак учета Количественный.

Перейдем на закладку Субконто и укажем, что субконто для этого плана счетов будут находиться в плане видов характеристик ВидыСубконто. Максимальное количество субконто на счете установим равным двум. Также создадим признак учета субконто Количественный и сразу откроем закладку Прочее.

Нажмем кнопку Предопределенные и создадим четыре предопределенных счета:

  • §     Товары
Рис. 8.4. Предопределенный счет Товары
Рис. 8.4. Предопределенный счет Товары

РасчетыСПоставщиками, код 60, активно/пассивный (рис. 8.5).

Рис. 8.5. Предопределенный счет Расчеты с поставщиками
Рис. 8.5. Предопределенный счет Расчеты с поставщиками

ДебиторскаяЗадолженность, код 62, активно/пассивный, с учетом в разрезе клиентов (рис. 8.6).

 

Рис. 8.6. Предопределенный счет Дебиторская задолженность
Рис. 8.6. Предопределенный счет Дебиторская задолженность

Капитал, с кодом 90, активно/пассивный (рис. 8.7).

 

Рис. 8.7. Предопределенный счет Капитал
Рис. 8.7. Предопределенный счет Капитал

В результате план счетов нашего ООО «На все руки мастер» будет выглядеть следующим образом (рис. 8.8):

Рис. 8.8. План счетов Основной
Рис. 8.8. План счетов Основной

Теперь мы можем перейти к знакомству с последним объектом конфигурации, который понадобится нам для организации бухгалтерского учета, – регистром бухгалтерии.

Объект конфигурации Регистр бухгалтерии

Объект конфигурации Регистр бухгалтерии является прикладным и предназначен для описания структуры накопления данных, учет которых ведется исходя из некоторого плана счетов. На основе объекта конфигурации Регистр бухгалтерии платформа создает в базе данных информационную структуру, в которой будут накапливаться данные о хозяйственных операциях, отображаемых в бухгалтерском учете.

По своему виду регистр бухгалтерии напоминает регистр накопления – он также имеет ресурсы, может иметь измерения и реквизиты. Измерения позволяют разделять ведение учета (например, используя измерение Организация, можно вести учет в разрезе нескольких юридических лиц). Реквизиты служат признаком, по которому одни записи регистра можно отделить от других (например, в качестве реквизита может использоваться номер журнала, что позволит отбирать проводки, имеющие одинаковый смысл).

Значительное отличие от регистра накопления заключается в том, что регистр бухгалтерии имеет жесткую связь с используемым планом счетов. Поэтому каждая запись регистра бухгалтерии содержит дополнительные поля, определяемые настройкой используемого плана счетов. Например, запись регистра может содержать дополнительные поля для указания корреспондирующих счетов, сумм, объектов аналитического учета (субконто), количества, вида валюты и т. д.

Кроме этого отличительной чертой регистра бухгалтерии является возможность поддержки механизма двойной записи, при которой каждая запись регистра содержит обязательные поля для указания счета дебета и счета кредита.

Создание регистра бухгалтерии Управленческий

Откроем конфигуратор и создадим новый объект конфигурации Регистр бухгалтерии. Зададим его имя – Управленческий. Укажем, что с ним будет связан план счетов Основной. Установим флаг Корреспонденция. Он будет говорить о том, что создаваемый нами регистр поддерживает корреспонденции. Это означает, что каждая запись регистра имеет дебетовую и кредитовую часть, что позволит нам получать информацию не только об остатках и оборотах по счетам, но и о корреспонденциях между счетами.

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

Теперь перейдем на закладку Данные и создадим два ресурса:

  • §     Сумма, длина 15, точность 2, балансовый;
  • §     Количество, длина 15, точность 3, небалансовый, признак учета – количественный, признак учета субконто – количественный.

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

Запустим 1С:Предприятие в режиме отладки и откроем регистр бухгалтерии Управленческий. Как видите, платформа (при создании структуры хранения данных) добавила к созданным нами реквизитам регистра еще ряд полей, которые явились следствием использования плана счетов Основной. Прежде всего, это поля СчетДт, СубконтоДт1, СчетКт и СубконтоКт1. Кроме этого, если прокрутить окно вправо до конца, вы обнаружите две колонки Количество: КоличествоДт и КоличествоКт. Для измерений и ресурсов регистра, связанных с признаками учета, платформа создает пару полей для хранения значения ресурса отдельно по дебету и отдельно по кредиту проводки.

Использование регистра бухгалтерии

Настало время познакомиться с тем, каким образом используется созданный нами регистр бухгалтерии Управленческий. В этой главе мы сначала доработаем оба наши документа – ПриходнаяНакладная и ОказаниеУслуги – так, чтобы они «поставляли» данные не только для регистров накопления, но и для регистра бухгалтерии. Затем мы создадим бухгалтерский отчет Оборотно-сальдовая ведомость, который будет показывать нам состояние товародвижения в ООО «На все руки мастер», основываясь на данных регистра бухгалтерии.

Создание движений документа Приходная накладная

Начнем с простого: доработаем движения документа ПриходнаяНакладная. Для этого нам достаточно будет воспользоваться конструктором движений документа и заменить старые движения документа новыми, по трем регистрам.

Откроем конфигуратор. В окне редактирования объекта конфигурации Документ ПриходнаяНакладная, на закладке Движения запустим конструктор движений документа.

В список регистров добавим РегистрБухгалтерии.Управленческий. В качестве источника данных выберем табличную часть документа ПриходнаяНакладнаяМатериалы. Счет дебета установим равным ПланыСчетов.Основной.Товары (41), а счет кредита – ПланыСчетов.Основной.РасчетыСПоставщиками (60).

Нажмем кнопку Заполнить выражения. У вас должен получиться следующий результат (рис. 8.9):

Рис. 8.9. Движения документа ПриходнаяНакладная
Рис. 8.9. Движения документа ПриходнаяНакладная

Нажмем ОK и посмотрим, какой текст платформа добавила в обработчик проведения документа ПриходнаяНакладная (листинг 8.1).

Листинг 8.1. Процедура ОбработкаПроведения()

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора

// внесенные вручную изменения будут утеряны!!!

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

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

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

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

Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;

Движение.Количество = ТекСтрокаМатериалы.Количество;

КонецЦикла;

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

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

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Стоимость = ТекСтрокаМатериалы.Сумма;

КонецЦикла;

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

// Регистр Управленческий

Движение = Движения.Управленческий.Добавить();

Движение.СчетДт = ПланыСчетов.Основной.Товары;

Движение.СчетКт = ПланыСчетов.Основной.РасчетыСПоставщиками;

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

Движение.Сумма = ТекСтрокаМатериалы.Сумма;

Движение.КоличествоДт = ТекСтрокаМатериалы.Количество;

   Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = ТекСтрокаМатериалы.Материал;

КонецЦикла;

 

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Платформа сформировала уже знакомые нам три цикла обхода табличной части документа (для каждого регистра свой цикл). В первых двух циклах для нас нет ничего нового. В последнем по большому счету тоже: движения формируются таким же образом, как и для регистра накопления. Интерес для нас представляет только последняя строчка цикла, в которой присваивается значение субконто дебета.

Дело в том, что количество субконто как по дебету, так и по кредиту у каждой записи движения регистра будет различное, в зависимости от того, как определены счета в используемом плане счетов. Поэтому для каждой записи движения регистра бухгалтерии платформа хранит две коллекции значений: коллекцию субконто дебета и коллекцию субконто кредита. Каждая из них содержит ровно столько элементов, сколько видов субконто указано использовать для соответствующего счета (дебета или кредита) в плане счетов. Обратиться к элементу коллекции можно, указав в квадратных скобках ссылку на соответствующий вид характеристик, либо указав через точку имя предопределенного вида характеристик.

Другими словами, запись, приведенная в листинге 8.2, равносильна записи, показанной в листинге 8.3.

Листинг 8.2. Пример обращения к субконто

Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] …

Листинг 8.3. Пример обращения к субконто

Движение.СубконтоДт.Материалы …

Запустим 1С:Предприятие в режиме отладки, откроем документ Приходная накладная №1 и перепроведем его.

Посмотрим, какие движения сформировал документ в регистре бухгалтерии Управленческий (рис. 8.10).

Рис. 8.10. Записи регистра бухгалтерии Управленческий
Рис. 8.10. Записи регистра бухгалтерии Управленческий

Обратите внимание: поскольку на счете 60 (РасчетыСПоставщиками) отсутствует аналитика и ведется только суммовой учет, в записях движений регистра СубконтоКт1, СубконтоКт2 и КоличествоКт не указаны.

После этого перепроведем документ Приходная накладная №2 и посмотрим, какие движения он сформирует.

Теперь перейдем к более сложной задаче: добавлению движений по регистру Управленческий в документ ОказаниеУслуги.

Добавление движений по регистру бухгалтерии Управленческий в документ Оказание услуги

Для того чтобы добавить движения по регистру Управленческий в документ ОказаниеУслуги, нам уже не удастся воспользоваться конструктором движений. Если вы помните, движения этого документа мы создавали самостоятельно, без использования конструктора.

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

Таблица 8.1. Проводки, создаваемые документами

Документ

Проводки

Дебет

Кредит

Сумма

ПриходнаяНакладная

41

Товары

60

Расчеты с поставщиками

Стоимость

ОказаниеУслуги

62

Дебиторская задолженность

90

Капитал

Выручка

90

Капитал

41

Товары

Стоимость

Напомним, что бухгалтерия нашего ООО «На все руки мастер» не совсем похожа на «настоящую», потому что для облегчения своей работы она учитывает только движения материалов. Услуги, которые оказывает ООО, для нее как бы не существуют. Поэтому документ ОказаниеУслуги должен формировать движения по регистру бухгалтерии только в той части, которая касается расходования материалов.

Откроем в конфигураторе модуль объекта конфигурации Документ ОказаниеУслуги и найдем в нем процедуру обработки проведения (листинг 8.4).

Листинг 8.4. Процедура ОбработкаПроведения()

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

"ВЫБРАТЬ

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

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

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

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

|      ОстаткиМатериаловОстатки.КоличествоОстаток,

|      СтоимостьМатериаловОстатки.СтоимостьОстаток,

|      ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоОстатокНаСкладе

|

|ИЗ

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

|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки

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

|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки

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

|      ЛЕВОЕ СОЕДИНЕНИЕРегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента) И Склад = &СкладВДокументе) КАК ОстаткиМатериаловОстаткиНаСкладе

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

|

|ГДЕ

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

|

|ДЛЯ ИЗМЕНЕНИЯ

|      РегистрНакопления.ОстаткиМатериалов.Остатки,

|      РегистрНакопления.СтоимостьМатериалов.Остатки";

 

Иначе

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

"ВЫБРАТЬ

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

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

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

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

|      ОстаткиМатериаловОстатки.КоличествоОстаток,

|      СтоимостьМатериаловОстатки.СтоимостьОстаток

|

|ИЗ

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

|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки

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

|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки

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

   |

|ГДЕ

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

|

|ДЛЯ ИЗМЕНЕНИЯ

|      РегистрНакопления.ОстаткиМатериалов.Остатки,

|      РегистрНакопления.СтоимостьМатериалов.Остатки";

КонецЕсли;

 

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));

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

 

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

 

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

 

// Проверить остаток при оперативном проведении.

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

              Остаток =?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null, 0,

                                                                                                        ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);

              Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда

                    Сообщить("Материала " + СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только " + Остаток);

                    Отказ = Истина;

                    Возврат;

              КонецЕсли;

       КонецЕсли;

КонецЕсли;

 

// Сформировать движения

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

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

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

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

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

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

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

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

 

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

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

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

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

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

       // Рассчитать стоимость материала

       СтоимостьМатериала =?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,

                                                     ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);

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

КонецЕсли;

 

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

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

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

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

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

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

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

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

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

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

Иначе

       Движение.Стоимость = 0;

КонецЕсли;

КонецЦикла;

 

// Записать движения регистров

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

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

Движения.Продажи.Записать();

Поскольку нас интересует только движение материалов, для внесения дополнений подойдет тело условия Если …, в котором мы формировали движения по регистрам ОстаткиМатериалов и СтоимостьМатериалов.

Добавим движения по регистру бухгалтерии Управленческий (листинг 8.5).

Листинг 8.5 Движения по регистру бухгалтерии Управленческий

// Сформировать движения.

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

 

// По регистру Управленческий 

 

// Первая проводка:

// Д 62(ДебиторскаяЗадолженность) - К 90 (Капитал)

// Розничная сумма

Движение = Движения.Управленческий.Добавить();

Движение.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;

Движение.СчетКт = ПланыСчетов.Основной.Капитал;

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

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

Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Клиенты] = Клиент;

 

// Вторая проводка:

// Д 90 (Капитал) - К 41 (Товары) - себестоимость

Движение = Движения.Управленческий.Добавить();

Движение.СчетДт = ПланыСчетов.Основной.Капитал;

Движение.СчетКт = ПланыСчетов.Основной.Товары;

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

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

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

Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = ВыборкаРезультатаЗапроса.Номенклатура;

КонецЕсли;

В первой проводке мы указываем розничную сумму материала из документа и субконто дебета, поскольку на счете Дебиторская задолженность ведется учет в разрезе материалов.

Во второй проводке мы пишем стоимость материала, количество и субконто кредита, поскольку на счете Товары ведется количественный учет в разрезе материалов.

Запустим 1С:Предприятие в режиме отладки, перепроведем документ Оказание услуги №1 и посмотрим, какие движения он сформировал по регистру бухгалтерии Управленческий (рис. 8.11).

Рис. 8.11. Записи регистра Управленческий
Рис. 8.11. Записи регистра Управленческий

После этого перепроведем остальные документы Оказание услуги.

Создание отчета Оборотно-сальдовая ведомость

Теперь нам только осталось создать отчет для бухгалтерии ООО «На все руки мастер», и наше знакомство с использованием регистра бухгалтерии будет закончено.

Единственный отчет, которым пользуется бухгалтерия нашего ООО, – это отчет Оборотно-сальдовая ведомость.

Для того чтобы его сформировать, откроем конфигуратор и создадим новый объект конфигурации Отчет с именем ОборотноСальдоваяВедомость. Создадим новую схему компоновки данных и добавим набор данных - запрос. Откроем конструктор запроса.

Бухгалтерский отчет Оборотно-сальдовая ведомость представляет собой таблицу, в строках которой перечислены все имеющиеся в плане счетов счета, а в колонках – начальное сальдо, оборот и конечное сальдо по дебету и кредиту каждого счета. Поэтому нам для построения такого отчета понадобятся две исходные таблицы (рис. 8.12): объектная (ссылочная) таблица плана счетов Основной и виртуальная таблица регистра бухгалтерии Управленческий.ОстаткиИОбороты.

Рис. 8.12. Исходные таблицы
Рис. 8.12. Исходные таблицы

Из таблицы Основной мы выберем поля Код и Наименование, а из таблицы УправленческийОстаткиИОбороты возьмем следующие поля (рис. 8.13):

  • §     СуммаНачальныйОстатокДт;
  • §     СуммаНачальныйОстатокКт;
  • §     СуммаОборотДт;
  • §     СуммаОборотКт;
  • §     СуммаКонечныйОстатокДт;
  • §     СуммаКонечныйОстатокКт.
Рис. 8.13. Выбранные поля
Рис. 8.13. Выбранные поля

Перейдем на закладку Связи и укажем, что из таблицы Основной мы будем выбирать все записи, а из таблицы регистра – только те, которые соответствуют условию связи (рис. 8.14).

Рис. 8.14. Условия связи таблиц
Рис. 8.14. Условия связи таблиц

Затем на закладке Объединения/Псевдонимы зададим псевдонимы полей регистра: СальдоНачДт, СальдоНачКт, ОборотДт, ОборотКт, СальдоКонДт и СальдоКонКт (рис. 8.15).

Рис. 8.15. Объединения/Псевдонимы
Рис. 8.15. Объединения/Псевдонимы

После этого на закладке Порядок укажем, что результат запроса должен быть отсортирован по возрастанию поля Код. На этом создание отчета закончено, нажмем ОK.

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

Рис. 8.16. Роли полей компоновки данных
Рис. 8.16. Роли полей компоновки данных

Для этих полей система определила бухгалтерский тип – Дебет и Кредит. Поэтому когда в нашей оборотно-сальдовой ведомости будет рассчитываться общий итог по этим полям, мы получим значение 0, т. к. сумма по дебету счетов будет равна сумме по кредиту, только с обратным знаком. Для того чтобы избежать такой ситуации, в ролях этих полей мы уберем указание бухгалтерского типа и изменим имена групп полей. В этом случае система компоновки данных будет воспринимать эти поля как «обычные» поля остатков.

Войдя в режим редактирования поля Роль и нажав кнопку выбора, можно открыть окно редактирования роли поля (рис. 8.17).

Рис. 8.17. Диалог редактирования роли поля
Рис. 8.17. Диалог редактирования роли поля

Для полей СальдоНачДт и СальдоКонДт зададим имя СальдоДт, а для полей СальдоНачКт и СальдоКонКтСальдоКт. Для всех четырех полей установим Бухгалтерский тип в значение Нет (рис. 8.18).

Рис. 8.18. Роли полей компоновки данных
Рис. 8.18. Роли полей компоновки данных

Перейдем на закладку Ресурсы и с помощью кнопки Добавить все ресурсы (>>) выберем все доступные ресурсы.

В заключение перейдем на закладку настройки и создадим структуру отчета. Добавим группировку, содержащую детальные записи. Затем на закладке Выбранные поля выберем все поля для вывода в отчет.

На закладке Другие настройки укажем заголовок отчета – Оборотно-сальдовая ведомость. Для параметра Расположение общих итогов по вертикали укажем значение Начало и конец.

Наш отчет готов. Запустим 1С:Предприятие в режиме отладки и посмотрим, как он работает (рис. 8.19).

Рис. 8.19. Оборотно-сальдовая ведомость
Рис. 8.19. Оборотно-сальдовая ведомость

Контрольные вопросы

  • ·         как использовать план видов характеристик для организации ведения бухгалтерского учета?
  • ·         что такое субконто?
  • ·         для чего предназначен объект конфигурации План счетов?
  • ·         как создать план счетов?
  • ·         для чего предназначен Регистр бухгалтерии?
  • ·         как создать регистр бухгалтерии и настроить параметры учета?
  • ·         как создать движения документа по регистру бухгалтерии при помощи конструктора движений?
  • ·         как создать движения документа по регистру бухгалтерии средствами встроенного языка?
  • ·         как получить данные из регистра бухгалтерии запросом?
  • ·         как создать отчет на основании данных из регистра бухгалтерии с помощью системы компоновки?


 

Количество посещений

Website counter