2.3 Инструментальные средства АС «Бюджет»

Открытость системы позволяет пользователям самостоятельно (независимо от разработчика) с помощью специальных инструментальных средств (генератора отчетов и встроенного макроязыка ABL) наращивать возможности системы. Встроенный макроязык ABL специально предназначен для расширения функциональных возможностей системы без непосредственного участия ее разработчиков. На ABL программируются функции двустороннего обмена данными с внешними системами, контроля вводимых и присылаемых по каналам электронной связи данных, дополнения и порождения новых данных, вызова внешних приложений и т.д. ABL – это объектно-ориентированный русифицированный язык, аналог языка VBA (Visual Basic For Applications), использующегося в Microsoft Office. Идея возникновения и реализации ABL принадлежит руководителю отдела АС "Смета" НПО «Криста»[9] Смирнову Сергею. Понимая, что для реализации идеи написания конфигурационной базы со встроенными скриптами нужен какой-то макроязык, рассматривалось 2 варианта: использовать уже имеющиеся скриптовые языки (JS, VB), либо создать свой. Победила идея, что нужен свой язык хотя бы потому, что в случае использования JS/VB фактически появляется зависимость от их реализации, и обязательно всплывут проблемы, которых ты решить в принципе не можешь - не переписывать же Windows…Программирование на ABL доступно только квалифицированным ИТ-специалистам. Для программирования и администрирования подпрограмм (макросов) на ABL-языке в систему встроены специальные интерфейсы, в том числе имеется встроенный отладчик подпрограмм. Макросы хранятся в реестре сервера настроек и расширяют функции АС «Бюджет».

Например, в формы месячной отчетности внесены изменения бюджетной классификации[10]. Тогда создается скрипт на ABL, который выглядит следующим образом:

<?xml version="1.0" encoding="windows-1251" ?>

- <registry>

- <node path="%root%">

- <node path="Объекты">

- <node path="Интерфейсы">

- <node path="{EC6083A1-BC20-4FC8-AAFF-20399B48497A}">

- <node path="Выпадающие меню">

- <node path="Меню принятия/отмены принятия">

- <node path="Принять отчеты">

<value type="3" name="Действие">УстановитьДатуПринятия</value>

<param value="Действие" type="3" name="crc32">$E5CA2E34</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">Галочка</value>

<param value="Картинка" type="3" name="crc32">$3605C21A</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

</node>

- <node path="Снять принятие">

<value type="3" name="Действие">СнятьДатуПринятия</value>

<param value="Действие" type="3" name="crc32">$FED06E36</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">Обновить</value>

<param value="Картинка" type="3" name="crc32">$BEC3BCE7</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

</node>

</node>

</node>

- <node path="Действия">

- <node path="КонтрольКлассификации">

