<<

стр. 4
(всего 11)

СОДЕРЖАНИЕ

>>

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

Диаграмма

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

Значение серии в
точке
Область
легенды

Серия

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



197
196
Создание отчетов
Использование основных объектов конфигурации


Затем разместим под ним диаграмму с именем «Диаграмма».
имена точек и серий. В случае с областью табличного документа
Изменим размеры областей диаграммы, и зададим текст области
имена точек и серий будут браться из верхней строки и левого столбца
заголовка - «Рейтинг клиентов»:
области; в случае с таблицей значений - из заголовков колонок и
первой колонки.
Во-вторых, диаграмма может быть заполнена данными «вручную».
Для этого нужно создать в диаграмме несколько серий и точек, а
затем, используя метод УстановитьЗначение(), задать нужные
значения для каждой пары серия - точка.
Следует отметить, что эти два способа заполнения диаграммы не
могут комбинироваться.
В следующем примере мы будем использовать диаграмму,
расположенную в форме и заполнять ее данными «вручную»,
используя метод УстановитьЗначение().

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


С
оздадим в конфигураторе новый объект конфигурации Отчет
«РейтингКлиентов». Затем создадим основную форму отчета и
расположим на ней поле выбора с именем «ПолеВыбора»,
подписью «Тип диаграммы:» и подсказкой «Выбор типа диаграммы» В модуле формы создадим процедуру «Сформировать» с
(Форма | Вставить элемент управления...): заготовкой для текста запроса:

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст =

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


Установим курсор в предпоследней строке, перед точкой с запятой
и вызовем конструктор запроса (Текст | Конструктор запроса...).
Выберем виртуальную таблицу регистра накопления
«Продажи.Обороты» и из нее одно поле
«ПродажиОбороты.Клиент.Представление».


199
198
Использование основных объектов конфигурации
Создание отчетов

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

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент, |
ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот |
КАК Доход |ИЗ| РегистрНакопления.Продажи.Обороты КАК
ПродажиОбороты
|УПОРЯДОЧИТЬ ПО
| ДоходУБЫВ";
КонецПроцедуры


По сравнению с предыдущими отчетами, текст запроса довольно
прост; единственным интересным местом, на которое следует обратить
внимание, является поле «Доход», являющееся результатом
вычисления выражения:


В результате список выбранных полей будет иметь следующий вид:
ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот
КАК Доход




Теперь обработаем результат запроса таким образом, чтобы данные
отобразились в диаграмме, расположенной в форме отчета.
На закладке «Объединения/Псевдонимы» укажем, что поле
Добавим в процедуру следующий текст (добавленный текст
«ПродажиОбороты.Клиент.Представление» будет иметь псевдоним выделен жирным шрифтом):
«Клиент», а вычисляемое поле - псевдоним «Доход»:

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент, |
ПродажиОбороты.ВыручкаОборот — ПродажиОбороты.СтоимостьОборот |
КАК Доход |ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты




200
201
Создание отчетов
Использование основных объектов конфигурации

«АвтоТранспонирование» для того, чтобы различные типы диаграмм,
!УПОРЯДОЧИТЬ ПО I которые будут выбраны в поле выбора, отображались правильно.
ДоходУБЫВ";
ВыборкаРеэультатаЗапроса = Запрос.Выполнить().Выбрать();
<#" Узнай больше!
Следует сделать несколько замечаний no оптимизации заполнения
Диаграмма = ЭлементыФормы.Диаграмма; //запретить
диаграммы данными.
обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Ложь;
Во-первых, перед началом заполнения диаграммы данными следует
Диаграмма.АвтоТранспонирование = Ложь;
отключать обновление диаграммы (свойство диаграммы
«Обновление»). Это значительно ускорит процесс заполнения,
//создать единственную точку диаграммы ТочкаДиаграммы =
Диаграмма.УстановитьТочку("Доход");
поскольку при включенном обновлении диаграмма будет выполнять
пересчет и отрисовку автоматически. После того, как диаграмма
//перебрать выборку результата запроса и создать серии
будет заполнена данными, обновление диаграммы нужно снова
// и значения
включить.
Пока ВыборкаРезультатаЗапроса.СледующнйО Цикл
ТекущаяСерияДиаграммы = Диаграмма
Во-вторых, перед началом заполнения диаграммы данными
.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);
следует также отключать автотранспонирование диаграммы
Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы,
(свойство диаграммы «АвтоТранспонирование»).
ВыборкаРезультатаЗапроса.Доход);
Автотранспонирование позволяет диаграмме анализировать данные и
КонецЦикла;
выбирать наиболее подходящее представление в зависимости от
//разрешить обновление и автотранспонирование диаграммы
заданного типа диаграммы. Например, круговая диаграмма
Диаграмма.Обновление = Истина;
отображает значения нескольких серий в одной точке, а обычный
Диаграмма.АвтоТранспонирование = Истина;
график - как раз наоборот - значения одной серии в нескольких
точках. Обратите внимание, что автотранспонирование диаграммы
доступно только в режиме «ручного» заполнения данными. При
Сначала, с помощью метода Выполнить() мы получаем результат использовании источника данных это свойство недоступно. После
запроса. Затем методом Выбрать() получаем выборку записей из того, как ди а г р а м м а будет заполнена данными,
результата запроса в переменной «ВыборкаРезультатаЗапроса». автотранспонирование диаграммы можно снова включить, если в
Перед началом заполнения мы отключаем обновление и этом есть необходимость.
автотранспонирование диаграммы для того, чтобы заполнение
данными выполнялось быстрее. Теперь создадим обработчик события формы «ПриОткрытии», и
После этого добавляем в диаграмму единственную точку. добавим в него установку значения поля выбора и типа диаграммы, и
вызов нашей процедуры «Сформировать»:
Затем мы организуем цикл по выборке из результата запроса и в
цикле добавляем серии в нашу диаграмму. Каждому клиенту будет
соответствовать своя серия. После этого мы устанавливаем значение Процедура ПриОткрытии() //
точки, передавая методу УстановитьЗначение() точку, серию, для Заполним список поля выбора
ПолеВыбора = ТипДиаграммы. Гистограмма;
которой устанавливается значение в этой точке, и само значение.
После заполнения диаграммы данными мы включаем свойство ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
«Обновление», чтобы новое состояние диаграммы было отображено, и
Сформировать();
КонецПроцедуры




