Служебный объект «Запрос» Создание регламентного документа «Расчета»
Создадим процедуру автоматического заполнения табличной части документа «Амортизация» по записям текущего периода журнала расчетов. Выборку записей можно осуществить, используя служебный объект «Запрос».
Преимущество использования этого объекта заключается в том, что при выполнении запроса к информационной базе производится комплексная выборка данных и формируется таблица выборки в оперативной памяти, после чего программа может не обращаться к таблицам информационной базы, и работать непосредственно с таблицей выборки, что существенно в многопользовательском режиме работы информационной базы.
Служебный объект «Запрос», имеет свой собственный «язык запросов» для описания создаваемой таблицы выборки. Для создания таблицы выборки текст на языке запросов передается в параметр метода Выполнить(ТекстЗапроса) объекта типа Запрос.
186______________________ 1С:Предприятие. Практика программирования на платформе V7
Метод Выполнить(<ТекстЗапроса>) выполняет запрос и создает таблицу выборки по запросу. Возвращает: 1 - если запрос выполнен, 0 • иначе. <ТекстЗапроса> - строка с текстом запроса на языке генерации запросов.
Описание внутренних переменных запроса — полей таблицы выборки.
ИмяПеременной = ОписаниеПеременной[, ОписаниеПеременной...];
ОписаниеПеременной - указывает на конкретный реквизит документа, справочника, измерение или
ресурс регистра.
Можно указывать несколько вариантов ОписанияПеременной через запятую.
Дополнительные атрибуты внутренних переменных типа документ:
ТекущийДокумент- ссылка на текущий документ;
НомерДок - номер документа;
ДатаДок - дата документа;
НомерСтроки номер строки документа;
ВремяДок - время документа.
Дополнительные атрибуты внутренних переменных типа справочник:
ТекущийЭлемент ссылка на элемент справочника;
Код - код;
Наименование - наименование
Определение периода выборки.
[Период] С <Дата1>|<ВнешняяПеременная1> [По <Дата2>|Внешняя переменная2]; <Дата1>,<Дата2> - значение типа "Дата", "Документ" или позиция документа. <ВнешняяПеременная1>,<ВнешняяПеременная2> - внешняя переменная, задающая значение типа "Дата", "Документ" или позиция документа.
Если вторая часть оператора после ключевого слова По пропущена или значение второго параметра команды равно нулю, то интервал времени применяется от начального момента времени до ТА (или по РабочуюДату, если не установлена компонента "Оперативный учет"). Если в описании запроса команда Период С опущена, то интервал дат формирования запроса устанавливается в точку актуальности итогов. Для журнала расчетов конструкция Период С ... По... означает выборку в разрезе расчетных периодов журнала, а конструкция С ... По... означает выборку в разрезе времени действия записей журнала расчетов, определяемых реквизитами журнала "ДатаНачала" и "ДатаОкончания".
Установка фильтров по объектам.
Обрабатывать Все|ПомеченныеНаУдаление|НеПомеченныеНаУдаление;
XI. Основы построения объектов компоненты «Расчет»__________________________ 187
ОбрабатыватьДокументы Проведенные|Непроведенные|Все; ОбрабатыватьОперации Включенные|Выключенные|Все;
Вычисление функций и включение их результатов в таблицу выборки. Функции — это вычисляемые поля таблицы выборки. Списки вычисляемых функций различны для различных типов параметров функций.
Функция <Имяфункции> = <Типфункции>(<Параметр>|<УточненныйПараметр>)
[Когда (<Условие>)];
<ИмяФункции> - имя, присваиваемое функции;
<Типфункции> - ключевое слово одной из встроенных функций языка;
<Параметр> - имя внутренней переменной, параметр вызова функции;
<УточненныйПараметр> - конкретизация внутренней переменной, параметр вызова функции.
<Условие> - условие вычисления функции (необязательно).
Типы встроенных функций:
Сумма - сумма значений параметра;
Среднее - среднее значений параметра;
Минимум - минимальное значение параметра,
Максимум - максимальное значение параметра;
НачОст - начальный остаток значений параметра-ресурса Регистра остатков;
КонОст - конечный остаток значений параметра-ресурса Регистра остатков;
Приход - приход значений параметра-ресурса Регистра остатков;
Расход - расход значений параметра-ресурса Регистра остатков;
Счётчик - количество записей, вошедших в выборку, <Параметр> - не нужен;
СНД, СКД, СНК, СКК - сальдо начальное или конечное по дебету или кредиту;
ДО, КО, КорДо, КорКо - обороты по дебету или кредиту счета или корсчета;
В функциях; Сумма, Среднее, Максимум, Минимум в качестве аргумента возможно использование
арифметического выражения в терминах встроенного языка.
К параметрам, указывающим на ресурсы Регистров, могут применяться только оговоренные функции.
Поля группировок задают порядок обхода базы данных, а также позволяют записать в таблицу выборки значения необходимых реквизитов переменных запроса, выбранных в качестве полей группировок. Выборка данных из таблицы выборки производится во вложенных циклах по полям группировок. Порядок вложенности циклов должен соответствовать порядку номеров группировок в тексте запроса, как и в бухгалтерском запросе циклы по субконто.
Группировка <ИмяГруппировки>|<ПредопредГруппировка> [Упорядочить по
<КонкретизацГруппировки>, ...][Без Упорядочивания][Без Групп][Все [ВошедшиеВЗапрос]];
<ИмяГруппировки> - имя внутренней переменной, задающей группировку;
<ПредопредГруппировка> - ключевое слово одной из встроенных группировок;
<КонкретизацГруппировки> - конкретизация переменной <ИмяГруппировки>, задающая порядок групп.
Ключевые слова:
Упорядочить по - параметрами, следующими за данным ключевым словом, могут быть атрибуты и
реквизиты внутренней переменной, задающей группировку. Эти параметры записываются в таблицу
выборки и определяют упорядочивание строк в группировке.
Без Упорядочивания - необязательное добавочное ключевое слово, которое преследует цель
уменьшения времени формирования запроса, при условии, что ни упорядочивание, ни значения
упорядочивания при использовании данного запроса не нужны.
Без Групп - группы справочника не выводятся в запрос (для группировки по справочнику);
Все - в запрос выводятся все значения, и нулевые тоже (используется для группировок по справочникам и временных группировок).
ВошедшиеВЗапрос - уточняет предыдущее ключевое слово 'Все'. Использование данного слова подразумевает, что в каждую строку запроса будут включены значения данных (в том числе нулевые),
для которых есть ненулевое значение хотя бы в одной строке запроса.
188______________________ 1С:Предприятие. Практика программирования на платформе \/7
Предопределенные группировки:
Документ - позволяет детализацию до документа;
СтрокаДокумента - позволяет детализацию до строки документа;
ПериодЖурнала - группировка по времени ввода записи журнала расчетов или по времени ее действия. Группировки по дате:
День;
Неделя;
Месяц;
Квартал;
Год.
Для увеличения скорости выполнения запроса, при условии, что итоговые записи при использовании запроса не нужны, можно не накапливать итоги по группировкам.
Метод Без итогов. В случае применения данного оператора в тексте запроса, при обходе результатов запроса применяется только один цикл обхода, используя метод объекта "Запрос" ГруппировкаО без параметра. Если в тексте запроса используется группировка по многоуровневому справочнику и не указано "Без Групп", то итоги по группам справочника будут накапливаться. Другими словами, если в запросе не нужны итоги по группам справочника, то в тексте запроса кроме использования оператора "Без Итогов" дополнительно следует в операторах "Группировка ..." использовать ключевое слово "Без Групп".
Можно назначить условие включения информации в запрос.
Условие(<ЛогическоеВыражение>);
В логическом выражении могут участвовать внутренние и внешние переменные. Внутренние
переменные ставятся слева от логического оператора, внешние - справа.
Кроме обычных логических операторов (>, <, =, >=, <=, о. И, ИЛИ, НЕ) в операторе "Условие ..."
языка запросов можно использовать дополнительный оператор: логический оператор
принадлежности - В
Оператор языка запросов "Условие (А в Б);" говорит о том, что условие истинно, когда значение А
является подмножеством значения Б. Следует особо отметить, что если значение Б пустое (объект не
выбран), то условие является истинным, в отличие от оператора "=" (равно). Если на принадлежность
проверяется значение типа элемент справочника, то проверка выполняется с учетом его возможного
вхождения в группу справочника. Аналогично, проверка на принадлежность субсчета осуществляется с
учетом его возможного вхождения в счет-группу. В качестве включающего подмножества логического
оператора принадлежности (второй параметр после слова "в") может выступать как простое значение,
так и список значений. В этом случае проверка выполняется с учетом вышеотмеченных особенностей для
каждой строки списка значений.
Запрос можно сформировать с помощью конструктора. Войдем в модуль формы документа «Амортизация» и вызовем конструктор «Запрос » из меню «Конструкторы». Создадим запрос с именем «Заполнить».
XI. Основы построения объектов компоненты «Расчет»__________________________ 189
Определим период запроса.
Определим переменные запроса: Оборудование и Рез - из журнала расчетов.
190______________________ 1С:Предприятие. Практика программирования на платформе у7
Определим Функцию запроса Результат — сумму по переменной запроса Рез.
Определим поле группировки запроса — переменную запроса Оборудование, без упорядочивания и, обязательно, без групп, чтобы группы справочника в выборку не попадали, они в документе не нужны.
Определим условие записи строки выборки.
Определим Функцию запроса Результат — сумму по переменной запроса Рез.
|
Определим параметры конструктора запросов.
Отредактируем сформированную конструктором процедуру, используя следующие методы:
Метод Выгрузить(<ТаблЗнач>,<Флаг>,<Итоги>) позволяет выгрузить результаты запроса в таблицу значений. Возвращает число: 1 - если выгрузка произошла успешно, иначе - 0. <ТаблЗнач> - Таблица значений, куда выгружаются результаты запроса. <флаг> - необязательный параметр. Число или строка:
0 - значения групп и функций (по умолчанию);
1 - значения групп и функций, дополнительных переменных;
2 - значения упорядочиваний групп и функций;
3 - значения упорядочиваний групп и функций, дополнительных переменных;
Строка - " ТоварО), Товар(2), Товар, Склад, Приход, Расход", где ТоварО) - значение первого упорядочивания группировки "Товар". <Итоги> - необязательный параметр. Число:
0 - итоги по группировкам не выводить;
1 - итоги по группировкам выводить сверху (по умолчанию);
2 - итоги по группировкам выводить снизу;
3 - итоги по группировкам выводить сверху и снизу.
Метод ЗагрузитьТабличнуюЧасть(<ТаблЗнач>) позволяет загрузить многострочную часть документа из таблицы значений. <ТаблЗнач> - значение типа "Таблица значений", откуда загружается многострочная часть документа. Колонки совмещаются по идентификаторам.
Процедура Заполнить()
Перем Запрос, ТекстЗапроса, ТаблицаВыборкиЗапроса;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Заполнить)
|Период с (НачМесяца(ДатаДок)) по (КонМесяца(ДатаДок));
192______________________ 1С:Предприятие. Практика программирования на платформе V7
|Оборудование = ЖурналРасчетов.Амортизация.Объект;
|Рез = ЖурналРасчетов.Амортизация.Результат;
|Функция Результат = Сумма(Рез);
|Группировка Оборудование без упорядочивания без групп;
|Условие(Рез о 0); |" //}}ЗАПРОС
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат ;
КонецЕсли;
ТаблицаВыборкиЗапроса=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТаблицаВыборкиЗапроса,0,0);
ЗагрузитьТабличнугоЧасть(ТаблицаВыборкиЗапроса);
КонецПроцедуры
Процедуру Заполнить() можно вызвать из процедуры ВводНового().
Упражнение 38. (Необязательное) Создать реквизит документа формы документа «Амортизация», графу отбора журналов документов и алгоритм для проверки наличия регламентного документа в периоде расчета, которому принадлежит вводимый документ. Если в указанном периоде уже есть проведенный регламентный документ, то запретить ввод нового документа.
¦ Для проведенного регламентного документа разрешить только просмотр документа.
¦ Если регламентный документ уже есть, то при вводе нового выдать соответствующее предупреждение и открыть форму регламентного документа.
Метод ВыбратьПоЗначению(<Дата1>,<Дата2>,<ИмяОтбора>,<Знач>)
открывает выборку документов в интервале дат с заданным значением реквизита отбора. Возвращает:
1 - если действие выполнено и в выборке есть хотя бы один документ;
0 - если действие не выполнено или в выборке нет ни одного документа.
<Дата1> - дата, документ или позиция начала выборки документов. Если данный параметр опущен, то
выборка начинается с самого первого существующего в системе документа.
<Дата2> - дата, документ или позиция конца выборки документов. Если данный параметр опущен, то
выборка заканчивается самым последним существующим в системе документом.
<ИмяОтбора> - строка с названием Общего реквизита документов либо названием Графы отбора
журналов;
<3нач> - значение отбора, по которому строится выборка документов.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.
XI. Основы построения объектов компоненты «Расчет»_________________________ 193
Метод ОткрытьФормуМодально(<Документ>,<КонтекстФормы>,<РежимПросмотра>) открывает
визуальную форму существующего документа или элемента/группы справочника.
Возвращает: 1 - если действие выполнено, 0 - иначе.
<Документ> - выражение со значением типа 'документ' или 'справочник';
<Контекстформы> - имя переменной, куда можно задать значение любого типа для передачи в
открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.
После исполнения данного метода система вернет в данную переменную контекст открытой формы (необязателен);
<РежимПросмотра> - необязательный параметр. Числовое выражение: 1 - открыть форму в режиме только просмотра; 0 - открыть форму в режиме редактирования; -1 (минус единица) - в этом случае
используется вариант, предусмотренный текущим значением параметра "Режим открытия объектов",
установленным пользователем интерактивно.
Пока форма открыта, тип значения параметра <КонтекстФормы> равен 100, когда закрыта - 0.
Примерный текст алгоритма проверки приводится ниже.
Функция ПроверитьРегламент(ДатаД =РабочаяДата()) Экспорт
Док=Создать0бъект("Документ.Амортизация");
ФлагРегламента=О;
Если Док.ВыбратьПоЗначению(НачМесяца(ДатаД),КонМесяца(ДатаД), "Регламент",1) =1 Тогда
Док.ПолучитьДокумент();
Если Док.Проведен()=1 Тогда
Предупреждение("В этом периоде существует регламентный документ!");
ОткрытьФормуМодально(Док,,1);
ФлагРегламента=1;
КонецЕсли;
КонецЕсли;
Возврат ФлагРегламента;
КонецФункции //ПроверитьРегламент
Вызов этой функции Вам предлагается сделать самостоятельно.
Данную проверку целесообразно делать и при проведении документа «Амортизация».
Упражнение 39. (Необязательное) Создайте алгоритм, который покажет документы «Амортизация», которые надо перепровести, если изменился ТипУчета в проведенном документе «Приход». Создайте алгоритм перепроведения этих документов.
Примерный текст алгоритма в глобальном модуле учебного примера приводится ниже.
Перем ПерепровестиДокументы Экспорт;
194______________________ 1С:Предприятие. Практика программирования на платформе \/7
II____________________________________________
Процедура Перепровести(Конт) Экспорт
Перем зн,поз,стр;
Если Конт.Проведен()=1 Тогда
СписокДокументов=Создать0бъект("СписокЗначений");
0пер=Создать0бъект("Операция");
Опер.ИспользоватьКорСубконто(ВидыСубконто.Партия, Конт.ТекущийДокумент());
Опер.ВыбратьОперацииСПроводками(Конт.ПолучитьПозицию(),,"ОБ.СП", "ОБ.ПР", 2, );
Пока Опер. ПолучитьПроводку 0=1 Цикл
БДок= Опер.Документ.ТекущийДокумент();
Если (БДок.Вид()="Амортизация") И (СписокДокументов.Принадлежит(БДок)= 0) Тогда
СписокДокументов.ДобавитьЗначение(БДок,БДок.НомерДок);
КонецЕсли;
КонецЦикла;
Рег=Создать0бъект("Регистр.Амортизация");
Peг.УстановитьФильтр(,Конт.ТекудийДокумент());
Peг.ВыбратьДвижения(Конт.ПолучитьПозицию(),,);
Пока Peг.ПолучитьДвижение()=1 Цикл
Док=Рег.ТекущийДокумент();
Если (Док.Вид()="Амортизация") И (СписокДокументов.Принадлежит(Док)=0) Тогда
СписокДокументов.ДобавитьЗначение(Док,Док.НомерДок);
КонецЕсли;
КонецЦикла;
СписокДокументов.Сортировать();
Если СписокДокументов.ОтметитьЗначения (ЗН,"Пометить документы",Поз)=1 Тогда
Для i=l по СписокДокументов.РазмерСписка() Цикл
Если СписокДокументов.Пометка(i)=1 Тогда
XI. Основы построения объектов компоненты «Расчет»__________________________ 195
ЗначениеДокумента=СписокДокументов. ПолучитьЗначение(i,Стр);
Если ПерепровестиДокументы. Принадлежит(ЗначениеДокумента)= 0 Тогда
ПерепровестиДокументы.ДобавитьЗначение(ЗначениеДокумента,Стр);
КонецЕсли;
КонецЕсли;
КонецЦикла; // Для
КонецЕсли;
КонецЕсли;
КонецПроцедуры //Перепровести
//_________________________________________
Процедура Перепроведение()
Перем Стр;
Если ПустоеЗначение(ПерепровестиДокументы)=0 Тогда
Док=СоздатьОбъект("Документ.Амортизация");
Для i=1 по ПерепровестиДокументы.РазмерСписка() Цикл
Док.НайтиДокумент(ПерепровестиДокументы. ПолучитьЗначение(i,Стр));
Если Док.Провести()=1 Тогда
Сообщить("Документ "+Док+ " проведен.");
Иначе
Сообщить("Документ "+Док+ " НЕ ПРОВЕДЕН! !!!!!!!!");
КонецЕсли;
КонецЦикла; //ПерепровестиДокументы.РазмерСписка()
КонецЕсли;
КонецПроцедуры //Перепроведение
//________________________________
- ··
- ··
ПерепровестиДокументы=СоздатьОбъект("СписокЗначений");
196______________________ 1С:Предприятие. Практика программирования на платформе V7
Упражнение 40. Постройте самостоятельно ( Конструктором отчетов) Оборотные ведомости по бухгалтерским итогам, с помощью конструктора бухгалтерских запросов, и по регистру остатков, используя конструктор запросов. Покажите Начальные и конечные остатки (сальдо) и обороты по счету «ОБ.ПР» и, аналогично, по движениям Приход и Расход регистра остатков.
Вопросы для самоконтроля
Какое основное отличие компоненты Расчет от учетных компонент?
Можно ли включать один и тот же ВидРасчета в записи различных журналов расчета?
Можно ли вести в одном журнале расчета записи по разным объектам
учета?
Атрибуты какого элемента данных непосредственно доступны в модуле расчета?
Можно ли в одном календаре вести индивидуальные графики всех объектов учета?
XII. Связь с другими базами данных_____________________________________________ 197