Техническая информация по форматам файлов Студии

From SunFlurry wiki
Jump to: navigation, search

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

Способ хранения проекта и файлы проекта

Проекты представляют собой набор файлов и папок, хранящихся на жестком диске, каждый проект обычно имеет три основные папки:

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

Основной файл проекта (файл конфигурации проекта), открываемый или создаваемый Студией, это файл с расширением sfprj, обычно sfstudio.sfprj. Файл всегда находится внутри папки исходных текстов проекта. При создании нового проекта, Студия создает структуру из двух папок -- папки исходных текстов (Source) и папки скомпилированных файлов (Compiled), внутри первой папки находится основной файл проекта. Основной файл проекта представляет собой текстовый файл в формате UTF-16, в котором, кроме дополнительной информации по проекту, хранится ссылка на папку с скомпилированными файлами проекта (при создании нового проекта, это ..\Compiled\). Основной файл проекта можно открыть непосредственно из проводника Windows, рабочего стола, либо из меню "открыть" Студии.

Папка исходных текстов проекта может содержать следующие подпапки:

  • _ConfigFiles -- папка с файлом метаданных, файлами настройки меню, связанных элементов и прочего. Папка хранит всю информации по конфигурации проекта, в частности, в ней хранятся файлы:
    • Meta.ini -- основной файл структуры базы данных
    • CommonProp.ini -- общие установки проекта
    • ControlPanels.ini -- установки панелей инструментов
    • GuestInfo.ini -- установки проекта, включающие картинку при загрузке проекта, наименование проекта и пр., данные установки будут доступны пользователю в момент ввода пароля для регистрации на сервере
    • Menus.ini -- установки главных меню
    • UserAttbuttons.ini -- установки пользовательских связанных элементов, использующихся в этом проекте
    • ServersList.ini -- список серверов, который используется при разворачивании обновлений
    • IconsLibrary.png -- библиотека иконок, использующаяся в этом проекте
  • _DeploymentBin_Server -- папка используется для обновления исполняемых файлов и библиотек серверов базы данных. При выполнении обмена между Студией и сервером базы данных, изменения в этой папке попадают в каталог обновления на сервере, после чего программа обновления на сервере заменяет текущие исполняемые файлы сервера полученными новыми версиями. Обновление такого рода временно переводит сервер в нерабочее состояние.
  • _DeploymentBin_ConsoleClient, _DeploymentBin_GUIClient -- папки, позволяющие разворачивать обновления программ на клиентах автоматически. Новые файлы из этих папок автоматически переносятся на сервер в соответствующие папки для обновлений. В момент, когда клиент (консольный или визуальный) регистрируется на сервере, он получает эти обновления (для визуальный клиентов есть возможность задать вопрос пользователю см. описание визуального клиента) и заменяет текущие исполняемые файлы полученными новыми версиями. После обновления клиент регистрируется на сервере снова.
  • Modules -- папка с модулями, таблицами и формами проекта. Информацией из этой папки обновляются файлы на сервере. Кроме основных файлов проекта, в структуре этой папки могут храниться ini-файлы или другие файлы, в том числе бинарные. Основными файлами проекта являются:
    • файлы исходных текстов модулей. Файлы имеют расширения sf и содержат текст в формате UTF-16, перенос строк осуществляется знаками с кодами 13 и 10, каждый файл имеет UTF-16 BOM. Допустимо использование ANSI файлов без BOM.
    • файлы установок форм. Файлы имеют расширения sfg и содержат текст в формате ASCII (символы с кодами >127 не используются), перенос строк осуществляется знаками с кодами 13 и 10. Все строковые константы и тексты визуальных событий внутри файлов кодируются особым образом.
    • файлы электронных таблиц. Файлы имеют расширения sft и содержат бинарную информацию по таблицам SFT.

Формат основных файлов проекта

Описание Форматов основных файлов проекта Meta.ini, ControlPanels.ini, Menus.ini и UserAttbuttons.ini выходит за рамки компетенции этой документации. Описания этих файлов доступны во внутренних исходных текстах системы.

Формат файлов-шаблонов (папка Profiles)

Формат файла шаблонов цветов SFT (ColorProfiles.*.sfs)

Шаблоны цветов используются в таблицах SFT не только в Студии, но и в клиентах. Файл загружается при запуске Студии, и, в зависимости от языка Студии имеет дополнительный суффикс используемого языка (к примеру, ru, для русского, т.е. полное имя файла будет выглядеть следующим образом: ColorProfiles.ru.sfs). Если файл не найден, загрузка Студии будет остановлена. Шаблон является текстовым файлом в формате UTF-16 с BOM. Разделение строк осуществляют два символа с кодами 13 и 10. Комментарии в файле могут следовать только отдельными строками и должны начинаться на знак ;. Файл имеет следующую структуру:

[MajorIndexNames]
;Далее следуют наименования заголовков шаблонов ячеек (назначений ячеек), обычно их 5 штук:
Index1="Стандартные ячейки"
Index2="Заголовки отчета"
Index3="Заголовки и итоги таблиц"
Index4="Строки таблиц"
Index5="Особенные строки таблиц"
...

[MinorIndexNames]
;Далее следуют наименования шаблонов ячеек (назначений ячеек). Наименования имеют вид Index<Индекс заголовка>_<Индекс шаблона>.
;Первый шаблон всегда является шаблоном по умолчанию
;Для примера даны несколько обычно используемых наименований
Index1_1="Дизайн по умолчанию"
Index2_1="Имя отчета"
Index2_2="Свойства отчета"
Index2_3="Доп. инф. (предупреждения и пр.)"
Index3_1="Заголовок (обычный)"
Index3_2="Заголовок выделенный"
Index3_3="Заголовок (мелкий)"
Index3_4="Заголовок (обычный, без выдел.)"
Index4_1="Уровень 1"
Index4_2="Уровень 2"
Index4_3="Уровень 3"
Index4_4="Уровень 4"
Index4_5="Уровень 5"
...

[Profiles]
;Далее следуют наименования профилей палитры. Каждая палитра задает свой вид таблиц, пользователи могут свободно выбирать палитры по своему желанию.
;Ниже приведены примеры палитр
Profile1="Стандартная настройка"
Profile2="Оттенки серого"
Profile3="Темные цвета для принтера"
Profile4="Зеленые цвета"
Profile5="Синие цвета"
Profile6="Красные цвета"
...

;Количество параграфов Profile* должно совпадать с количеством профилей палитр в параграфе [Profiles]
[Profile1]
;Каждый профиль палитры содержит информацию по каждому шаблону ячейки из параграфа [MinorIndexNames]
;Наименования переменных профиля имеют вид Scheme<Индекс заголовка>_<Индекс шаблона>.
;Значение каждой переменной -- список значений, разделенных знаками ";", пропущенные значения используют параметры по умолчанию
;Первый профиль является профилем по умолчанию, параметры по умолчанию заменяются на значение именно этого шаблона
;Значение переменных имеет следующий формат: 
;"<Имя шрифта>;<Размер шрифта>;<Цвет шрифта>;<Цвет фона>;<Жирный>;<Наклонный>;<Подчеркнутый>;<Вычеркнутый>;<Отрицательный красным>;<Цвет рамки>"
;Цвета имеют формат RGB, и могут быть заданы в шестнадцатеричном формате (начинаются на знак $), либо в десятичном формате
;Булевые значения задаются как 0 или 1
;Далее показаны примеры нескольких строк шаблонов. Нужно заменить, что наименование шрифта упоминается только в шаблоне по умолчанию, 
;  последующие шаблоны пропускают этот параметр
Scheme1_1="Arial;9"
Scheme2_1=";12;$000000;;1"
Scheme2_2=";8;$000000;;1"
Scheme2_3=";8;$000000"
Scheme3_1=";9;$000000;$C0C0C0;1"
Scheme3_2=";9;$000000;$C0C0C0;1;;1"
Scheme3_3=";8;$000000;$C0C0C0;1"
Scheme3_4=";9;$000000;;1"
Scheme4_1=";9;$000000;$FFFFFF"
Scheme4_2=";9;$000000;$E8E8E8"
Scheme4_3=";9;$000000;$D0D0D0"
Scheme4_4=";9;$000000;$C0C0C0;1"
Scheme4_5=";9;$000000;$B0B0B0;1"
Scheme4_6=";10;$000000;$A0A0A0;1"
Scheme4_7=";11;$FFFFFF;$909090;1"
Scheme4_8=";11;$FFFFFF;$707070;1"
Scheme4_9=";12;$FFFFFF;$404040;1"

[Profile2]
...

;Параграф "палитры" задает цветовые палитры с доступными в SFT таблицах цветами. Так как цвета в ячейках не задаются в формате RGB, а используют индексы, 
;  в таблицах нельзя использовать произвольные цвета, но только цвета из указанной палитры.
;Обычно указывается одна палитра по умолчанию, но можно указать несколько палитр
[Palettes]
Palette1="Стандартная палитра"