203
202
Создание отчетов
Использование основных объектов конфигурации

Запустим 1С:Предприятие в режиме отладки и откроем отчет
В теле модуля формы опишем заполнение списка выбора для поля
«РейтингКлиентов». Обратите внимание, что при наведении курсора
выбора: на столбец гистограммы появляется подсказка:

СписокВыбора = ЭлементыФормы.ПолеВыбора.СписокВыбора;

СписокВыбора.Добавить(ТипДиаграммы.График, "График");
СписокВыбора.Добавить(ТипДиаграммы.Гистограмма, "Гистограмма");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаОбъемная, "Гистограмма 3D");
СписокВыбора.Добавитъ(ТипДиаграммы.ГистограммаГоризонтальная,
"Гистограмма горизонтальная");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальнаяОбъемная,
"Гистограмма горизонтальная 3D");
СписокВыбора.Добавить(ТипДиаграммы.Круговая, "Круговая");
СписокВыбора.Добавить(ТипДиаграммы.КруговаяОбъемная,"Круговая объемная");
СписокВыбора.Добавить(ТипДиаграммы.Изометрическая," Изометрическая");
СгшсокВыбора.Добавить(ТипДиаграммы.ИзометрическаяНепрерывная,
"Изометрическая непрерывная");
СписокВыбора.ДобавитьСГипДиаграммы.ИзометрическаяЛента,
"Изометрическая лента");
СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяПирамида,
"Изометрическая пирамида");
Теперь изменим тип диаграммы на «Круговая объемная>:

И в заключение, создадим обработчик события поля выбора «При
изменении», и выполним в нем установку типа диаграммы:

ПроцедураПолеВыбораПриИзмененииЭлемент)
ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
КонецПроцедуры ______________________________________




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


205
204
т
Использование основных объектов конфигурации
Создание отчетов

заполнения диаграммы данными, используя свойство диаграммы -
«вручную» (используя
«ИсточникДанных».
обрабатывать транспонирование диаграммы
Вернемся в модуль формы отчета «РейтингКлиентов» и все строки, свойство СерииВСтроках).
которыми мы добавляли в диаграмму данные:
Таким образом, на примере этого отчета мы продемонстрировали
как создавать запросы, используя конструктор запросов, и как
использовать диаграмму для визуализации результата запроса.
ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Диаграмма = ЭлементыФормы.Диаграмма;
//запретить автотранспонирование диаграммы
Диаграмма.АвтоТранспонирование = Ложь;

//создать единственную точку диаграммы ТочкаДиаграммы =
Диаграмма.УетановитьТочку("Доход");

//перебрать выборку результата запроса и создать серии и значения
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
ТекущаяСерияДиаграммы = Диаграмма
.УстановитьСерикКВыборкаРезультатаЗапроса.Клиент);
Диаграмма.УстановитьЗначение(ТочкаДиаграммы, ТекущаяСерияДиаграммы,
ВыборкаРезультатаЗапроса.Доход);
КонецЦикла;

//разрешить автотранспонирование диаграммы
Диаграмма.АвтоТранспонирование = Истина;



заменим одной строкой:


ЭлементыФормы.Диаграмма.ИсточникДанных = Запрос,Выполнить().Выгрузить();


Дело в том, что метод Выгрузить() по умолчанию выгружает
результат запроса в таблицу значений, которую мы и устанавливаем
диаграмме в качестве источника данных. Причем структура
получаемой таблицы значений как раз соответствует расположению
серий в строках диаграммы, принятому по умолчанию.
Запустите 1С:Предприятие в режиме отладки и проверьте работу
отчета. Обратите внимание на то, что некоторые типы диаграмм
выглядят «некрасиво» (график) или не отображаются совсем
(изометрическая непрерывная, изометрическая лента). Это связано с
тем, что при использовании источника данных нет возможности
использовать свойство диаграммы «АвтоТранспонирование» и нужно


206
207
Использование основных объектов конфигурации Создание отчетов




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




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




208
209
Создание отчетов
Использование основных объектов конфигурации


Создание универсального отчета
Автоматически параметры настройки формируются вызовом



М
метода ЗаполнитьНастройки() следующим образом:
ы с вами рассмотрим один из вариантов использования
построителя отчета, в котором результаты отчета будут
• полями, доступными для выбора в качестве полей отбора,
выводиться в сводную таблицу.
порядка или вывода в отчет (свойство «ДоступныеПоля»),
Создадим в конфигураторе новый объект
становятся все поля из списка выборки и все их подчиненные
конфигурации Отчет «Универсальный». Этот отчет будет иметь
поля,
реквизит «ПостроительОтчета», с типом ПостроительОтчета.
• в список полей, выбранных для вывода в отчет (свойство
В модуле отчета создадим текст запроса для построителя отчета.
«ВыбранныеПоля»), добавляются все поля из списка выборки,
Для этого вставим в модуль следующие строки:
• полями, доступными для выбора в качестве измерений,
становятся все поля из предложения ИТОГИ ПО и все их
ПостроительОтчета.Текст =
подчиненные поля, ;
• в список измерений по строкам (свойство
«ИзмеренияСтроки») добавляются все поля из предложения
Установим курсор перед символом точки с запятой и вызовем
ИТОГИПО,
конструктор запросов (Текст | Конструктор запроса...).
• в доступные отборы (свойство «Отбор») добавляются
В качестве таблицы выберем виртуальную таблицу регистра
параметры виртуальных таблиц.
накопления «Продажи.Обороты». Из этой таблицы выберем все поля:
Вторым способом формирования параметров настроек построителя
отчета является выделение их в тексте запроса. Для этого
используются фигурные скобки «{}». Фигурными скобками могут
быть выделены параметры построителя отчета, а также некоторые
синтаксические конструкции:
• ВЫБРАТЬ ... - описывает поля, которые пользователь сможет
выбирать для вывода,
• ГДЕ ... - описывает поля, на которые пользователь может
накладывать ограничения,
Ha закладке «Итоги» укажем получение общих итогов и выберем
• УПОРЯДОЧИТЬПО ... - описывает поля для обозначения все ресурсы регистра:
порядка,
• ИТОГИ ПО ... - описывает поля, по которым будут
выводиться итоговые значения.
После того, как значения параметров указаны, вывод результатов
запроса возможен как принудительно (используя методы Выполнить()
и Вывести()), либо автоматически, если результаты выводятся в
сводную таблицу.