<value type="7" name="Код программы">включить '\Библиотеки\LibRu.lib'; включить '\Библиотеки\Forms.lib'; включить "Бюджет\Объекты\Контроль\Скрипты\События\КонтрольКлассификации"; включить '\Макросы\КИ\ПоддержкаПроекта'; включить 'project'; константы кПутьККонфигурации = "Бюджет\Объекты\Настройки\Консолидация\КонтрольКлассификации"; кКонфигурация = "Конфигурация"; // берем либо выделенные, либо текущую запись функция ПолучитьВыделенныеИлиТекущую(СеткаВвода: СеткаДанных; Данные: СтатическиеДанные): СтатическиеДанные; начало если СеткаВвода.ЕстьВыделенныеСтроки тогда результат := СеткаВвода.ПолучитьВыделенныеСтроки иначе начало // ничего не выделено, тогда занесем в выделенные текущую запись мастера результат := СоздатьСтатическиеДанные; результат.ПрисвоитьПоля(Данные); результат.Открыть; результат.СкопироватьЗапись(1, Данные); конец; конец; // функция ПроверитьКорректностьКлассификацииДанных(Данные: СтатическиеДанные; Конфигурация: СтатическиеДанные): Целое; переменные ИмяПоляДляКонтроля: строка; Классификация: строка; ТипПроверки: Целое; ТипКлассификации: Целое; начало результат := да; ИмяПоляДляКонтроля := Конфигурация.Поле('ControlField').КакСтрока; ТипПроверки := Конфигурация.Поле('ControlType').КакЦелое; ТипКлассификации := Конфигурация.Поле('ClsType').КакЦелое; Данные.Вначало; пока не Данные.ВКонце и результат делать начало Классификация := Данные.Поле(ИмяПоляДляКонтроля).КакСтрока; результат := ПроверитьКлассификацию(Классификация, ТипПроверки, ТипКлассификации); Данные.Следующая; конец; конец; // проверка отчета на корректность классификации функция ПроверитьКорректностьКлассификацииОтчета(КодОтчета: Целое; КодФормы: Целое; Конфигурация: СтатическиеДанные): Целое; переменные ФормаВвода: IBaseForm; НомерДетализации: Целое; ДанныеДетализации: СтатическиеДанные; начало результат := да; Конфигурация.SetScope(МассивИз(КодФормы)); если Конфигурация.ЧислоЗаписей > 0 тогда начало // загружаем детализацию ФормаВвода := ПостроитьФормуВвода(КодОтчета, КодФормы, nil); ФормаВвода.ShowDataEx(sdoNotShow + sdoStatic); // проверяем все контроли Конфигурация.ВНачало; пока не Конфигурация.ВКонце и результат делать начало НомерДетализации := Конфигурация.Поле('DetailNumber').КакЦелое; ДанныеДетализации := ФормаВвода.StaticSets(НомерДетализации); если ДанныеДетализации.ЧислоЗаписей > 0 тогда результат := ПроверитьКорректностьКлассификацииДанных(ДанныеДетализации, Конфигурация); Конфигурация.Следующая; конец; ФормаВвода.ClearStatics; конец; конец; // загрузка конфигурации из реестра функция ПолучитьКонфигурацию: СтатическиеДанные; начало результат := СоздатьДанныеИзРеестра(кПутьККонфигурации, кКонфигурация); результат.IndexFieldNames := 'FormID'; конец; // проверка набора отчетов функция ПроверитьНаборОтчетов(Выделенные, Заголовок, Конфигурация: СтатическиеДанные): Целое; переменные КлассификацияКорректна: Целое; КодОтчета: Целое; КодФормы: Целое; начало КлассификацияКорректна := да; результат := 0; Выделенные.ВНачало; пока не Выделенные.ВКонце делать начало КодОтчета := Выделенные.Поле('ID').КакЦелое; если Заголовок.Locate('ID', КодОтчета, 0) тогда начало КодФормы := Заголовок.Поле('TYPEDFORM').КакЦелое; КлассификацияКорректна := ПроверитьКорректностьКлассификацииОтчета(КодОтчета, КодФормы, Конфигурация); // записываем результат проверки если КлассификацияКорректна тогда начало Заголовок.Поле('ControlMessage').КакСтрока := ''; Заголовок.Поле('ControlResult').КакЦелое := -1; конец иначе начало Заголовок.Поле('ControlResult').КакЦелое := 10; Заголовок.Поле('ControlMessage').КакСтрока := 'Есть ошибки бюджетной классификации'; результат := результат + 1; конец; конец; Выделенные.Следующая; конец; конец; переменные ф: ФормаВвода; Заголовок, Выделенные, Конфигурация: СтатическиеДанные; КоличествоОшибок: целое; начало Ф := ПолучитьФормуВвода; Заголовок := Ф.Заголовки.Таблица; если не Заголовок.Active или (Заголовок.ЧислоЗаписей = 0) тогда ВызватьОшибку('Нет данных для проверки'); // считываем конфигурацию для проверки Конфигурация := ПолучитьКонфигурацию(); попытка // набор отчетов для проверки Выделенные := ПолучитьВыделенныеИлиТекущую(Ф.Заголовки.Сетка, Заголовок); попытка КоличествоОшибок := ПроверитьНаборОтчетов(Выделенные, Заголовок, Конфигурация); обязательно УдалитьОбъект(Выделенные); конец; обязательно УдалитьОбъект(Конфигурация); конец; // сообщаем результаты проверки если КоличествоОшибок = 0 тогда Сообщение('Ошибок ввода классификации не найдено') иначе Сообщение(Формат('Найдено %d документов с ошибочной классификацией', КоличествоОшибок)); конец.</value>