[Palette1]
;Далее следуют 16 переменных цвета палитры. Каждая переменная содержит 16 цветов, разделенных знаком ";".
;Цвета могут быть заданы как в шестнадцатеричном формате (начинаются на знак $), так и в десятичном формате
;Для примера дана стандартная палитра SunFlurry
Colors1="$000000;$FFFFFF;$000080;$0000FF;$008000;$00FF00;$800000;$FF0000;$008080;$00FFFF;$800080;$FF00FF;$808000;$FFFF00;$808080;$C0C0C0"
Colors2="$E0E0FF;$D0D0FF;$C0C0FF;$A0A0FF;$8080FF;$6060FF;$4040FF;$2020FF;$0000FF;$0000E0;$0000C0;$0000A0;$000080;$000060;$000040;$000020"
Colors3="$E0FFE0;$D0FFD0;$C0FFC0;$A0FFA0;$80FF80;$60FF60;$40FF40;$20FF20;$00FF00;$00E000;$00C000;$00A000;$008000;$006000;$004000;$002000"
Colors4="$FFE0E0;$FFD0D0;$FFC0C0;$FFA0A0;$FF8080;$FF6060;$FF4040;$FF2020;$FF0000;$E00000;$C00000;$A00000;$800000;$600000;$400000;$200000"
Colors5="$E0FFFF;$D0FFFF;$C0FFFF;$A0FFFF;$80FFFF;$60FFFF;$40FFFF;$20FFFF;$00FFFF;$00E0E0;$00C0C0;$00A0A0;$008080;$006060;$004040;$002020"
Colors6="$FFE0FF;$FFD0FF;$FFC0FF;$FFA0FF;$FF80FF;$FF60FF;$FF40FF;$FF20FF;$FF00FF;$E000E0;$C000C0;$A000A0;$800080;$600060;$400040;$200020"
Colors7="$FFFFE0;$FFFFD0;$FFFFC0;$FFFFA0;$FFFF80;$FFFF60;$FFFF40;$FFFF20;$FFFF00;$E0E000;$C0C000;$A0A000;$808000;$606000;$404000;$202000"
Colors8="$E8E8E8;$E0E0E0;$D0D0D0;$C0C0C0;$B8B8B8;$B0B0B0;$A0A0A0;$909090;$808080;$707070;$606060;$505050;$404040;$303030;$202020;$101010"
Colors9="$F0FFE0;$E0FFC0;$D0FFA0;$C0FF80;$B0FF60;$A0FF40;$90FF20;$80FF00;$FFF0E0;$FFE0C0;$FFD0A0;$FFC080;$FFB060;$FFA040;$FF9020;$FF8000"
Colors10="$F0E0FF;$E0C0FF;$D0A0FF;$C080FF;$B060FF;$A040FF;$9020FF;$8000FF;$E0F0FF;$C0E0FF;$A0D0FF;$80C0FF;$60B0FF;$40A0FF;$2090FF;$0080FF"
Colors11="$FFE0F0;$FFC0E0;$FFA0D0;$FF80C0;$FF60B0;$FF40A0;$FF2090;$FF0080;$E0FFF0;$C0FFE0;$A0FFD0;$80FFC0;$60FFB0;$40FFA0;$20FF90;$00FF80"
Colors12="$E0FF80;$A0FF80;$FFE080;$FFA080;$E080FF;$A080FF;$80E0FF;$80A0FF;$FF80E0;$FF80A0;$80FFE0;$80FFA0;$708040;$807040;$704080;$407080"
Colors13="$E0FFC0;$A0FFC0;$FFE0C0;$FFA0C0;$E0C0FF;$A0C0FF;$C0E0FF;$C0A0FF;$FFC0E0;$FFC0A0;$C0FFE0;$C0FFA0;$804070;$408070;$708060;$807060"
Colors14="$E0C080;$A0C080;$C0E080;$C0A080;$E080C0;$A080C0;$80E0C0;$80A0C0;$C080E0;$C080A0;$80C0E0;$80C0A0;$706080;$607080;$806070;$608070"
Colors15="$C0C0FF;$E0D0FF;$C0FFC0;$E0FFD0;$FFC0C0;$FFE0D0;$E0E0FF;$A0A0FF;$E0FFE0;$A0FFA0;$FFE0E0;$FFA0A0;$706040;$607040;$704060;$407060"
Colors16="$C0C0E0;$C0C0A0;$C0E0C0;$C0A0C0;$E0C0C0;$A0C0C0;$A0E0FF;$E0A0FF;$A0FFE0;$FFA0E0;$E0FFA0;$FFE0A0;$604070;$406070;$FFFFFF;$000000"

...

Формат файла шаблонов прописей и валюты (Common.*.sfs)