210 211
Использование основных объектов конфигурации Создание отчетов

Нажмем «OK». B модуле отчета появится текст сформированного Теперь создадим форму отчета и расположим на ней поле
табличного документа (Форма | Вставить элемент управления I
запроса:
Поле табличного документа) с именем
«ПолеТабличногоДокумента»:
ПостроительОтчета.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.Номенклатура.Представление, Расположим в форме поле табличного документа
| ПродажиОбороты.Клиент,
| ПродажиОбороты.Клиент.Представление,
| ПродажиОбороты.Мастер,
| ПродажиОбороты.Мастер.Представление,
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот,
| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
|
|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот),
| СУММА(СтоимостьОборот)
| ПООБЩИЕ";

Добавим в текст запроса указания для построителя отчетов:

ПостроительОтчета.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.Номенклатура.Представление,
| ПродажиОбороты.Клиент,
Затем установим курсор в верхнюю левую ячейку поля табличного
| ПродажиОбороты.Клиент.Представление,
| ПродажиОбороты.Мастер, документа и выполним
| ПродажиОбороты.Мастер.Представление,
Таблица | Встроенные таблицы | Вставить сводную таблицу.
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
После этого создадим обработчик события формы отчета «При
| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот,
открытии», и добавим в него следующий текст:
| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
Процедура ПриОткрытии() СводнаяТаблица =
ЭлементыФормы.ПолеТабличногоДокумеита
|{ИТОГИ ПО Номенклатура, Клиент, Мастер}
¦ВстроенныеТаблицы.СводнаяТаблица1,'
|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот), СводнаяТаблица.ИсточникДанных = ПостроительОтчета;
| СУММА(СтоимостьОборот) КонецПроцедуры
| ПООБЩИЕ";
Этим текстом мы устанавливаем сводной таблице в качестве
источника данных построитель отчета.




212 213
Использование основных объектов конфигурации Создание отчетов

Запустим 1С:Предприятие в режиме отладки и откроем отчет Теперь в окне выбора полей сводной таблицы раскроем группу
«Универсальный». На экране появится форма отчета, и окно выбора «Номенклатура» и добавим значение «(Без иерархии)» в строки, а
измерение «Клиент» добавим в колонки. Отчет изменит свой вид:
полей сводной таблицы:




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




214 215
Создание отчетов
Использование основных объектов конфигурации


«ТабличноеПолеПоля» (соответственно «КоманднаяПанельПорядок»
Отчет Универсальный2 и «ТабличноеПолеПорядок»):



Н а примере создания второго универсального отчета мы
рассмотрим способы непосредственного управления
настройками построителя отчета и возможность
формирования макетов на основе вариантов стандартного оформления.
Для более легкого понимания мы будем использовать практически
тот же самый запрос по регистру накопления «Продажи». Таким
образом, можно сказать, что в этом отчете мы просто покажем другой
вариант управления настройками построителя отчета.
Создадим новый объект конфигурации Отчет с именем
«Универсальный2».
На закладке «Данные» создадим реквизит отчета с именем
«ПостроительОтчета» и типом ПостроительОтчета. На закладке
«Формы» с помощью конструктора создадим основную форму отчета
и приступим к ее редактированию.
Расположим в форме две надписи с именами «Поля» и «Порядок» и Теперь для табличного поля «ТабличноеПолеПоля» зададим
заголовками «Поля:» и «Порядок:» соответственно: источник данных как
ОтчетОбъект.ПостроительОтчета.ВыбранныеПоля:




Под каждым текстовым полем расположим командную панель и
табличное поле с именами «КоманднаяПанельПоля» и




216 217
Использование основных объектов конфигурации Создание отчетов


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




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

*" Узнай больше!
О связи элементов управления и данных, можно прочитать в
разделе «Данные и элементы управления» на странице 502



219
218
Создание отчетов
Использование основных объектов конфигурации


Теперь в нижней части формы разместим еще одну надпись с | РегистрНакопления.Продажи КАК Продажи
|
именем «Оформление» и заголовком «Оформление:», а под ним поле
|{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}
выбора с именем «ПолеВыбораОформление»: |
|ИТОГИ СУММА(Количество),
| Сумма(Выручка),
| Сумма(Стоимость)
| ПО ОБЩИЕ";


