Смекни!
smekni.com

Описание функционирования организации (стр. 4 из 12)

Движения документа Акт об оказании услуг

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

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

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

3.5 Использование инструментария запросов

Как и любая СУБД, 1С:Предприятие (которая несомненно является таковой) поддерживает работу с хранимыми данными с использованием языка запросов (SQL). Запрос можно сформировать в любой процедуре (в любом модуле) как непосредственно на языке SQL, так и используя конструктор запросов[3]. Использование запросов позволяет осуществлять любые выборки, агрегирование данных, фильтры и т.д.

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

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

Возвращаемся к документу Акт об оказании услуг. Необходимо реализовать процедуру заполнения акта на основании договора (данная задача оговаривалась на стр. 7).

Постановка задачи:

· при заполнении акта, после выбора договора в шапке документа автоматически заполняются поля Контрагент, а также поля табличной части Спецификация Акта по услугам;

· при заполнении спецификации проверяется «остаток» по договору и в поле количество вносится не договорное, а «не выполненное» количество услуг;

· пользователь самостоятельно корректирует значение поля Количество. Если измененное пользователем значение превышает долг по договору, то выводится информационное сообщение.

Технология реализации заполнения спецификации акта по услугам:

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

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

Процедура ДоговорПриИзменении(Элемент)
Контрагент=Договор.Контрагент; Заполняем поле Контрагент
Запрос=Новый Запрос; Создаем объект запрос, присваиваем ему имя Запрос
Запрос.Текст= Вызываем метод текст для формирования текста запроса
Для формирования текста запроса вызываем конструктор запроса. Вызов осуществляется через контекстное меню, команда Конструктор запроса. Формирование запроса в режиме конструктора описано в комментариях после текста процедуры.
"ВЫБРАТЬ| ВыполнениеДоговораОстаткиИОбороты.Услуга.Ссылка КАК Услуга,| ВыполнениеДоговораОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоОстаток,| ВыполнениеДоговораОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаОстаток,| ВыполнениеДоговораОстаткиИОбороты.СуммаКонечныйОстаток / ВыполнениеДоговораОстаткиИОбороты.КоличествоКонечныйОстаток КАК ЦенаПоДоговору|ИЗ| РегистрНакопления.ВыполнениеДоговора.ОстаткиИОбороты КАК ВыполнениеДоговораОстаткиИОбороты|ГДЕ| ВыполнениеДоговораОстаткиИОбороты.Договор.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",Договор); Устанавливаем значение договора
ТаблЗнач=Запрос.Выполнить().Выгрузить(); Выполняем запрос, выгружаем в таблицу значений ТаблЗнач (см. комментарий 2 после текста процедуры).
Для каждого СтрокаТаблицыЗначений из ТаблЗнач Цикл Организуем цикл по перебору записей таблицы значений
НоваяСтрока=СпецификацияАктаПоУслугам.Добавить(); Добавить новую строку в спецификацию акта по услугам
НоваяСтрока.Услуга= СтрокаТаблицыЗначений.Услуга; НоваяСтрока.Цена= СтрокаТаблицыЗначений.ЦенаПоДоговору; НоваяСтрока.Количество= СтрокаТаблицыЗначений.КоличествоОстаток; НоваяСтрока.Сумма= СтрокаТаблицыЗначений.СуммаОстаток; НоваяСтрока.НДС=НоваяСтрока.Сумма*0.18;НоваяСтрока.СуммаСНдс=НоваяСтрока.НДС+НоваяСтрока.Сумма;КонецЦикла; Заполнить поля добавленной строки значениями соответствующих полей из обрабатываемой строки таблицы значений
ИтогоПоУслугам=СпецификацияАктаПоУслугам.Итог("СуммаСНдс");Итого=ИтогоПоУслугам; Пересчитать итоговые поля документа
КонецПроцедуры

Комментарии:

1. Формирование запроса в режиме конструктора

Вид конструктора запрос представлен на Рис. 2.

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

2. Из регистра выбираем поля: Услуга, КоличествоКонечныйОстаток, СуммаКонечныйОстаток.

3. Для расчета цены по договору немного схитрим и рассчитаем ее как частное от деления суммы и количества (1).

4. На вкладке Условия добавить ограничения по договору (выборка идет по конкретному договору). См. Рис. 3.

5. На вкладке Объединения/Псевдонимы задать имена результирующих полей (см. текст запроса выше).

6. Нажать ОК, просмотреть текст запроса в модуле формы. Продолжить разработку процедуры.

Рис. 2 Конструктор запроса

Рис. 3 Добавление условий запроса

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

Технология реализации задачи контроля при корректировке значения поля

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

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

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

Прикладная задача: расчет учетных цен (формирование записей регистра сведений УчетныеЦены)