Шаблон прописей и валюты используется при работе программ клиентов (консольного и визуального). Файл загружается при запуске в момент использования функций прописи SpellNumber, FormatCurrency или FormatDate, и, в зависимости от указанного при вызове функции языка, имеет дополнительный суффикс (к примеру, ru, для русского, т.е. полное имя файла будет выглядеть следующим образом: Common.ru.sfs). Шаблон является текстовым файлом в формате UTF-16 с BOM. Разделение строк осуществляют два символа с кодами 13 и 10. Комментарии в файле могут следовать только отдельными строками и должны начинаться на знак ;. Файл имеет следующую структуру:

[Months]
;Далее следуют полные наименования месяцев на языке шаблона. Первая буква должна быть прописной, остальные строчными.
January="Январь"
February="Февраль"
March="Март"
April="Апрель"
May="Май"
June="Июнь"
July="Июль"
August="Август"
September="Сентябрь"
October="Октябрь"
November="Ноябрь"
December="Декабрь"

[MonthsShort]
;Далее следуют краткие наименования месяцев на языке шаблона. Каждое из наименований должно иметь не более 3 букв, первая буква должна быть прописной, остальные строчными.
January="Янв"
February="Фев"
March="Мар"
April="Апр"
May="Май"
June="Июн"
July="Июл"
August="Авг"
September="Сен"
October="Окт"
November="Ноя"
December="Дек"

[MonthsGenitiveCase]
;Далее следуют полные наименования месяцев на языке шаблона в родительном падеже, если применимо с точки зрения языка 
;  (в случае, если не применимо, в разделе должны повторяться значения раздела [Months]). Первая буква должна быть прописной, остальные строчными.
January="Января"
February="Февраля"
March="Марта"
April="Апреля"
May="Мая"
June="Июня"
July="Июля"
August="Августа"
September="Сентября"
October="Октября"
November="Ноября"
December="Декабря"

[DaysOfTheWeek]
;Далее следуют полные наименования дней недели на языке шаблона. Первая буква должна быть прописной, остальные строчными.
Monday="Понедельник"
Tuesday="Вторник"
Wednesday="Среда"
Thursday="Четверг"
Friday="Пятница"
Saturday="Суббота"
Sunday="Воскресенье"

[DaysOfTheWeekShort]
;Далее следуют краткие наименования дней недели на языке шаблона. Каждое из наименований должно иметь не более 3 букв, первая буква должна быть прописной, остальные строчными.
Monday="Пнд"
Tuesday="Втр"
Wednesday="Срд"
Thursday="Чтв"
Friday="Пят"
Saturday="Суб"
Sunday="Вск"