<param value="Код программы" type="1" name="AccessCount">23</param>

<param value="Код программы" type="2" name="AccessDate">39377,8330395718</param>

<param value="Код программы" type="3" name="crc32">$17DD9440</param>

<param value="Код программы" type="3" name="version">36.044.79</param>

<param value="Код программы" type="3" name="Export">DIMAN2\dzimitchev\16.02.2009 16:44:59</param>

<value type="4" name="Отладка">0</value>

<param value="Отладка" type="3" name="crc32">$26D930AC</param>

<param value="Отладка" type="3" name="version">36.044.79</param>

</node>

- <node path="КопироватьОтчет">

<value type="7" name="Код программы">включить '\Библиотеки\LibRu.lib'; включить '\Макросы\КИ\Запросы'; включить 'project'; /* Для получения запросов на заголовок и детализацию используются функции из модуля Запросы.ТекстПолногоЗапросаФормы и Запросы.ТекстЗапросаДеталиФормы соответственно Эти функции генерируют запросы для выборки и вставки полей с условием */ функция КопироватьДетализацию(КодНовогоОтчета, КодОтчета, КопироватьСуммы: Целое); переменные Данные: СтатическиеДанные; ЗапросВыборки, ЗапросВставки: строка; начало Данные := СоздатьСтатическиеДанные; попытка Данные.СоединитьБД; Данные.CachedUpdates := да; ТекстЗапросаДеталиФормы(ЗапросВыборки, ЗапросВставки, Формат('utypedformsdetail.recordindex=%d', КодОтчета)); Данные.Запрос := Формат('[PUMPDATA]{%s} [INSERTDATA]{%s}', ЗапросВыборки, ЗапросВставки); Данные.Открыть; Данные.ВНачало; пока не Данные.ВКонце делать начало Данные.Поле('recordindex').КакЦелое := КодНовогоОтчета; Данные.UpdateStatus := usInserted; Данные.Следующая; конец; Данные.СохранитьИзменения; обязательно УдалитьОбъект(Данные); конец; конец; функция КопироватьЗаголовок(КодОтчета: Целое): Целое; переменные Данные: СтатическиеДанные; ЗапросВыборки, ЗапросВставки, ЗапросИзменения: строка; начало Данные := СоздатьСтатическиеДанные; попытка Данные.СоединитьБД; Данные.CachedUpdates := да; ТекстПолногоЗапросаФормы(ЗапросВыборки, ЗапросИзменения, ЗапросВставки, '550', Формат('utfc.id = %d', КодОтчета)); Данные.Запрос := Формат('[PUMPDATA]{%s} [INSERTDATA]{%s}', ЗапросВыборки, ЗапросВставки); Данные.Открыть; результат := ГенерироватьДиап('g_shared'); Данные.Поле('DocNumber').КакСтрока := 'Копия ' + Данные.Поле('DocNumber').КакСтрока; Данные.Поле('ID').КакЦелое := результат; Данные.Поле('AcceptDate').Очистить; если не Данные.Поле('DocStateref').Пустое тогда Данные.Поле('DocStateRef').КакЦелое := (Данные.Поле('DocStateRef').КакЦелое цел 10) * 10 + 01; Данные.UpdateStatus := usInserted; Данные.СохранитьИзменения; обязательно УдалитьОбъект(Данные); конец; конец; переменные Заголовки: СтатическиеДанные; ф: ФормаВвода; КодОтчета, КодНовогоОтчета: целое; начало //задача: скопировать текущую запись, номер документа заменить на "Копия <номер документа>", дату принятия игнорировать... ф := ПолучитьФормуВвода; если ф.ЕстьИзменения тогда ВызватьОшибку('Перед копированием отчетов надо сохранить все изменения!'); Заголовки := ф.Заголовки.Таблица; если Заголовки.ЧислоЗаписей = 0 тогда ВызватьОшибку('Нет отчета для копирования!'); КодОтчета := Заголовки.Поле('ID').КакЦелое; // копируем заголовок КодНовогоОтчета := КопироватьЗаголовок(КодОтчета); // копируем детализацию КопироватьДетализацию(КодНовогоОтчета, КодОтчета, ); // сохраняем изменения ф.СохранитьИзменения; Сообщение('Отчет был успешно скопирован!'); конец.</value>

