Сформировать движения

ИЗ


ПроцедураКнопкаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =

ПолучитьМакетОформления(ПолеВыбораОформление);

ПостронтельОтчета.Выполнить(); ПостроительОтчета.Вывести();

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

ПостроительОтчета.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

| Продажи.Клиент КАК Клиент,

| Продажи.Мастер КАК Мастер,

| Продажи.Количество КАК Количество,

| Продажи.Выручка КАК Выручка,

| Продажи.Стоимость КАК Стоимость

|{ВЫБРАТЬ

| Номенклатура.*,

| Клиент.*,

| Мастер.*,

| Количество.*,

| Выручка.*,


 


220



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


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


 


I Стоимость.*}

1ИЗ

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

I

!{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}

I

1ИТОГИ СУММА(Количество),

I Сумма(Выручка),

I Сумма(Стоимость)

I ПО ОБЩИЕ";

ПостроительОтчета.ВыбранныеПоля.Очистить():

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

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

Теперь, для завершения нашего универсального отчета следует заполнить список выбора поля выбора «ПолеВыбораОформление» и установить начальное значение поля:


| Продажи.Мастер КАК Мастер,

| Продажи.Количество КАК Количество,

| Продажи.Выручка КАК Выручка,

| Продажи.Стоимость КАК Стоимость

!{ВЫБРАТЬ

| Номенклатура.*,

| Клиент.*,

| Мастер.*,

I Количество.*,

I Выручка.*,

| Стоимость.*}

| ИЗ

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

I

|{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}

I

ИТОГИ СУММА(Количество),

I Сумма(Выручка),

I Сумма(Стоимость)

I ПООБЩИЕ";

ПостроительОтчета.ВыбранныеПоля.Очистить();

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

СписокВыбора.Добавить(СтандартноеОформление.БезОформления,

"БезОформления");

СписокВыбора.Добавить(СтандартноеОформление.Апельсин, "Апельсин"); СпнсокВыбора.Добавить(СтандартноеОформление.Асфальт, "Асфальт"); СписокВыбора.Добавить(СтандартноеОформление.Бирюза, "Бирюза");СписокВыбора.Добавить(СтандаргноеОформление.Текстиль, "Текстиль");

ПолеВыбораОформление = СтаидартноеОформление.БезОформлевия;


 


ПроцедураКношсаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =

ПолучитьМакетОформления(ПолеВыбораОформление);

Построительотчета.ОформитьМакет();

ПостроительОтчета.Вышшшть(); ПостроительОтчета.Вывести(); КонецПроцедуры

ПостроитедьОтчета.Текст =

"ВЫБРАТЬ

I Продажи.Номенклатура КАК Номенклатура,

I Продажи.Клиент КАК Клиент,________________________________________


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

Выберем поля: «Мастер», «Номенклатура.ВидНоменклатуры», «Номенклатура» и «Выручка». Зададим следующий порядок сортировки:

• «Мастер» по возрастанию,

• «Номенклатура.ВидНоменклатуры» по убыванию,

• «Номенклатура» по возрастанию.


 




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


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


 


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

Теперь изменим условия формирования отчета. Выберем поля «Клиент», «Номенклатура» и «Выручка», порядок сортировки будет по возрастанию значения поля «Клиент», а вариант оформления -«Асфальт»:


Использование построителя отчета в конструкторе выходной формы

в

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

формы.

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

П

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

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

На закладке «Итоги» отметим получение общих итогов и перейдем на закладку «Отчет»:


 


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


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


 


224



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


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


 


представления (например, для табличного документа - размещение группировок, реквизитов, итогов, наличие группировок и т.д.).

В нашем случае согласимся с параметрами, которые конструктор предложил по умолчанию, единственное, что мы изменим - вариант стандартного оформления установим «Асфальт».

Перейдем на закладку «Выходная форма» и откроем закладку: «Форма настройки построителя отчета»:


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

• выбранные поля: «Клиент», «Номенклатура»
«ВыручкаОборот»,

• порядок: «Клиент» по возрастанию:


 


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

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

Конструктор сформирует форму отчета и форму настроек отчета.


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

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

T

еперь, мы создадим отчет, аналогичный отчету

«ВыручкаМастеров», который будет выводить результат в сводную диаграмму.

Откроем конфигуратор и создадим новый объект


 


226



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


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


 


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

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


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

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

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


 


228



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

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

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

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

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

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

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

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


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

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

Т

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

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

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

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

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


 


232



Исполь


зование основных объектов конфигурации


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


сл\


 


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

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


приводит к тому, что мы просто читаем данные, хранящиеся в оперативной памяти:

Ссылка

Ссылка на Номенклатуру?

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


 


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


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

___________________________ Перечисления.ВидыНоменклатуры.Материал Toгда


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


234



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


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


 