[Numbers]
;Здесь следует раздел для создания прописи цифр, каждая переменная начинается на префикс рода или количества, далее следует цифра, пропись которой указывается в значении переменной. 
;Первая буква значений переменных должна быть прописной, остальные строчными.
;Переменные указываются для всех цифр а также порядков цифр, имеющих отличающееся написание в языке шаблона
;Доступны следующие префиксы:
;"M<цифра>" -- цифра прописывается в мужском роде
;"F<цифра>" -- цифра прописывается в женском роде, если женский род цифр в языке отсутствует, переменная не указывается
;"P<цифра>" -- переменная задает альтернативное написание в случае, когда необходимо употребить множественное число вместо рода
;  (к примеру, "одна тысяча" -- женский род, "один миллион" -- мужской, "десять тысяч" -- множественное число)
;  переменная может быть пропущена, если пропись множественного числа цифры совпадает с мужским или женским родом
;"C<цифра>" -- переменная задает суффикс (падеж) альтернативной прописи цифр порядков, которая начинается на данную. Переменная может быть указана только для цифр 0..9.
;  (к примеру, для цифры 4 укажем доп. суффикс "G", далее зададим переменную P1000G равную "Тысячи", тогда как обычная P1000 равна "Тысяч",
;   4000 будут прописаны, как "четыре тысячи", а 5000, как "пять тысяч").
;"G<цифра>" -- переменная указывает на род цифры, по умолчанию для цифр принимается мужской род. Для языков, где род не важен, переменная не указывается
;
;Дополнительные переменные, используемые в разделе:
;"Minus" -- пропись слова "минус" на требуемом языке
;"HundredsDelimiter" -- фраза-разделитель сотен ("And" используется для британского и европейского английского, для американского английского не указывается)
;"TensHyphen" -- фраза-разделитель десятков в прописи ("-" используется для английского, к примеру 67 превращается в "sixty-seven")
;
;Далее следует пример для русского языка
Minus="Минус"
M0="Ноль"
M1="Один"
F1="Одна"
M2="Два"
F2="Две"
C2="G"
M3="Три"
C3="G"
M4="Четыре"
C4="G"
M5="Пять"
M6="Шесть"
M7="Семь"
M8="Восемь"
M9="Девять"
M10="Десять"
M11="Одиннадцать"
M12="Двенадцать"
M13="Тринадцать"
M14="Четырнадцать"
M15="Пятнадцать"
M16="Шестнадцать"
M17="Семнадцать"
M18="Восемнадцать"
M19="Девятнадцать"
M20="Двадцать"
M30="Тридцать"
M40="Сорок"
M50="Пятьдесят"
M60="Шестьдесят"
M70="Семьдесят"
M80="Восемьдесят"
M90="Девяносто"
M100="Сто"
M200="Двести"
M300="Триста"
M400="Четыреста"
M500="Пятьсот"
M600="Шестьсот"
M700="Семьсот"
M800="Восемьсот"
M900="Девятьсот"
M1000="Тысяча"
P1000="Тысяч"
P1000G="Тысячи"
G1000="F"
M1000000="Миллион"
P1000000="Миллионов"
P1000000G="Миллиона"
G1000000="M"
M1000000000="Миллиард"
P1000000000="Миллиардов"
P1000000000G="Миллиарда"
G1000000000="M"
M1000000000000="Триллион"
P1000000000000="Триллионов"
P1000000000000G="Триллиона"
G1000000000000="M"
M1000000000000000="Квадриллион"
P1000000000000000="Квадриллионов"
P1000000000000000G="Квадриллиона"
G1000000000000000="M"
M1000000000000000000="Квинтиллион"
P1000000000000000000="Квинтиллионов"
P1000000000000000000G="Квинтиллиона"
G1000000000000000000="M"
M1000000000000000000000="Секстиллион"
P1000000000000000000000="Секстиллионов"
P1000000000000000000000G="Секстиллиона"
G1000000000000000000000="M"

;Далее следуют разделы для прописи любой из валют на языке шаблона, имена разделов [Currency\<Имя валюты>]
;Каждая валюта записывается тремя латинскими буквами, которые указываются при вызове функции FormatCurrency
;Первая буква значений переменных должна быть прописной, остальные строчными.

[Currency\RUB]
;MainName -- задается основное наименование валюты в именительном падеже, если применимо
MainName="Рубль"

;MainNameGender -- задается род основного наименования валюты. Род используется для прописи чисел этой валюты
;  если род мужской, переменную можно пропустить
MainNameGender="M"

;MainGenitiveCase -- задается основное наименование валюты в родительном падеже, если применимо
MainGenitiveCase="Рубля"

;MainGenitiveCasePlural -- задается основное наименование валюты во множественном числе, если написание отличается от единственного числа
MainGenitiveCasePlural="Рублей"

;AdditionalName -- задается альтернативное (сотые доли) наименование валюты в именительном падеже, если применимо
AdditionalName="Копейка"

;AdditionalNameGender -- задается род альтернативного (сотые доли) наименования валюты. Род используется для прописи чисел этой валюты
;  если род мужской, переменную можно пропустить
AdditionalNameGender="F"

;AdditionalGenitiveCase -- задается альтернативное (сотые доли) наименование валюты в родительном падеже, если применимо
AdditionalGenitiveCase="Копейки"

;AdditionalGenitiveCasePlural -- задается альтернативное (сотые доли) наименование валюты во множественном числе, если написание отличается от единственного числа
AdditionalGenitiveCasePlural="Копеек"

;Abbreviation -- задается сокращенное написание валюты (знак ₽ может быть не задан в системных шрифтах)
Abbreviation="р."

;AbbreviationBeforeNumber -- переменная задает режим (значение = 1), когда сокращенное наименование следует до числа, не в режиме прописи (к примеру, €100)
AbbreviationBeforeNumber="0"

;Далее показаны примеры для долларов и евро

[Currency\USD]
MainName="Доллар"
MainGenitiveCase="Доллара"
MainGenitiveCasePlural="Долларов"
AdditionalName="Цент"
AdditionalGenitiveCase="Цента"
AdditionalGenitiveCasePlural="Центов"
Abbreviation="$"
AbbreviationBeforeNumber="1"

[Currency\EUR]
MainName="Евро"
MainGenitiveCase="Евро"
MainGenitiveCasePlural="Евро"
AdditionalName="Цент"
AdditionalGenitiveCase="Цента"
AdditionalGenitiveCasePlural="Центов"
Abbreviation="€"
AbbreviationBeforeNumber="1"