<param value="Код программы" type="1" name="AccessCount">12</param>

<param value="Код программы" type="2" name="AccessDate">39405,7255468518</param>

<param value="Код программы" type="3" name="crc32">$D33877EC</param>

<param value="Код программы" type="3" name="version">36.044.79</param>

<param value="Код программы" type="3" name="Export">DIMAN2\dzimitchev\16.02.2009 16:44:59</param>

</node>

- <node path="ОбновитьКД">

<value type="7" name="Код программы">включить '\Библиотеки\LibRu.lib'; включить '\Библиотеки\Forms.lib'; включить '\Библиотеки\ConsSupport.lib'; включить '\Библиотеки\Reports.lib'; включить '\Макросы\КИ\ПоддержкаФормВвода'; включить 'project'; константы НаборПолей = 'КонсолидацияДетализация.КодЗаписи,КонсолидацияДетализация.КодСтрокиЦелое,КонсолидацияДетализация.Код30,КонсолидацияДетализация.Сумма0, КонсолидацияДетализация.Сумма1,КонсолидацияДетализация.Сумма2,КонсолидацияДетализация.Сумма3,КонсолидацияДетализация.Сумма4, КонсолидацияДетализация.Сумма5,КонсолидацияДетализация.Сумма6,КонсолидацияДетализация.Сумма7,КонсолидацияДетализация.Сумма8, КонсолидацияДетализация.Сумма9,КонсолидацияДетализация.Сумма10,КонсолидацияДетализация.Сумма11,КонсолидацияДетализация.Сумма12, КонсолидацияДетализация.Сумма13,КонсолидацияДетализация.Сумма14,КонсолидацияДетализация.Сумма15'; // функция СоздатьПредставление(КодДокумента: Целое; НомерДетализации: Целое): ПредставлениеДанных; переменные Раскладка: ITableInfoX; Ы: Целое; начало Раскладка := ПоддержкаКонсолидации.СоздатьРаскладку(НаборПолей); Раскладка.Columns(0).Group := grpGroup; от Ы := 1 до Раскладка.Count -1 делать Раскладка.Columns(Ы).Group := grpNone; результат := ПоддержкаКонсолидации.СоздатьПредставлениеДанных(Раскладка); результат.Параметр('КонсолидацияЗаголовки.КодДокумента') := КодДокумента; результат.Параметр('КонсолидацияДетализация.НомерДетализации') := НомерДетализации; результат.Открыть; конец; // функция ПолучитьМатрицуДоходов(КодФормы: Целое): СтатическиеДанные; переменные ОписаниеФормы: ITypedForm; ФормаВвода: IBaseForm; начало ОписаниеФормы := МенеджерФормВвода.ФормаПоКоду(КодФормы); ФормаВвода := ПостроительФормВвода.BuildInputForm(-1, КодФормы); результат := ФормаВвода.StaticSets(0); конец; // функция ОбновитьЗаголовок(КодДокумента, КодФормы: Целое); переменные Детализация: ПредставлениеДанных; Доходы: СтатическиеДанные; Данные: СтатическиеДанные; начало если (КодФормы = 36100704) или (КодФормы = 36100706) или (КодФормы = 36101704) или (КодФормы = 36101404) или (КодФормы = 36100404) или (КодФормы = 36100406) тогда начало // получаем текущую матрицу доходов (по которой будем определять соответствие КД и кода листа Доходы := ПолучитьМатрицуДоходов(КодФормы); // создаем представление для обновления данных в БД Детализация := СоздатьПредставление(КодДокумента, 0); // меняем коды листа Данные := Детализация.Данные; Данные.Группировать(Доходы, 'Keys=Код30;Код30=Код30;КодСтрокиЦелое=КодСтрокиЦелое;default=false;insert=false'); // сохраняем изменения Детализация.СохранитьИзменения; конец; конец; // функция ОбновитьЗаголовки(Заголовки: СтатическиеДанные; ТолькоТекущая: Целое); переменные Код, КодФормы: Целое; начало если ТолькоТекущая тогда начало Код := Заголовки.Поле('ID').КакЦелое; КодФормы := Заголовки.Поле('TypedForm').КакЦелое; если Заголовки.Поле('AcceptDate').Пустое тогда ОбновитьЗаголовок(Код, КодФормы); конец иначе начало Заголовки.ВНачало; пока не Заголовки.ВКонце делать начало Код := Заголовки.Поле('ID').КакЦелое; КодФормы := Заголовки.Поле('TypedForm').КакЦелое; если Заголовки.Поле('AcceptDate').Пустое тогда ОбновитьЗаголовок(Код, КодФормы); Заголовки.Следующая; конец; конец; конец; переменные ф: ФормаВвода; Заголовки: СтатическиеДанные; Выделенные: СтатическиеДанные; начало ф := ПолучитьФормуВвода; Заголовки := ф.Заголовки.Таблица; если не Заголовки.Active или (Заголовки.ЧислоЗаписей = 0) тогда ВызватьОшибку('В заголовке нет данных'); если ф.Заголовки.Сетка.ЕстьВыделенныеСтроки тогда начало Выделенные := ф.Заголовки.Сетка.ПолучитьВыделенныеСтроки; попытка ОбновитьЗаголовки(Выделенные, нет); обязательно Интерфейс(Выделенные).Освободить; конец; конец иначе ОбновитьЗаголовки(Заголовки, да); Сообщение('Обновление завершено'); конец.</value>