Как видите это совсем простой запрос по регистру накопления
«Продажи», в котором расположены управляющие конструкции для
построителя отчета.
Конструкция ВЫБРАТЬ позволяет предоставить пользователю
возможность выбирать в качестве полей запроса как сами исходные
поля запроса, так и все поля «через точку» от данных полей.
Конструкция УПОРЯДОЧИТЬ ПО предоставляет пользователю
возможность упорядочивать строки результата запроса.
Теперь, для того, чтобы привести состав полей в «исходное»
состояние, добавим команду очистки выбранных полей построителя
отчета, и затем в обработчик «КнопкаСформироватьНажатие» вставим
Теперь откроем модуль формы и добавим в него текст запроса для команды выполнения построителя отчета:
построителя отчета:
ПроцедураКнопкаСформироватьНажатие(Элемент)
ПроцедураКнопкаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =
ПолучитьМакетОформления(ПолеВыбораОформление);
КонецПроцедуры
ПостронтельОтчета.Выполнить();
ПостроительОтчета.Вывести();
ПостроительОтчета.Текст =
КонецПроцедуры
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
ПостроительОтчета.Текст =
| Продажн.Клиент КАК Клиеит,
"ВЫБРАТЬ
| Продажи.Мастер КАК Мастер,
| Продажи.Номенклатура КАК Номенклатура,
| Продажи.Количество КАК Количества,
| Продажи.Клиент КАК Клиент,
| Продажи.Выручка КАК Выручка,
| Продажи.Мастер КАК Мастер,
| Продажи.Стоимость КАК Стоимость
| Продажи.Количество КАК Количество,
| Продажи.Выручка КАК Выручка,
|{ВЫБРАТЬ
| Продажи.Стоимость КАК Стоимость
| Номенклатура.*,
|{ВЫБРАТЬ
| Клиент.*,
| Номенклатура.*,
| Мастер.*,
| Клиент.*,
| Количество.*,
| Мастер.*,
| Выручка.*,
| Количество.*,
| Стоимость.*}
| Выручка.*,
|ИЗ


221
220
Создание отчетов
Использование основных объектов конфигурации

| Продажи.Мастер КАК Мастер,
I Стоимость.*}
| Продажи.Количество КАК Количество,
1ИЗ
| Продажи.Выручка КАК Выручка,
I РегистрНакопления.Продажи КАК Продажи | Продажи.Стоимость КАК Стоимость
I !{ВЫБРАТЬ
!{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*} | Номенклатура.*,
I | Клиент.*,
1ИТОГИ СУММА(Количество), | Мастер.*,
I Сумма(Выручка), I Количество.*,
I Сумма(Стоимость) I Выручка.*,
I ПО ОБЩИЕ"; | Стоимость.*}
| ИЗ
ПостроительОтчета.ВыбранныеПоля.Очистить(): I РегистрНакопления.Продажи КАК Продажи
I
Если построителю отчета не указывать объект, в который |{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}
I
необходимо выводить результат, то результат будет выведен в новый
ИТОГИ СУММА(Количество),
табличный документ. Построитель отчета имеет возможность I Сумма(Выручка),
оформить макет результата, используя варианты стандартного I Сумма(Стоимость)
оформления макетов. Для этого мы в начале процедуры получаем I ПООБЩИЕ";
стандартный макет оформления, используя значение, которое будет
ПостроительОтчета.ВыбранныеПоля.Очистить();
выбрано пользователем в поле выбора, а затем на основе этого макета
оформляем макет, созданный построителем отчета по умолчанию. СписокВыбора = ЭлементыФормы.ПолеВыбораОформление.СписокВыбора;
Здесь следует сказать о том, что построитель отчета предоставляет
СписокВыбора.Добавить(СтандартноеОформление.БезОформления,
возможность полностью формировать макет будущего отчета, как
"БезОформления");
задавая его целиком (свойство «Макет»), так и путем описания СписокВыбора.Добавить(СтандартноеОформление.Апельсин, "Апельсин");
отдельных областей макета (свойства «МакетДетальныхЗаписей», СпнсокВыбора.Добавить(СтандартноеОформление.Асфальт, "Асфальт");
«МакетЗаголовка» и т.д.). СписокВыбора.Добавить(СтандартноеОформление.Бирюза, "Бирюза");
СписокВыбора.Добавить(СтандаргноеОформление.Текстиль, "Текстиль");
Теперь, для завершения нашего универсального отчета следует
заполнить список выбора поля выбора «ПолеВыбораОформление» и ПолеВыбораОформление = СтаидартноеОформление.БезОформлевия;
установить начальное значение поля:
Запустим 1С:Предприятие в режиме отладки и откроем отчет
«Универсальный2».
ПроцедураКношсаСформироватьНажатие(Элемент)
ПостроительОтчета.МакетОформления = Выберем поля: «Мастер», «Номенклатура.ВидНоменклатуры»,
ПолучитьМакетОформления(ПолеВыбораОформление); «Номенклатура» и «Выручка». Зададим следующий порядок
Построительотчета.ОформитьМакет();
сортировки:
ПостроительОтчета.Вышшшть();
• «Мастер» по возрастанию,
ПостроительОтчета.Вывести();
КонецПроцедуры • «Номенклатура.ВидНоменклатуры» по убыванию,
• «Номенклатура» по возрастанию.
ПостроитедьОтчета.Текст =
"ВЫБРАТЬ
I Продажи.Номенклатура КАК Номенклатура,
I Продажи.Клиент КАК Клиент, _______________________________________________



222 223
Использование основных объектов конфигурации Создание отчетов

Выберем оформление «Апельсин» и нажмем «Сформировать»
Использование построителя отчета в
Результат будет выглядеть следующим образом:




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

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


П осмотрим, как будет выглядеть отчет «Универсальный2»,
если, при создании его в конструкторе выходной формы,
указать использование построителя отчета.
Создадим новый объект конфигурации Отчет с
Теперь изменим условия формирования отчета. Выберем поля именем «УниверсальныйЗ». Запустим конструктор выходной
«Клиент», «Номенклатура» и «Выручка», порядок сортировки будет формы, и выберем все поля из виртуальной таблицы регистра
по возрастанию значения поля «Клиент», а вариант оформления - накопления «Продажи.Обороты».
«Асфальт»: На закладке «Итоги» отметим получение общих итогов и перейдем
на закладку «Отчет»:




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


224 225
Использование основных объектов конфигурации Создание отчето!

представления (например, для табличного документа - размещение Запустим 1С:Предприятие в режиме отладки, откроем отчет
группировок, реквизитов, итогов, наличие группировок и т.д.). «УниверсальныйЗ», нажмем кнопку «Настройка...» и установим
В нашем случае согласимся с параметрами, которые конструктор параметры выбранных полей и порядка такими же, как в последнем
примере с отчетом «Универсальный2»:
предложил по умолчанию, единственное, что мы изменим - вариант
стандартного оформления установим «Асфальт».
• выбранные поля: «Клиент», «Номенклатура»
Перейдем на закладку «Выходная форма» и откроем закладку:
«ВыручкаОборот»,
«Форма настройки построителя отчета»: • порядок: «Клиент» по возрастанию:




Дело в том, что кроме самой формы отчета, на которой будет
расположено представление данных, конструктор формирует сразу же
Как вы видите, мы получили тот же самый результат, однако
форму настройки отчета, позволяющую пользователю интерактивно
достигнуть его оказалось гораздо легче; кроме этого, в отчете
настраивать параметры отчета. В конструкторе мы имеем возможность
появилась дополнительная функциональность - возможность
выбрать, какие из параметров настройки будут доступны
установки отбора и изменения состава выбранных полей и порядка
пользователю и, кроме того, определить, на какой из форм будет вывода результатов.
расположена настройка отбора: либо в форме настроек отчета, либо
прямо на самой форме отчета. Отчет ВыручкаМастеров2


T
В нашем случае мы снова согласимся с тем, что конструктор
еперь, мы создадим отчет, аналогичный
предлагает по умолчанию, и нажмем «ОК».
отчету
Конструктор сформирует форму отчета и форму настроек отчета. «ВыручкаМастеров», который будет выводить результат в
сводную диаграмму.
Откроем конфигуратор и создадим новый объект


226 227
Создание отчетов
Использование основных объектов конфигурации

Теперь зададим условие отбора таким, что значение поля
конфигурации Отчет с именем «ВыручкаМастеров2». Запустим
«Номенклатура.ВидНоменклатуры» должно быть равно «Материал»
конструктор выходной формы, и выберем поля «Мастер», «Клиент»,
(для ввода условия отбора можно использовать клавишу «Insert»). И в
«ВыручкаОборот» и «СтоимостьОборот» из виртуальной таблицы
заключение, после того как диаграмма будет заново сформирована,
регистра накопления «Продажи». На закладке «Итоги» укажем
раскроем группу серий «ВыручкаОборот»:
группировочные поля «Мастер» и «Клиент» и суммируемые поля
«ВыручкаОборот» и «СтоимостьОборот». В заключение на закладке
«Отчет» отметим, что результат должен быть выведен только в
сводную диаграмму. Нажмем «ОК».
Запустим 1С:Предприятие в режиме отладки и откроем отчет
«ВыручкаМастеров2». На закладке «Настройка» укажем, что порядок
вывода должен быть по убыванию значения поля «ВыручкаОборот».
После этого двойным щелчком мыши по полю сводной диаграммы
откроем окно выбора параметров диаграммы и в точки диаграммы
поместим поле «Мастер», в серии - поле «Клиент», а поля
«ВыручкаОборот» и «СтоимостьОборот» поместим в данные:




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




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


Особенности использования ссылочных
Глава 6. Оптимизация процедуры
данных
проведения документа ОказаниеУслуги

Т ермином «ссылочные данные» мы будем обозначать данные,
После изучения предыдущей главы вы уже достаточно хорошо
хранящиеся в базе данных, доступ к которым возможен при
знакомы с языком запросов, и мы наконец-то можем приступить к
помощи объектов встроенного языка вида Ссылка:
одной из самых важных глав нашей книги - к оптимизации документа
СправочникСсылка^имя>, ДокументСсылка.<имя> и т.д. Для
«ОказаниеУслуги», и в частности, к полному изменению его
того чтобы дальнейшее изложение было более понятным, мы
обработчика события «ОбработкаПроведения».
построим объяснение на примере получения ссылки на вид
«Зачем это нужно?» - можете спросить вы. Тому есть две причины. Во-
номенклатуры при проведении документа «ОказаниеУслуги».
первых, руководство OOO «На все руки мастер» решило,
Не все данные, хранящиеся в базе данных, являются ссылочными.
наконец-то, завершить «эксперименты» по вводу стоимости Это связано с тем, что в модели данных 1С:Предприятия 8.0
расходуемых материалов руками и перейти на автоматический расчет существует деление на данные, представляющие объектные сущности
стоимости расходуемых материалов «по среднему». (справочники, планы счетов, документы и т.д.), и данные,
представляющие необъектные сущности (регистры сведений,
Во-вторых, в обработчике события «Обработка проведения» мы
регистры накопления и т.д.).
используем обращение к реквизиту «ВидНоменклатуры» справочника
«Номенклатура» «через точку». Такое обращение может сильно С точки зрения системы, некоторая совокупность объектных
замедлить скорость выполнения процедуры при больших объемах данных определяется не только значениями своих полей, но и самим
фактом своего существования. Другими словами, удалив из базы
табличной части документа.
некоторую совокупность объектных данных, мы не сможем вернуть
Поэтому, изменения, вносимые нами в документ
систему в то же состояние, которое было до удаления. Даже если мы
«ОказаниеУслуги», будут преследовать две цели:
заново создадим ту же самую совокупность объектных данных с теми
• определение стоимости расходуемых материалов при же самыми значениями полей, с точки зрения системы это будет
ДРУГАЯ совокупность объектных данных. Каждую такую
проведении документа,
совокупность объектных данных, уникальную с точки зрения системы,
• повышение скорости выполнения процедуры.
называют объектом базы данных. Для того чтобы система могла
Прежде, чем мы приступим непосредственно к каким-либо
отличить один объект базы данных от другого, каждый объект базы
действиям, следует сказать несколько слов об особенностях хранения
данных (совокупность объектных данных) имеет внутренний
и использования ссылочных данных в системе 1С:Предприятие 8.0.
идентификатор. Различные объекты базы данных всегда будут иметь
различные внутренние идентификаторы. Этот идентификатор хранится
вместе с остальными данными объекта в специальном поле «Ссылка».
Необъектные данные хранятся в виде записей, и с точки зрения
системы определяются исключительно значениями своих полей.
Таким образом, удалив некоторую запись и записав после этого новую,
с
точно такими же значениями всех полей, мы получим то же самое
состояние базы данных, которое было до удаления.
Таким образом, поскольку мы можем однозначно указать на
каждый объект базы данных, у нас появляется возможность хранить
232
233
Оптимизация процедуры проведения документа ОказаниеУ сл\
Исполь зование основных объектов конфигурации

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




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


Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры о
Когда в обработчике события «ОбработкаПроведения» документа ________________________
«ОказаниеУслуги» мы присваиваем з^начение реквизита ________________________
________________________
«Номенклатура» табличной части какой-либо переменной, мы имеем Перечисления.ВидыНоменклатуры.Материал
Toгда
дело с объектом ДокументОбъект.ОказаниеУслуги. Этот объект
содержит в себе значения всех реквизитов документа и реквизитов его
табличных частей. Поэтому обращение:

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




235
234
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации

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

*¦ Узнай больше!
Более подробно об устройстве кэша объектов можно прочитать
в главе «Кэш объектов» на странице 554.

Из всего вышесказанного можно сделать следующий вывод: если
алгоритм проведения документа использует только те данные, которые
присутствуют в реквизитах документа (и его табличных частей),
вполне достаточно использовать конструктор движений документа
(как это было у нас в случае с документом «ПриходнаяНакладная»).
Если же в алгоритме проведения требуется анализировать
дополнительные реквизиты объектов, ссылки на которые содержатся в
документе, а также использовать результаты расчета итогов регистров,
- следует использовать запросы для более быстрой выборки данных из
базы данных.
To же самое справедливо в отношении выполнения любых
участков программы, критичных по производительности. Механизм
запросов лучше «читает» информационную базу и может за один раз
выбрать все необходимые данные, поэтому, например, в типовых
Поскольку в объекте ДокументОбъект.ОказаниеУслуги есть
решениях вы практически не увидите использования объекта
только ссылка на элемент справочника «Номенклатура» и больше СправочникВыборка^имя>.
никаких данных об этом элементе нет, система возьмет эту ссылку и
обратится по ней в кэш объектов, в надежде найти там данные того
объекта, ссылка на который у нее есть. Если кэш объектов не будет
иметь нужных данных, он обратится к базе данных с тем, чтобы
прочитать все данные объекта, ссылкой на который он обладает. После
того, как все данные, хранящиеся в реквизитах нужного элемента
справочника и в реквизитах его табличных частей, будут считаны в
кэш объектов, кэш объектов вернет запрашиваемую ссылку,
хранящуюся в реквизите «ВидНоменклатуры» справочника
«Номенклатура».



237
236
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации


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


П
понадобится нам для анализа того, чем является номенклатура,
ервое, что мы сделаем для оптимизации документа
указанная в документе: материалом или услугой:
«ОказаниеУслуги» - удалим реквизит табличной части
«Стоимость», который нам не понадобится в будущем.
Также следует удалить соответствующую колонку из
табличного поля, расположенного в форме.
После этого можно полностью удалить содержимое обработчика
события «ОбработкаПроведения» в модуле документа и создать в нем
заготовку процедуры проведения. Текст запроса, выполняемого в
Теперь задумаемся о том, что для указания значений ресурса
режиме оперативного проведения, будет отличаться от запроса,
«Стоимость» регистров «СтоимостьМатериалов» и «Продажи» нам
выполняемого при неоперативном проведении, поэтому формирование
понадобится рассчитать текущую стоимость номенклатуры как
текста запроса мы включим в условие Если ... Иначе ... КонецЕсли:
частное стоимости остатка этого материала и его оставшегося
количества.
Процедура ОбработкаПроведения(Отказ, Режим)
Поэтому добавим к списку выбранных таблиц еще две таблицы:
Запрос = Новый Запрос;
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос.Текст = • «РегистрНакопления.СтоимостьМатериалов.Остатки»,
• «РегистрНакопления.ОстаткиМатериалов.Остатки»:
Иначе Запрос.Текст
=

КонецЕсли;
КонедПроцедуры

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




239
238
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации


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

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



f Узнай больше!
Следует внимательно подходить к использованию виртуальных
таблиц запросов. В частности, необходимо уделять особое внимание
максимально возможному использованию параметров этих таблиц.
Например, в нашем случае можно было бы и не использовать
параметр «Условие», а ограничить выбранные поля уже в самом
Теперь вспомним о том, что документы «ОказаниеУслуги» могут
запросе, указав вусловии ПОравенство номенклатуры из документа и
быть проведены как в оперативном, так и в неоперативном режиме.
материала из таблицы остатков. В результате мы получили бы тот
же самый результат, однако no производительности этот способ
*" Узнай больше!
сильно отличался бы от того, который мы используем.
О концепции оперативного и неоперативного проведения
В самом деле, в нашем варианте виртуальная таблица
документов можно прочитать в главе «Концепция оперативного и
предоставит нам ровно столько записей, сколько различных
неоперативного проведения документов» на странице 541.
элементов номенклатуры содержится в проводимом документе. Если
же не указывать условие, виртуальная таблица предоставит нам
записи no абсолютно всем элементам номенклатуры, информация о Поскольку в оперативном режиме нам понадобится контролировать
которых есть в регистре накопления. И уже в самом нашем запросе остатки списываемой номенклатуры на складе, выберем еще раз
мы будем отбирать из этой огромной массы записей лишь несколько, виртуальную таблицу регистра накопления «ОстаткиМатериалов» и
которые нам действительно нужны. переименуем ее в «ОстаткиМатериаловОстаткиНаСкладе»:
Очевидно, что второй вариант будет работать дольше, и время
выполнения такого запроса будет зависеть в основном не от
количества данных, содержащихся в документе (т.е. реального
количества обрабатываемой информации), а от размера регистра
накопления.




241
240
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации


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

<*- Узнай больше!
Более подробно об использовании предложения ДЛЯИЗМЕНЕНИЯ
можно прочесть на диске ИТС (информационно-технологического
с о п р о во ж де н и я ) в с т а т ь е « И с п о л ь з о ва н и е п р е дл о же н и я
ДЛЯ ИЗМЕНЕНИЯ в языке запросов».
Теперь из этой виртуальной таблицы мы выберем поле
«КоличествоОстаток»:
Поскольку мы с вами планируем выполнить запись регистров
накопления «ОстаткиМатериалов» и «СтоимостьМатериалов», укажем
таблицы этих регистров в качестве таблиц для изменения:




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




243
242
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

Перейдем на закладку «Псевдонимы» и зададим следующИе | ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
псевдонимы полей:
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.ОстаткиМатериалов.Остатки, |
• «НоменклатураВидНоменклатуры» - «ВидНоменклатуры»,
РегистрНакопления.СтоимостьМатериалов.Остатки"; Иначе
• «КличествоОстатокЬ> - «КоличествоНаСкладе». Запрос.Текст =
Нажмем «ОК» и посмотрим, какой текст запроса сформировал КонецПроцедуры
конструктор:

Как видите, в запросе нет ничего сложного за исключением, быть
Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый
Запрос; Если Режим = РежимПроведенияДокумента.Оперативный может, трех левых соединений с таблицей табличной части документа
Тогда
и использования ключевого предложения ДЛЯ ИЗМЕНЕНИЯ,
Запрос.Текст =
значение которого было объяснено выше.
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
Текст запроса для случая неоперативного проведения документа
| ОказаниеУслугиПереченьНоменклатуры.Количество,
будет практически таким же, за исключением того, что в нем будет
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры
отсутствовать третье левое соединение и, соответственно, поле
| КАК ВидНоменклатуры.
«КоличествоОстатокНаСкладе», т.к. проверку остатков в этом случае
I ОказаниеУслугиПереченьНоменклатуры.Сумма,
I ОстаткиМатериаловОстатки.КоличествоОстаток, мы выполнять не будем:
I СтоимостьМатериаловОстатки.СтоимостьОстаток,
I ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток
I КАК КоличествоОстатокНаСкладе
«ИЗ Иначе
I Документ.ОказаниеУслуги.ПереченьНоменклатуры Запрос.Текст =
1 КАК ОказаниеУслугиПереченьНоменклатуры "ВЫБРАТЬ
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура, |
I &МоментВремени,
ОказаниеУслугиПереченьНоменклатуры.Количеотво, |
I Материал В (&СписокНоменклатурыДокумента))
ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры |
I КАК СтоимостьМатериаловОстатки
КАК ВидНоменклатуры, | ОказаниеУслугиПереченьНоменклатуры.Сумма, |
1 ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
ОстаткиМатериаловОстатки.КоличествоОстаток, |
t СтоимостъМатериаловОстатки.Материал
СтоимостьМатериаловОстатки.СтоимостьОстаток |ИЗ
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
| Документ.ОказаниеУслуги.ПереченьНоменклатуры | КАК
1 &МоментВремени,
ОказаниеУслугиПереченьНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ
I Материал В (&СписокНоменклатурыДокумента))
РегистрНакопления.СтоимостьМатериалов.Остатки(
I КАК ОстаткиМатериаловОстатки
&МоментВремени,
I ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
Материал В (&СписокНоменклатурыДокумента))
I ОстаткиМатериаловОстатки.Материал
I КАК СтоимостьМатериаловОстатки
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
I ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
I &МоментВремени,
I СтоимостьМатериаловОстатки .Материал
I Материал В (&СписокНоменклатурыДокумента) И
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
I Склад = &СкладВДокументе)
I &МоментВремени,
I КАК ОстаткиМатериаловОстаткиНаСкладе
Материал В (&СписокНоменклатурыДокумента))
I ПО ОказаниеУслутиПереченьНоменклатуры.Номенклатура =
I КАК ОстаткиМатериаловОстатки I ПО
I ОстаткиМатериаловОстаткиНаСкладе.Материал
ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
1ГДЕ __