произойдет буквально следующее:

Ссылка на ВидНоменклатуры?

Ссылка ©

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


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

*■ Узнай больше!

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

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

To же самое справедливо в отношении выполнения любых участков программы, критичных по производительности. Механизм запросов лучше «читает» информационную базу и может за один раз выбрать все необходимые данные, поэтому, например, в типовых решениях вы практически не увидите использования объекта СправочникВыборка^имя>.


 


236



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


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


 


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

П

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

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

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

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

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

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

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

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

Вызовем конструктор запроса и раскроем таблицу
«ПереченьНоменклатуры» табличной части документа

«ОказаниеУслуги» и выберем из нее поля:

• «Номенклатура»,

• «Количество»,

• «ВидНоменклатуры»,

• «Сумма».


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

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

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

• «РегистрНакопления.СтоимостьМатериалов.Остатки»,

• «РегистрНакопления.ОстаткиМатериалов.Остатки»:

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


 


238



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


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


 


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


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

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


 


f Узнай больше!

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

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

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


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

*" Узнай больше!

О концепции оперативного и неоперативного проведения документов можно прочитать в главе «Концепция оперативного и неоперативного проведения документов» на странице 541.

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


 


240



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

Для этой виртуальной таблицы мы также укажем тп

«МоментВремени», а в условии напишем, что материал должен находиться в списке номенклатуры и склад должен быть равен складу указанному в документе:

Теперь из этой виртуальной таблицы мы выберем поле «КоличествоОстаток»:

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


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

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

<*- Узнай больше!

Более подробно об использовании предложения ДЛЯИЗМЕНЕНИЯ можно прочесть на диске ИТС (информационно-технологического сопровождения) в статье «Использование предложения ДЛЯ ИЗМЕНЕНИЯ в языке запросов».

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



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




 


 


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 ОстаткиМатериаловОстаткиНаСкладе.Материал

1ГДЕ __


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

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

Иначе

Запрос.Текст = "ВЫБРАТЬ

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

| Документ.ОказаниеУслуги.ПереченьНоменклатуры | КАК ОказаниеУслугиПереченьНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(

&МоментВремени,

Материал В (&СписокНоменклатурыДокумента)) I КАК СтоимостьМатериаловОстатки

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

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

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


 


244



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


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


 


| ОстаткиМатериаловОстатки.Материал

|

|ГДЕ

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

|ДЛЯ ИЗМЕНЕНИЯ

| РегистрНакопления.ОстаткиМатериалов.Остатки, | РегистрНакопления.СтоимостьМатериалов.Остатки"; КонецПроцедуры

Теперь добавим в текст обработчика задание параметров запроса:

Заирос.УстановитъПараметр("СкладВДокументе",Склад);

Иначе

Запрос.Текст = "ВЫБРАТЪ

| РегистрНакопления.ОстаткиМатериалов.Остатки"; КонецЕсли;

Запрос.УстановитьПараметрС'МоментВремени", МоментВремени()); Запрос.УстановитьПараметрО'СписокНоменклатурыДокумента",

ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура")); Запрое.УстановитьПараметр("Ссылка",Ссылка);

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


После этого добавим получение результата запроса и цикл его обхода:

КонецЕсли;

Запрос.УстановитьПараметрС'МоментВремени", МоментВремени());

Запрос.УстановитьПараметрС'СписокНоменклатурыДокумента",

ПереченъНоменклатуры.ВыгрузитьКолонку(" Номенклатура")); Запрос.УстановитьПараметр("Ссылка",Ссылка);

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

КонецЦикла;

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

Теперь, прежде чем начать формирование движений по регистрам, нам нужно проверить наличие на складе достаточного количества номенклатуры:

КонецЕсли;

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

ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура")); Запрос.УстановитьПараметр("Ссылка",Ссылка);

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

//Проверить остаток при оперативном проведении -Если Режим = РежимПроведенияДокумента.Оперативный Тогда Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =

Перечисления.ВидыНоменклатуры.Материал Тогда Остаток = ?(Вы6оркаРезультатаЗапроса.КоличествоОстатокНаСкладе = NuH,

0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда Сообщить("Материала " +

СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) +
" имеется только " + Остаток);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;


 


246



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


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


 


КонедЕсли;

КонецЦикла; КонецПроцедуры

И в заключение добавим формирование движений по регистрам накопления:

КонецЕсли;

Запрос.УстановитьПараметр(" МоментВремени", МоментВремени());

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

ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура")); Запрос.УстановнтьПараметр(" Ссылка" ,Ссылка);

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

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

Перечисления.ВидыНоменклатуры.МатериалТогда Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null,

0, ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда Сообщить("Материала" +

СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только " + Остаток); Отказ = Истина; Возврат; КонецЕсли; КонецЕсли; КонецЕсли;

Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =

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