<param value="Код программы" type="1" name="AccessCount">89</param>

<param value="Код программы" type="2" name="AccessDate">39856,69694625</param>

<param value="Код программы" type="3" name="crc32">$3E205B3D</param>

<param value="Код программы" type="3" name="version">36.044.79</param>

<param value="Код программы" type="3" name="Export">DIMAN2\dzimitchev\16.02.2009 16:44:59</param>

</node>

- <node path="СнятьДатуПринятия">

<value type="3" name="Заголовок">Автоснятие даты принятия</value>

<param value="Заголовок" type="3" name="crc32">$A09351E1</param>

<param value="Заголовок" type="3" name="version">36.044.79</param>

<value type="7" name="Код программы">включить "\Библиотеки\LibRu.lib"; включить "\Библиотеки\ABLTools.lib"; включить "project"; переменные ф: ФормаВвода; Сетка: СеткаДанных; // функция СнятьДатуПринятия(Закладка: Целое; Данные: БезТипа): Целое; начало если ф.МожноРедактироватьСтолбец(Сетка.ColumnByFieldName('AcceptDate')) тогда Сетка.ColumnByFieldName('AcceptDate').CheckState := 0; результат := да; конец; начало Ф := ПолучитьФормуВвода; если Ф.Заголовки.Таблица.ЧИслоЗаписей = 0 тогда ВызватьОшибку("В заголовке нет данных. Нажмите кнопку 'Выполнить'"); если Ф.ЕстьИзменения тогда ВызватьОшибку("В таблице есть измененные записи. Необходимо сохранить изменения."); Сетка := Ф.Заголовки.Сетка; если Сетка.ЕстьВыделенныеСтроки тогда Сетка.ForSelection(да, СоздатьОбработчик('СнятьДатуПринятия'), Null) иначе СнятьДатуПринятия(-1, Null); ф.СохранитьИзменения; конец.</value>

<param value="Код программы" type="1" name="AccessCount">16</param>

<param value="Код программы" type="2" name="AccessDate">39407,6166157986</param>

<param value="Код программы" type="3" name="crc32">$7F994D78</param>

<param value="Код программы" type="3" name="version">36.044.79</param>

<param value="Код программы" type="3" name="Export">DIMAN2\dzimitchev\16.02.2009 16:44:59</param>

</node>

- <node path="УстановитьДатуПринятия">

<value type="3" name="Заголовок">Автоустановка даты принятия</value>

<param value="Заголовок" type="3" name="crc32">$5A882DA2</param>

<param value="Заголовок" type="3" name="version">36.044.79</param>