244 245
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги


| ОстаткиМатериаловОстатки.Материал После этого добавим получение результата запроса и цикл его
|
обхода:
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка |
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.ОстаткиМатериалов.Остатки, |
КонецЕсли;
РегистрНакопления.СтоимостьМатериалов.Остатки";
Запрос.УстановитьПараметрС'МоментВремени", МоментВремени());
КонецПроцедуры
Запрос.УстановитьПараметрС'СписокНоменклатурыДокумента",
ПереченъНоменклатуры.ВыгрузитьКолонку(" Номенклатура"));
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Теперь добавим в текст обработчика задание параметров запроса:
ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
Заирос.УстановитъПараметр("СкладВДокументе",Склад);
Иначе
КонецЦикла;
Запрос.Текст =
КонецПроцедуры ____________________________________________________________
"ВЫБРАТЪ

| РегистрНакопления.ОстаткиМатериалов.Остатки";
Теперь, прежде чем начать формирование движений по регистрам,
КонецЕсли;
нам нужно проверить наличие на складе достаточного количества
Запрос.УстановитьПараметрС'МоментВремени", МоментВремени());
номенклатуры:
Запрос.УстановитьПараметрО'СписокНоменклатурыДокумента",
ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
Запрое.УстановитьПараметр("Ссылка",Ссылка);