<value type="7" name="Код программы">включить "\Библиотеки\LibRu.lib"; включить "\Библиотеки\ABLTools.lib"; включить "project"; переменные ф: ФормаВвода; Сетка: СеткаДанных; // функция ПринятьОтчет(Закладка: Целое; Данные: БезТипа): Целое; начало если ф.МожноРедактироватьСтолбец(Сетка.ColumnByFieldName('AcceptDate')) тогда Сетка.ColumnByFieldName('AcceptDate').CheckState := 1; результат := да; конец; начало Ф := ПолучитьФормуВвода; если Ф.Заголовки.Таблица.ЧИслоЗаписей = 0 тогда ВызватьОшибку("В заголовке нет данных. Нажмите кнопку 'Выполнить'"); если Ф.ЕстьИзменения тогда ВызватьОшибку("В таблице есть измененные записи. Необходимо сохранить изменения."); Сетка := Ф.Заголовки.Сетка; если Сетка.ЕстьВыделенныеСтроки тогда Сетка.ForSelection(да, СоздатьОбработчик('ПринятьОтчет'), Null) иначе ПринятьОтчет(-1, Null); ф.СохранитьИзменения; конец.</value>

<param value="Код программы" type="1" name="AccessCount">19</param>

<param value="Код программы" type="2" name="AccessDate">39412,4119151042</param>

<param value="Код программы" type="3" name="crc32">$AAFE330E</param>

<param value="Код программы" type="3" name="version">36.044.79</param>

<param value="Код программы" type="3" name="Export">DIMAN2\dzimitchev\16.02.2009 16:44:59</param>

</node>

</node>

- <node path="Панели">

- <node path="КонтрольКлассификации">

- <node path="КонтрольКлассификации">

<value type="3" name="Действие">КонтрольКлассификации</value>

<param value="Действие" type="3" name="crc32">$B41478A7</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">Контроль</value>

<param value="Картинка" type="3" name="crc32">$0C4CF2C9</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

<value type="3" name="Хинт">Проверить отчеты на корректность введенной классификации</value>

<param value="Хинт" type="3" name="crc32">$59916E61</param>

<param value="Хинт" type="3" name="version">36.044.79</param>

</node>

</node>

- <node path="ДинамическиеФормы">

- <node path="КопироватьОтчет">

<value type="3" name="Действие">КопироватьОтчет</value>

<param value="Действие" type="3" name="crc32">$FC04C19B</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">КопироватьПлатежку</value>

<param value="Картинка" type="3" name="crc32">$36B1AE3D</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

<value type="3" name="Хинт">Создать копию отчета</value>

<param value="Хинт" type="3" name="crc32">$40C9CBAB</param>

<param value="Хинт" type="3" name="version">36.044.79</param>

</node>

- <node path="ОбновитьКД">

<value type="4" name="Видимость">1</value>

<param value="Видимость" type="3" name="crc32">$51DE003A</param>

<param value="Видимость" type="3" name="version">36.044.79</param>

<value type="3" name="Действие">ОбновитьКД</value>

<param value="Действие" type="3" name="crc32">$7EF41D22</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">РазбиениеПоКД</value>

<param value="Картинка" type="3" name="crc32">$259FE513</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

<value type="3" name="Стиль">Кнопка</value>

<param value="Стиль" type="3" name="crc32">$F0B26634</param>

<param value="Стиль" type="3" name="version">36.044.79</param>

<value type="3" name="Хинт">Обновить доходы по новым шаблонам (для форм 114, 117, 314, 317)</value>

<param value="Хинт" type="3" name="crc32">$6E149448</param>

<param value="Хинт" type="3" name="version">36.044.79</param>

</node>

- <node path="Описание">

<value type="4" name="Видимость">1</value>

<param value="Видимость" type="3" name="crc32">$51DE003A</param>

<param value="Видимость" type="3" name="version">36.044.79</param>

<value type="3" name="Действие">Описание</value>

<param value="Действие" type="3" name="crc32">$24050E21</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">Вопрос</value>

<param value="Картинка" type="3" name="crc32">$FA5BF857</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

<value type="3" name="Стиль">Кнопка</value>

<param value="Стиль" type="3" name="crc32">$F0B26634</param>

<param value="Стиль" type="3" name="version">36.044.79</param>

<value type="3" name="Хинт">Описание формы</value>

<param value="Хинт" type="3" name="crc32">$9A8257F8</param>

<param value="Хинт" type="3" name="version">36.044.79</param>

</node>

- <node path="Установить дату принятия">

<value type="3" name="Выпадающее меню">Меню принятия/отмены принятия</value>

<param value="Выпадающее меню" type="3" name="crc32">$AB21825A</param>

<param value="Выпадающее меню" type="3" name="version">36.044.79</param>

<value type="3" name="Действие">УстановитьДатуПринятия</value>

<param value="Действие" type="3" name="crc32">$E5CA2E34</param>

<param value="Действие" type="3" name="version">36.044.79</param>

<value type="3" name="Картинка">Галочка</value>

<param value="Картинка" type="3" name="crc32">$3605C21A</param>

<param value="Картинка" type="3" name="version">36.044.79</param>

<value type="3" name="Стиль">Меню</value>

<param value="Стиль" type="3" name="crc32">$2267114F</param>

<param value="Стиль" type="3" name="version">36.044.79</param>

<value type="3" name="Хинт">Установить дату принятия</value>

<param value="Хинт" type="3" name="crc32">$783EBDE3</param>

<param value="Хинт" type="3" name="version">36.044.79</param>

</node>

</node>

</node>

- <node path="Отчеты">

<value type="3" name="Версия обновления отчетов">06.11.02.02</value>

<param value="Версия обновления отчетов" type="3" name="crc32">$5EF9D6CF</param>

<param value="Версия обновления отчетов" type="3" name="version">36.042.20</param>

</node>

</node>

</node>

</registry>

После загрузки файла обновления требуемые формы отчетности меняются на новые.

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

Количество выводимых колонок, порядок следования данных в отчете;

Наличие промежуточных итогов, их уровни и способ вывода;

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

Уровень обобщения классификаторов при группировке данных;

Режим автоподбора ширины и высоты у колонок;

Режим группировки документов в отчет: лента документов или общий документ (приложения Г,Д).

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

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

Способ формирования и отображения отчета, построенного на основе макросов, описывается шаблоном. Использование шаблонов позволяет гибко настраивать внешний вид отчета, сделанные один раз настройки сохраняются и используются в дальнейшем. Для хранения файлов различных шаблонов используются соответствующие их назначению каталоги, имена которых жестко фиксированы в файловой структуре системы. Все шаблоны отчетов должны храниться на сервере в специальном каталоге, доступном всем пользователям системы, например, в каталоге //Server/BudgetAx/Reports/Новые отчеты, в состав которого входят соответствующие каталоги с шаблонами (Документы, Импорт, Экспорт, Ресурсы, т.д.).

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

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


Информация о работе «Анализ и оценка надежности и эффективности АИС "Бюджет"»
Раздел: Информатика, программирование
Количество знаков с пробелами: 115207
Количество таблиц: 3
Количество изображений: 4

Похожие работы

Скачать
184049
9
16

... создание эффективных оценочных систем, позволяющих адекватно оценивать качество выполняемых работ и своевременно выявлять недостатки на основных. 2. Анализ и оценка эффективности управления предприятием ООО «Газпромнефть-Хантос»   2.1. Общая характеристика ООО «Газпромнефть-Хантос» Общество с ограниченной ответственностью «Газпромнефть-Хантос», (именуемое в дальнейшем «Общество») было ...

Скачать
173906
11
0

... интервал времени. В этом случае поведение АСОД может быть представлено только в дискретных точках (группа динамических моделей с дискретным временем). 6 Описание программы автоматизации учета исполнения бюджета Краснодарского края 6.1 Средства разработки 6.1.1 Компилятор BORLAND PASCAL 7.0 Программа написана на языке Turbo Pascal версии 7.0. Турбо Паскаль появился на рынке программных ...

Скачать
151913
7
6

... казначейства и автоматизировать процесс прогнозирования [43]. Глава 3. Анализ использования бюджетных средств   3.1 Анализ поступления всех видов налогов и других обязательных платежей в 2004 году по Родниковскому отделению УФК по Ивановской области   Объем доходов федерального бюджета обусловлен основными направлениями государственной бюджетной политики, ходом экономических реформ в ...

Скачать
253221
67
6

... при этом показатель чистого операционного результата в 2006 году ниже по сравнению с 2005 г на 68877,15 рублей. 2.4 Обоснование предложений по улучшению работы учреждения. Важным этапом аналитической работы является поиск резервов по улучшению деятельности учреждения; разработка организационно-технических мероприятий по реализации этих резервов и непосредственное внедрение этих мероприятий. ...

0 комментариев


Наверх