КонецЕсли;
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Обратите внимание, что для формирования списка номенклатуры Запрос.УстановитьПараметр("СписокНоменклатурыДокумента",
документа мы используем метод ВыгрузитьКолонку() объекта ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура"));
Запрос.УстановитьПараметр("Ссылка",Ссылка);
ДокументТабличнаяЧасть.ОказаниеУслуги.ПереченьНоменклат
УРЫ. ВыборкаРезультатаЗапроса =

Запрос.Выполнить().Выбрать(); Пока

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

//Проверить остаток при оперативном проведении -Если Режим =
РежимПроведенияДокумента.Оперативный Тогда Если
ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
Остаток = ?(Вы6оркаРезультатаЗапроса.КоличествоОстатокНаСкладе = NuH,
0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Если
Остаток < ВыборкаРезультатаЗапроса.Количество Тогда
Сообщить("Материала " +
СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) +
" имеется только " + Остаток);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;



246 247
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
КонедЕсли;
Движение.Период = Дата;
КонецЦикла;
Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
КонецПроцедуры
//расчитать стоимость материала
СтоимостьМатериала =
И в заключение добавим формирование движений по регистрам ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,
ВыборкаРезультатаЗапроса.СтоимостьОстаток /
накопления:
ВыборкаРезультатаЗапроса.КоличествоОстаток); Движение.Стоимость =
СтоимостьМатериала *
ВыборкаРезультатаЗапроса.Количество;
КонецЕсли;
КонецЕсли;
Запрос.УстановитьПараметр(" МоментВремени", МоментВремени());
// регистр Продажи
Запрос.УстановитьПараметр(" СписокНоменклатурыДокумента",
Движение = Движения.Продажи.Добавить();
ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура"));
Движение.Период = Дата;
Запрос.УстановнтьПараметр(" Ссылка" ,Ссылка);
Движение.Номенклатура = ВыборкаРезультатаЗанроса.Номенклатура;
Движение.Клиент = Клиент;
ВыборкаРезультатаЗапроса = Запрос.Вьшолнить().Выбрать();
Движение.Мастер = Мастер;
Движение.Количество = ВыборкаРезультатаЗапроса.Количество;
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма;
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =
//Провернть остаток при оперативном проведении Если Режим —
Перечисления.ВидыНоменклатуры.Материал Тогда
РежимПроведенияДокумента.Оперативный Тогда Если
Движение.Стоимость = СтоимостьМатериала *
ВыборкаРезультатаЗапроса.ВидНоменклатуры =
ВыборкаРезультатаЗапроса.Количество;
Перечисления.ВидыНоменклатуры.МатериалТогда
Иначе
Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null,
Движение.Стоимость = 0;
0, ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);
КонецЕсли; КонецЦикла;
Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда
Сообщить("Материала" +
// записать движения регистров
СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только
Движения.ОстаткиМатериалов.Записать();
" + Остаток); Отказ = Истина; Возврат; КонецЕсли; КонецЕсли;
Движения.СтоимостьМатериалов.Записан,();
КонецЕсли;
Движения.Продажи.Записать();
КонецПроцедуры
//Сформировать движения
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
Запустим 1С:Предприятие в режиме отладки и проверим работу
// регистр ОстаткиМатериалов Расход
нового обработчика события «ОбработкаПроведения», перепроведя
Движение = Движения.ОстаткиМатериалов.Добавить();
все документы «ОказаниеУслуги».
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
В заключение следует сделать небольшое отступление, которое
Движение.Материал = ВыборкаРезулыатаЗапроса.Ноченклатура;
касается задания параметров виртуальных таблиц, использовавшихся в
Движение.Склад = Склад;
наших запросах.
Движение.Количество = ВыборкаРезультатаЗапроса.Количество;

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



249
248
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги


Как в первом, так и во втором запросах мы использовали условие
Что нового мы узнали
что материал должен находиться в списке значений, задаваемом одним
из параметров запроса:


| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( - как система 1С:Предприятие выполняет обращение к
| &МоментВремени,
ссылочным данным - как используется кэш объектов -
Материал В (&СписокНоменклатурыДокумента))

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




250 251
План видов характеристик



Постановка задачи
Глава 7. План видов характеристик

З
адача, которую мы перед собой поставим, будет заключаться в
В этой главе мы познакомимся с новым объектом конфигурации - следующем: мы создадим механизм, который позволит
План видов характеристик - и узнаем, каким образом можно пользователю произвольным образом описывать материалы, и,
использовать этот объект для расширения возможностей нашей что самое главное, вести учет в разрезе всех тех описаний, которые
конфигурации. могут быть заданы пользователем.
Описывать материалы пользователь сможет следующим образом:
для каждого материала будет возможность создать некоторые
(произвольные) характеристики этого материала (например, цвет,
производитель и пр.). Затем, при поступлении материалов можно
будет задать конкретные значения интересующих характеристик
(например, при поступлении электрических кабелей можно будет
указать, что они белого цвета и их сечение равно 2,5 мм2, а при
поступлении резиновых шлангов указать, что они черного цвета и
произведены на фирме «Fagumit Sp. z о.о.»).
В дальнейшем всегда можно будет получить информацию о том,
сколько и каких материалов есть у нас, скажем, белого цвета, или
сколько было израсходовано черных резиновых шлангов.
Поскольку заранее не известно, какими именно характеристиками
пользователь захочет описать тот или иной материал, мы должны
предоставить ему некоторый механизм, позволяющий создавать
любые характеристики и, что самое важное, указывать, какой тип
значения должен быть у этих характеристик. Тогда при задании
значений определенной характеристики пользователь сможет
выбирать значения строго в соответствии с указанным типом.
Такую возможность описания характеристик как раз и
обеспечивает объект конфигурации План видов характеристик, с
которым мы сейчас познакомимся.




253
252
План видов характеристик
Использование основных объектов конфигурации

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


О
бъект конфигурации План видов характеристик является
прикладным объектом и предназначен для описания %Для тех, ктоработал с версией 7.7.
структуры хранения информации о характеристиках, В версии 7.7 нет прямого соответствия прикладному объекту
создаваемых пользователем. На основе объекта конфигурации план видов характеристик. Точнее всего будет сказать,
конфигурации План видов характеристик платформа создает в базе что один план видов характеристик включает в себя me
данных информационную структуру, в которой может храниться функциональные возможности, которыми в версии 7.7 обладали все
информация о том, какие существуют виды характеристик и какой тип объекты конфигурации вида «Вид субконто». Таким образом, в
должно иметь значение характеристики каждого вида. терминах 7.7, планы видов характеристик позволяют создавать
несколько «наборов» объектов «Вид субконто».
В сущности, план видов характеристик очень напоминает
Однако описание механизма ведения аналитического учета на
справочник. Однако план видов характеристик имеет более узкую
счетах не является теперь основной задачей для плана видов
«специализацию»: он хранит, по сути, информацию только о том,
характеристик. Использование подобного механизма было обобщено в
какими видами характеристик может описываться какой-либо объект
виде возможности задания переменного количества свойств, которые
базы данных. Эта информация состоит из названия вида
могут описывать объект конфигурации. Причем возможность
характеристики и ее типа. Разработчик и, что самое важное,
задания свойств существует как в режиме Конфигуратора, так и в
пользователь могут задать в нем любое необходимое им количество
режимеработы пользователя «1С:Предприятие».
видов характеристик.
Работа с планом счетов рассматривается теперь не как основное
Для того чтобы разработчик мог задать некий «набор» возможных
предназначение плана видов характеристик, а как частный случай,
типов значений, которые могут принимать виды характеристик, у
вытекающий из его возможностей. Конечно, как мы увидим далее,
объекта конфигурации План видов характеристик существует свойство
взаимодействие плана видов характеристик с планом счетов
Тип значения характеристик. Это свойство определяет составной тип
максимально автоматизировано средствами платформы (no
данных, в который входят все типы, которые могут понадобиться при
сравнению с взаимодействием с другими объектами конфигурации).
указании типа значения характеристики.
Однако основной акцент делается на универсальность механизма,
Кроме этого может случиться так, что пользователю станет
предоставляемого планом видов характеристик. В частности это
недостаточно тех типов данных, которые существуют в конкретной
видно и из названия объекта, где вместо слова субконто (разрез
системе (например, он захочет вести учет в разрезе цвета товаров, а
аналитического учета) теперь используется слово характеристика,
справочник Цвет в конфигурации отсутствует). В этом случае он
обозначающее свойство объекта конфигурации, описанное вне его
сможет воспользоваться неким вспомогательным справочником,
самого (в другом объекте конфигурации).

<<

стр. 4
(всего 11)

СОДЕРЖАНИЕ

>>