===============================================================================
Предыдущие записи в файле "Новенькое.txt" "Старенькое.txt"

21.02.2018

- ТБ.Скрипт: поддержка "слабых" ссылок на объект. Слабые ссылки не увеличивают 
  счетчик ссылок на объект, что в ряде случаев позволяет избежать проблем с
  циклическими зависимостями и связанной с ними утечкой памяти.

  Для описания слабых ссылок используется ключевое слово Weakref (СлабаяСсылка):
    var Owner :weakref SomeObject;

  запись
    var Owner :weakref;

  равносильна
    var Owner :weakref object;

  Weakref можно использовать так-же как объект в большинстве случаев, например,
  вызывать методы объекта.

  Wekref/Object можно напрямую присваивать друг другу и сравнивать между собой.

  При уничтожении объекта все слабые ссылки на него автоматически обнуляются:

    proc Test;
      var O :Object;
      var R :Weakref;

      O = SomeObject.Create;
      R = O;

      O = nil;
      assert(R = nil);
    end;

  В связи с этим, например, следующий код не имеет смысла:

    proc Test;
      var R :Weakref;
      R = SomeObject.Create;
      assert(R = nil);  -- Объект уничтожатся сразу после создания, т.к на него нет ссылок
    end;


16.03.2018

- ТБ.Скрипт: В класс TableColumn добавлено свойство:

    field Tag :Variant 


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


19.03.2018

- Динамическая смена иконок при смены темы, иконки могут загружаться 
  из каталога, указанного в теме.

- Экспериментальная тема (Florian) с черно-белыми иконками

- Тестовая поддержка SVG (только x32, с надписью Trial)

- Возможность отключать главное меню (не отключайте все!)

*** Build 10013 ***

- WEB: Ошибка при одновременном вызове через одно персональное подключение

*** Build 10014 ***

- Первая реализация анонимных функций (замыканий - closure), подробное описание - позже

- Много переделок в компиляторе/интерпретаторе ТБ.Скрипт - требуется наблюдение

- Поддержка векторного графического формата SVG

- Набор черно белых SVG иконок для темы Florian

- Возможность менять картинку рабочего стола программы при смене Skins.
                                                                       
*** Build 10015 ***

05.04.2018

- ТБ.Скрипт: новые директивы препроцессора:

  #Deprecated {"Message"};

  - Директива пишется перед определением свойства класса.
    Помечает свойство класса как устаревшее. При любом обращении к устаревшему
    свойству будет выдаваться предупреждение при компиляции. Пока работает 
    только для свойств, не работает для классов и типов.

  #DebugInfo On/Off;

  - Позволяет включать/отключать генерацию отладочной информации для
    определенных фрагментов ТБ.Скрипт

  #Dynamic On/Off;

  - Директива пишется перед ключевым словом Class.
    Помечает скриптовой класс как поддерживающий динамическую диспетчеризацию.

- Если скриптовой класс поддерживает динамическую диспетчеризацию, то в нем
  могут быть определены методы диспетчеризации "по умолчанию", которые 
  вызываются если свойство не найдено по имени. Методы имеют фиксированный
  формат и должны называться:

  InClass 

    func OnGetClassField(Name :String) :Variant;
    proc OnSetClassField(Name :String; Value :Variant);

  InObject 

    func OnGetField(Name :String) :Variant;
    proc OnSetField(Name :String; Value :Variant);

  Не обязательно описывать все.

- Набор черно белых SVG иконок в стиле Regular

*** Build 10016 ***

18.01.2018

ТБ.Скрипт:

- #Deprecated может относиться к классам и типам, для классов директиву 
  нужно писать перед ключевым словом Class.

- Новый способ описания строковых литералов: многострочные строки.
  Задаются с помощью 3-го типа кавычек: `xxx` (обратная кавычка или "гравис")

  Пример:

    Str = `abc
           def
           xyz`;

  Ранее для этого нужно было писать что-то типа:

    Str = "abc" + chr(13) + chr(10) +
          "def" + chr(13) + chr(10) +
          "xyz";

  Обратите внимание:

  1. В качестве перевода строк всегда используется CRLF
  2. Для второй и последующих строк отсекаются N ведущих пробелов,
     где N = начальной позиции первой строки литерала.

- Частичная поддержка замыканий в Evaluate. Можно вычислять замыкания
  в Evaluate или возвращать замыкания из Evaluate.

  Пример, вычисления факториала 33! с помощью Evaluate:

  Evaluate(
    `(func(N :Integer) :Numeric
       var i :Integer;
       Result = 1;
       for i = 1..N do
         Result = Result * i;
       end;
     end)(33)`)

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

  var Factorial :func(N :Integer) :Numeric = 
    Evaluate(
      `func(N :Integer) :Numeric
         var i :Integer;
         Result = 1;
         for i = 1..N do
           Result = Result * i;
         end;
       end`);
  Trace( Factorial(33) );

*** Build 10017 ***

17.04.2018

- Поддержка стилей (skins) в шаблонах

*** Build 10018 ***

18.04.2018

- Исправлена ошибка при программной установке обработчиков объекта шаблона CardTree

*** Build 10019 ***

19.04.2018

- Добавлена регистрация графического типа SVG

- Исправлена ошибка использования стилей в шаблонах при не 100% масштабе

*** Build 10020 ***

11.05.2018

- Первая версия стека форм, для тестирования. По умолчанию отключен, включается:

  Настройки программы -> Бланки -> Общие
    [x] Использовать стек форм

- В перечислимый тип Window.WindowStyles добавлено значение:

    StackedWindow  = 5

- Обработчик события Blank.BeforeClose получает ModalResult даже если бланк 
  был открыт немодально (раньше немодальные бланки всегда получали cmCancel)

- Исправлен метод Template.EndEdit. Теперь он закрывает Inplace редактор 
  в том шаблоне, у которого вызван, даже если тот не текущий. 

- В класс Image добавлены методы:

    field Color :Integer
    field Shaping :Logical

*** Build 10021 ***

15.05.2018

- Доработки стека форм (анимация, сохранение на рабочем столе, закрытие полуформ, печать)

*** Build 10022 ***

17.05.2018

- Доработки стека форм (закрытие полуформ, изменение размера)

- Исправлена ошибка присвоения: Windows.Icon <- SVG

- Исправлена ошибка c замыканиями внутри with.

*** Build 10023 ***

05.06.2018

- Доработки визуальных стилей:
  - Новые стили таб-ов
  - Новый стиль навигационной цепочки
  - Доработан список стилей

- В навигационной цепочке добавлена команда "Поднять окно"

- ТБ.Скрипт:

  - В программный интерфейс FieldEdit добавлено свойство:
      field Value :Variant

  - Событие клетки шаблона OnEnter вызывается с новым типом Action:
      Action = Template.AfterEnter  -- == 3

    Этот Action возникает при обычном входе в поле, после создания 
    inplace-редактора. Т.е. теперь при обычном входе в поле событие
    OnEnter вызывается 2 раза:
      1: Action = Template.Enter, Template.CurrentEdit = nil
      2: Action = Template.AfterEnter, Template.CurrentEdit <> nil

  - В настройках WEB сервера добавлена возможность ограничения количества
    анонимных соединений к одной инф.базе.

    Настройка задается в файле Servers.ini:

    [HTTP\Alias\xxx]
    ...
    MaxPool=3
    ...

  - Исправлено несколько ошибок в сетевом протоколе

  - Мультиплексирование сетевых соединений временно отключено

*** Build 10024 ***

09.06.2018

- Замыкания содержат слабую ссылку объект - это избавляет от ряда
  циклических зависимостей

- При компиляции избавляемся от лишних warning'ов
  Обращение к классу "..." недопустимо на сервере

*** Build 10025 ***

19.06.2018

- Новая команда "Зафиксировать окно" (Window.Fix), по умолчанию доступна
  через Popup-меню закладки окна.

  Зафиксированные окна автоматически перемещаются в начало списка окон,
  их нельзя закрыть по команде Close / CloseAll. Чтобы закрыть зафиксированное  
  окно нужно сначала снять фиксацию. Визуально зафиксированные окна 
  отличаются отсутствием кнопки закрытия на закладке.

  Для программной фиксации окна в класс Window добавлено свойство:

  field Fixed :Logical

- В класс System добавлена функция:

  func ReplaceStrings (Text :String; Old :String[]; New :String[]; ReplaceAll :Logical = True; IgnoreCase :Logical = True) :String

  Для эффективной групповой замены подстрок в строке. В строке Text ищутся
  вхождения одной из сток массива Old и заменяются на соотв. строку массива New.

  ReplaceString("Hello, World!", ["Hello", "World"], ["Привет", "Мир"]) -> "Привет, Мир!"

  Если длина массива Old < New то в качестве недостающих замен будет использована 
  последняя строка из New

  ReplaceString("Hello, World!", [",", "!", " "], ["_"]) -> "Привет__Мир_"

- Еще меньше warning'ов

- Поддержка компиляции под Delphi 10.2

*** Build 10026 ***

22.06.2018

- ТБ.Скрипт: метод ClassFileName перенесен из Kernel.Form в Kernel.UserObject

  В класс Console добавлен метод:

    proc OpenSourceFile (FileName :String)

  Который открывает файл в проектировщике, если сессия запущена под отладчиком.

  В совокупности эти два метода позволяют поддержать привычное поведение 
  перехода на класс текущей формы в отладчике (F4) для серверных форм.

- Новая возможность: ручная группировка закладок окон. Для группировки перетаскивайте
  закладку удерживаю кнопку Ctrl. Сгруппированные окна переключаются через
  выпадающее меню на закладке, по двойному клику на закладке или по F4.

- Исправлены ошибки с прокруткой и фокусировкой в шаблонах

*** Build 10027 ***

27.06.2018

- Версия Turbo X собирается с поддержкой многоязычности (Max == Int)

- Улучшена поддержка фиксации окон

- ТБ.Скрипт: В класс SessionInfo добавлены свойства:

  field SystemLocale :String
  field SessionLocale :String
  field ClientLocale :String

  Они возвращают 2-х буквенный идентификатор языка ("ru", "en")

  SystemLocale - язык, установленный в настройках Windows для 
    текущего пользователя

  SessionLocale - По умолчанию = SystemLocale, но может быть 
    изменен при запуске клиента Turbo.exe в ключом /Locale=xx

  ClientLocale - язык, используемый клиентским приложением Turbo.exe.
    По возможности = SessionLocale, если присутствуют соотв.
    языковые ресурсы. Если они не найдены = "en" или "ru", 
    в зависимости от SystemLocale.

*** Build 10028 ***

04.07.2018

- ТБ.Скрипт: Getters/Setters для свойств.

  синтаксис:

  var FieldName :TSomeType get <Замыкание-getter> [ set <Замыкание-Setter> ];


  Пример:

  private
    var FInternalField :String;

  public
    var FaceField :String 
      get func :String
        Result := FInternalField;
      end
      set proc(NewValue :String)
        FInternalField = NewValue;
        -- Пересчёт...
      end;


  Допустим комбинированный синтаксис:

    var FaceField :String = FInternalField
      set proc(NewValue :String)
        FInternalField = NewValue;
        -- Пересчёт...
      end;


  Замечание 1: Т.к. get/set стали ключевыми словами, могут быть ошибки
    при компиляции старых исходных текстов, в которых они могли 
    использоваться в качестве идентификаторов. 

  Замечание 2: Для получения замыканий (getter/setter) исполняется выражение
    которое может быть нестатическим, т.е. вызывать функции высшего порядка.
    Полученный результат-замыкание запоминается для дальнейшего использования.
    Для inclass свойств замыкание вычисляется один раз для каждого класса.
    Для inobject свойств - один раз для каждого объекта.

    Пример:

    var MyField1 :String get MakeGetter('MyField1');
    var MyField2 :String get MakeGetter('MyField2');

    func MakeGetter(aFieldName :String) :func :String;
      Result =
        func :String
          Result = FInternalStorage.GetField(aFieldName);
        end;
    end;

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


- Свойство Form.Visible теперь делает синхронное закрытие немодальных форм.
  Т.е.:
  Form.Visible = False;
  <>
  Form.Close;

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

*** Build 10029 ***

- ТБ.Скрипт: "Короткие" замыкания - простой способ превратить обычные процедуры
  или функции в замыкания. Если в выражении написать: @ИмяПроцедуры то это
  будет эквивалентно созданию замыкания с таким же прототипом как у этой
  процедурЫ, перевызывающего ее с передачей всех параметров.
  
  Например, если у вас есть процедура:

  proc Some(Sender :IControl);
  end;


  А по синтаксису требуется замыкание, то вместо:

  Button1.OnClick = proc(Sender :IControl) Some(Sender); end;

  теперь можно писать:

  Button1.OnClick = @Some;


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

  private
    var FInternalField :String;

    func GetMyField :String;
      Result = FInternalField;
    end;

    proc SetMyField(aNewValue :String);
      FInternalField = NewValue;
      -- Пересчёт...
    end;

  public
    var FaceField :String get @GetMyField set @SetMyField;


  Если Getter не нужен, можно упростить:

    var FaceField :String get @FInternalField set @SetMyField;

  Или

    var FaceField :String = FInternalField set @SetMyField;

*** Build 10030 ***

- ТБ.Скрипт: Добавлен новый класс RTTI: PackageInfo, а в класс ClassInfo
  новое свойство, которое его возвращает:

  field Package :PackageInfo

- В класс System добавлена функция:

  func CopyClosure (Closure :Variant; Self :Variant) :Variant

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

*** Build 10031 ***

- Расширенный синтаксис #Deprecated, для пометки регионов:

  #Deprecated On {"Message"};
  #Deprecated Off;

  Все идентификаторы расположенные в регионе между On-Off
  будут помечены как устаревшие с общим сообщением.

- Поддержка #Deprecated в MTL

- Стили scroll-bar'ов можно настраивать через *,skin файлы.
  Настроены стили для темы TurboX

*** Build 10032 ***

- Временно отключил стилизацию scroll-bar'ов из-за ошибок

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

  [x] Путь к файлу

*** Build 10033 ***

- При перекрытии вычислимых полей Getter/Setter наследуется.
  Т.о. можно "уточнять" тип поля в наследнике базового класса.

- Подсветка предупреждений в текстовом редакторе. Отключается
  в настройках редактора на странице "Синтаксис".

- Исправлена ошибка с запрещением форм под отладчиком

*** Build 10034 ***

- Пополнение словаря перевода

- Исправление AV при отладке

- Исправление отображения запрещенных CheckBox'ов в Skin'е TurboX

*** Build 10035 ***

- Синонимы в MTL

- Улучшенный показ ошибок при компиляции MTL

- Новые иконки для сервера и 64-х разрядного клиента

- Исправление ошибки зависания отладчика при показе объектов с Getter'ами

- Рефакторинг DbsCliObjects

*** Build 10036 ***

- Синонимы в MTL, улучшена диагностика ошибок

*** Build 10037 ***

- Синонимы в MTL, отлавливается еще несколько типов ошибок

- Улучшена диагностика ошибок при реорганизации

*** Build 10038 ***

- Исправление ошибки с реорганизацией

*** Build 10039 ***

- Исправлена ошибка периодического падения 64-х разрядного сервера

- Исправлена ошибка зависания клиентов при ошибках нехватки системных ресурсов 
  при запуске из под планировщика (с ключом /Silence)

- Исправлена ошибка импорта документов с пустым иерархическим путем

- Исправлено AV при обработке кнопок во время завершения сессии

- Оптимизации аллокации памяти

- Оптимизации отладочного менеджера памяти

*** Build 10040 ***

- Переименования и иконки

*** Build 10041 ***

23.08.2018

- Расширение программного интерфейса к отчетам. 

  Report:
    ShowTotalsOptions
      const opAlways  = 0
      const opBefore  = 1        
        -- Итоговая колонка слева / итоговая строка сверху

  Например:

    vRep.Split[Report.rdRow].ShowTotalsOption[Report.opBefore] = True;
    vRep.Split[Report.rdCol].ShowTotalsOption[Report.opBefore] = True;


  ReportSplit:
    field ShowTotalsPercent :Logical
      -- Выводить итоговую строку в %, имеет смысл только для разбиения по строкам.


  Настройка разбиения "Разносить дебет с кредитом":

  Report:
    field SumKindSplit :Logical
    field SumKindSplitOption [SumKind :Report.SumKinds; {DebCre :Report.SumDebCre}] :Logical


  Прочие настройки отображения:

  Report:
    type ShowReportOptions = enumeration
       const opAdjustEndSaldoDate  = 0
       const opAdaptInlineContents  = 1

       const opIndicatorRow  = 2
         -- Включать в отчет строки показателей
       const opDebCreRow  = 3
         -- Включать в отчет строку дебета кредита
       const opSumKindRow  = 4
         -- Включать в отчет строку оборотов, остатков
       const opTabHeaderAtTop  = 5
         -- Заголовки таблицы сверху (имеет смысл только если есть склеенные таблицы)
       const opSwapDebCre  = 6
         -- Кредит перед дебетом
       const opFreezeHeader  = 7
         -- Замораживать шапку
       const opFreezeSide  = 8
         -- Замораживать боковину
       const opPrintHeaders  = 9
         -- Печатать заголовки

  Например:

    vRep.ShowReportOption[ Report.opFreezeHeader ] = True;
    vRep.ShowReportOption[ Report.opFreezeSide ] = True;


- Улучшено масштабирование иконок в меню и шаблонах

*** Build 10042 ***

27.08.2018

- Улучшенное масштабирование иконок

*** Build 10043 ***

28.08.2018
  
- ТБ.Скрипт. В класс Structure добавлено свойство EditStruct. Оно переводит
  документ в состояние редактирования (если еще не) и одновременно активизирует
  периодическую структуру, если надо.

*** Build 10044 ***

29.08.2018

- Улучшенная поддержка slide-хостов

- Исправление ошибки кэширования проектов

*** Build 10045 ***

03.09.2018

- Доработки картотек на шаблонах:
  - Работают команды Импорт/Экспорт
  - Работает команда Печать
  - Работает сравнение записей
  - Работает настройка клавиатуры

- Исправлена ошибка фокуса для старых картотек

*** Build 10046 ***

04.09.2018

- Доработки программного открытия Stacked форм

*** Build 10047 ***

05.09.2018

- Исправление ошибки установки IndicatorValue в Report

*** Build 10048 ***

11.09.2018

- Доработки утилиты перевода

- Оптимизация именованных объектов в ТБ.Скрипт и Сервере Расчетов.

*** Build 10049 ***

14.09.2018

- Доработки утилиты перевода: переход на исходный текст (F4),
  исправление ошибок.

- Прерывание Profile.Init под отладчиком прерывает всю цепочку.

*** Build 10050 ***

18.09.2018

- Добавлена быстрая фильтрация в окне сообщений

- Добавлены иконки

- Исправлены ошибки: AV в диалоге отчета, надписи в системных диалогах

*** Build 10051 ***

- ТБ.Скрипт: в программный интерфейс Window добавлено:

    field StackIndex :Integer

  Свойство позволяет определить, использует ли форма стек (полу)окон,
  и какой у нее номер в стеке. Если значение = 0, то стек не используется.

- В редактор перевода добавлена настройка цветов.

*** Build 10052 ***

- Добавлены иконки, изменены надписи, исправлены ошибки

*** Build 10053 ***

- В программный интерфейс Command добавлено свойство:

    field List :List

  Позволяющее создавать команды со списком.

  Замечания:

  1. Свойство можно использовать только для программно создаваемых команд.
     Для системных команд оно всегда = nil.

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

  3. Команда со списком на тулбаре отображается а виде кнопки с выпадающим
     подменю. В меню список игнорируется.

*** Build 10054 ***

- ТБ.Скрипт. Изменения в программном интерфейсе Window:

    - Свойства Maximize/Minimize работают для Stacked форм
    - Если Docked форма лежит на Side-хосте то Minimize=True скрывает Side-хост
    - Свойство DockAlign динамически обновляется при перемещении Docked-форм

- Автоматический показ сокрытого верхнего меню при нажатии кнопки Alt

- Оптимизация создания меню

- Оптимизация отрисовки контролов 

*** Build 10055 ***

- Форма приветствия и стилизованный диалог логина. Появление формы приветствия
  можно настроить:

  Сервис -> Настройки программы -> Общие настройки -> Общие


- Новая система лицензирования. Основные отличия:
  
  1. Сервер лицензий одновременно является сервером авторизации.

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

     Из этого правила есть исключения. 

     1. Открытие администрирования
     2. Открытии проекта в редакторе проекта
     3. Выполнении задач планировщика
     4. Подключение сервера расчетов

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

     Сервер лицензий/авторизации сделан полноценным сервисом windows, 
     т.е. его нужно явно запускать (имя сервиса: TBAuth). Настройка:
       [x] Разрешить выдачу сетевых лицензий 
     стала бесполезной и будет удалена. 
     
     Вообще диалоги настройки сервера лицензий/авторизации нужно перепроектировать.

  2. Для добавлении пользователей в список администрирования требуется лицензия (и ключ)

     Нельзя добавить активных пользователей больше чем есть мест на продукт Turbo X (1000).
     Неактивные пользователи - не считаются. Так-же не считаются встроенные системные 
     пользователи, которых сейчас 6:

     Пользователь, Администратор, Сервер расчетов, Планировщик, Лицензиат, WEB Диспетчер

     Формат хранения списка пользователей изменен. Теперь пользователи хранятся в файле
     Users.dat, который является XML файлом защищенным от редактирования. Его можно
     открыть в текстовом редакторе TurboX для просмотра. Для редактирования требуется 
     мастер-ключ. Сейчас мастер-ключом выбран ключ разработчика E0004. Можно изменить.

     При первом запуске новой версии пользователи импортируются из старого Users.xml,
     При последующих запусках используется Userd.dat, а Users.xml игнорируется.

  3. Запрещена одновременная работа одного пользователя с разных рабочих мест.

     Факт одновременной работы отслеживает сервер авторизации, поэтому запрещается
     работа одного пользователя даже в разных инсталляциях TurboX, при условии,
     что они используют один сервер авторизации. Также запрещается одновременная
     работа пользователя через desktop и WEB клиентов.

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

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

     Запрет одновременная работы не действует для след. случаев:

     1. При запуске сессии из под отладчика.
     2. При запуске сессии с ролью $SafeMode
     3. При подключении WEB пользователей со специальной служебной ролью "$webproxy"


  Другие доработки

  - Для поддержки пула анонимных WEB подключений сервер авторизации автоматически
    создает служебную группу пользователей "WEB Диспетчеры" и одного пользователя
    в ней "WEB Диспетчер". Только пользователи, принадлежащие этой группе могут
    использовать роль "$webproxy". Так же они по умолчанию могут подключаться
    к любой инф.базе, как и администраторы. 

    Пользователь "WEB Диспетчер" по умолчанию используется HTTP сервером для
    подключения к серверу процедур. Явное указание других пользователей (WebUser)
    желательно удалить из настроек [HTTP\Access]

  - Всем пользователям при создании присваивается уникальный GUID, который может
    использоваться при авторизации вместо имени пользователя. Для встроенных
    системных пользователей эти GUID'ы предопределены и всегда одинаковы.

    Имена системных пользователей ("Пользователь", "Администратор") локализуются 
    в международной версии по обычным правилам. Т.е. системные пользователи
    получат имена в зависимости от того какой язык был текущим при первом 
    запуске сервера авторизации, когда он создавал файл Users.dat. При 
    последующих запусках системные пользователи ищутся по GUID и уже не могут
    быть переименованы.

  - При подключении к инф. базы по умолчанию предлагается имя системного
    пользователя "Пользователь", а не "Администратор", как ранее.

*** Build 10056 ***

22.10.2018

- Расширение программного интерфейса к отчетам. 

  Report:
    IndicatorOptions
      const opInvertValue = 9
        -- Расширенная настройка показателя -> Обратный знак

  Например:

    vRep.IndicatorByName['Сумма'].Option[ Report.opInvertValue ] = True;


  ReportSplitContent:
    field UseMacro :Logical
      -- Настройки разбиения -> Вывод -> Использовать макросы.


  Следующие настройки имеют смысл только при разбиении на таблицы по дебету/кредиту:

  ReportSplit:
    field SplitDebCreBy :Integer
      -- 0 - Не определено
      -- 1 - Остатки
      -- 2 - Обороты

  Возможно, стоит завести перечислимый тип, но пока - так

  Report:
    SubstItems
      const sbTabDebet = 3
      const sbTabCredit = 4
        -- Заголовки таблиц при разбиении на таблицы по дебету/кредиту

  Пример:

    vRep.Split[Report.rdTab].SplitType = Report.byDebCre;
    vRep.Split[Report.rdTab].SplitDebCreBy = 2;

    vRep.SubstCaption[Report.sbTabDebet] = 'Deb';
    vRep.SubstCaption[Report.sbTabCredit] = 'Cre';


23.10.2018

- Исправление проблем с авторизацией сервера процедур:
  Серверные процедуры, запущенные через программный интерфейс ProcServer
  авторизуются через сервер авторизации, как и обычные клиенты.

*** Build 10057 ***

- Исправление AV при создании ИБ

*** Build 10058 ***

26.10.2018

- Исправлена ошибка с закрытием не текущего полуокна
  Полуокна можно закрывать кликом средней кнопки мыши на закладке
  Полуокна можно перетаскивать на отдельную страницу с помощью Drag&Drop

- Исправлена ошибка с кодировкой при формировании отчетов в виде HTML строки

- ТБ.Скрипт: В класс System добавлена функция:

    func ClosureOwner (Closure :Variant) :Object

  Возвращает объект, в контексте которого создано замыкание. Может вернуть nil,
  если объект уже уничтожен (т.к. замыкание использует слабые ссылки на объект).

*** Build 10059 ***

02.11.2018

- Доработано форматирование отчета в HTML. Если включить опцию

  [x] Включать значения разбиений

  То в HTML включаются дополнительные теги, из которых можно получить
  информацию для построения уточняющих отчетов. Эти теги имеют префикс r:
  (типа, xml-namespace) и след. имена:
    r:tab  - Значение разбиения на таблицы (если есть)
    r:col  - Значение разбиения на колонки (если есть)
    r:row  - Значение разбиения на строки
    r:ind  - Номер показателя и вид суммы в формате "N:XX",
             Где XX совпадает с Com.Consts.TSumParts

  Одновременно с этим включается режим оптимизации стилей. При этом
  используются множественные классы (CSS2) - не совместимо с MS Office.

  Программно этот режим можно включить:

    MyReport.ShowReportOption[Report.opPreciseValues] = True;

- Turbo X собирается в 2-х редакциях Max и Standart.

*** Build 10060 ***

07.11.2018

- Форматирование отчета в HTML. Изменены имена доп. тегов для соотв. HTML5:
  Вместо r:xxx используется data-xxx

- Тестовая версия редактора ресурсов.

- В редакцию Standart включен Web Server.

*** Build 10061 ***

08.11.2018

- Для отчетов отрабатывает событие BeforeClose

- Изменены настройки формы Welcome - теперь ее можно использовать одновременно 
  с запоминанием текущего проекта/сессии.

- Исправлена ошибка: AV при закрытии полу-форм с включенным PrintPreviw

- Исправлена ошибка: AV на сервере авторизации при принудительном отключении пользователей.

*** Build 10062 ***


09.11.2018

- Исправлена ошибка при восстановлении синхрореплики

  (Поле "Roles.Roles" документа "Kernel.Settings.User" ссылается на несуществующий 
  документ "Kernel.Settings.Role". Перекомпилируйте проект "Kernel".)

*** Build 10063 ***

15.11.2018

- XML парсер поддерживает пути с макросами (%Project%, etc)

- Исправление AV при регистрации классов документов

- Исправление ошибки с битовыми AND/OR в Фильтрах

- Разные доработки в редакторе ресурсов

*** Build 10064 ***

22.11.2018

- Именованные инсталляции. В разделе Servers.ini [Installation] вместо
  параметра Number=NNN можно использовать параметр Name=XXX, задающий
  строковое имя инсталляции. Имя должно содержать только алфавитно-цифровые
  символы. Национальные символы допустимы, но не желательны, т.к. при
  этом могут быть проблемы с управлением именованными сервисами через
  командную строку (net start ...). Старый формат (Number=NNN) тоже 
  поддерживается, при этом номер считается строковым именем.

  [Installation]
  Name=Test

  Инсталлятор так же доработан для поддержки именованных инсталляций


- Таймаут отключения неактивных WEB клиентов. По умолчанию = 15 мин.
  Пока настраивается только вручную в файле Servers.ini:

  [HTTP]
  ; Таймаут в сек
  IdleTimeout=600    

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

  Настройки программы -> Формы -> Общие
  [x] Сдвигать форму после закрытия дочерней

- ТБ.Скрипт: в класс List добавлен итератор экспериментальный итератор Each:

*** Build 10065 ***

27.11.2018

- Доступ к локальным переменным внешних функций из замыканий. Теперь замыкания
  имеют полноценную реализацию соотв. концепции функциональных языков.

  Пример функции высшего порядка, создающей замыкание-итератор:

  func CreateIterator(aBase :Integer) :func :Integer;
    Result =
      func :Integer
        Result = aBase;
        aBase = aBase + 1;
      end;
  end;

  proc Test;
    var vIter :func :Integer;

    vIter = CreateIterator(0);

    Assert(vIter() = 0);
    Assert(vIter() = 1);
    Assert(vIter() = 2);
  end;


  Так же теперь можно создавать вложенные замыкания.

  Пример каррирующей функции 2-х аргументов:

  func Curry2(F :func(A, B :Variant) :Variant) :func(X :Variant) :func(X :Variant) :Variant;
    Result =
      func(A :Variant) :func(X :Variant) :Variant
        Result =
          func(B :Variant) :Variant
            Result = F(A, B);
          end;
      end;
  end;


  func Sum(A, B :Variant) :Variant;
    Result = A + B;
  end;


  proc Test;
    Assert( (Curry2(@Sum)(1))(2) = Sum(1, 2) );
  end;


*** Build 10066 ***

- Доработки Cardfile / TemplateCardfile:

  1. Добавлено свойство 

       field CurrentEdit :FieldEdit

  2. Расширен формат обработчика CardfileColumn.OnEnter:

       func OnEnter (Column :CardfileColumn; Rec :Record; Action :Template.EnterTypes) :Logical

     Добавлен параметр Action, по аналогии с TemplateCell.OnEnter
     Старый формат поддерживается для совместимости, но выдает предупреждение при компиляции.

- Доработана отладка замыканий 

- Исправлена ошибка закрытия полу-форм


*** Build 10067 ***

- Поддержка регулярных выражений PCRE.
  https://www.pcre.org/ 
  http://www.pcre.ru/docs/perl/text/intro/

  В диалогах поиска синтаксис регулярных выражение (Turbo/PCRE) можно выбирать
  с помощью переключателя (по умолчанию используется синтаксис Turbo)

  Если используется PCRE то при замене возможно использование нумерованных 
  или именованных групп:

  (\d+)\.(\d+)\.(\d+)  ->  $3.$2.$1

  (?P<day>\d+)\.(?P<mon>\d+)\.(?P<year>\d+) -->  ${year}.${mon}.${day}


- ТБ.Скрипт: добавлены классы для программного доступа к регулярным выражениям.
  Поддерживаются операции поиска и замены, в том числе с итераторами.

  RegExp:

  inclass
    type Options = enumeration
      const IgnoreCase  = 0
      const TurboRegExp  = 1
    func Create (Mask :String; {Options :RegExp.Options[]}) :RegExp
    func MatchMask (Text :String; Mask :String; {Options :RegExp.Options[]}) :Logical
    func PosMask (Text :String; Mask :String; {From :Integer}; {Options :RegExp.Options[]}) :Integer
    func FindMask (Text :String; Mask :String; {From :Integer}; {Options :RegExp.Options[]}) :Finding
    func EachMask (Text :String; Mask :String; Proc :Variant; {Pos :Integer}; {Options :RegExp.Options[]}) :Integer
    func ReplaceExMask (Text :String; Mask :String; Proc :Variant; {Count :Integer}; {Options :RegExp.Options[]}) :String
    func ReplaceMask (Text :String; Mask :String; Replacement :String; {Count :Integer}; {Options :RegExp.Options[]}) :String

  inobject
    func Match (Text :String) :Logical
    func Pos (Text :String; {From :Integer}) :Integer
    func Find (Text :String; {From :Integer}) :Finding
    func Each (Text :String; Proc :Variant; {Pos :Integer}) :Integer
    func ReplaceEx (Text :String; Proc :Variant; {Count :Integer}) :String
    func Replace (Text :String; Replacement :String; {Count :Integer}) :String

  Finding:

  inobject
    func Str :String
    func Pos :Integer
    func Len :Integer
    func Index :Integer
    func Count :Integer
    field SubStr [Index :Integer] :String
    field SubPos [Index :Integer] :Integer
    field SubLen [Index :Integer] :Integer
    func Found :Logical
    func Next :Logical

  Примеры использования - в проекте Demo.


- Доработки SubCardfile / TemplateSubCardfile / SubCardfileColumn (CurrentEdit + OnEnter)

- Оптимизация строковых констант в ТБ.Скрипт

- Доработана отладка замыканий 

*** Build 10068 ***

- В класс RegExp Options добавлена опция
    const MultiLine  = 2

- Событие TemplateFrame.OnMouseAction (бета)

    func OnMouseAction (Frame :TemplateFrame; Object :Object; X :Numeric; Y :Numeric; Button :Integer; Action :Template.MouseAction) :Logical

- Экспериментальная поддержка HintError

- Рефакторинг парсера

- Исправлена ошибка с короткими замыканиями.

*** Build 10069 ***

- PostgreSQL: добавление нескольких полей одним ALTER TABLE

- Расширение программного интерфейса к отчетам. 

  ReportSplit:

    field APParam :String
    field APPlan :String

- Доработки функций Console GetFromClipboard/PutToClipboard. В качестве имени формата
  можно использовать имя константы любого из стандартных форматов Clipboard Windows 
  (без CF_ спереди): Text, UnicodeText, Sylk...

  https://docs.microsoft.com/en-us/windows/desktop/dataxchg/standard-clipboard-formats

- Отдельные списки истории для обычного поиска и поиска по RegExp'ам

- Доработки OnMouseAction

*** Build 10070 ***

- Расширение программного интерфейса класса Администрирование:

  proc AddUser (Name :String; FullName :String; Description :String; Groups :String; {Enabled :Logical = True})
    -- Добавлен параметр Enabled, по умолчанию = True;


  proc SetUserPassword (Name :String; {Password :String})
    -- Параметр Password сделан необязательным, если он опущен то у пользователя будет затребована смена пароля.

  proc SetUserEnabled (Name :String; Enabled :Logical)

- Добавлен новый ключ запуска клиентского рабочего места /NoUI

  При запуске с этим ключом минимизируется потребление системных ресурсов,
  путем отключения части интерфейсных элементов: меню, тулбара etc.

  Рекомендуется использовать этот ключ при запуске клиента как робота
  из под планировщика.

  Запуск с ключом /NoUI не отменяет необходимость задавать другие ключи, 
  такие как /Silence /IgnoreDesktop etc

- Исправлена AV при завершении работы клиента, запущенного из под сервиса (?)

- Рефакторинг парсера

*** Build 10071 ***


24.12.2018

- Текстовый редактор:

  - Новая команда "Поиск слова" (Ctrl+W)
  - Если при команде поиска удерживать кнопку Shift, то поведение флага
    "Поиск текущего слова" инвертируется
  - При открытии редактора из окна сообщений или результатов поиска учитывается
    положение Slide-хоста.

- Изменены клавиатурные комбинации по умолчанию, для соответствия стандартам Windows

  Ctrl+Z        - Undo    (в дополнение к Alt+BkSp)
  Ctrl+Shift+Z  - Redo    (в дополнение к Ctrl+BkSp)
  Ctrl+O        - Open    (в дополнение к F3)
  Ctrl+P        - Print   (в дополнение к F7)
  Ctrl+F        - Find    (в дополнение к Ctrl+S)
  Ctrl+H        - Replace (в дополнение к Ctrl+R)

  Ctrl+Q, Z     - Вставка текущей даты переехала сюда.


- ТБ.Скрипт:

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

  Описание переменной может быть совмещено с ее инициализацией:

  proc Some;
    var N :Integer = 1;
    vas S :String = "Hello";
  end;

  Можно опускать имя типа, тогда тип переменной определяется на основе выражения (выведение типа):

  proc Some;
    var N = 1;
    vas S = "Hello";
  end;

  Выведение типа пока не работает для замыканий. Так же выведение отключается, если выражение
  имеет тип Variant, для безопасности.

  Для конструкции for переменная цикла может описываться вместе с инициализацией:

  for var I = 1..10 do
    Trace(I);
  end;

  Область видимости этой переменной ограничена циклом и ее нельзя модифицировать.


- ТБ.Скрипт: Новая директива препроцессора, позволяющая приписывать произвольный
  набор именованных атрибутов любой сущности ТБ.Скрипт: классу, методу, полю или типу:

  #Attr Class="Color";
  #Attr Comment="Цвет текста...";
  Field TextColor :Integer;

  Значение атрибутов может быть получено программно через классы доступа к RTTI:

  MemberInfo:
    field Help :String;
    field Attrs :Storage;

  Некоторые атрибуты будут поддерживаться инструментарием для того своих целей.
  В настоящий момент для пользовательских классов обрабатывается атрибут "Class",
  если он имеет значение:
    "Blank" - класс считается бланком
    "Card" - класс считается картотекой

  При этом класс включается в соответствующее дерево выбора. Для того, чтобы он
  открывался, класс должен иметь метод Show, аналогичный классу Form.


*** Build 10072 ***

25.12.2018

- Запоминание на рабочем столе бланков с новыми документами 

- Оптимизация циклов.

*** Build 10073 ***

26.12.2018

- Улучшена работа автодополнения

- Исправлена ошибка установки свойств отчета SubstItems sbTabDebet/sbTabCredit

*** Build 10074 ***

14.01.2019

- Картотеки: Новая команда "Редактировать в ячейке" (Kernel.Card.Run.EditInplace)
  Если в настройках картотеки разрешено редактирование в ячейке и с помощью бланка,
  то с помощью этой команды можно выбрать режим по умолчанию. В противном случае - 
  она запрещена. Команда всегда активна в окне просмотра записей.

- Новые свойства столбца картотеки (доступны только программно):

  field AutoLock :Logical
  field ActionOnType :Cardfile.ActionsOnType

  Свойство AutoLock управляет тем, будет ли текущий документ картотеки переводиться
  в режим редактирования при начале редактирования в ячейке. Имеет смысл для 
  вычислимых полей, типа группового выбора. ВНИМАНИЕ: ранее все вычислимые поля
  не переводили документ в режим редактирования, т.е. считались AutoLock = False.
  Теперь необходимо устанавливать свойство AutoLock, чтобы добиться того-же поведения.

  Свойство столбца ActionOnType управляет тем, какой действие будет сделано при
  начале набора в этом столбце. По умолчанию оно = DefaultAction, и действие
  определяется значением ActionOnType самой картотеки.

  Если установить ActionOnType = EditOnType, то в данной ячейке будет разрешено
  Inplace редактирование вне зависимости от остальных настроек картотеки. Это
  удобно использовать для реализации задач типа группового ввода.


- Шаблоны: Расширения программного интерфейса:

  FieldEdit:
    field List :List

  Список для выбора значений в поле ввода. Может заполняться в обработчике OnEnter.
  Может содержать список значений или список ассоциативных пар в одном из 2- форматов:

  1. В виде строк, разделенных "|" (старый вариант):
     "Отображаемое значение 1|ВводимоеЗначение1"
     "Отображаемое значение 2|ВводимоеЗначение2"

  2. В виде массивов пар:
     ["Отображаемое значение 1", ВводимоеЗначение1]
     ["Отображаемое значение 2", ВводимоеЗначение2]

  Во втором варианте ВводимоеЗначение может быть любого типа, в том числе - ссылочного.
  Список может быть у поля любого типа, не только перечислимого.


  TemplateCell:
    field ButtonStyle :Template.ButtonStyles

  Где:

  Template:
    type ButtonStyles = enumeration
      const NoButton  = 0
      const DefaultButton  = 1
      const LookupButton  = 2
      const ComboButton  = 3

  Заменяет устаревшее свойство Button :Logical. Управляет поведением кнопки обзора
  у поля и иконкой на ней.

    NoButton - кнопки нет, аналогично Button = False
    DefaultButton - кнопка по умолчанию (в зависимости от типа поля), аналогично Button = True
    LookupButton - на кнопке всегда рисуется "...", действие по умолчанию - в зависимости от типа поля.
    ComboButton - на кнопке всегда рисуется "v", действие по умолчанию - открытие списка


- Новое свойство класса Console:

  field UserLookupFilter :String;

  Глобальная переменная, через которую можно получить значение набранное пользователем
  в ссылочном поле ввода. Может использоваться в обработчике OnOpenCardfile, чтобы
  устанавливать UserFilter в картотеке, открываемой для выбора. 


- Добавлены клавиатурные комбинации по умолчанию (в основном контексте):

  Alt+Left   - Назад (Kernel.Move.Back)
  Alt+Right  - Вперед (Kernel.Move.Forward)

  В режиме отладки этим клавиатурным комбинациям соответствуют команды отладчика.
  Для этого добавлена новый клавиатурный контекст "Режим отладки"

- Новая команда в текстовом редакторе: "Перейти по ссылке" (Kernel.Project.Design.GoLink)
  Клавиатурная комбинация по умолчанию Ctrl+Enter. Делает то-же что Ctrl+Click

- Перекрестные ссылки в коде. Особый вид комментария, который начинается с --Link:
  По перекрестным ссылкам можно переходить с помощью Ctrl+Click или Ctrl+Enter

  Пример:

  --Link:Frm.extIForm

- ТБ.Скрипт: Оптимизация кода и интерпретатора.

- Оптимизация хранения двоичных файлов (#cod, #prj)

- Исправлена ошибка подключения информационных баз

*** Build 10075 ***

- Исправление ошибки с вариантами при динамических вызовах

*** Build 10076 ***

- Исправлена ошибка при обновлении проекта 'Com'

- Методы GetCloseDate/SetCloseDate перенесены из класса Console в класс Books.

  При этом:
    GetCloseDate - Доступен на клиенте и сервере процедур, недоступен на сервере расчетов
    SetCloseDate - Доступен только на клиенте.

- Методы GetCloseDate/SetCloseDate перенесены из класса Console в класс Books.

- Шаблоны: в редактор поля добавлено событие OnEdit, с помощью которого можно управлять 
  процессом ввода и/или отслеживать вводимые значения.

  Прототип события:

  func OnEdit (AEditor :FieldEdit; var AStr :String; Action :Template.EditActions) :Logical

  Где:

  type EditActions = enumeration
    const BeforeEdit  = 0
    const AfterEdit  = 1
    const PauseEdit  = 2

  BeforeEdit - вызывается до модификации строки в редакторе, при этом AStr содержит вводимый
    символ/строку. Если AStr = '', то это удаление (BkSp или Del). Если событие вернуло True
    то выполняется стандартное действие, если False - то действие запрещается. Событие может
    изменить вводимую строку, например, следующий обработчик поднимает регистр всех вводимых 
    символов:

  func FieldOnEdit (AEditor :FieldEdit; var AStr :String; Action :Template.EditActions) :Logical;
    if Action = Template.BeforeEdit then
      AStr = Up(AStr);
    end
    Result = True;
  end;


  AfterEdit - вызывается сразу после модификации строки в редакторе. Текущее значение строки
    можно получить через AEditor.Text

  PauseEdit - вызывается после модификации, с небольшой задержкой. Величина задержки 
    настраивается:

  field PausePeriod :Numeric;

16.01.2019

*** Build 10077 ***

17.01.2019

- Исправление ошибки с GetCloseDate (Тип записи "Kernel.Fixed.Date" не определён)

- Оптимизация PCode

*** Build 10078 ***

- Исправление ошибки интерпретатора ТБ.Скрипт

*** Build 10079 ***

21.01.2019                                                      

- Изменено форматирование иерархических отчетов в HTML 
  (при включенной опции "Включать значения разбиений".)

  1. Для строк иерархического отчета добавляются тэги:

     Data-Lvl="N" - Уровень иерархии для текущей строки, начиная с 0
     Data-Grp="X" - Где:
       X = 1 - Свернутая группа
       X = 2 - Заголовок раскрытой группы с итогами
       X = 3 - Заголовок раскрытой группы без итогов
       X = 4 - Строка итогов.
       Для остальных строк "Data-Grp" отсутствует.

  2. При включении опции "Раскрывать интерактивно" в клетке, содержащей
     кнопку "+/-" добавляется тэг:

     Data-Ind="h;n" - Где
       N - 0 - Раскрытая группа (кнопка "-")
       N = 1 - свернутая группа (кнопка "+")


- Свойства класса Report: BuildGroup и GroupIsOpen теперь можно вызывать на сервере процедур.

*** Build 10080 ***

25.01.2019

- В класс TemplateFrame добавлено свойство:

  field Proportion :Integer

- Доработки редактора ресурсов:
  - Поддержка событий
  - Поддержка перечислимых типов

*** Build 10081 ***

28.01.2019

- Доработки TraceRef
  - Метод перенесен из Console в System
  - Метод возвращает отчет в виде строки
  - Не делается обращение к вычислимым свойствам
  - Учитываются ссылки из системных коллекций (List/Storage) и из замыканий

- Новая реализация точек останова отладчика - без модификации кода.
  Должны исправиться ошибки при отладке серверных WEB процедур.

*** Build 10082 ***

31.01.2019

- Добавлен новый ButtonStyle: ClearButton = 4
- добавлен новый EditActions: InitList 
  OnEdit(,, InitList) формируется при нажатии на кнопку без предварительного редактирования 
- ButtonStyles добавлен в объект TableColumn

- Загрузка переводов (*.transl) на сервере процедур

- Доработка редактора ресурсов - предварительная поддержка наследования

*** Build 10083 ***

05.02.2019

- Доработка редактора ресурсов - поддержка ссылочных свойств (на другие компоненты)

- Доработки декорации иконок и *.skin файлов

- Доработки HintError и CaretHint

- Расширенная диагностика при ошибках импорта, при наличии зацикленных ссылок

*** Build 10084 ***

- Исправлено несколько ошибок работы под Linux

- Доработка редактора ресурсов

*** Build 10085 ***

15.02.2019

- Поддержка экспорта / импорта Storage в форматах XML и JSON с помощью методов:

  proc SaveToFile (FileName :String; {Format :Storage.Format})
  proc LoadFromFile (FileName :String; {Format :Storage.Format})

  А также новый метод, делающий тоже самое без файла:

  field AsString [{Format :Storage.Format}] :String

- Шаблоны: Расширения программного интерфейса:

  FieldEdit

    field ListUseMacro :Logical

- Доработка редактора ресурсов

*** Build 10086 ***

18.02.2019

- Доработка редактора ресурсов

*** Build 10087 ***

- Исправление ошибки загрузки переводов

*** Build 10088 ***

20.02.2019

- Доработка редактора ресурсов

- Доработка XML и JSON

*** Build 10089 ***

26.02.2019

- Шаблоны: В адаптивных секциях поддерживается ограничения максимальной 
  и минимальной ширины. Пока доступно только программно:

  TemplateSection

    field MinWidth :Numeric
    field MaxWidth :Numeric

- Доработка редактора ресурсов (групповой перенос компонент)

- Доработка XML и JSON

- Исправлена ошибка - AV в бланках

*** Build 10090 ***

- Шаблоны: в программный интерфейс секции добавлен метод

  TemplateSection:
    proc LinkCols (Column :Integer; Columns :Integer; Width :Numeric; {MinWidth :Numeric}; {MaxWidth :Numeric})

  который используется для настройки адаптивной раскладки секций

- В редакторе добавлена свертка файлов *.crf и *.transl

- В редакторе снова сворачиваются локальные процедуры

- Исправлена ошибка программной фиксации окон

- Исправлена ошибка показа значений под отладчиком

*** Build 10091 ***

- Редактор ресурсов: свойство Excluded (отключает загрузку компонент без удаления их из файла ресурсов)

- Редактор ресурсов: копирование компонент (Drag&Drop с удержанием Ctrl)

- Поддержка отчета по проводкам в WEB.

*** Build 10092 ***

- Поддержка перевода файлов ресурсов

- Доработки инспектора объектов отладчика

- Отладчик показывает private-поля объектов

- Исправлена ошибка экспорта проводки в JSON

- Исправлена ошибка показа 'nil' в отчетах

- В HTML представление отчета добавлены классы для создания "зебры" (tr.row1/tr.row2)

- Шаблоны: Оптимизация отрисовки адаптивных секций 

- Шаблоны: BeginModify/EndModify блокирует создание объектов/фреймов

- Исправлена ошибка PCRE-замены в x64.

*** Build 10093 ***

- Шаблоны: Вторая попытка оптимизации отрисовки адаптивных секций 

*** Build 10094 ***

- Обновлена версия PCRE

- ТБ.Скрипт: в класс System добавлена процедура:

    proc DebugTrace (Message :Variant)

  Сообщение пишется в лог отладочной версии и в окно утилиты DbWinOLE (если запущена).
  Работает только в отладочной версии Bin, в релизе - ничего не делает. 

*** Build 10095 ***

- Сервер процедур сделан полноценным сервисом windows, 
  его нужно явно запускать (имя сервиса: TBProc).

- Редакция MAX требует лицензию на запуск следующих серверов:

  1021 - Сервер данных
  1022 - Сервер расчетов
  1023 - Сервер процедур
  1024 - WEB Сервер

  Лицензия снимается в момент запуска сервера и освобождается при его остановке.
  Без лицензии сервер не запустится. Если используется сервер лицензирования,
  то его адрес нужно прописать в настройках каждой инсталляции, в обычном месте:

  Администрирование -> Настройки сервера -> Сервер Авторизации -> Лицензии

- Отдельная лицензия для использования аккумуляторов более не требуется.

- Если при запуске сервера произошла какая-то ошибка (например, нет лицензии)
  то информация об этом пишется в журнал событий. Кроме того ее можно увидеть
  в окне утилиты Control, если навести мышь на слово Ошибка в столбце Состояние.

*** Build 10096 ***

- При подключении WEB пользователей теперь требуется тот-же код лицензии "на ядро"
  что и при подключении обычных пользователей: 1000/1001. Код 1005 не используется.

- Пользователь работающий по роли $Webproxy не снимает никакие лицензии. 
  Т.о. ограничение пула анонимных подключений (MaxPool) становится необязательным.

- ТБ.Скрипт: новый тип данных - pointer, используется, в основном, для поддержки
  вызовов из DLL (Windows API). Необходим для корректной работы 64-х разрядной версии.

  Ряд встроенных функций переопределены с поддержкой Pointer:

  System:

    func VarAddr (Value :String; {Delta :Integer}) :Pointer
    func ReadMemory (Addr :Pointer; Type :System.VarTypes; {Length :Integer}) :Variant
    proc WriteMemory (Addr :Pointer; Value :Variant; {Length :Integer})
    func CreateCallback (Class :Class UserObject; ProcName :String) :Pointer 

- ТБ.Скрипт: исправлена ошибка работы оператора IS для пользовательских типов.

*** Build 10097 ***

- Новый стиль окна BlockedWindow - среднее между Popup и Modal. Блокирует нижележащие 
  окна (как Modal) но не задерживает поток (как Popup). Используется для совместимости
  с WEB интерфейсом во всех квази-модальных диалогах.

- Редактор ресурсов поддерживает работу с Clipboard.

- Исправлена ошибка чтения JSON

*** Build 10098 ***

- В объекте шаблона Picture свойство Image доступно на запись.

- ТБ.Скрипт: добавлен элемент перечислимого типа VarTypes:

    const VarPointer  = 42

- ТБ.Скрипт: В функцию System.ReadMemory добавлен необязательный параметр Encoding:

    func ReadMemory (Addr :Pointer; Type :System.VarTypes; {Length :Integer}; {Encoding :Variant}) :Variant

*** Build 10099 ***

- ТБ.Скрипт: новый тип данных - Int64 - 64-х разрядное целое. Может использоваться
  в тех случаях, когда не хватает разрядности 32-х разрядного Integer, например,
  при работе с большими файлами. Диапазон допустимых значений:

  -9223372036854775808 - 9223372036854775807 (0x8000000000000000 - 0x7FFFFFFFFFFFFFFF)

  Int64 совместимо с Integer, при этом присвоение Int64 = Int - безопасно, 
  а Int = Int64 может привести к ошибке переполнения, если значение выходит 
  за допустимый диапазон.

  Совместимость с Numeric - по тем же правилам что и Integer. При этом следует помнить,
  что при присвоении Numeric = Int64 может произойти потеря точности.

  Переменные типа Int64 могут передаваться во внешние вызовы только как var параметры.

  Сохранять в базе данных - нельзя (пока).

  Ряд встроенных функций переопределен для поддержки Int64:

  System
    proc GetFileInfo (FileName :String; {var Size :Variant}; {var Date :Date}; {var Attrib :Integer})
      - Параметр Size может принимать переменные типа Integer или Int64, в случае если переменная 
        имеет тип Integer а размер файла > 2G возникнет ошибка (ранее возвращался отрицательный размер)
      + Все параметры сделаны необязательными

  TextFile:
    field Size :Int64
    field Position :Int64
    func Seek (Position :Int64; {Origin :Integer}) :Int64

- Исправлена ошибка резервного копирования в 64-х разрядной версии
- Исправлена (не)работа DebugTrace в 64-х разрядной версии.

*** Build 10100 ***

- Поправлены драйвера БД для поддержки новых версий PostgreSQL и MySQL.

*** Build 10101 ***

- Добавлен мастер по кодированию/раскодированию файлов проекта. 
  Команда вызова мастера: Kernel.Project.Design.Encode

- ТБ.Скрипт: добавлен составной оператор begin-end. Может использоваться для ограничения
  области видимости локальных переменных.


  proc Test

    begin
      var A :Integer = 1;
      --...
    end;

    begin
      var A :String = "...";
      --...
    end;

  end;

- В класс System добавлена функция 

  func DummyFunc(...) :Variant

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

- Добавлено несколько логических цветов.

*** Build 10102 ***

- Доработки визуальных тем

*** Build 10103 ***

- Опция "Всегда показывать навигационную панель"

- В список стилей окна шаблона добавлено значение "сдвигающееся окно". 
  По умолчанию стек форм работает только если установлен данный стиль

- Доработки уточняющих отчетов, чтобы они открывались в виде полу-окон.

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

- Доработки мастера кодирования проектов

- Доработки для возможности использования Native backup PostgreSQL под Linux

- Исправления иконок

- Исправление ошибок

*** Build 10104 ***

- Поддержка круглых кнопок в шаблоне

- Доработки мастера кодирования проектов

- Исправление надписей и рисунков

- Обновление перевода

*** Build 10105 ***

- Проверки файлов ресурсов при компиляции

- Верхнее меню по умолчанию выключено, иконки на тулбаре - размером 24.

- Картинки зависят от языка

- Шаблоны: возможность управлять шрифтом Tab'ов фреймов. Только программно:
  
  TemplateFrame:
    field TabFont :Font

- EXE-шники снова подписываются.

*** Build 10106 ***

- Добавлен новый логический цвет: Фон Редактора Т/Ч

- Исправление иконок

*** Build 10107 ***

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

- Исправление надписей

- Исправление ошибок 

*** Build 10108 ***

- Исправлена ошибка реорганизации отчетов версии 7.4

- Доработка локализации файлов ресурсов

- Исправление ошибок с иконками

*** Build 10109 ***

- Встроенная группа пользователей Роботы и пользователь Робот. Пользователь отнесенный к группе
  Роботы может открывать интерактивные клиентские сессии (desktop клиентом) со специальной 
  служебной ролью $Robot, при этом он:

  - Может подключаться к любым инф. базам (как администратор)
  - Не снимаются никакие лицензии.
  - Не блокируется одновременная работа нескольких пользователей.
  - НО! Робот не может открывать никакие визуальные формы.

*** Build 10110 ***

- Исправлена ошибка активации интернет лицензий и утилиты TXCompare

*** Build 10111 ***

- Web Сервер делает Idle Ping каждого подключения с периодичностью 4 сек. Следствия:

  - Обрабатываются нотификации об изменении документов и обновляются кэши 
  - Обрабатывается команды об отключении клиентов для локальных подключений
  - Восстанавливается разорванная связь с серверами
  - Закрываются подключения при невосстановимом разрыве связи с серверами

- Рефакторинг сервисов подключений к серверам

- Рефакторинг механизма вызовов сервера процедур со стороны клиента (вызов делается 
  в отдельном потоке)

- Экспериментальная возможность: асинхронные вызовы сервера процедур со стороны клиента.
  Для этого в программный интерфейс ProcServer добавлен метод:

  proc AsyncExecute (OnResult :Variant; OnError :Variant; ClassName :String; ProcName :String, {...} )

  Пример:

  var vSrv = ProcServer.Create;
  vSrv.AsyncExecute(
    proc(aRes :Variant)
      Trace('Finish. Result=' + Str(aRes));
    end,
    proc(aError :String)
      Trace('Error: ' + aError);
    end,
    'SrvClass', 'ProcName', Arg1, Arg2);

  При вызове AsyncExecute исполнение серверной процедуры запускается в отдельном потоке
  а управление возвращается немедленно. По окончании работы серверной процедуры произойдет
  вызов замыкания OnResult, которому будет передан результат возвращенный серверной процедурой.
  Если при работе серверной процедуры возникает ошибка - будет вызвано замыкание OnError.
  Вызов замыканий произойдет во время простоя основного потока клиента, т.е. они не будут
  вызваны пока не завершится предыдущий процесс.

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

- Исправление перевода

*** Build 10112 ***

- Skin: добавлены виды декоарации иконок: Icon_Style1, Icon_Style2, Icon_Style3

  ТБ.Скрипт: тип свойства Image.Shaping заменён с Boolean на String
    возможные значения: '', 'Style1', 'Style2', 'Style3'


- В класс Template добавлено свойство:

   field MoveDelay :Numeric; – Задержка вызова события OnMove, в сек.

     значение < 0 - используется стандартный интервал
     значение = 0 - событие генерируется при каждом перемещении
     значение > 0 - используется как интервал

- Доработка мастера импорта помощи

*** Build 10113 ***

- Локальные переменные могут объявляться с помощью ключевого слова const, при
  условии что они сразу инициализируются. В дальнейшем такие переменные менять
  нельзя (т.е. они immutable - неизменяемые). Аналогично const-аргументам.

- Document.Lock(True) (блокировка с ожиданием) на сервере ограничена таймаутом.
  Если в течении таймаута заблокировать документ не удалось - генерируется ошибка.
  Таймаут = 5 сек (в будущем будет настраиваемым).

  Для клиента - ничего не меняется, блокировку можно прервать только вручную.

  То же самое касается Edit и пр. действий с документом.

- Исправлена ошибка со случайной установкой флагов PostHint у документа

- Оптимизировано удаление проектов.

- Доработка мастера импорта помощи

*** Build 10114 ***

- Исправлена ошибка зависания локального сервера расчетов

- Ver 10.1

*** Build 10115 ***

- Оптимизация блокировки документов с использованием объектов синхронизации.

- Исправление ошибки в длительным закрытием стека с большим количеством окон.

- Исправление нескольких ошибок с синонимами в структуре учета

*** Build 10116 ***

- При экспорте в PDF в режиме "как при печати" поддерживается масштабирование.

- В иерархии классов работают перекрестные ссылки и команды Назад/Вперед

- При открытии проекта с пустым рабочим столом автоматически открывается 
  редактор проекта

- Исправлена ошибка "List Index.." в шаблонах (при активном хинте)

*** Build 10117 ***

- Добавлена поддержка Linter x64. Доступ к Linter по ADO возможен только 
  для 32-х разрядного Turbo. 64-разрядный Turbo может подключаться к 64-х
  разрядному Linter через DBX. Т.е.:                      

                Turbo x32    Turbo x64
  Linter x32    ADO          ???
  Linter x64    ADO          DBX

  Из за ограничения Linter на количество полей (250) на нем не получается
  создать .большие информационные базы (например, для проекта ERP).
  Можно создавать базы для демо проектов, например Control.

- Исправлен ошибка в алгоритмах импорта записей, из-за которой не работал
  импорт в Linter.

- Исправлена ошибка разбора фильтров проводок/справочников связанная с поддержкой
  синонимов

*** Build 10118 ***

- Рефакторинг алгоритмов изоляций сервера расчетов. Должна исправиться ошибка
  потери нотификаций при длительных транзакциях

- Исправлена ошибка обработки текстовых журналов

- Редактор ресурсов: поддерживается изменение класса компонента. В наследниках
  класс компонента можно изменить на класс наследника.

- Редактор ресурсов: поддерживается поиск

- Формат файла ресурсов изменен на версию 2

- Исправлен ошибка с ложными предупреждениями в редакторе 

- Рефакторинг алгоритмов компилятора

- Если Turbo.exe запущена с ключом /Silence то при разрыве связи с сервером
  попытки восстановления ограничены таймаутом (30 сек)

- Добавлены ключи командной строки Turbo.exe: /Minimize /Maximize

- ТБ.Скрипт: в класс ProcessInfo добавлено свойство:
    field Path :String
  возвращает путь к исполняемому файлу процесса (без имени файла)

*** Build 10119 ***

- ТБ.Скрипт: процедура ExecuteProgram при любых ошибках запуска генерирует 
  ошибку, вместо того, чтобы показывать модальные окна.

- ТБ.Скрипт: в класс ProcessInfo добавлено свойство:
    field PID :Integer;
  возвращает ID текущего процесса.

- ТБ.Скрипт: в класс System добавлена процедура:
    proc ServerPoll
  делает обращение к серверу данных для быстрого получения нотификаций.

- ТБ.Скрипт: Класс Chart - свойство WindowHandle переопределено как Pointer
    field WindowHandle :Pointer

- Ключи запуска Turbo.exe /IgnoreSettings и /NoSaveConfig влияют и на
  чтение/запись classes.dbt

- Редактор ресурсов: поддерживается изменение класса библиотек.

- Редактор ресурсов: повышена устойчивость к ошибкам в ресурсах-наследниках
  при изменении в базовых классах

- Изменение ресурса приводит к перекомпиляции класса.

- Ошибка при чтении ресурса не приводит к остановке компиляции проекта

*** Build 10120 ***

- Ver 10.2

*** Build 10201 ***

- Обновленная версия библиотеки для работы с SVG иконками
  Ключ запуска /SVGGDIPlus - используется GDI+ для работы с SVG
  Под Wine GDI+ используется всегда.

- Исправлена ошибка запуска HTTP сервера.

- Событие OnEnter с Action = AfterEnter игнорирует возвращаемый результат.
  (для повышения совместимости со старым кодом)

- Исправлено несколько ошибок при проверке файлов ресурсов

*** Build 10202 ***

- Исправлена ошибка кодогенерации в версии 10.2

*** Build 10203 ***

- Улучшена совместимость с Linux/Wine 

- Подключена библиотека AGG для работы с SVG иконками без GDI+/DirectX
  по умолчанию - используется только под Linux.
  Ключ /SVGAgg - принудительно использовать AGG под Windows

- Рефакторинг библиотек сервера данных (TListOf...)

- Рефакторинг компилятора ТБ.Скрипт (bParseV2, bLoopRule)

- Исправлена ошибка экспорта Storage в форматы JSON/XML после удаления полей

- Несколько исправлений поиска по регулярным выражениям и около...

*** Build 10204 ***

- Поддержка выбора иконок и Help'ов в редакторе ресурсов

- Поддержка иконок для компонентов. Назначаются через диалог свойств объекта проекта.

- Оптимизации компилятора ТБ.Скрипт (bStrCache)

- ТБ.Скрипт: В класс ProjectInfo добавлены свойства для поиска сущностей 
  в загруженных проектах:

  ProjectInfo:
    func FindItem (Name :String; Types :ProjectInfo.ProjectGroupTypes[]) :String

  Где:

  type ProjectGroupTypes = enumeration
    const RecordGroup  = 1
    const CalcStructGroup  = 2
    const ClassGroup  = 3
    const FormGroup  = 4
    const CardfileGroup  = 5
    const OperationGroup  = 6
    const ReportGroup  = 7
    const ReplicationGroup  = 8
    const InterfaceGroup  = 10
    const AccessGroup  = 11
    const AttachmentGroup  = 12
    const HelpGroup  = 13
    const TranslationGroup  = 14

*** Build 10205 ***

- Редактор ресурсов: улучшенный выбор иконок (#Attr Folder='...')

- Улучшены алгоритмы проверки ресурсов при компиляции (+проверка иконок и Help'ов)

- ТБ.Скрипт: исправлена ошибка двойного перекрытия свойств с getters/setters

- Сервер данных: Рефакторинг алгоритмов блокировки документов
  + Оптимизация блокировки с использованием тикетов

- Исправлена ошибка установки перечислимых свойств в табличном журнале

*** Build 10206 ***

- Функционал перевода прикладных проектов перемещен на уровень ядра. 
  В класс System добавлена функция:

    func Translate (Message :String; {Languge :String}) :String

  При вызове этой функции из всех активных проектов загружается перевод 
  на язык Lang и сообщение Message пытается перевестись на этот язык.
  Если перевод сообщения отсутствует - возвращается пустая строка.
  Если Lang опущен, то перевод делается на текущий язык приложения.
  Message - должно содержать только ключ, без сообщения по умолчанию,
  на прикладном уровне функцию Translate напрямую использовать 
  не рекомендуется, вместо нее по прежнему используйте Voc.Txt.

  При выдаче прикладных сообщений через системные диалоги (например,
  списки бланков, картотек, журналов и т.п.) локализуемые строки также
  переводятся через функцию Translate. Теоретически, теперь нигде в сессии
  не должны вылезать сообщения с "@". Если где-то увидели - сообщите.

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

- Некоторые сообщения сервера данных переводятся на текущий язык пользователя.
  Пока работает только для Desktop клиента, только для некоторых сообщений.
  Будет дорабатываться,

- ТБ.Скрипт: добавлены новые директивы компилятора:

  #Final - Помечает класс или свойство как "окончательное", такой класс
  нельзя наследовать или расширять, а свойство - перекрывать;

  #Override - Помечает свойство как "перекрывающее". Если в базовом классе
  для него нет базового свойства - возникает ошибка при компиляции.
  Для перекрывающих свойств не помеченных директивой #Override может
  генерироваться предупреждение при компиляции. По умолчанию это предупреждение
  отключено. Рекомендуется в новых проектах его включать для усиления 
  контроля за перекрытием свойств.

- Оптимизирована загрузка ресурсов. Теперь все прикладные свойства, вызываемые
  в процессе загрузки (конструкторы, сеттеры...) вызываются в одном процессе
  исполнения ТБ.Скрипт,

- Расширенна поддержка ограничений для редактора ресурсов:

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

  Новый атрибут: Visible. Компонент помеченный: #Attr Visible="False" 
  нельзя использовать в визуальном редакторе. Таким образом можно 
  скрывать абстрактные базовые или промежуточные классы.

- Добавлен новый класс RTTI: VarInfo = inherited(MethodInfo). Возвращается
  для всех полей классов, вместо базового MethodInfo.

  Т.е. теперь вместо

    if vClassInfo.Member[i].Kind = MethodInfo.mkProp then ...

  можно писать

    if vClassInfo.Member[i] is VarInfo then ...

  Класс VarInfo содержит дополнительное свойство:

    field Stored :Logical

- Шаблоны: ошибки при редактировании полей теперь, по возможности, выдаются в виде хинта.

- Клиентское приложение Turbo.exe теперь по умолчанию использует менеджер памяти FastMM.

*** Build 10207 ***

- В перечислимый тип System.VarTypes добавлены:

    VarInt64  = 48
    VarFunction  = 52

*** Build 10208 ***

- Поддержка индексных свойств с Getters/Setters:

  Пример:

    var Items[Idx :Integer] :Variant
      get func(Idx :Integer) :Variant
        return FItems[Idx];
      end
      set proc(Idx :Integer; Value :Variant)
        FItems[Idx] = Value;
      end

  С коротким замыканием:

    var Cells[X, Y :Integer] :Variant get @GetCells set @SetCells;

    func GetCells(X, Y :Integer) :Variant;
      return FCells[X, Y];
    end

    proc SetCells(X, Y :Integer; Value :Variant);
      FCells[X, Y] = Value
    end

  Альтернативный вариант, без getter'а:

    var Cells[X, Y :Integer] :Variant = FCells[X, Y] set @SetCells;

  Возможно использование индексов по умолчанию:

    var Items[Name :String; Version :Integer = 0] :Variant = ...

- Одно из индексных свойств может быть объявлено свойством "по умолчанию" с помощью директивы #Default;

    #Default;
    var Items[Idx :Integer] :Variant = ...

  Свойство "по умолчанию" можно опускать:

    vObj.Items[i] = ...
    vObj[i] = ...

*** Build 10209 ***

- ТБ.Скрипт: исправлена ошибка использования Self в расширениях, 
  Исправлена ошибка доступа к приватным свойствам в расширениях.
  Исправлена ошибка подстановки InObject констант.

- RTTI: Свойство MethodInfo.ReadOnly перенесено в класс наследник VarInfo

  В класс VarInfo добавлено свойство:

    field ConstValue :Variant

  возвращающее значение константы (если свойство является константой)

*** Build 10210 ***

- Редактор ресурсов: ограниченная поддержка расширений. Расширения можно настраивать
  в визуальном редакторе, но при настройке ресурсов-наследников расширения базового
  класса в визуальном редакторе не видны. В режиме исполнения все расширения должны 
  грузиться корректно.

- #Attr Visible теперь логический: #Attr Visible=False

- ТБ.Скрипт: Поддержка принципа Copy-On-Write (COW) при работе с массивами.
  При присвоении массива он не копируется, а устанавливается ссылка на общий
  объект в памяти. При изменении массива, если на него есть несколько ссылок,
  делается копирование и создается новый объект в памяти.

- Исправлена ошибка работы стека квази-модальных диалогов

*** Build 10211 ***

- Отчеты: добавлен вычислимый показатель Первое значение (FirstValue). 
  Работает аналогично LastValue только показывает FirstValue

- Обновлен компонент показа графиков.

  Новый настройки графиков: 
    Вид->Сглаживание линий
    Оформление->Серии

  Настройки графика можно сохранить/загрузить из файла (*.cfc) через соотв.
  команды диалога настроек (в Popup Menu).

  Так же в программный интерфейс ChartSettings добавлены свойства:

    proc LoadFromFile (FileName :String)
    proc SaveToFile (FileName :String)

- Обновление перевода

*** Build 10212 ***

- При подключении пользователей они ищутся по совпадению имени или SID (если задан)

- В класс SessionInfo добавлено свойство:

    field AuthServerName :String

  возвращающее адрес сервера авторизации, который используется для авторизации пользователей.

- В класс Administration добавлены свойства:

    field Users :Storage[]
    field UserGroups :Storage[]

  возвращающие список пользователей или групп пользователей в виде массива Storage.
  Для пользователей установлены поля: Name, FullName, Description, SID
  Для групп: Name, FullName, Description, SID

  Возможно, в будущем сделаем типизированное решение.

*** Build 10213 ***

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

  Программные интерфейсы ProcServer и Administration используют доверительную авторизацию
  если при подключении не указан UserName. Такое подключение работает из серверных процедур.

  Сессионный ключ можно получить программно через SessionInfo:

    field SessionKey :String

  Для того чтобы использовать сессионный ключ для авторизации необходимо во время подключения
  указать UserName=$trust$, Password=SessionKey

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

- Добавлены новые встроенные классы:
 
  UserInfo:
    field Name :String
    field FullName :String
    field Description :String
    field SID :String

  UserGroupInfo:
    field Name :String
    field Description :String
    field SID :String

  Изменены свойства класса Administration:

    field Users :UserInfo[]
    field UserGroups :UserGroupInfo[]


- Отчеты по проводкам: на странице дополнительно добавлена опция:

    [ ] Описание вместо имени

  программный интерфейс  к ней:

    type ShowReportOptions = enumeration
      ...
      const opShowDescriptions  = 11

  Влияет на показ признаков, для которых разыменование не указано явно.

- Отчеты: расширение программного интерфейса

  ReportIndicator, ReportSplitContent:
    field Alignment :Report.AlignmentTypes

  Где

  Report:
    type AlignmentTypes = enumeration
      const DefaultAlign  = -1
      const LeftAlign  = 0
      const RightAlign  = 1
      const CenterAlign  = 2


- Оптимизированы короткие замыкания. Теперь вызов функции через короткое замыкания  
  делается за один Call (раньше было 2). Кроме того 2 коротких замыкания на одну
  функцию теперь считаются равными: @MyProc = @MyProc

  Для свойств теперь синтаксис:

    var Some :Variant get @FSome;

  работает быстрее чем:

    var Some :Variant = FSome;

*** Build 10214 ***

- Изменен формат конструктора Record.Open:

    func Open(DocID :Variant) :Record;

  Теперь в качестве DocID можно передавать собственно значение DocID, вместо
  полного строкового представления, как ранее:

    vDoc = MyRecordClass.Open(123);

  вместо

    vDoc = MyRecordClass.Open('{MyRecordClass:123}');

 
- В класс Console добавлены функции:

    func FindRecordEditors (RecordClass :Class Record; {ChooseOne :Logical}) :Class BlankForm[]
    func FindRecordCardfiles (RecordClass :Class Record; {ChooseOne :Logical}) :Class CardForm[]

  Возвращают список классов редакторов/картотек для заданного класса записей. 
  Если установлен флаг ChooseOne = True и в списке более одного класса
  то возникает системный диалог выбора и возвращается один выбранный класс,
  или [], если нажали отмену.

  Изменено поведение функции OpenCardfile. Если в качестве имени формы картотеки 
  передать пустую строку и Record <> nil то будет автоматически выбрана одна 
  из совместимых картотек по стандартным системным правилам (аналогичное поведение
  имеет функция OpenBlankEditor). Если исходная запись для позиционирования 
  неизвестна, то воспользоваться новым поведением можно, передав в качестве 
  Record фиктивную запись с DocID = 0:

    OpenCardfile('', MyRecordClass.Open(0));

-  В классы UserInfo / UserGroupInfo добавлено свойство:

     field Enabled :Logical

- В класс UserInfo добавлено Inclass свойство:

    func Verify (User :String; {Password :String}) :UserInfo

  позволяющее проверить корректность логина пользователя и получить
  общую информацию о нем, без открытия дополнительной сессии. 
  Если авторизация с указанными параметрами не прошла, то функция возвращает nil;
  Поддерживаются все типы авторизации, в том числе - доверительная. 

- Доработаны настройки графиков. Теперь *.cfc файлы можно открывать на редактирование
  как документы (аналогично интерфейсным схемам, настройкам печати и пр.)

- ТБ.Скрипт: поддержано выведение типа для замыканий (только для локальных переменных)
  Поддержана работа анонимных типов замыканий в Evaluate.

- ТБ.Скрипт: оптимизирован доступ к глобальным переменным собственного класса
  (ускорен более чем в 2 раза).

*** Build 10215 ***

- Частичная поддержка локализации шаблонов. Строки в шаблона, начинающиеся с "@"
  при загрузке локализуются по стандартным правилам локализации прикладных проектов.
  Локализация применяется к статическому тексту шаблона, надписям объектов и хинтам и пр.
  Для того чтобы это работало в шаблоне должна быть включена опция:

  Свойства шаблона -> Общие
   [x] Использовать локализацию строк

  При обновлении словаря шаблоны пока не учитываются. Поэтому, если нужно, чтобы 
  строки из шаблона попали в словарь - их придется продублировать в *.cod файле.

- Отчеты по проводкам: в шаблоне отчета, в клетке параметров, можно использовать 
  новые макросы: {Name} и {Value}.

- ТБ.Скрипт: повышена устойчивость грамматики выражений

- Исправлена ошибка при загрузке *.xml файлов в Storage

- Обновление перевода

*** Build 10216 ***

- Редактор ресурсов: поддержка расширений во время проектирования. При редактировании
  ресурсов-наследников грузятся расширения базовых классов. На них можно ссылаться
  и редактировать их свойства.

- Локализация проектов: в свойствах перевода добавлена опция:
    [x] Сканировать нижележащие проекты

  При обновлении словаря могут сканироваться файлы шаблонов, для поиска многоязычных
  констант. Для этого в свойства перевода добавлена опция:
    [x] Обрабатывать файлы шаблонов

- Настройки графиков: добавлено свойство: Оформление -> Легенда -> Обрамление легенды.

- Настройки графиков: в программный интерфейс ChartSettings добавлено свойство:

    field UseSerieColor :Logical

- ТБ.Скрипт - исправление ошибок кодогенерации

- Запрещение иконки выхода из группы в корневой группе картотеки

- Обновление перевода

*** Build 10217 ***

- Пересборка. Не открывались свойства перевода.

*** Build 10218 ***

- Настройки графиков: добавлено свойство: Подсказки -> Только для выделенного элемента

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

  Присвоения вида:
   
    ТипизированноеЗамыкание = ОбобщенноеЗамыкание;
    ТипизированноеЗамыкание = Вариант;

  Проверяют совместимость типа замыкания во время исполнения, в случае 
  несовпадения типа генерируется исключение;

  Так же работает проверка типа замыканий через "is":

    var F :Function;
    F = @Sin;
    if F is func(X :Numeric) :Numeric then
      Trace( F(1.2) );
    end;

- Функция ErrorCode теперь возвращает значение типа Variant. Для исключений,
  сгенерированных инструментарием она возвращает строку - имя класса исключения.
  Для прикладных исключений по прежнему возвращается целочисленный код ошибки 
  переданный SetError.

- Поддержка многоязычности на сервере. Для каждого клиента сервер выдает сообщения
  на его языке. Для desktop-клиентов язык определяется на основе текущего
  языка клиента (с учетом ключа /Locale=xx). Для WEB клиентов язык должен быть 
  назначен до вызова OpenSession с помощью нового метода:

  HTTPServer:
    proc SetLocale (Locale :String)

  Для поддержки многоязычности на сервере изменена версия сетевого протокола (7.7).

- Доработки локализации отчетов, 
- Обновление перевода

*** Build 10219 ***

- Изменен Формат события Sign.OnOpenCardfile - добавлен первый параметр SignClass:
 
    func OnOpenCardfile(Reference :Reference; Parameter :String; var Record :Record; Filter :String; WindowStyle :Window.WindowStyles) :Integer

  Внимание: это изменение влияет на совместимость со старыми проектами. Если это 
  событие использовалось соотв. место нужно поправить.

  Событие OnOpenCardfile теперь можно установить у базового класса Sign, оно будет
  вызываться для каждого справочника, у которого не установлен собственный обработчик. 
  По аналогии с Record.OnOpenCardfile;

*** Build 10220 ***

- Доработана поддержка многоязычности на сервере (исправлены ошибки многопоточного доступа)

- ТБ.Скрипт: Поддержка кэширования пользовательских объектов для оптимизации.
  Реализуется с помощью методов UserObject:
                                 
    field CacheLimit :Integer
    func GetFromCache :UserObject
    proc OnCaching

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

  ReportSplitContent
    field UseIndent :Logical
    field IndentShift :String

  Опция UseMacro помечена как deprecated. Для старых отчетов UseMacro конвертируется
  в UseIndent.

*** Build 10221 ***

- Проектный атрибут Visible теперь примени к классам-формам. Он влияет на видимость класса 
  во всех диалогах выбора

- Проектные атрибуты теперь можно задавать в *.cod файле через директиву препроцессора #Attr
  Применимо к атрибутам: Visible, Required, Heritable, Template. Рекомендуется использовать
  этот способ задания атрибутов, вместо диалога свойств, чтобы не плодить лишние *.nfo файлы.

- В программный интерфейс объекта шаблона OCXContol добавлен свойство

    field OCXName :String

  Позволяющее программно установить имя класса OCX, например:

    OCXControl1.OCXName = 'AcroPDF.PDF.1';

- В класс ProcServer добавлено inclass свойство:

    func WaitAll (Servers :ProcServer[]; {Timeout :Numeric}) :Logical

  позволяющее приостановить поток исполнения и дождаться завершения работы нескольких
  асинхронно запущенных серверных процедур. Если все процедуры завершились - функция
  возвращает True. Если дождаться не удалось (сработал Timeout) - False.
  По умолчанию Timeout не ограничен (ждем до упора). Все Callback'и завершения/ошибки
  будут вызваны изнутри WaitAll, до ее завершения.

- Расширение программного интерфейса к отчетам:

    ReportSplitParameter:
      field PeriodFunc :Report.DateSplitFuncTypes

    где

      type DateSplitFuncTypes = enumeration
        const byMonths  = 0
        const byQuarts  = 1
        const byYears  = 2

- Доработки экспорта в формат XML. В объект Storage добавлены свойства:

  func GetString ({Format :Storage.Format}; {Options :Storage.FormatOptions[]}) :String
  proc SetString (Value :String; {Format :Storage.Format}; {Options :Storage.FormatOptions[]})

  Где

  type FormatOptions = enumeration
    const XMLSingleRow  = 0
    const XMLAttrFirst  = 1

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

- Доработки поддержки локализации при настройке и построении отчетов
  
*** Build 10222 ***

- Исправлена ошибка операторов Is/As при работе с массивами объектов

*** Build 10223 ***

- Изменены некоторые правила импорта из XML. Теперь атрибуты/субтэги корневого
  XML тэга попадают непосредственно в Storage, а не создают в нем вложенный
  суб-storage. При этом имя корневого тега сохраняется свойстве с именем 
  #XMLRoot. Оно же используется при экспорте для наименования корневого XML тэга.

  + Исправлены недоработки экспорта списков/массивов в XML.

- Расширен синтаксис файла Updates.ini, теперь в нем можно задавать исключающие
  маски, предваряя их символом "-". Например, если мы хотим чтобы обновлялись
  все файлы из каталога Bin за исключением файлов лежащих в подкаталоге FBE:
  Updates.ini:

  *
  -FBE\*

- Файлы структуры учета теперь компилируются в порядке, заданном в редакторе
  проекта (раньше они упорядочивались по алфавиту)

- Исправлена ошибка двойного срабатывания AutoLookup 

- Команды Экспорт/Импорт добавлены в меню по умолчанию для бланков/картотек

- Доработка локализации табличных журналов и отчетов

- Обновление перевода

*** Build 10224 ***

- В функцию ReplaceStrings добавлен необязательный параметр OnlyWords

    func ReplaceStrings (Text :String; Old :String[]; New :String[]; {ReplaceAll :Logical}; {IgnoreCase :Logical}; {OnlyWords :Logical}) :String

*** Build 10225 ***

- Редактор ресурсов: добавлены ограничения для библиотек. Задаются с помощью
  атрибута #ContainLib аналогично #Contain для компонент. Значением по умолчанию
  является:

    #ContainLib="IContainer"

  При нарушении ограничения библиотек выдаются предупреждения во время компиляции,
  аналогично предупреждениям для компонент

- Редактор ресурсов: Поддержка свертки групп. Клавиатурные комбинации совпадают
  с комбинациями по умолчанию в текстовом редакторе:

  Shift+Gray- / Shift+Gray+  -- Свернуть/развернуть текущую группу
  Ctrl+Gray- / Ctrl+Gray+    -- Свернуть/развернуть все группы

- Исправлена ошибка дублирования имен компонент при копировании в редакторе ресурсов.

- Исправлена ошибка несрабатывания события FieldEdit.OnEdit в нек. случаях.

- Исправлена ошибка "Обнаружен недопустимый тип (21)" при обращении к подтаблице/структуре 
  удаленного элемента справочника

- Исправлена диагностика ошибок MAPI в TXNet.exe

- Номер порта по умолчанию изменен на 25800.

*** Build 10226 ***

- Изменен формат обработчика объекта шаблона TemplateCardfile.OnDrawRow:

    proc OnDrawRow (Sender :TemplateCardfile; Record :Record; Selected :Logical; var Color :Integer; Image :Image)

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

- RTTI: Метод MemberInfo.Owner для методов/типов из extends'ов возвращает 
  корректный ClassInfo - расширяемого класса.

- ТБ.Скрипт: В объект BinaryObject добавлено свойство:

    field AsBase64 :String

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

- Поддержка логических цветов и палитр в графиках

- Доработки оформления и локализации журналов

*** Build 10227 ***

- Сервер процедур поддерживает файловые системы, отображаемые на базу данных (User/Common).
  Поддержка работает только в интерфейсах, открываемых со стороны WEB сервера 
  (не работает для планировщика и при программном запуске серверных процедур).
  Stored inclass переменные автоматически сохраняются между сессиями. Причем они
  будут иметь общие значения для Desktop и Web интерфейсов, при условии логина 
  одного пользователя с одной ролью.

- Класс SessionInfo, добавлено свойство:

    field UserFolder :String

  Возвращающее путь к каталогу, отображаемому на базу данных (User File System)
  Любой файл, сохраненные в этом каталоге (или любом его подкаталоге) автоматически
  синхронизируется с Инф. Базой.

*** Build 10228 ***

- Шаблоны: отступы клетки (или стиля) - можно задавать разные значения отступов 
  с разных сторон. В программный интерфейс добавлены свойства:

    TemplateCell, TemplateStyle:
      field MarginsEx :Numeric[];

  Порядок задания отступов: MarginsEx = [Left, Top, Right, Bottom];

*** Build 10229 ***

- Синонимы для имен проектов. Задаются в форме свойств проекта. Учитываются
  при компиляции MTL/COD файлов а также в бланках/картотеках/помощи

*** Build 10230 ***

- Редактор ресурсов: быстрое переключение между наследниками и расширениями.
  Над деревом компонент добавлен combobox для переключения между под-ресурсами.

  Новые клавиатурные комбинации

  Alt+Enter             - Переключение между деревом компонент/списком свойств.
  Alt+Right / Alt+Left  - В списке свойств - переход к след./пред. компоненту

- ТБ.Скрипт: в класс Console добавлен метод для оптимальной конкатеации значений:

  func ConcatString (Array :Variant[]; {Delimiter :String}; {IgnoreEmpty :Logical}) :String

*** Build 10231 ***

- Экспериментальная фича: именованные расширения. Что-то среднее между наследниками
  и расширениями. Во всем ведут себя как расширения, но при этом допускают 
  обращение к себе как к классу по своему имени (или синониму). Описываются с помощью
  синтаксиса:

    class extends БазовыйКласс;
      -- Именованное расширение
    end;

  Для сравнения:

    extend БазовыйКласс;
      -- Безымянное расширение
    end;

    class inherited БазовыйКласс;
      -- Наследование
    end;

  Пока поддерживаются только для *.cod файлов.

*** Build 10232 ***

- Исправление ошибки компиляции именованных расширений

- Изменена регистрация automation классов для TurboX,
  Добавлена версия интерфейса:

    TXAuto.T9ServerManager102

  Теперь возможна одновременная регистрация и работа 
  automation интерфейсов версий 9.x и 10.2

*** Build 10233 ***

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

  Фича отключается в настройках программы на странице Разработка\Общие:
    [x] Показывать иконки в редакторе проекта

- Исправлена ошибка при показе иерархии классов COM

- Еще исправление ошибки компиляции именованных расширений

*** Build 10234 ***

- Поддержка именованных расширений в MTL. Синтаксис:

    record Имя extends БазовыйКласс;
      -- Именованное расширение
    end;

  Для сравнения:

    extends БазовыйКласс;
      -- Безымянное расширение
    end;

    record Имя inherited БазовыйКласс;
      -- Наследование
    end;

*** Build 10235 ***

- Доработки именованных расширений:

  - Поддерживаются классы структур записей, определенные через именованные расширения
    Например: Управление.Данные.Процесс.Позиции

  - Исправлена ошибка компиляции именованных расширений после изменений MTL.

*** Build 10236 ***

- Исправлена ошибка инициализации сервера расчетов

- Исправлено несколько ошибок при импорте

*** Build 10237 ***

- Поддержка именованных расширений в отчетах

- Новые полосы прокрутки (ScrollBars) с поддержкой тем и авто-сокрытием 
  Только для тем TurboX

- Оптимизированная анимация окон

*** Build 10238 ***

- Исправлена работа функции ErrorCode. Теперь она действительно возвращает Variant,
  и ее значение можно сравнивать и с числом и со строкой.

- Добавлено значение VarMeasure = 17 в перечислимый тип VarTypes.

- Улучшена диагностика ошибок при чтении файла ресурсов
  
*** Build 10239 ***

- Программный интерфейс к редакторам тестов/ресурсов. Добавлены классы:

  Editor
    TextEditor
    ResourceEditor

  Изменения в классе Console:

    func OpenEditor(FileName :String; {Encoding :Variant}) :Editor
    func FindEditor(FileName :String) :Editor
    func OpenSourceFile(FileName :String) :Editor

- Доработана поддержка именованных расширений при использовании FindClass

- Доработана поддержка именованных расширений в MTL.

*** Build 10240 ***

- Исправлена ошибка в мастере импорта помощи

*** Build 10241 ***

- Исправление ошибок

- Доработка локализации

*** Build 10242 ***

- Библиотека иконок упакована в ZIP архив

- Редактор ресурсов: доработано быстрое переключение ресурсов

- Редактор проектов: доработана поддержка иконок

*** Build 10243 ***

- Исправление ошибок

*** Build 10244 ***

- Исправление ошибок в сервере данных (импорт в PostgreSQL, 
  + юникодные строки в in [...] )

*** Build 10245 ***

- Исправлена ошибка согласованности подтаблиц после записи в рамках транзакции (InternalUpdate)

*** Build 10246 ***

- Экспериментальная фича: Архив кода. При полной перекомпиляции проектов все *.#cod файлы
  помещаются в один архив в корне каталога проекта и имеющий имя "ИмяПроекта.#cod".
  Несмотря на расширение - это обычный ZIP архив. Благодаря этому сильно увеличивается
  скорость открытия сессии по сети с невысоким ping-ом, за счет значительного уменьшения
  числа RPC вызовов и лучшего кэширования.

  При частичной компиляции проекта (make) изменившиеся файлы сохраняются как и раньше - 
  в отдельные файлы с именем "ИмяКласса.#cod", т.е. происходит "фрагментация" кода,
  ухудшающая кэширование. Для "дефрагментации" необходимо сделать полную перекомпиляцию,
  тогда снова останутся только архивы.

- Оптимизирован алгоритм компиляции (make) проекта, значительно уменьшено число 
  RPC вызовов при компиляции по сети.

- Во всех диалогах выбора (Бланков/Картотек/Журналов/etc) а также в редакторе проекта
  работает быстрая фильтрация вместо поиска. Набираете текст - в списке остаются только
  элементы, удовлетворяющие фильтру. При поиске можно использовать wildcard *.
  Автоматически делается поиск по XLAT преобразованию, т.ч. вхождение найдется даже
  если вы забыли переключить раскладку клавиатуры.

- Исправлена ошибка при построении отчетов в WEB

- Доработана поддержка именованных расширений при регистрации классов документов.
  Дополнительно регистрируются расширения для классов структур и подтаблиц.

- Исправлена ошибка (AV) при компиляции наследников именованных расширений, 
  описанных в этом же проекте.


*** Build 10247 ***

- Исправлена ошибка передачи параметров массивов по значению

*** Build 10248 ***

- Короткие замыкания на разыменованных выражениях. Синтаксис:
    Класс.@Свойство
  или
    Объект.@Свойство

- В класс System добавлены свойства:

    func VarInitialized (Ref :Function) :Logical
    proc VarDeinitialize (Ref :Function)

  VarInitialized - возвращает было ли проинициализировано поле класса или объекта
  VarDeinitialize - деинициализирует поле (сбрасывает в значение по умолчанию)

  В качестве параметра обе функции получают ссылку на поле (короткое замыкание)

    if VarInitialized(@SomeField) then
      VarDeinitialize(@SomeField)
    end;

- В класс MethodInfo добавлено inclass-свойство:

    func Open (Ref :Function) :MethodInfo

  которое позволяет получить RTTI информацию о свойстве передавая ссылку на него.
  Т.е. вместо:

    SomeClass.ClassInfo("SomeMethod")

  теперь можно писать:

    MethodInfo.Open(SomeClass.@SomeMethod);
    
- В класс MethodInfo добавлено свойство:

    func FuncRef ({Self :Variant}) :Function

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

  Например:

    var vProcInfo = SomeClass.ClassInfo("SomeProc");

  Старый вариант вызова:

    vProcInfo.CallProc(nil, Arg1, Arg2);

  Новый вариант вызова:

    var vProc = vProcInfo.FuncRef;
    vProc(Arg1, Arg2);


- Усилен контроль серверных классов при компиляции. Проверяется допустимость
  обращения к классам в коротких замыканиях

- Оптимизирована работа ScrollBars c поддержкой тем.

- Оптимизирована загрузка метаданных в сервере расчетов (каждый журнальный агент
  загружает *.#cod через собственное подключение)

*** Build 10249 ***

- Исправлена ошибка импорта из CSV/DBF

*** Build 10250 ***

- При импорте контролируются попытки установить в качестве группы ссылку на запись,
  не помеченную как группа. При этом предлагается либо установить признак, либо
  очистить группу. Особенно актуально при импорте из CSV/DBF.

- Сценарии импорта учитывают ситуацию, когда имена полей содержат пробелы и 
  др. "плохие" символы. Актуально при импорте из CSV/DBF.

- Доработаны алгоритмы быстрой фильтрации в списках/деревьях

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

*** Build 10251 ***

- ТБ.Скрипт: Расширен синтаксис оператора Import. Теперь можно в одном операторе
  импортировать классы из разных проектов, перечисляя их через запятую:

    Import Sys.Utils, Com.Def;

  Старый синтаксис поддерживается, для совместимости. При этом конструкция

    Import Com classes Def;

  Эквивалентна:

    Import Com, Com.Def;

  Т.к. она импортирует не только класс Com.Def, но и все имена классов проекта Com.

  Так же добавлены новые warnings при компиляции:

    'Повторный импорт класса или проекта "..."'
    'Импорт класса "..." не требуется';

- Исправлена ошибка фильтрации документов с использованием Owner в кванторах
  Например: Позиции.Exists(Сумма = Owner.Итого)

- Исправлена ошибка с исключениями при арифметических операциях над вещественными числами.

- Опциональное логирование потоков и подключений WEB сервера. Включается через Servers.ini:

  [HTTP]
  LogInfo=1

  Лог - Temp\Servers\WebConnections

- Оптимизация блокировок в WEB сервере

*** Build 10252 ***

- Исправлена AV при вычислении выражений на сервере процедур

- Убран повторный запрос на сохранение новых файлов при запуске отладочной сессии.

*** Build 10253 ***

- Версия 10.3

- Поддержка портала. 

  Новый код продукта: 1002 (Portal)

  Новая встроенная группа пользователей: 
   "Диспетчеры портала" - {4cce2216-44b0-4dc6-a5a6-f8ffc5cfb4a3}
  и пользователь       
   "Портал"             - {cf15c075-88b0-41ef-8d25-9c5090eac789}

  Любые пользователи, относящимся к группе "Диспетчеры портала":

  - Могут открывать анонимные и именованные WEB подключения
  - Могут подключаться к любым инф. базам (как администратор)
  - Имеют служебную роль "$Portal"
  - Не блокируется одновременная работа нескольких пользователей.
  - При подключении снимается лицензия с кодом 1002

  Пользователям, относящимся к группе "WEB Диспетчеры", наоборот,
  запрещено открывать именованные WEB подключения.

- Для WEB пользователей с ролью "$Webproxy" и "$Portal" отключена поддержка 
  User File System, то есть для них не сохраняется значение Stored Inclass
  переменных. Common File System поддерживается.

- Возможность отключать логирование HTTP запросов через параметр Flags в Debug.ini

  Биты Flags:

    SQL  = 1;
    RPC  = 2;
    HTTP = 4;

- При логировании событий HTTP сервера не логируется исключение 
  "Connection closed gracefully"

- Исправлена AV в шаблонах при отладке события "ПриПеремещении"

- Исправлена AV при запуске с ключом /NoUI

*** Build 10301 ***

- Доработки роботов: 
  - Исправлена ошибка: блокировалась одновременная работа нескольких роботов
  - Роботы могут запускать серверные процедуры

- Более корректно запрещаются команды добавить/удалить в периодических секциях

- Оптимизация WEB сервера

*** Build 10302 ***

- Поддержка Markdown при написании помощи. Если при создании темы помощи указать 
  расширение *.md, то можно использовать разметку markdown.

  Для конвертации markdown разметки в HTML используется библиотека delphi-markdown
    https://github.com/grahamegrieve/delphi-markdown
  Там же информация о поддерживаемом диалекте markdown

  Кроме того поддерживается:
    1. Preview (F4)
    2. Вставка гиперссылок на другие темы помощи или изображения (Alt+H)
    3. Проверка всех ссылок при компиляции с выдачей предупреждений о "битых" ссылках
    4. Метатэги Title и Keywords для задания заголовка темы и списка ключевых слов
    5. HTML шаблоны для конвертации и задания таблицы стилей *.css

  Шаблон для конвертации Markdown -> HTML должен иметь фиксированное имя TemplateMD.htm
  и находиться в корне группы помощи проекта.

  Пример темы помощи в разметке Markdown с шаблоном и таблицей стилей - в проекте Demo

- Для поддержки Markdown в WEB интерфейсе в ТБ.Скрипт добавлена функция для программной
  конвертации Markdown -> HTML:

  Kernel.System:

    func MarkdownToHTML (Text :String; {Template :String}) :String

- Улучшена поддержка фильтрации в системных диалогах

*** Build 10303 ***

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

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

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

     Чтобы проекты можно было перекомпилировать при запущенном WEB сервере
     должна быть установлена опция:

     Администрирование -> Настройки сервера -> Сервер данных -> Общие
     [x] Разрешить обновление проектов при активных клиентах.

*** Build 10304 ***

- Проверка орфографии в текстовом редакторе, с помощью словарей HunSpell:

    http://http://hunspell.github.io

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

    http://github.com/LibreOffice/dictionaries

  Словари должны находиться в каталоге <Turbo>\Config\Dictionary. Каждый словарь -
  это два файла, например:

    ru_RU.aff
    ru_RU.dic

  Пока проверятся орфография только для текстовых файлов в составе проектов. При этом:
    для cod/mtl/lis файлов проверятся текст комментариев и строковых литералов
    для md/html файлов проверятся текст абзацев
    для txt файлов проверяется все

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

    en_US,ru_RU

  Слово считается правильным, если найдено хоть в одном словаре. Неправильные 
  слова подчеркиваются красной волнистой линией.

  Для каждого файла проекта, или проектной группы, можно переопределить язык
  в диалоге свойств файла/группы. Например, можно создать группы для документации
  на каком-то языке и указать язык в настройках группы. 

  Подсказки и пользовательские словари пока не поддерживаются.

- ТБ.Скрипт: поддержка много-строчных и внутри-строчных комментариев.
  Комментарий начинается с -{  и заканчивается }. Например:


    proc Some;
      -{ Комментарий в 
         несколько строк }

      if DebugMode -{ Под отладчиком} or WebSide -{ На сервере} then

      end;
    end


  Много-строчные комментарии могут быть вложенными, тогда внешний комментарий
  должен начинаться с нескольких открывающихся фигурных скобок и заканчиваться
  таким же количеством закрывающих 
  
  -{{{
    Внешний комментарий
    -{{
      Вложенный комментарий
      -{ Самый вложенный }
    }}
  }}} 

  Много-строчные комментарии начиная со второго уровня автоматически сворачиваются
  как структуры в редакторе.


- В структуре учета можно задавать фильтры для табличных журналов. В частности -
  в расширениях. Например:
                                                                      
    extends journal ТабЖур1 title 'Табличный журнал с 2020 года';
      Filter "Дата >= 01.01.2020";
    end;

- Изменения в структуре учета, которые не влияют на классы ТБ.Скрипт не приводят
  к полной перекомпиляции проекта


- В текстовом редакторе подсвечивается текущая строка. Опционально отключается:

    Настройки программы -> Редактор текстов -> Отображение
    [x] Выделение текущей строки


- Исправлена ошибка при закрытии окна истории по физически удаленной записи.


*** Build 10305 ***

- Словари искались не в том каталоге

- Поддержка раскраски много-строчных комментариев в HTML

*** Build 10306 ***

- Новые возможности графиков:
  - Новые типы графиков: Японские свечи, Диаграммы Ганта.
  - Вывод серий разного типа на одном графике
  - Новый программный интерфейс.

  В тип ChartSettings.SeriesKinds добавлено:

    const Gantt  = 8
    const Candle  = 9

  В тип Chart добавлено:

    field Series [SeriesNo :Integer] :ChartSeries
    func AddSeries ({Kind :ChartSettings.SeriesKinds}) :ChartSeries
    func InsertSeries (SeriesNo :Integer; {Kind :ChartSettings.SeriesKinds}) :ChartSeries

  Новый класс для заполнения/настройки одной серии:

  ChartSeries
    field Kind :ChartSettings.SeriesKinds
    field Visible :Logical
    field Label :String
    field Color :Integer
    field LineStyle :ChartSeries.LineStyles
    field LineWidth :Integer
    field ValuesCount :Integer
    field ValueLabel [ValueNo :Integer] :String
    field ValueColor [ValueNo :Integer] :Integer
    field Value [ValueNo :Integer] :Numeric
    field ValueEx [ValueNo :Integer] :Variant

  Для программного заполнения графика в него нужно добавить одну или несколько
  серий с помощью методов AddSeries/InsertSeries, и настроить/заполнить их с помощью
  методов класса ChartSeries. Каждая серия может быть своего типа и содержать
  различное количество значений Values. Компонента график пытается совместить 
  разные типы серий на одной панели, если это возможно.

  Старый способ заполнения графиков поддерживается для совместимости, но не рекомендуется.
  Следующие свойства Chart помечены как Deprecated:
  
    SeriesLabel, SeriesColor, SeriesLineWidth, SeriesLineStyle, LinesTolerance,   
    ValuesCount, Value, ValueLabel

  При заполнения серий новых типов Candle и Gantt необходимо использовать свойство ValueEx
  вместо Value. Оно позволяет установить для одного значения несколько разнотипных свойств
  в виде массива вариантов. Типы и порядок следования свойств однозначно определяется типом
  серии:

  Candle:
    ValueEx[i] = [Date, Open, Close, Min, Max];

  Gantt:
    ValueEx[i] = [Value, BegDate, EndDate, NextValue];

- Проверка орфографии: для слов с ошибками выдаются варианты замены в Popup-меню. 
  Опционально отключается в настройках программы:

  Настройки программы -> Редактор текстов -> Синтаксис

  [x] Проверять орфографию
     [x] Предлагать варианты замены

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

- В класс List добавлено свойство:

    func IndexOf (Value :Variant; {From :Integer = 1}) :Integer

  Если параметр From имеет отрицательное значение, то поиск идет в обратном 
  направлении с позиции Count - (Abs(From)-1)

- В MTL поддерживается авто-дополнение

- Рефакторинг компилятора MTL для повышения устойчивости к ошибкам.

- Доработан стандартный набор шаблонов авто-формирования

*** Build 10307 ***

- Шаблоны: программный интерфейс к клетке секции "по умолчанию":

  TemplateSection:

    field DefaultCell :TemplateCell

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

- Проверка орфографии: пользовательские словари.

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

  Есть 2 типа словарей:

  1. "Общие словари" - относятся к программе (инсталляции) в целом, находятся в 
    каталоге <Turbo>\Config\Custom\Dictionary
  2. "Словари проекта" - располагаются в каталоге проекта, в подкаталоге Dictionary

  В каждом из этих каталогов может быть создано несколько файлов словарей - 
  по одному для каждого языка. Файл имеет расширение *.wrd, например ru_RU.wrd

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

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

  При добавлении слова в словарь можно использовать 2 сценария: 

  1. Аббревиатуры или ключевые слова, которые не склоняются, можно добавить
     сразу, оставив поле "подобно" пустым.
  2. Для других слов, которые склоняются по падежам нужно: 
     - привести слово к именительному падежу единственного числа, в нижнем регистре
     - написать для него "похожее" слово, которое уже есть в словаре

  Например: как ошибка помечается слово "Подпроекты". Добавляем в словарь:

    Слово: подпроект  Подобно: проект

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

    подпроекта, подпроекту, подпроектом, подпроектами ...

- Исправлена ошибка в компиляторе, которая давала обращаться к свойствам расширения
  класса по имени файла расширения, вместо имени класса. 

  Могут перестать компилироваться какие-то проекты.

- Улучшена подсветка в текстовом редакторе

- Исправлены ошибки в графиках.
  
*** Build 10308 ***

- Chart: расширен программный интерфейс управления подсказками

  ChartSeries:
    field AutoHint :Logical { = True}
    field ValueHint [ValueNo :Integer] :String

  Свойство AutoHint позволяет отключить автоматическую установку подсказок 
  для серии. С помощью свойства ValueHint можно задать произвольную подсказку для 
  каждого значения.

  ChartSettings, переименованы свойства:
    ShowMarks -> ShowHints
    MarkKinds -> HintKinds
    MarkContetns -> HintContents

  Старое имя оставлено как синоним, для совместимости.

- Администрирование: группировка проекта по папкам в каталоге Projects 
  отображается в администрировании в ветке проектов. Поддерживается
  создание/удаление групп и перенос проектов из группы в группу.
  Группировка опционально отключается в popup-меню.

- Шаблоны: для клетки "по умолчанию" поддерживается настройка TabStop

- Шаблоны: оптимизация отрисовки.

- Возможность отключать логирование клиентом вызовов событий через 
  параметр Flags в Debug.ini

  Биты Flags:

    SQL    = 1;
    RPC    = 2;
    HTTP   = 4;
    Events = 8;

- Исправление ошибок в редакторе проекта (поддержка словарей и фильтрации)

*** Build 10309 ***

- Поддержка разработки прикладной помощи на разных языках.

  Для написания тем помощи на дополнительном языке нужно создать в проекте
  группу типа "Файлы помощи" с именем в формате "Help.XX", например "Help.en".
  Имена каталогов и файлов в разных языковых группах могут (но не обязаны)
  совпадать. При компиляции проекта каждая языковая группа помощи компилируется
  в отдельный файл "ИмяПроекта.XX.#hlp". Клиент грузит #hlp файл, соответствующий
  его текущему языку и показывает темы помощи из соотв. проектной группы.

  Группа помощи без расширения ".xx" считается основной. Если какая-то тема помощи 
  на текущем языке клиента не найдена - вместо нее показывается тема из основной
  группы.

  Все то же касается файлов изображений в помощи, они могут локализоваться
  по таким-же правилам.

- Администрирование: групповое удаление выделенных проектов

- Доработана поддержка пользовательских иконок в картотеках.

- Улучшена поддержка изображений (assign для SVG, копирование через clipboard)

- Исправлена ошибка передачи аргументов при вызове AsyncExecute

*** Build 10310 ***

- Помощь: внешние ссылки открываются в стандартном броузере

- Помощь: доработан экспорт помощи в форматы HTML/CHM

- Исправлены ошибки при отображении новых типов графиков (Гант, Свечи)

- TXNet: исправлена ошибка приема писем по POP3

*** Build 10311 ***

- Поддержка "полуокон" в режиме проектирования. По умолчанию в режиме
  полуокон открываются "парные" файлы (cod/tpl, cod/crf). Гиперссылки
  можно открыть в полуокне, если при переходе по гиперссылке удерживать Shift.

  Группировка с помощью Drag&Drop пока не поддерживается.

- При восстановлении рабочего стола восстанавливаются все полуокна на всех
  закладках. Как в режиме проектирования, так и в сессии.

- Новые клавиатурные комбинации по умолчанию:

  F5     - Распахнуть/схлопнуть полуокно
  AltF5  - Распахнуть/схлопнуть главное окно.

  CtrlAltLeft - Перейти к полуокну слева
  CtrlAltRight - Перейти к полуокну справа

  CtrlAltUp - "Поднять" полуокно на отдельную закладку

  Конфликтующие комбинации в шаблонах (управление обводкой) удалены

- Положением навигационной панели в стеке полуокон можно управлять
  через popup-меню  (Положение -> Сверху/Снизу)

- Добавлена поддержка MSSQL 2019

*** Build 10312 ***

- Доработки "полуокон"
  - Панель навигатора не появляется, при редактировании парных файлов (cod/tpl, etc)
  - Zoom влияет на все полуокна на всех вкладках
  - Drag&Drop: при "вытаскивании" полуокна из цепочки оно вытаскивается
    вместе со всеми последующими окнами (ранее следующие окна закрывались)
  - Закладки окон можно "объединять", если при Drag&Drop удерживать Ctrl.
    При этом все полуокна из одной закладки прикрепляются в конец цепочки.
  - Исправлен ряд ошибок

- Исправлены ошибки при работе шаблонов

*** Build 10313 ***

- ТБ.Скрипт: Класс Kernel.Pipe для организации взаимодействия между несколькими
  клиентами путем обмена сообщениями. Доступен на клиенте и сервере процедур.

  Документация:

  http://wiki.tengry.com/confluence/pages/viewpage.action?pageId=79495336

  Метод GetAny пока не реализован.

- Помощь: Live Preview при редактировании html/md тем помощи. Окно редактора 
  делится на 2 части, справа отображается итоговой вид темы, автоматически 
  обновляемый при редактировании текста.

  При прокрутке текстового файла Preview пытается синхронизироваться на 
  ближайшую позицию.

  Двойной клик в preview выделяет соотв. абзац в исходном тексте.

- Помощь: в Markdown можно использовать относительные ссылки на другие темы
  помощи. Относительной считается любая ссылка, без префикса (topic: etc). 
  Например:

  [](Topic1)
  [](Group\Topic2)
  [](..\Topic3)
  [](\Group\Topic)  - Ссылка от корня проекта.

  То же самое для картинок:

  ![](Image.png)

- Помощь: В проектах можно описывать темы помощи, которые будут показываться
  в режиме проектирования (Design-time help). Для этого нужно создать 
  проектную группу помощи и установить у нее атрибут "Разработка: True"

  При открытии проекта в список тем помощи добавляются все Design-time темы 
  из этого проекта и всех его подпроектов.

  Пример: проект Com группа Documentation.

- Для графика типа Свечи поддерживается настройка цветов для растущей/падающей свечи.

- Добавлен программный интерфейс для задания формы гистограммы для каждой серии:

  ChartSeries
    field HystogramForm :ChartSettings.HystogramForms

- Исправлена работа RTTI свойства FieldInfo.MaxSize. Для классов записей, замэппленных
  на базу данных оно возвращает реальную длины поля а не логическую (-1 / -2).

- Подсветка текущей строки настраивается в цветовой схеме редактора

*** Build 10314 ***

- Доработки Kernel.Pipe. Поддержаны каналы 0-й длины. Первая реализация GetAny.

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

- Графики: Расширенное управление чередованием цветов. 
  Через программный интерфейс:

  ChartSettings:
    field RotateColors :ChartSettings.RotateColorsKinds

  ChartSettings.RotateColorsKinds = (
    RotateColorsAuto  = 0
    RotateColorsSeries  = 1
    RotateColorsValues  = 2
    RotateColorsOff  = 3
  )

  В режиме Auto (умолчание):
    если одна серия - чередуется цвет значений
    если > 1 - чередуется цвет серий
    Для свечей: используется цвет "растущая/падающая"

- Графики: Управление обводкой значений, независимо, для каждой серии
  Через программный интерфейс:

  ChartSeries
    field Contour :Logical

  Для свечей, при выключении обводки - "усы" рисуются цветом свечи.

*** Build 10315 ***

- Доработки Kernel.Pipe. Поддержаны дополнительные параметры конструктора:

  Kernel.Pipe:
    func Create (Name :String; {Capacity :Integer}; {Mode :Pipe.CreatePipeModes}) :Pipe

  Pipe.CreatePipeModes = (
    CreateAlways  = 0
    CreateIfExist  = 1
    CreateIfNot  = 2
  )

  Оптимизирована работа GetAny. Теоретически, он поддерживает неограниченное
  количество ожидаемых каналов. На практике лучше не делать > 63, т.к. при
  этом будут запускаться дополнительные потоки для ожидания.

*** Build 10316 ***

- ТБ.Скрипт: в класс Window добавлено свойство, позволяющее управлять 
  состоянием прикрепленных (Docked) окон, т.е. программный интерфейс к 
  команде 'Зафиксировать' (или "шпильке" в заголовке окна)

  field DockSlide :Logical

- Графики: возможность программно управлять тем, включается ли серия в легенду:

  ChartSeries:
    field ShowInLegend :Logical

- Графики: возможность программно запретить трекинг мыши для отдельных серий:

  ChartSeries:
    field TrackMouse :Logical

*** Build 10317 ***

- Исправлено несколько ошибок при работе с изображениями

- Исправлена ошибка при фиксации дочерних окон

- Исправлена ошибки при вызове OnClick на графиках типа Pie

- Исправлена ошибка отслеживания мыши на графиках с несколькими сериями

*** Build 10318 ***

- Доработки Kernel.Pipe. Добавлены методы:

  func Send (Value :Variant; {Timeout :Numeric}) :Pipe
  func Receive (var Value :Variant; {Timeout :Numeric}) :Pipe
  func Call (InValue :Variant; var OutValue :Variant; {CallTimeout :Numeric}; {WaitTimeout :Numeric}) :Logical
  func Dispatch (Func :Function; {Timeout :Numeric}) :Logical

- Web Server: добавлена поддержка TLS v.1.1 и 1.2, Настраивается в Servers.ini

  [HTTP]
  VersionTLS=1.2   ; 1.0 / 1.1 / 1.2 (умолчание)

- Текстовый редактор: добавлена раскраска синтаксиса *.md файлов (пока без настройки)

- Исправлена ошибка загрузки #cod файлов, если делалась полная 
  перекомпиляция при работающих пользователях

- Исправлено несколько ошибок при работе с изображениями

*** Build 10319 ***

- Рефакторинг блокировок на сервере данных. Открытие подключения не блокирует запросы.

- Список ролей пользователя выдается в том порядке, в котором они перечислен в User.Roles.
  WEB при логине использует первую роль из списка.

-  В класс HTTPRequest добавлены свойства:
    field Secure :Logical    -- True, если запрос через HTTPS
    field SSLPort :Integer   -- Номер порта HTTPS, если сервер поддерживает этот протокол

- В стандартную поставку Bin включены библиотеки OpenSSL

*** Build 10320 ***

- Поддержка шифрования сетевого трафика и пароля сервера

  Шифрование сетевого трафика настраивается так же как и упаковка - отдельно для зон: 
    Локальное подключение, Местная сеть, Интернет
  в диалоге:
    Администрирование -> Настройки сервера -> Сетевой сервис -> Общие:
      [] Шифрование

  По умолчанию шифрование включено для зоны "Интернет", для остальных - отключено.

  Можно использовать алгоритмы шифрования: DES, 3DES, AES. По умолчанию используется AES,
  как самый надежный и быстрый.

  Дополнительно, можно задать пароль сервера, это делает шифрование устойчивым к MITM-атакам 
  и позволяет ограничивать доступ к серверу в публичных сетях. Пароль сервера задается 
  в том же диалоге на странице "Шифрование" и сохраняется в Servers.ini

  У клиента пароль сервера задается при в диалоге "добавление сервера" и сохраняется
  в файле Favorites.xml. Если пароль не задан, то он будет запрошен при подключении,
  до запроса пароля пользователя.

  Используется ли шифрование при работе с сервером можно проверить в диалоге 
  "Информация о сессии", текущий алгоритм шифрования будет написан после адреса сервера:

    Сервер данных: ИмяСервера (xx.xx.xx.xx), AES

- ТБ.Скрипт: Исправлена ошибка при использовании пользовательских типов в замыканиях

- ТБ.Скрипт: При добавлении пользователей через программный интерфейс Administration 
  можно использовать GUID групп вместо имен

*** Build 10321 ***

- Шаблоны: изменения в работе iplace-редактора

  - После входа в Ipnlace-редактор по Enter/DoubleCLick срабатывает обработчик OnEdit 
    с Action=InitList в котором можно производить инициализацию списков 

  - При перемещению по спискам срабатывает обработчик OnEdit c Action=ListChange

  - При закрытии списка по Esc срабатывает обработчик OnEdit c Action=ListClose

  - В FieldEdit добавлено новое свойство:
      field ListIndex :Integer

  - При нажатии на кнопки Del/BkSp в обработчик OnEdit с Action BeforeEdit 
    приходит код нажатой клавиши:

    Del = Ord(7)
    BkSp = Ord(8)

  - В FieldEdit добавлено новое свойство Tag, которое может хранить произвольное
    значение пока открыт inplace-редактор.
      field Tag :Variant

  В проекте Demo пример использования новых возможностей для организации поля ввода
  с автодополнением - выбор каталога/файла

*** Build 10322 ***

  - Программный интерфейс для смены пароля пользователя:

    UserInfo
      proc SetPassword (OldPassword :String; NewPassword :String)

  - Настройка inplace редактора клетки шаблона для ввода паролей:

    FieldEdit
      field IsPassword :Logical

*** Build 10323 ***

 - Пересборка с подписью

*** Build 10324 ***

- ТБ.Скрипт: в класс System добавлены функции:

  System:
    func UrlEncode (Text :String; {EncodeSpace :Logical=False}) :String
    func UrlDecode (Text :String) :String
    func HTMLEncode (Text :String) :String
    func HTMLDecode (Text :String) :String

  Функция UrlEncode по умолчанию кодирует пробел как "+" (как PHP urlencode)
  Если EncodeSpace=True, то пробелы кодируются как "%20" (как PHP rawurlencode)
                                                                 
- В Servers.ini добавлен ServerPasswordRaw

*** Build 10325 ***

- Диалог открытия проектов поддерживает группировку проектов и быстрый поиск,
  Открытия инф. баз - быстрый поиск

- TXServer.exe поддерживает ключ запуска /Console. При задании этого ключа
  все сообщения и запросы подтверждения выдаются в консоль, вместо модальных окон.
  Полезно для написания скриптов. 

  Так-же в состав исполняемых модулей включен TXServerC.exe - консольное приложение
  делающее вызов TXServer.exe c передачей ему всех параметров + /Console.

*** Build 10326 ***

- TXNet: все пути, указанные в сценарии, считаются относительными к каталогу сценария.
  Касается ключевых слов: AttachFile, BodyFromFile, AttachFolder, LCD

- В класс HTTPRequest добавлены свойства:

    field ServerAddr :String;     -- Адрес HTTP сервера
    field ServerPort :Integer;
    field RemoteAddr :String;     -- Адрес подключившегося узла (последнего в цепочке)
    field RemotePort :Integer;

- Графики: переработан программный интерфейс к осям. 

  ChartSettings:
    field Axis [Kind :ChartSettings.AxisKinds] :ChartAxis

  type AxisKinds = enumeration
    const BottomAxis|Arguments  = 0
    const LeftAxis|Values  = 1
    const TopAxis  = 2
    const RightAxis  = 3

  ChartAxis:
    field Visible :Logical
    field ShowGrid :Logical
    field ShowLabels :Logical
    field Title :String
    field MinValue :Variant
    field MaxValue :Variant
    field Step :Variant
    field Logarithm :Numeric
    field Reversed :Logical

  ChartSeries:
    field UsedAxes :ChartSettings.AxisKinds[] = [LeftAxis, BottomAxis]
      -- Привязка серии к осям

  Дублирующиеся свойства ChartSettings объявлены deprecated:
    field ShowGrid [Kind :ChartSettings.AxisKinds] :Logical
    field ShowAxis [Kind :ChartSettings.AxisKinds] :Logical
    field ShowLabels [Kind :ChartSettings.AxisKinds] :Logical

*** Build 10327 ***

- Новый формат дистрибутива проектов. Состоит из одного файла с расширением TPB.
  Является обычным ZIP архивом, внутри которого запакованы каталоги проектов
  и файл оглавления content.nfo.

  Мастер публикации поддерживает структура папок при выборе проектов. 
  При установке проектов структура папок сохраняется.

  На расширение TPB можно настроить файловую ассоциацию и устанавливать/обновлять
  проекты в один клик на файле дистрибутива.

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

- Доработки управления сервисами Turbo через командную строку. Изменены коды
  возврата сервиса TXServer.exe:

  1. Если произошла ошибка при вызове функций OS API, то возвращается код ошибки OS.
     Например 5 - Отказано в доступе, etc. Значения < 1000000
     Коды ошибок Windows:
       https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes
  2. При возникновении программной ошибки на Delphi, возвращается код 1000000
  3. При ошибках запуска/остановки одного или нескольких сервисов возвращается
     код 2000000 + n, где n - количество сбойных сервисов. Сервисы, которые 
     были пропущены,потому что они уже запущены/остановлены - не считаются.

- TXAuto: новый интерфейс T9NetServer - для управления сетевой службой, 
  в частности - запуска/остановки сервисов. Предварительная версия.

*** Build 10328 ***

- Исправлена ошибка печати/экспорта графиков

- В программный интерфейс ChartAxis добавлено свойство:
    field AutoScale :Boolean

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

*** Build 10329 ***

ТБ.Скрипт: 

- В класс Window добавлены свойства:

    field WidthMM :Numeric
    field HeightMM :Numeric
    field AutoSize :Logical
    field CanResize :Logical

- В класс Image добавлено свойство:

    func Transform ({Format :String}; {Width :Integer}; {Height :Integer}) :Image

  Позволяющее сменить формат и/или размер картинки. Доступно только на клиенте.

- Доработка метода HTrans.AsString. Добавлены новые опции:

  type AsStrOptions = enumeration
    const AsStrRefNames  = 6
    const AsStrRefDescriptions  = 7

- Исправлена ошибка вытеснения журналов в сервере расчетов. Настройки вытеснения 
  сбрасывались после компрессии журналов.

- Редактор проекта: команда "Исключен (Ctrl-)" активна на всех элементах дерева
  проекта, а не только на корневых группах

*** Build 10330 ***

- Новая версия мастера создания классов, с поддержкой прикладных шаблонов.

- Добавлена группа подтверждений - "Подтверждения проектирования"

- Исправлена ошибка "потери" исключения в некоторых случаях (например, при вызове 
  из кода завершения модальных диалогов).

- Исправлена ошибка циклического обновления редактора ресурсов  

- Исправлена ошибка фильтрации в диалоге выбора тем помощи

- Исправлена ошибка при показе пустых картинок

*** Build 10331 ***

- В структуре учета можно назначать для справочников TAB-классы в качестве картотеки.
  Для этого класс (или его предки) должен быть помечен атрибутом Class="Card".
  Совместимость по типу документа - не проверяется.

- Изменился тип свойства класса AccSource:
    field Cardform :Class UserObject
  Ранее он был - Class CardForm. Возможны ошибки при компиляции старых проектов.

- Графики: поддержка перспективных 3D проекций. Настройка параметров проекции
  делается в диалоге настроек, кнопка [x] Трехмерный вид "Настроить"

  Поддерживается интерактивная настройка проекции прямо в графике с помощью 
  мышки при удержании кнопки Alt:

  Alt + Double Click - Включение/выключение перспективной проекции
  Alt + Left Drag    - Вращение графика
  Alt + Right Drag   - Перемещение графика
  Alt + Колесико     - Масштабирование графика

- Графики: экспорт в различных графических форматах (Bmp/Png/Jpg/Gif/Emf),
  параметры экспорта задаются в мастере.

- Графики: восстановлена функциональность экспорта/импорта данных графика
  в формате TBG. Поддерживается совместимость с версией 9.5

- В класс ProcessInfo добавлено свойство:

    field Platform :ProcessInfo.Platforms

  где:

    type Platforms = (
       const Windows  = 0
       const Linux  = 1
    )

- ТБ.Скрипт: оптимизация работы с типом Variant (NullSingleton)

*** Build 10332 ***

- Новый механизм расширенного форматирования отчетов, общий для Desktop и WEB версий.
  Используется обработчик события OnUpdateCell, который можно устанавливать у 
  показателей и параметров разбиения. Обработчик является обычным замыканием.
  В качестве 2-го параметра он получает программный интерфейс ReportCell, через
  свойства которого можно управлять некоторыми стилями. В Desktop версии это
  приведет к изменению клетки шаблона а в Web - стилей HTML.

  Расширения в программном интерфейсе отчетов (все классы доступны на сервере процедур)

  ReportIndicator:
    proc OnUpdateCell :proc(aSender :ReportIndicator; Cell :ReportCell)

  ReportSplitContent
    proc OnUpdateCell :proc(aSender :ReportSplitContent; Cell :ReportCell)

  ReportCell:
    field Part :Report.IndicatorParts
    field SumKind :Report.SumKinds
    field DebCre :Report.SumDebCre
    field Content :Variant
    field FormatStr :String
    field Color :Integer
    field Font :Font

  Старый механизм форматирования, основанный на событии шаблона OnUpdateReport
  работает только для Desktop версии. Он является Deprecated. 

  Пример использования - в проекте Demo

- Рефакторинг работы с датами для поддержки Linux

*** Build 10333 ***

- ТБ.Скрипт: добавлен метод:

  System
    func Compare (Value1 :Variant; Value2 :Variant; {Options :System.CompareOptions[]}) :Integer

  где

    type CompareOptions = (
      cmpIgnoreCase,
      cmpBinary,
      cmpApprox,
      cmpVariants)

  Сравнивает 2 произвольных значения и выдает -1 / 0 / 1 в зависимости от результата
  По умолчанию сравнение строк идет с учетом регистра, а чисел - с абсолютной точностью.
  Опции позволяют менять это поведение:
    cmpIgnoreCase - сравнение строк без учета регистра
    cmpBinary     - сравнение строк по коду символа, а не по алфавиту (работает быстрее)
                    Возможно сочетание флагов [cmpBinary, cmpIgnoreCase] - при этом
                    сравнение без учета регистра делается только для латиницы.
    cmpApprox     - Вещественные числа сравниваются с относительной погрешностью
    cmpVariants   - Допустимо сравнение значений различного типа (например, число и строка)
                    Без этого флага сравнение разнотипных значение приведет к ошибке

- Kernel.List: добавлен метод:

    proc Move (SourceIndex :Integer; DestIndex :Integer)

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

  List
    proc Sort ({Proc :Function})

  Пример:

    MyList.Sort(
      func(Val1, Val2 :Variant) :Integer
        Result = Compare(Val1, Val2);
      end);

- Добавлен метод:

  System
    proc CopyMemory (SourceAddr :Pointer; DestAddr :Pointer; Length :Integer)

- Методы System.ReadMemory / System.WriteMemory поддерживают тип Int64

- Графики: ошибки/зависания при уменьшении размеров графиков.

*** Build 10334 ***

- Новая версия сервера процедур: поддержка "внутренних сервисов".

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

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

  inclass
    func CreateService ({Name :String}; {Server :String}; {DataServer :String}; {Infobase :String}; {User :String}; {Password :String}) :ProcServer
    func OpenService (Name :String; {Server :String}; {DataServer :String}; {Infobase :String}; {User :String}; {Password :String}) :ProcServer

  Inobject
    field ServerName :String
    field DataServerName :String
    field CalcServerName :String
    field InfobaseName :String
    field UserName :String
    field ServiceName :String
    field AlreadyExists :Logical
    field CloseTimeout :Numeric

  Все свойства, кроме CloseTimeout - read-only

  Конструктор CreateService ищет сервис по имени, если не находит - создает новый, если
  находит - подключается к существующему. В этом случае свойство AlreadyExists = True

  Конструктор OpenService подключается к существующему сервису по имени, если сервис
  с таким именем не найден - возвращает nil.

  В случае если происходит подключение к существующему сервису параметры User/Password 
  игнорируются (т.е. в OpenService они пока игнорируются всегда)

  Все параметры CreateService / OpenService можно опускать, при этом они имеют те же умолчания,
  что и соотв. параметры Create для обычных серверных процедур (кроме Name - см. далее)

  Имя сервиса - уникально в контексте информационной базы с которой работает сервер процедур,
  т.е. условно, можно считать "полным именем сервиса" ключ "Server\DataServer\Infobase\Name".

  Имя сервиса можно опускать (или передавать ""). При этом CreateService всегда создаст новый 
  "безымянный сервис", а OpenService("") - всегда вернет nil. Т.е. безымянный сервис нельзя 
  открыть по имени, если ссылка на него потеряна - подключиться к нему невозможно
  
  Таймаут неактивности для именованных сервисов по умолчанию = 1 мин, для безымянных = 0.
  Неактивный сервис автоматически закрывается, если к нему нет ни одного подключения.

  Управлять таймаутом неактивности можно через свойство CloseTimeout (задается в сек.).
  Если нужно чтобы сервис никогда не закрывался по таймауту - присваивайте -1.

  Сервисы могут исполнять любые серверные процедуры, синхронно или асинхронно с помощью
  методов  Execute / AsyncExecute. Со след. отличиями от обычных серверных процедур:

  1. AsyncExecute не поддерживает Callback'и, соотв. параметры - игнорируются.
     так же не поддерживается WaitAll для асинхронных вызовов.
  2. Исполнение асинхронной процедуры не прерывается после закрытия подключения к сервису
  3. Исполнение синхронной процедуры не прерывается при прерывании работы клиента -
     прерывается _ожидание_ завершения, а процедура продолжает работать.

  Единственный способ (пока) прервать работу сервиса - остановить сервер процедур.   
  В дальнейшем планируется административный интерфейс для мониторинга/управления сервисами

  Запуск/открытие сервисов доступно как с Desktop клиента, так и из серверных процедур,
  в том числе, работающих под сервисом. Т.е. сервисы могут использовать другие сервисы

- Асинхронное исполнение серверных процедур (AsyncExecute) теперь работает не только 
  на Desktop клиенте но и на сервере (из других серверных процедур). При этом нужно 
  учитывать следующую особенность: Callback'и для асинхронных вызовов на сервере 
  будут срабатывать только при вызове WaitAll. 
  На клиенте они вызываются из WaitAll или при Idle - когда клиент "простаивает".
  И, напомню, Calbback'и для сервисов - не поддержаны вообще (пока).

- Так же в программный интерфейс ProcServer добавлены методы:

    func ExecuteEx (Proc :Function {, ...}) :Variant
    proc AsyncExecuteEx (OnResult :Function; OnError :Function; Proc :Function {, ...})

  для запуска серверных процедур по ссылке на функцию (короткому замыканию), вместо имени.

  Т.е. вместо

    vSrv.Execute("МойКласс", "МояФункция", Параметры...)

  можно писать:

    vSrv.Execute(МойКласс.@МояФункция, Параметры...)

- Отчеты: в программный интерфейс ReportSplitContent добавлено свойство:

    field AfterIndicators :Logical

- Администрирование: в списке подключений добавлены столбцы с именем 
  пользователя и инф. базы. Так же поддержана команда "Настроить видимость".

- Сервер данных: исправлена ошибка - циклическая реорганизация (версии x64)

- Графики: исправлена ошибка отображения круговой диаграммы

*** Build 10335 ***

- При вызове обработчика OnUpdateCell (ReportIndicator/ReportSplitContent)
  текущая позиция Report синхронизируется с форматируемой клеткой

- Поля справочника/параметры типовых операций в структуре учета можно 
  связывать с полями документа типа Text.

- Сервер процедур: исправление ошибок поддержки сервисов

- Графики: Поддержка прокрутки "широких" графиков (клавиши Left/Right)

- Графики: исправление ошибок отображения

*** Build 10336 ***

- Исправлена ошибка в сервере данных, приводившая к ошибкам импорта и др.
  (ошибка появилась в Build 10335)

*** Build 10337 ***

- Шаблоны: не вызывался обработчик ПриВыходе в ссылочном поле при повторном выборе
  записи из картотеки (если был обработчик ПриОбзоре)

- Исправлена ошибка: неправильная кодировка CRF файла при создании нового 
  класса с помощью мастера классов

- Исправлена ошибка отображения в редакторе ресурсов.

*** Build 10338 ***

- Помощь: ссылки на темы помощи из текущего проекта должны начинаться с ".":
    Topic:.Group.Item
  Такой синтаксис позволяет избежать конфликта между именем проекта и
  именем группы. Старый синтаксис (Topic:Group.Item) поддерживается, 
  для совместимости, но не рекомендуется к использованию.
  Диалог выбора ссылки (Alt-H) вставляет ссылки в новом формате.

- Редактор перевода: поддержана команда Фильтр (Ctrl+F)
  + Исправлено несколько ошибок

- Исправлена ошибка перехода на обработчик события из редакторов ресурсов/шаблонов

- Исправлена ошибка форматирования в текстовом редакторе

*** Build 10339 ***

- В класс System добавлены функции для получения информации о свободном
  месте на диске:

  func GetDiskFreeSpace (FolderName :String) :Int64
  func GetDiskTotalSpace (FolderName :String) :Int64

- Исправлена ошибка наследования свойств с getters, заданными через формулу, типа
  var Field :Variant = FField set @SetField

- Исправлено несколько ошибок работы с файловыми путями под Linux

*** Build 10340 ***

- Исправлена ошибка наследования свойств с getters, заданными через формулу, версия 2.

*** Build 10341 ***

- ТБ.Скрипт: Скалярные свойства по умолчанию.

  Директиву #Default теперь можно использовать для скалярных свойств:

   #Default;
   var Value :Variant = ...

  Если объект имеет скалярное свойство по умолчанию, то доступ к нему возможен
  с помощью сокращенного синтаксиса: Имя$

   var vVar :IVar;
   vVar = IVar.Create;
   vVar$ = 123;
   Assert(vVar$ = 123);

  Синтаксис Имя$ является "синтаксическим сахаром" и равносилен Имя.Value

  Итого: 
    для индексных свойств по умолчанию: vList[i] = vList.Items[i]
    для скалярных свойств по умолчанию: vVar$ = vVar.Value

  Свойство по умолчанию может быть только одно в классе. Однако, наследник может
  его изменить на другое (например, Fld.IPeriodicField: Value -> Items)


- ТБ.Скрипт: новый способ описания вычислимых полей: "приводимые" поля 

    var Num :IVar as Integer;

  В поле Num хранится переменная типа IVar, имеющая скалярное свойство 
  по умолчанию (Value). При обращении к полю Num автоматически произойдет
  обращение к этому свойству, типизированному как Integer. 
  Для того чтобы обратиться к самой переменной IVar (ее называют "нижележащей" 
  переменной или "Backfield") используется синтаксис $Num.


    $Num = IVar.Create;
    $Num.Caption = '...';

    Num = 123;
    Assert(Num = 123);

    Assert(Num = $Num.Value);
    Assert(Num = $Num$);

  Обратите внимание, что $Num.Value (или, $Num$ = ($Num)$ ) - по прежнему
  имеет тип Variant. 

    $Num$ = 'abc'; 
    Assert(Num <> 0); -- Runtime ошибка:  Значение типа "String" используется как "Integer"

  ошибка происходит, т.к. обращение к Num равносильно выражению: $Num.Value as Integer

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

  Альтернативный способ обращения к backfield - функция класса System:

    func Backfield (Ref :Function; {NewValue :Variant}) :Variant

  Пример:

    Backfield(@Num, IVar.Create);
    Assert( Backfield(@Num) = $Num );

  Может использоваться для получения или установки значения backlfield в случае,
  когда класс неизвестен - по имени класса/поля через RTTI.

- Доработки в редакторе ресурсов для поддержки приводимых свойств
- Доработки проверок ресурсов при компиляции -/-/
- Доработки отладчика -/-/
- Доработки автодополнения -/-/

- Исправлена ошибка обращения к унаследованным свойствам с getters через RTTI.
- Более строгий контроль наследования свойств при компиляции
- Оптимизация Assert

*** Build 10342 ***

- ТБ.Скрипт: оператор условного разыменования Expr?.Prop. Если выражение Expr = nil, 
  то Prop - не исполняется. При этом:

  Если условное разыменование является частью выражения, результатом
  выражения является nil. Т.е. 

    Expr?.Prop  аналогично  if(Expr <> nil, Expr.Prop, nil)

  С некоторыми отличиями:
  1. Выражение Expr вычисляется только один раз.
  2. Если Expr возвращает класс имеющий перекрытый оператор сравнения (Equal) 
     то он _не_ вызывается, т.е. сравнение делается по истинному результату Expr.

  Если условное разыменование является частью операции

    Expr?.Prop(...);
    Expr?.Prop = ...;

  то при Expr = nil часть после ?. - не выполняется, т.е. этот код аналогичен:

    if Expr <> nil then
      Expr.Prop(...);
    end;

  Возможны произвольные цепочки условных разыменований:

    if a?.b?.c?.d = nil then
    end;

*** Build 10343 ***

- Версия 10.4

- ТБ.Скрипт: прикладные функции с переменным набором параметров. 

  Для описания добавляете последним формальным параметром:  ...Name :Type
  При вызове такой функции можно перечислять произвольное (в том числе - 0) количество 
  фактических параметров типа Type через запятую. Внутри функции Name рассматривается 
  как обычный массив: Name :Type[];

    func SumNum(...Args :Numeric) :Numeric;
      for var I = 1..LengthOfArray(Args) do
        Result = Result + Args[i];
      end;
    end;

    Assert(SumNum(1,2,3,4,5) = 15);
    Assert(SumNum() = 0);

  Если тип переменного набора параметров - Variant, то его можно опускать:

    func MyFormat(const Mess :String; ...Args ) :String;
      Result = Sys.Strings.Format(Mess, Args);
    end;

    Trace( MyFormat("Number=%d, String=%s", 123, 'abc') );

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

    proc MyTrace(const Mess :String; ...Args );
      Trace( MyFormat(Mess, ...Args) );
    end;

  Это работает и для встроенных функций с переменным набором параметров, например:

    var Srv = ProcServer.Create;
    var Args :Variant[] = [123, 'abc'];
    Srv.Execute('Class', 'Proc', ...Args);

    -- Равносильно:
    --  Srv.Execute('Class', 'Proc', 123, 'abc');
    --  Srv.Execute('Class', 'Proc', ...[123, 'abc']);

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

    func PartialRight(Fn :Function; ...RightArgs) :Function;
      Result =
        func(...Args) :Variant
          Result = Fn( ...GetArraysUnion(Args, RightArgs) );
        end;
    end;

    var ExtractFirstWord = PartialRight(@ExtractWord, 1, '');
    Assert( ExtractFirstWord('Some text') = 'Some' );

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

    var Items[...Args] :Variant
      get func(...Args) :Variant
        Result = FItems[ ConcatString(Args) ];
      end
      set proc(Value :Variant; ...Args)
        FItems[ ConcatString(Args) ] = Value;
      end;

    var FItems :Storage := Storage.Create;

  ВНИМАНИЕ: В связи с тем, что переменный набор параметров может быть 
  только последним в списке параметров, в версии 10.4 изменен формат 
  индексных функций-сеттеров:

    proc SetItems(aIndex :Integer; NewValue :Variant)
    -->
    proc SetItems(NewValue :Variant; aIndex :Integer)

  Стандартные проекты ветки 10.4 изменены в соответствии с новым синтаксисом.
  Пользовательские проекты придется исправлять.

*** Build 10401 ***

- Объект шаблона Picture: изменен формат обработчика OnClick:

    proc OnClick (Sender :Picture; Action :Template.ClickTypes; X :Integer; Y :Integer; Ref :String)

  Совместимость со старым форматом не поддерживается - если пользовательские проекты 
  использовали этот обработчик - их придется исправить.

  В обработчик передается дополнительная информация:
    Action - SingleClick/DoubleClick
    X, Y - координаты нажатия в координатной системе изображения
    Ref - Только для SVG - нажата гиперссылка.

  Так же добавлено свойство:

  Picture:
    field ManualStretch :Logical
      -- Включает масштабирование изображения с помощью колесика мышки

- Доработаны системные диалоги выбора иконок и выбора изображений для справки
  В текстовом редакторе команда вставить ссылку (Alt-H) теперь отображает
  только темы помощи, без изображений. Для вставки ссылки на изображение
  добавлена новая команда:

    Вставить картинку (Kernel.Service.InsertImagelink) - Alt+Shift+H

- В состав исполняемых файлов добавлена библиотека TXNetLib, в которую вынесена
  вся работа с интернет-протоколами. Утилита TXNet работает только при наличии
  этой библиотеки.

  В ТБ.Скрипт добавлены встроенные классы для приема/отправки почты:

    Kernel.SMTPServer
    Kernel.POP3Server
    Kernel.EMail

  Базовые проекты теперь используют эти классы вместо вызова TXNet.
  Утилита TXNet пока оставлена, для совместимости, но, возможно, в будущих
  версиях будет удалена.

  Работа над встроенными классами еще не закончена, в текущий момент стабильно
  работает только отправка почты через SMTP.

- Добавлена поддержка типа Int64 в базах данных. Можно описывать поля данного
  типа в MTL и использовать для хранения/поиска информации.

  Использовать Int64 в качестве DocID пока нельзя.

*** Build 10402 ***

- Исправлено несколько ошибок работы с почтой

- Исправлена ошибка удаления записей в PostgreSQL

*** Build 10403 ***

- Поддержан мэппинг мягких ссылок на поля типа Sign в журналах версии 2.

- Исправлено несколько ошибок работы с почтой

- Убрана проверка кодов защиты при подзагрузке во фрейм

*** Build 10404 ***

- Новый объект шаблона: Browser. Может использоваться для просмотра
  HTML, загружаемого из Internet (свойство URL) или заданного
  статически (свойство HTML)

- ТБ.Скрипт: события шаблонов и картотек теперь являются полноценными замыканиями.

  Т.е. вместо:

    Button1.OnClick = "Button1_OnClick";

  можно писать

    Button1.OnClick = @Button1_OnClick;

  или даже:

    Button1.OnClick = 
      proc(Sender :Button)
      end;

  Для совместимости ограниченно поддерживается старый синтаксис:
  Событию можно присвоить строку, c именем обработчика "MethodName" 
  при этом обработчик ищется в классе формы, а не в текущем классе, 
  как в случае @MethodName. Но при обращении к свойству мы всегда 
  получим замыкание. Т.е.:

    Button1.OnClick = "Button1_OnClick";                  -- Работает
    -- Assert( Button1.OnClick = "Button1_OnClick" );     -- Не откомпилируется.
    Assert( Button1.OnClick = @Button1_OnClick );         -- Нужно так
    Assert( Str(Button1.OnClick) = "@Button1_OnClick" );  -- или так
    Assert( Com.Lib.EventName(Button1.OnClick) = "Button1_OnClick" );  -- или так

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

- Типизированы Callback функции во встроенных классах

- Доработано чтение SVG изображений с разными кодировками строк в XML

- Поддержка Int64 при экспорте/импорте Storage в JSON

*** Build 10405 ***

- Класс System, добавлен метод:

    func RecordsRedirect (Old :Record; New :Record; {Where :Class Record[]}; {ShowWizard :Logical}) :Integer

  программный интерфейс к системному сервису коррекции ссылок.
  Может вызываться на сервере процедур (только с опцией ShowWizard = False)
  Возвращает количество измененных записей.

- Класс Mathematic, добавлены методы:

    func Inc (var Value :Integer) :Integer
    func Dec (var Value :Integer) :Integer

- Исправлено несколько ошибок кодогенерации при работе с Variant

- Linux: поддержка MySQL
- Linux: единый формат DbTypes.ini

*** Build 10406 ***

- Класс HTTPClient для кроссплатформенной работы с HTTP протоколом
  (предварительная версия)

- Доработки объекта Browser

- Отслеживание позиции мыши в grid'ах (для тем TurboX)

- Повышена контрастность текущей позиции в grid'ах

*** Build 10407 ***

- Доработки вызовов AutoObject

- Доработки объекта Browser

- Доработки объекта HTTPClient

- Исправлены ошибки при копировании изображений в Clipboard

- Исправлена ошибка загрузки desktop'а при программной отмене открытия окон

- Исправлена диагностика ошибки реорганизации ИБ, при отсутствии части проектов

*** Build 10408 ***

- Автодополнение в текстовом редакторе. Настраивается:
    Настройки программы -> Редактор текстов -> Синтаксис

*** Build 10409 ***

- Исправления TXCompare

- Доработки объекта Browser

- Доработки автодополнения

*** Build 10410 ***

- Подсказки по параметрам текущего вызова. При включенном автодополнении
  появляются автоматически после выбора из списка или набора "(" или "[".

  Для ручного вызова: Ctrl+Shift+Space (Kernel.Project.Design.ParamHint)

*** Build 10411 ***

- Прикладной класс поддерживающий динамическую диспетчеризацию (#Dynamic On)
  теперь поддерживает вызовы методов и индексированных свойств через 
  диспетчер "по умолчанию". Для вызова методов методов нужно реализовать
  методы OnCallFunc/OnCallClassFunc. Во все обработчики добавлен 
  открытый набор параметров. Полный набор обработчиков:

  InObject 
    func OnCallFunc(Name :String; ...Args) :Variant;
    func OnGetField(Name :String; ...Args) :Variant;
    proc OnSetField(Name :String; Value :Variant; ...Args);

  InClass 
    func OnCallClassFunc(Name :String; ...Args) :Variant;
    func OnGetClassField(Name :String; ...Args) :Variant;
    proc OnSetClassField(Name :String; Value :Variant; ...Args);

- В класс System добавлен метод:
   func ClosureIsFunc (Closure :Function) :Logical

- Исправлена ошибка объекта Chart при запуске с ключом /NoUI

- Исправлена ошибка отображения Grid'ов

*** Build 10412 ***

- Автоматическое добавление парных символов в редакторе кода.
  Парными считаются: (), [], {}, '', "", ``
  Отключается в настройках

- Доработки OnMouseAction

- Доработки IMAPServer

*** Build 10413 ***

- Доработки HTTPClient

- Обновлена версия OpenSSL

- Добавлен режим показа аллоцированной памяти по показаниям Windows.
  Переключается кликом в правой панели строки состояния

*** Build 10414 ***

- Доработки HTTPClient (добавлены методы Put/Path/Delete, поддержан KeepAlive)

- Исправлена ошибка импорта документов из TBD формата

- Исправлена ошибка импорта: не переносились пустые значения служебных полей

- Экспериментальный режим работы полуокон, без навигационной панели. Вместо нее
  используются иконки на закладке окна. Включается через Popup меню на строке
  закладок окон, опция "Панель навигации". Может быть независимо настроен для
  рабочей сессии и режима разработки.

- Исправлено несколько ошибок при работе с нестандартным масштабом экрана

- Изменен шрифт по умолчанию для системных диалогов - на стандартный для системы: 
  SegoeUI, 9 (Vista+)

- Доработана стилизация (хинты, текстовый редактор)
     
*** Build 10415 ***

- Исправлена ошибка показа хинта по параметрам

- Исправлена ошибка вызова процедур с параметрами из планировщика

*** Build 10416 ***

- Новая команда "Аварийный выход" (Kernel.Service.Kill), по умолчанию: Ctrl+Alt+X
  Немедленно завершает работу сессии, без сохранения изменившихся документов
  и настроек. Может использоваться, когда нормальный выход из сессии затруднен,
  например, при разрыве связи с сервером.

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

  Аварийный выход возможен, даже если в сессии открыты модальные бланки.

- Команда прерывания сессии под отладчиком (Ctrl-F12) позволяет прервать
  сессию в модальном состоянии и без предварительной остановки отлаживаемого
  процесса

- Доработки нового режима закладок

*** Build 10417 ***

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

- Исправлена ошибка фокусировки окон при построении уточняющего отчета для
  графического отчета

*** Build 10418 ***

- Добавлена возможность перекрывать поля документов в MTL. Можно перекрывать
  поля базового класса при наследовании документов или поля исходного класса
  при расширении. При перекрытии можно:

  - Изменить длину строкового поля
  - Изменить кодировку строкового поля или поля типа Text
  - Изменить описание поля
  - Добавить синонимы для имени поля

  Перекрытие поля по синтаксису аналогично описанию нового поля, перед 
  которым поставлена директива #Override, например:

    extends Com.Base.CodeName;
      #Override;
      Field Code synonym UKey :String;  -- Добавляем синоним UKey
      #Override;
      Field Name :String(500);          -- Увеличиваем длину имени
    end;

  В отличии от ТБ.Скрипт наличие директивы #Override при перекрытии поля
  является обязательным.

*** Build 10419 ***

- Исправлено несколько ошибка в объекте шаблона Picture (печать, очистка)

- Исправлено перекрытие полей. Слишком строгий контроль не позволял 
  восстанавливать некоторые старые Backup'ы

*** Build 10420 ***

- Оптимизация компиляции проектов (кэширование cod и #cod файлов)

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

- Исправлена ошибка (AV) при построении текстовых отчетов

*** Build 10421 ***

- Исправлена ошибка чтения не`инициализированных мягких ссылок

- Исправлена ошибка циклической реорганизации при изменении наследования полей

- Улучшена поддержка Int64 в калькуляторе

- Исправлен Copyright и перевод

*** Build 10422 ***

- Доработки визуальных стилей

- Доработки модальных окон

- Работа с интернет ключом перенесена на Indy (TXNetUtil.dll)

- Шаблоны: доработана поддержка мыши (OnMouseAction)

- Linux: включена защита, только интернет-ключ.

- Linux: добавлена поддержка работы в режиме сервиса (daemon). Подробности:
    http://wiki.tengry.com/confluence/pages/viewpage.action?pageId=90865761

*** Build 10423 ***

- Типизированы все callback функции во встроенных скриптовых классах

- Большинство мастеров в Администрировании сделаны масштабируемыми

- Доработана поддержка стилей

*** Build 10424 ***

- Добавлен манифест совместимости в Windows 10

- Редакция Бизнес поддерживает до 4-х Гб памяти, вместо 2-х

- Поддержка 64-х разрядных DocID

  Включить 64-х разрядные DocID можно индивидуально для каждого типа записи,
  путем описания соотв. поля в MTL, в том числе - через extends, например:

    extends COM.Base.ComFields;
      field DocID :Int64;
    end;

  или сразу для всех записей инф.базы - в администрировании, в диалоге
  настроек информационной базы:

  Общие -> Прочие
    [x] 64-х разрядные DocID.

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

  64-х разрядные DocID поддерживаются всеми серверными и клиентскими 
  компонентами платформы но требуется дополнительная адаптация проектов,

  Включение 64-х разрядных DocID не означает, что они сразу начнут
  получать значения > 4-х Гб. Для этого нужно добавить соотв. количество
  записей, что в обычных условиях маловероятно и может произойти только
  в особо нагруженных таблицах. До тех пор пока реальные значения DocID
  не превышают 2-х Гб - практически все работает как раньше и проекты 
  не должны ломаться. 

  Отключение 64-х разрядных DocID для информационной базе возможно до тех
  пор, пока ни в одной таблице нет записи с DocID > 2 Гб. После этого
  отключение становится невозможным - при реорганизации возникнет ошибка.

- Утилита сравнения TXCompare позволяет сопоставлять записи по ForeignKey 
  вместо ExtID. Режим сопоставления выбирается на странице с настройками сравнения.

- Оптимизирована работа асинхронных запросов на сервере данных

- Исправлены ошибки при установке ссылочных полей в журналах и фильтрах

- Исправлена ошибка при установке значений в графиках

*** Build 10425 ***

- Исправлена ошибка инициализации SessionInfo.UserRecord / RoleRecord,
  появившаяся в Build 10425

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

*** Build 10426 ***

- Доработана поддержка Int64 в ТБ.Скрипт, в класс Math добавлен метод

    func AsInt64 (Value :Variant; {DefValue :Int64}) :Int64

  работающий аналогично Math.AsInt (Int). Оба метода (AsInt/AsInt64)
  теперь понимают 16-ти ричную запись чисел в формате: "0x1234"

- Изменен интерфейс класса HTTPClient:

  - Все вызовы (Get/Post/...) стали функциями, возвращающими HTTPResponse.
    Свойство Response - удалено.

  - Добавлен универсальный вызов:

      func Request (Method :String; URL :String; {Data :BinaryObject}) :HTTPResponse

    получающий имя HTTP метода в качестве параметра. Он может использоваться
    для всех HTTP вызовов, лишние методы Head/Put/Patch/Delete - удалены,
    Get/Post - оставлены, как наиболее часто используемые.

- Оптимизация конвертации инф. баз при смене кодировки или длины строк

- Исправление ошибки при обнулении мягких ссылок

*** Build 10427 ***

- Пересборка. Исправлена ошибка Int.

*** Build 10428 ***

- Добавлена поддержка аутентификации через протокол Kerberos. 
  Выбор протокола аутентификации:

  Администрирование -> Настройки сервера-> Сервер авторизации -> Пароли

    [x] Использовать SSPI для проверки паролей Windows
        Протокол: NTLM/Kerberos

- Там же: дополнительные ограничения на сложность пароля Турбо
  (Количество букв/цифр/... )

- Добавлена возможность использования прокси при работе с Интернет-ключом.
  Там же, страница "Ключи защиты"

- Исправлена ошибка реорганизации в PostgreSQL

*** Build 10429 ***

- Поддержка выбора нескольких записей из Tab-классов в системных диалогах фильтров
  Для этого в программный интерфейс добавлено:

  Console:
    field UserCurrentEdit :FieldEdit
      -- Возвращает программный интерфейс к inplace-редактору системного диалога
         Обращение к этому свойству имеет смысл только из обработчиков 
         Record.OnOpenCardfile, во всех остальных случаях UserCurrentEdit = nil

  FieldEdit:
    field AllowMultivalue :Logical
      -- Возвращает True, если это inplace-редактор диалога фильтра. В этом случае
         Value можно присвоить массив записей, который попадет в диалог.

- Доработана поддержка IMAP. В класс IMAPServer добавлено свойство:

    func GetFolderAttrs (FolderName :String) :String

  возвращающее строку со списком атрибутов почтового ящика (\Sent \Trash ...)

- Доработана установка замыканий в качестве обработчиков событий, в нескольких местах,
  где они еще не поддерживались (события классов Record/Sign/Importer/Window)

- Исправлено несколько ошибок проверки шаблонов при компиляции

- Исправлена ошибка регистрации обработчика OnConflict класса Importer

- Исправлена ошибка программной установки ширины столбца картотеки
  (было ошибочное ограничение 999 вместо 9999)

*** Build 10430 ***

- Шаблоны: доработки печати / экспорта в PDF. Новое свойство:

  TemplateFrame:
    field PrintWidth :Numeric

  Задает ширину фрейма, которая будет использоваться при печати 
  для адаптивной раскладки секций/объектов

- Усовершенствован мастер установки проектов. Теперь имена всех каталогов 
  и все запросы на создания резервной копии делаются на одной странице.

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

- Усовершенствованы алгоритмы перекрытия полей в MTL. Теперь в расширениях
  можно перекрывать унаследованные поля.

- Исправлена ошибка реорганизации инф. базы MSSQL через alter table при наличии
  таблиц/полей с очень длинными именами. Теперь при реорганизации сохраняются
  старые имена constraint'ов

- Исправлена ошибка в сервере данных, которая могла приводить к невозможности
  завершения транзакций из-за записи в словарь истории изменений

- Оптимизация библиотек сервера данных (оптимизация упорядочивания разыменованных
  запросов на клиенте, оптимизация хэш таблиц клиентского пула документов)

*** Build 10431 ***

- Доработки объекта шаблона Browser.

  - Изменен алгоритм Set HTML
  - Добавлена поддержка печати
  - Добавлено:
      field ShowScriptError :Logical

- Исправлена ошибка переименования в редакторе проекта

- Исправлена ошибка добавления классов в иерархии COM объектов

- Исправлена ошибка реорганизации в x64 из-за неправильной сборки 10431

*** Build 10432 ***

- Доработки печати / экспорта в PDF (объекты учитывают PrintWidth/PrintHeight)

- Доработка inplace-редактирования в таблицах/картотеках

- Исправлена ошибка экспорта данных, допущенная в Build 10431

- Исправлена ошибка помощи: иногда не показывалась содержимое при открытии.

*** Build 10433 ***

- Текстовый редактор: отображение всех найденных вхождений при поиске.
  Вхождения помечаются отдельным цветом ("Помеченный текст").
  Для сброса помеченного текста - Esc.
  Отключается:
    Настройки программы -> Редактор текстов -> Общие -> Поиск
    [x] Показывать все вхождения

- Экспорт/импорт в CSV позволяет задавать произвольные разделители
  колонок/дробей/триад. Пока только через мастер, программный интерфейс
  дорабатывается.

- Картотеки: поддержка команды "восстановить раскладку" в Tab-классах.

- Исправлено несколько ошибок при показе помощи.

*** Build 10434 ***

- Доработки программного импорта/экспорта из CSV файлов
  В перечислимые типы Exporter.Options / Importer.Options добавлены значения:

    ValueSeparator
    DecimalSeparator
    GroupSeparator
    CSVMaskString
    CSVFieldNames

  Указание разделителей делается аналогично Form.Export, например:

     RecordsExport('MyFile.csv', MyQuery, 
      [Exporter.ShowWizard, Exporter.AutoExport, 
       Exporter.ValueSeparator, ';', 
       Exporter.DecimalSeparator, '.', 
       Exporter.CSVFieldNames, False]);

   Для совместимости опции CSVMaskString/CSVFieldNames имеют значение True,
   поэтому их нужно использовать только если нужно их отключить.

- При импорте из CSV/DBF в методе Imported.AddCorrespondence параметр
  From игнорируется, ему не обязательно передавать имя файла.

- Исправлена ошибка программного импорта документов допущенная в Build 10434

- Исправлена ошибка позиционирования модальных форм при работе на
  нескольких мониторах

- Исправлено несколько ошибок при показе помощи.

*** Build 10435 ***

- Исправлена ошибка online-разбора при отсутствии исходных текстов подпроектов

- Оптимизировано кэширование при online-разборе

- Доработки стилизации меню

- Обновление перевода

*** Build 10436 ***

- Оптимизация передачи файлов при публикации/установке проектов

- Linux: отладочная версия поддерживает ключ запуска /trace для выдачи
  отладочных сообщений в консоль или файл.
    /trace - отладочные сообщения выдаются в консоль
    /trace=ИмяФайла - отладочные сообщения выдаются в файл.
      Файл может быть задан полным путем, например: /tmp/turbo
      Если задано только имя файла, то он пишется в каталог /tmp
      Если перед именем файла указать ^, то файл очищается при запуске: /Trace=^turbo

  Дополнительно поддерживается ключ /ttrace он не применяется к текущему
  процессу TXServer но передается в порождаемый процесс как /trace. 
  Используется вместе с командой "start", примеры:

    TXServer run TBServer TBCalc /trace=turbo
    TXServer start TBServer TBCalc /ttrace=turbo

  для просмотра логов можно пользоваться командой tail:

    tail -f /tmp/turbo

  так же удобная утилита для просмотра логов lnav:
    http://lnav.org/

- Исправлено несколько ошибок работы под Linux

*** Build 10437 ***

- Используется новая версия библиотек OpenSSL 1.1
  Вместо 
    libeay32.dll + ssleay32.dll -> libcrypto-1_1.dll + libssl-1_1.dll

- В класс HTTPClient добавлено свойство Timeout (с сек):
    field Timeout :Numeric

- HTTPClient автоматически распаковывает ответы сервера (Content-Encoding: gzip)

- Исправлено несколько ошибок перекрытия полей в MTL

- Исправлена ошибка замены по регулярным выражениям в текстовом редакторе

- Оптимизирована компиляция помощи + исправлено несколько ошибок

- Расширение ИмяПроекта.#hlpdsg заменено на ИмяПроекта.design.#hlp

- Исправлены ошибки формирования отчетов в форматах HTML, CSV, DBF

- Обновление перевода

*** Build 10438 ***

- Новый класс Kernel.Hash для подсчета основных ХЭШ функций:
   CRC32, CRC64, MD5, SHA1, SHA256, SHA384, SHA512
  Описание:
   http://wiki.tengry.com/confluence/pages/viewpage.action?pageId=93094674

  Функции System AddCRC32/AddCRC64 оставлены для совместимости, 
  но не рекомендуются к использованию

- Исправлена ошибка работы с Memo/Blob полями в СУБД MSSQLCE

- Улучшена совместимость с Linux по форматам файлов

*** Build 10439 ***

- ТБ.Скрипт: ключевое слово SelfType, которое может использоваться 
  при указании типа, вместо явного задания имени текущего класса.

  Если SelfType используется для указания результата функции или поля,
  то это свойство будет автоматически перекрываться в каждом наследнике
  класса, приводя тип результата к классу наследника. 
  Это полезно при написании конструкторов:

  func CreateEx :Selftype;
    Result = inherited Create;
    -- Инициализация экземпляра
  end;

  Обратите внимание, что если в каком-то наследнике конструктор перекрывается 
  с явным указанием типа, вместо Selftype, то он "теряет" способность
  автоматического перекрытия, что скорее всего, является нежелательным.
  Чтобы отследить такие ошибки в старом коде - добавлен новый Warning:

    Свойство с типом Selftype перекрывается с явным указанием типа

- Добавлены новые Warnings:

    Приведение типа не требуется
    Проверка типа не требуется

  они выдают предупреждения в случаях, подобных этому:

    var Obj = IButton.Create;
    --...
    if Obj is IButton then               -- Проверка типа не требуется
      (Obj as IButton).Caption = '...';  -- Приведение типа не требуется
    end;

  такой код эффективнее переписать:

    if Obj <> nil then
      Obj.Caption = '...';
    end;

  Или

    Obj?.Caption = '...';

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

- Исправлены ошибки в работе объекта Browser при вызове обработчиков.

- Исправлена ошибка утечки ресурсов, которая приводила к падению 
  сервера после ~600 перезагрузок TXData.dll

*** Build 10440 ***

- ТБ.Скрипт: Новая фича: примитивные классы. Все простые типы ТБ.Скрипт:
    String, Integer, Numeric, Date, Logical, Measure, Int64, Pointer, Function, Array

  - стали классами, наследниками абстрактного базового класса Kernel.Primitive.
  Для них поддерживается вызов методов экземпляра (InObject) и класса (InClass).

  Например:

    var A = [11,22,33];
    Assert(A.Count = 3);
    A.Add(44);
    Assert(A.Count = 4);

    var S = String.Concat(A, ',');
    Assert(S = "11,22,33,44");

    Assert(S.ClassType = Kernel.String);
    Assert(S.ClassName = 'String');

  Если необходим вызов метода на константе (или выражении) - ее нужно взять в скобки:

    Assert( (255).Hex = 'FF' );

  Пока для этих классов зарегистрирован минимальный набор методов, он будет расширяться.

  Для всех классов ядра добавлен общий корень: Kernel.Variant. 
  Иерархия классов Kernel теперь выглядит так:

  Variant
    Primitive
      String
      Integer
      ...
    System
    ...
    Object
      ...
  
*** Build 10441 ***

- Метод Administration.CloseConnection работает на сервере процедур

- Исправлено несколько ошибок в сетевом протоколе при восстановлении связи

- Добавлено несколько методов в примитивные классы:
    String: Part, Replace, Upcase, Locase
    Array: Sort

*** Build 10442 ***

- Добавлена поддержка СУБД Oracle (11+)

- Утилита TXAdm - кросс-платформенный аналог скрипта T9Adm. Позволяет выполнять
  основные функции администрирования сервера Turbo из командной строки

- ТБ.Скрипт - улучшена поддержка пользовательских типов
- Улучшена совместимость с Linux при установке проектов
- Исправлена ошибка при отображении помощи в режиме совместимости с IE 11
- При запуске клиента автоматически устанавливается режим совместимости с IE 11
- Исправлена ошибка построения списка проектов в диалоге "Открыть проект"
- Исправлена ошибка импорта журналов

*** Build 10443 ***

- Исправлены ошибки позиционирования в grid'ах

*** Build 10444 ***

- Исправлена ошибка предыдущего билда - пропали scroller'ы в шаблонах

*** Build 10445 ***

- ТБ.Скрипт: Новая фича: обобщенные процедуры (generics)

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

    func Some{Тип1:Ограничение1;Тип2:Ограничение2}(Парам1 :Тип1; Парам2 :Тип2) :Тип2;

  Ограничением может быть Object или любой его наследник. Если Ограничение опущено -
  тип может быть любым (variant). Формальные типы можно использовать в любом месте 
  процедуры - при описании ее параметров, результата, локальных переменных и т.п.

  Пример обобщенной процедуры:

    func Min2{T}(Val1, Val2 :T) :T;
      Result = If(Val1 < Val2, Val1, Val2);
    end;

  Вызов обобщенной процедуры:

    var I = Min2{Integer}(1, 2);
    var S = Min2{String}("A", "B");

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

    var I = Min2(1, 2);

  Замечание 1: аналогичный синтаксис обобщенных процедур имеется во многих 
    языках программирования. Обычно для указания формальных типов используются 
    угловые скобки <>. Мы используем фигурные {}, чтобы избежать 
    неоднозначности синтаксиса.

  Замечание 2: Обобщенные процедуры ТБ.Скрипт не являются шаблонами.
    Они компилируются только один раз в момент разбора описания и не могут
    контролировать наличие/отсутствие определенных методов у фактических
    типов передаваемых при вызове. Если внутри обобщенного метода используется
    динамическая диспетчеризация - будет runtime ошибка. 

  Замечание 3: В настоящий момент нельзя использовать формальные типы
    при описании анонимных замыканий в параметрах процедуры. Это будет позже.

  Замечание 4: Обобщенные классы тоже будут позже.

- Экспорт Storage в JSON теперь учитывает опцию XMLSingleRow
- Доработки редактора ресурсов (исправлены ошибки позиционирования 
  и формирования обработчиков)
- Доработки администрирования и мастеров публикации/установки проектов
- Доработки TXAdm

*** Build 10446 ***

- ТБ.Скрипт: синтаксис обобщенных процедур поддерживается для замыканий.
  В частности, для короткого замыкание обобщенной процедуры:

  var vMin2 = @Min2;  -- Min2 - обобщенная процедура из примера выше
  Assert( vMin2{Integer}(1, 2) = 1 );
  Assert( vMin2('A', 'B') = 'A' );
  -- vMin2(1, 'X');  -- Ошибка

- ТБ.Скрипт: исправлена ошибка при инициализации параметра-замыкания 
  значением по умолчанию, типа

    proc SortArray(var A :Variant[]; aComaprer :func(V1, V2 :Variant) :Integer = @DefaultCompare);

- ТБ.Скрипт: в объект AutoObject добавлено свойство:

    field FloatExceptionMask :Integer

  которое позволяет управлять состоянием FPU Control Word (MXCSR регистра для x64).
  Правильная установка этих флагов может быть важна для некоторых Autmation объектов 
  занимающихся математическими вычислениями. Значение является битовой маской:

    0x01 - Allow invalid numbers
    0x02 - Allow denormals (very small numbers)
    0x04 - Allow divide by zero
    0x08 - Allow overflow
    0x10 - Allow underflow
    0x20 - Allow inexact precision

  Значение по умолчанию:

    0x32 - Allow denormals, underflow, inexact precision

  Если нужно запретить все исключения, установите:

    0x3F - Allow all

- Шаблоны: исправлена ошибка экспорта в PDF

- Улучшена диагностика ошибок при открытии диалога внутренних отчетов 
  в случае нарушений в структуре отчета

- Сервер данных: добавлена поддержка Native Backup PostgreSQL под Linux
  в том числе с  упаковкой (под Windows и Linux)
- Сервер данных: во время создания дистрибутивов проектов не блокируется
  подключение пользователей и др. алгоритмы сервера
- Сервер данных: Исправлена ошибка сохранения схем репликации

- Исправлена ошибка в объектах синхронизации, которая могла приводить 
  к зависанию сервера под нагрузкой

- Клиент: исправлено несколько ошибок в формах

*** Build 10447 ***

- Шаблоны: доработана поддержка клавиатуры в объекте Browser
- Help: исправлена ошибка поиска в текущей теме
- Исправлены ошибки администрирования
- Исправлены ошибки масштабирования форм
- Сервер данных: улучшена поддержка Oracle

*** Build 10448 ***

- Исправлена ошибка при вызове обобщенных замыканий, если в качестве
  параметра передавался Variant.

- Метод Document.Clone вызванный на документе, помеченном как удаленный,
  возвращает копию не помеченную как удаленная.

- Исполняемые файлы снова подписываются.

*** Build 10449 ***

- Исправлена ошибка позиционирования в шаблоне

- Исправлен перевод

*** Build 10450 ***

- ТБ.Скрипт: допустима прямая индексация Variant'ов. При этом ожидается, 
  что значением Variant'а является массив - иначе возникнет ошибка 
  на этапе исполнения.

    var V :Variant;

    V = [1,2,3];
    V[1] = 123;
    Assert(V[1] = 123);

    V = 'abc';
    Assert(V[1] = 'a');  -- Runtime: Значение типа "String" используется как "Array"
    Assert(String(V)[1] = 'a');  -- Нужно так.

- ТБ.Скрипт: доработан способ вызова функций с передачей открытых параметров
  Пример кэширующего декоратора, сохраняющего сигнатуру кэшируемой функции:

    func Cached {TFn:function} (F :TFn) :TFn;
      var vCache = Storage.Create;
      Result =
        func(...Args) :Variant
          var vKey = Str(Args);
          if vCache.FieldExists(vKey) then
            Result = vCache[vKey];
          else
            Result = F(...Args);  
            vCache[vKey] = Result;
          end;
        end;
    end;


    proc Test;
      var CachedSin = Cached(@Sin);
      var CachedPower = Cached(@Power);

      Assert(CachedSin(1) = Sin(1));
      Assert(CachedPower(10, 2) = Power(10, 2));
    end;


- Администрирование: для 64-х разрядной версии показывается количество 
  установленной физ. памяти, вместо размера адресного пространства

- Исправлена ошибка отображения Preview для некоторых тем помощи 
  в формате markdown

- Исправлены ошибки работы с проектами расположенными за пределами
  стандартного каталога

- Исправлено несколько ошибок в подсистеме журнала событий

- Исправлено несколько ошибок в TXAdm и TXNet

- Доработки Control для Linux

*** Build 10451 ***

- ТБ.Скрипт: Упрощенная грамматика: в конце строк можно опускать ";"

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

    var A = 0
    var B = 0
    A = 1; B = 1

  Длинные инструкции по прежнему могут быть записаны в несколько строк:

    A = 
      123 +
      456 +
      789

  Есть несколько ограничений, когда инструкция не может быть "разбита":

    - При вызове функции "(" должна быть в той же строке
    - После ключевых слов class/weakref/unit имя класса должно быть в той же строке
    - При вызове типовой операции первый именованный параметр должен быть в той же строке
    - Возможно, будут еще ограничения...

  Это может привести к некоторому количеству ошибок в старых проектах, Например:

    Some
      (Param1,
       Param2)  

    -- Не компилируется, нужно так:

    Some(
       Param1,
       Param2)  

  В mtl/lis пока изменений нет, ";" опускать нельзя

- ТБ.Скрипт: повышена устойчивость грамматик 

- Ошибки и предупреждения в текстовом редакторе подчеркиваются волнистой
  линией, а не выделяются цветом

- Сервер расчетов: исправлена ошибка в аккумуляторах, не поддерживались 
  псевдонимы при вычислении оборотов

*** Build 10452 ***

- 10.5 Исправлено несколько ошибок в сервере расчетов

- 10.5 собирается новой версией Delphi для Windows и Linux

*** Build 10504 ***

- 10.5 Исправлено несколько ошибок в сервере расчетов

- ТБ.Скрипт: Исправлено несколько ошибок при работе с примитивными классами

- Оптимизации сервера данных

*** Build 10505 ***

- Linux: ограниченная поддержка авторизации доменных пользователей через LDAP.
  Тестировалось только на AD, но, возможно, будет работать с другими каталогами.

  На Linux должны быть установлены библиотеки реализующие GSS-API
  В настройках сервера авторизации Turbo должен быть включен режим SSPI/Kerberos. 

  Подробная статья для аналогичной настройки сервера 1C:
    https://its.1c.ru/db/metod8dev/content/2799/hdoc

  Для Turbo:
    - Keytab файл по умолчанию: <Turbo>/Config/turbo.keytab
      может быть изменен через ручную правку Servers.ini:

        [Auth\Policy]
        Keytabfile=...

    - Имя сервиса (SPN - Service Principal Name) по умолчанию - turbo.
      Настраивается:

        [Auth\Policy]
        SPN=...

  Поддерживается
    - Авторизация по доменному имени и паролю для Windows и WEB клиентов
    - Авторизация без ввода пароля (SSO) для Windows клиентов

  Не поддерживается
    - SSO для Linux клиентов (TXAdm)
    - SID для идентификации пользователей. Идентификация только по имени
    - !!! Идентификация на основе доменных групп. Каждый пользователь домена
      должен быть добавлен в список пользователей сервера авторизации.

- Linux: рефакторинг мьютексов. Все мьютексы одного инстанса Турбо перемещены
  в подкаталог /tmp/Turbo_xxxxxxxx, права на запись даются всем пользователям

- Help: поддержка темного стиля. В каталоге Bin добавлены файлы CSS с основными
  стилями HTML, соответствующими стилям Turbo (Help.css и HelpBlack.css)
  Для того, чтобы прикладные темы помощи соответствовали стилю, 
  нужно в подключить системную библиотеку стилей:

  <link rel=stylesheet type=text/css href='system:style.css'>

  Для markdown это достаточно сделать в одном TemplateMD.htm

- Help: возможно указание связи темы помощи и класса/свойства ТБ.Скрипт
  Делается с помощью мета-тега Link. Пример для markdown:

    ---
    Title: Компонент IButton
    Link:Com.Ctrl.IButton
    ---

  Для ссылки на свойство используется синтаксис "короткого замыкания":
  
    Link:Com.Ctrl.IButton.@Field

  Если тема помощи относится к текущему проекту, то имя проекта можно опускать:

    Link:.Ctrl.IButton

  Если тема помощи "связана", то она будет вызываться из иерархии классов
  или текстового редактора (через popup-меню свойства)

- Редактор ресурсов: поддержка ввода многострочных свойств. Любому строковому
  свойству можно присвоить многострочный текст открыв вспомогательный диалог
  ввода кнопкой "..." или PgUp

- Редактор ресурсов: поддержка истории для строковых свойств. По умолчанию 
  история запоминается в разрезе первичного имени свойства. При необходимости
  ключ истории может быть задан явно с помощью атрибута History:

  #Attr History="Caption"
  stored field Title :String;

- TXAdm - новая команда для управления настройками авторизации:

    TXAdm SrvAuthLic

- Исправлено несколько ошибок в редакторе проектов и мастерах создания классов

*** Build 10506 ***

- Повышена стабильность системы при возникновении ошибок переполнения стека

- Принудительно ограничена вложенность фильтров - до 1024 узлов, при превышении
  возникает ошибка: Слишком сложное условие.
  Касается фильтров сервера данных и сервера расчетов

- ТБ.Скрипт: оптимизация работы с вариантами + несколько других оптимизаций
- ТБ.Скрипт: Исправлена ошибка в Pipe при возврате пустых значений

- В класс FieldInfo добавлено свойство, показывающее является ли поле мягкой ссылкой:
    field MultiRef :Logical

- Сервер расчетов 10.5: исправлена ошибка обработки журналов с мягкими ссылками

- Сервер расчетов 10.5: поддержана работа с Int64

- Ключ запуска /BaseDocID64=NNN - принудительно заставляет сервер генерировать
  64-х разрядные DocID с базового номера NNN. Для целей отладки.

*** Build 10507 ***

- Help: Команда "Помощь" (F1) при вызове из редактора cod-файла открывает 
  тему помощи по текущему символу

- Help: Указание Link:Класс.@Свойство автоматически добавляет ключевые слова:
    Свойство
    Свойство, Класс

- ТБ.Скрипт: Исправлена ошибка при использовании пользовательских типов в замыканиях

*** Build 10508 ***

- ТБ.Скрипт: доработки CopyClosure - поддерживаются короткие замыкания, замыкания 
  в расширениях и установка в качестве Owner'а наследников исходного класса

- ТБ.Скрипт: исправлена ошибка - через оператор условного разыменования нельзя
  было обращаться к свойствам, чье имя совпадает к ключевым словом:

    vMyPipe?.Get(...)

- Новый мастер создания тем помощи (предварительная версия)

- Исправлены ошибки работы некоторых форм в новой версии Delphi

*** Build 10509 ***

- Рефакторинг работы с архивами. Добавлена поддержка работы с файлами > 4Г.
  Библиотека TBPack.dll более не требуется и удалена

- ТБ.Скрипт: оператор условного разыменования (?.) генерирует код приведения
  к итоговому типу, чтобы результат выражения не был varNull.

  Такой код теперь не будет приводить к ошибкам:

  var L :List;
  Assert(L?.Count + 1 = 1)  -- Ранее: Операция "Сложение" недопустима между значениями типа "Empty" и "Integer"

- Linux: исправлена ошибка остановки сервисов, через 24 дня работы

- Исправлены ошибки работы некоторых форм в новой версии Delphi

*** Build 10510 ***

- Доработки запроса аналитики AnalitQuery. Добавлены свойства:

    field Order :String
    field PacketSize :Integer

  Имеющие тот же смысл, что одноименные свойства класса Query

- Sign.GetField ограниченно поддерживает разыменования. Только при вызове на клиенте.

- Доработки мастера создания помощи. 

- Создание помощи "на лету" при вызове F1 (предварительная версия)

- Исправлена ошибка перемещения групп в редакторе проекта

- Доработки объекта шаблона Browser (при установке Html дважды срабатывала загрузка страницы)

*** Build 10511 ***

- ТБ.Скрипт расширенная диагностика ошибок. 

  Если в коде встречается одиночная локальная переменная, класс или константа - генерируется ошибка:  
    Результат выражения не используется.

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

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

- AutoObject: поддержаны аргументы событий типа Variant.

- Редактор ресурсов поддерживает #Deprecated. Если stored=поле отмечено как Deprecated оно
  не показывается в редакторе ресурсов, ели его значение не было установлено ранее.
  Если значение было установлено - оно показывается, отмеченное восклицательным знаком
  и выдается соответствующее предупреждение при компиляции
 
*** Build 10512 ***

- ТБ.Скрипт: доработки обобщенных процедур (Generics). Разрешено использовать формальные типы
  при описании анонимных замыканий в параметрах процедуры. Пример:

    proc ArrayForEach1 {Any} (const aArray :Any[]; aProc :proc(aValue :Any));
      for var i = 1..aArray.Count do
        aProc(aArray[i]);
      end;
    end;

    ArrayForEach1([1,2,3],
      proc(Value :Integer)
        --
      end)

    ArrayForEach1(['a','b','c'],
      proc(Value :String)
        --
      end)

- Синтаксис обобщенных процедур можно использовать для локальных процедур

- Исправлена ошибка работы Pipe при передаче вариантов

- Доработки текстового редактора:
  - Новая команда - "Вставить пробел" (Kernel.Text.Edit.SpaceChar), по умолчанию - Shift+Space
    опция "Отсекать пробелы в конце строки" - удалена
  - Клавиатурная комбинация Ctrl+BkSp по умолчанию назначена на команду  "Удалить слово слева"
  - Клавиатурная комбинация для команды "Вернуть" (Kernel.Edit.Redo) - Alt+Shift+BkSp (или Ctrl+Shift+Z)

*** Build 10513 ***

- Сервер данных: Добавлена поддержка SQLite - свободной, opensorce, встроенной СУБД 

  https://ru.wikipedia.org/wiki/SQLite

  SQLite не требует установки дополнительных компонент. Все необходимое для работы - 
  в каталоге Turbo\Bin: DBXSQLiteDrv.dll. Поддерживается в Windows и Linux

  SQLite не может служить заменой полноценным многопользовательским СУБД - она работает
  в режиме блокировки БД при записи, т.е. одновременно в БД может писать только один
  пользователь. Область применения SQLite - однопользовательские, портабельные БД
  или БД для хранения служебной информации, например - логов.

- Сервер данных: новый формат бэкапа инф. базы - bkpx. Физически - это ZIP архив,
  содержащий все сохраняемые файлы инф. базы + псевдо-файлы Metadata и Data - потоки
  сериализованных данных. В корне архива находится текстовый файл с описанием содержимого
  content.nfo

  Т.о бэкап, сделанный средствами Турбо в новом формате состоит их одного файла bkpx 
  (ранее - bkp + tbb). Бэкап сделанный средствами SQL по прежнему состоит из нескольких 
  файлов (минимум - 2): bkpx + nXX. Ранее bkp+tbn+nXX

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

- Перепроектированы мастера создания/восстановления инф. баз и проектов. Страницы
  выбора файлов одинаково поддерживают работу с удаленной и локальной файловой 
  системой. Т.е. можно устанавливать проекты из дистрибутивов на сервере и наоборот
  инф. базы из локальных бэкапов.

- Доработан мастер создания тем помощи. Шаблоны файлов помощи поддерживают макросы:

   &Proptotype()  -- Прототип свойства
   &Help()        -- Описание свойства, заданное через #Help
   &ClassName()   -- &ClassName(ИмяКласса.@ИмяСвойства) --> ИмяКласса
   &MemberName()  -- &MemberName(ИмяКласса.@ИмяСвойства) --> ИмяСвойства

- Новый мастер добавления приложенных файлов

- В файлах помощи (MD) работают перекрестные ссылки на другие темы и Link:
  (Ctrl+Click или Ctrl+Enter)
  
*** Build 10514 ***

- Сервер расчетов 10.5: Обработанные данные сохраняются между сессиями           

- Доработана поддержка ZIP архивов для лучшего соответствия стандартам (Linux)
  ВНИМАНИЕ: дистрибутивы проектов (*.tpb) сделанные новой версией 10.5
  не будут устанавливаться предыдущими версиями Турбо.

- Для публикации проектов на сервере добавлен новый стандартный каталог - SrvDistr
  Задается в файле tb.ini с помощью ключа:

  [Server\Paths]
  PrjBackup=..\SrvDistr

- Доработан планировщик для поддержки бэкапов нового формата

- Исправлена ошибка создания бэкапов под Linux

- TXAdm: исправлены ошибки работы под Linux

- ТБ.Скрипт: проверка совместимости замыканий при наследовании

- Улучшена поддержка темной темы

- Оптимизация библиотек VCL, отключение неиспользуемого функционала для уменьшения размеров

*** Build 10515 ***

- Исправлена ошибка загрузки библиотеки иконок из Build 10515

*** Build 10516 ***

- Улучшена поддержка нестандартных DPI

- Улучшено масштабирование и адаптивная раскладка в бланках

- В строке состояния для бланков и картотек показывается текущий масштаб. 
  Popup меню на панели позволяет выбрать типичные значения  масштаба,
  а двойной клик - устанавливает значение 100%

- Отладчик ТБ.Скрипт: доработано окно просмотра значений в режиме "Как объект".
  Через popup меню доступны дополнительные опции отображения.

- WEB сервер обрабатывает все HTTP команды, а не только GET и POST. 
  Диспетчеризация остальных команд (PUT, DELETE И пр.) делается по тем же правилам,
  что GET/POST, селекторы [HTTP\Access] не учитывают тип команды (пока),
  он должен проверятся в серверных скриптах.

- При формировании отчетов в HTML формате учитываются ограничения на ширину
  столбцов разбиения и показателей. Так же для столбцов разбиения добавляется
  дополнительный класс "freeze" для поддержки фиксации заголовков

- Сервер расчетов 10.5: Рефакторинг работы с переменными и сигнатурами

*** Build 10517 ***

- Исправлена ошибка формирования отчетов в HTML, появившаяся в Build 10517

- Улучшено масштабирование в текстовом редакторе

- Доработки мастера создания тем помощи

*** Build 10518 ***

- Сервер расчетов 10.5: Отслеживание зависимостей при изменении переменных 
  структуры учета  и справочников

- Длительные операции прерываются по Esc. Для поддержки клавиатур без кнопки Break.
  Перед прерыванием задается запрос подтверждения.

- WEB Сервер: исправлена ошибка - при включении HTTPS отключался HTTP

- ТБ.Скрипт: доработки класса Administration для управления списками 
  пользователей и групп

- Доработки мастера создания помощи и формы выбора изображений

*** Build 10519 ***

- Исправление ошибок в сервере расчетов

*** Build 10520 ***

- Администрирование: группировка информационных баз, аналогично группировке проектов.
  Перенос существующих информационных баз между группами возможен, только если
  SQL сервер это позволяет. Для MSSQL перенос поддерживается, при этом неявно 
  делается detach, перенос и attach в новом каталоге

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

  Папки, добавленные в списке инф. баз сохраняются в настройках сервера (ServerObjects.xml)
  и не удаляются при удалении последней инф. базы в папке. Благодаря этому можно, например,
  подменить папку на SymLink ведущий на другой диск иметь возможность легко разносить 
  разные инф. базы на разные диски

- Доработан мастер создания инф. баз:
  - На странице выбора проектов поддерживается группировка, упорядочивание и быстрый поиск
  - На странице выбора SQL сервера добавлена опция:
    [x] Использовать по умолчанию

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- ТБ.Скрипт: Изменено поведение Template.CurrentCell - свойство возвращает nil,
  если фокус в шаблоне находится не на секциях

- Доработано прерывание по ESC

- Доработан поиск по файлам

*** Build 10521 ***

- Сервер расчетов 10.5: Подключены аккумуляторы

- ТБ.Скрипт: добавлен класс Kernel.AcrhFile для работы с ZIP архивами (Windows/Linux)

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Администрирование: при публикации проектов добавлена опция:
    [x] Кодировать исходные тексты

  Та же опция доступна при публикации проектов через TXAdm с помощью ключей:

    /EncodeLic:Код         - Код лицензии на открытие (например, 911)
    /EncodeKey:Ключ        - Номер главного ключа
    /EncodePassword:Пароль - Кодирование с паролем

- Сервер процедур: Исправлена ошибка при установке UserObject.AsString 
  в нескольких потоках

- Сервер данных: Исправлена ошибка при восстановлении упакованных бэкапов 

*** Build 10522 ***

- Исправлена ошибка вызова помощи на перечислимых свойствах

- Исправлена ошибка отрисовки вертикальных табов

*** Build 10523 ***

- Исправлены ошибки фокусировки шаблона при вызове Window.GoTop

- Исправлена ошибка установки проектов из старых дистрибутивов (nfo+cab)

- Доработки локализации системных диалогов

- Обновление перевода

*** Build 10524 ***

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

- Исправлена ошибка при формировании HTML отчета по проводкам

- Оптимизирована отрисовка шаблонов

- Оптимизирован алгоритм сортировки

- Обновление перевода

*** Build 10525 ***

- Опция "Плавная прокрутка" переименована в "Анимация и плавная прокрутка",
  она влияет не только на прокрутку в редакторах но и на все анимации.

- Исправлена ошибка при установке некоторых перечислимых свойств в отчетах 
  (появившаяся в Build 10524)

- Исправлена ошибка программного вызова команд

- Исправлена ошибка вычисления высоты Tab'ов в шаблонах

- Исправлена ошибка формирования отчетов при отсутствии Report.tpl

*** Build 10526 ***

- ТБ.Скрипт: В SetError первый параметр объявлен как Variant:

    proc SetError(Code :Variant; {Text :String}; {Caption :String}; {IconType :System.IconType})

- Исправлено зависание при разборе некорректных XML файлов

- Исправлена утечка памяти в WEB сервере при работе через SSL

*** Build 10527 ***

- Сервер расчетов: возможна кластеризация по периодам < месяца (по дням)

- Сервер расчетов: оптимизировано обновление текстовых журналов

- Int64 может использоваться в качестве левого операнда в операции "^" 
  в типовых операциях и журналах

- Дополнительные проверки при добавлении нового сервера

- Исправлено несколько ошибок отрисовки в шаблонах

*** Build 10528 ***

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

- При обработке данных сервером расчетов в окне прогресса показывается 
  количество потоков в виде:  
    Потоков: Активных / Всего
  
- Администрирование: исправлена ошибка при публикации проектов - 
  портились закодированные файлы

*** Build 10529 ***

- Поддержка броузера Edge.

  Объект шаблона Browser может использовать WEB движок Edge (Chromium), 
  если он установлен в системе. Если Edge не доступен - используется 
  Internet Explorer. Процессом выбора можно управлять с помощью свойства:

  Browser
    field UseEngine :Browser.Engine

  где

    type Engine = (
      Auto  = 0, -- Использовать Edge, если возможно, иначе - IE (умолчание)
      IE    = 1, -- Всегда использовать IE
      Edge  = 2, -- Всегда использовать Edge, если его нет - ошибка
      None  = 3
    )

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

    field CurrentEngine :Browser.Engine

  Так же были добавлены свойства:

    field Title :String  
      -- Заголовок страницы, Read/Only

    func ExecuteScript (Script :String) :Variant
      - Выполнить JavaScript 

    proc Print
      -- Печать

    event OnComplete :proc (Sender :Browser; Ref :String)
      -- Событие при завершении загрузки страницы


  Основные отличия в использовании Edge по сравнению с IE:

    - Событие OnUpgrade для Edge не реализовано
    - Automation интерфейс, получаемый через Object для Edge сильно
      ограничен и практически бесполезен. В частности он не имеет доступа к DOM
      (Object.Document всегда = nil), не позволяет устанавливать обработчики и т.п.

  Для того чтобы частично сохранить совместимость в использовании Edge и IE
  добавлен метод ExecuteScript, который работает в обоих броузерах. Для IE
  он делает вызов Object.Document.Script.Eval, для Edge он имеет частично
  аналогичный функционал. С некоторыми различиями:

    - Изначально ExecuteScript в Edge асинхронный и не возвращает значения.
      Для совместимости с IE при вызове ExecuteScript Turbo ожидает завершения
      скрипта (типа, await) и возвращает значение. Однако await невозможен
      в некоторые моменты времени, пока не завершена навигация, в частности - 
      из обработчика OnClick. В такие моменты ExecuteScript запускает script
      асинхронно.

    - Если скрипт возвращает объект то в IE будет возвращен Automation 
      интерфейс этого объекта, а в Edge - Storage со свойствами объекта.
      В общем - лучше так не делать и возвращать только простые типы

- Исправлена ошибка в RegExp при поиске по коротким маскам

- Сервер расчетов: исправлена ошибка сохранения расчетной базы:
  не сохранялась информация о потерянной аналитике

- Сервер расчетов: исправлена ошибка показа проводок по событию в журнале.

*** Build 10530 ***

- ТБ.Скрипт: поддержка внешних вызовов и Callback'ов под Linux
  + Поддержка Callback для Win64

- TXAdm: исправлены ошибки работы под Linux
  + Поддержка очистки некорректных мягких ссылок: ключ
    repair /MultiRef:clear 

- Исправлены ошибки в редакторе ресурсов
- Исправлены ошибки поддержки Edge
- Исправлены ошибки в поддержке регулярных выражений

*** Build 10531 ***

- В объекте шаблона Browser добавлено событие:

    event OnMessage :proc (Sender :Browser; Message :Variant)

  оно может быть вызвано из JS путем вызова:

    window.chrome.webview.postMessage(...)

  В обработчике OnMessage можно делать синхронный вызов ExecuteScript.
  Параметр Message, передаваемый со стороны JS имеет те-же ограничения
  что результаты исполнения ExecuteScript (объекты передаются как Storage).
  Событие OnMessage поддерживается только для Edge.

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

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

  При желании, можно включить старый алгоритм отбора: 
  
    Настройки сервера -> Сервер расчетов -> Прочие
    [x] Предварительный отбор проводок

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

- Сервер расчетов: исправлена ошибка отбора по документам с 64-х разрядным DocID
- Сервер расчетов: исправлена ошибка многопоточной загрузки расчетной базы

- Исправлены ошибки в поддержке регулярных выражений

*** Build 10532 ***

- ТБ.Скрипт: альтернативный способ задания Callback'ов для внешних вызовов.

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

    external func EnumResourceNames(hModule :Pointer; lpType :Pointer; lpEnumFunc :function; lParam: Pointer) :Boolean
      library "kernel32" name 'EnumResourceNamesW';

    func MyEnumResCallback(hModule :Pointer; lpType :Pointer; lpName :Pointer; lParam :Pointer) :Boolean
      --
      Result = True
    end

    EnumResourceNames(nil, Pointer(RT_RCDATA), @MyEnumResCallback, nil)

  Вариант 2: Если Callback параметр внешней процедуры описан в старом стиле 
  (как Pointer) то вместо CreateCallback рекомендуется пользоваться новым 
  классом ExtCallback. Пример:

    external func EnumResourceNames(hModule :Pointer; lpType :Pointer; lpEnumFunc :Pointer; lParam: Pointer) :Boolean
      library "kernel32" name 'EnumResourceNamesW';

    var vCallback = ExtCallback.Create(@MyEnumResCallback)
    EnumResourceNames(nil, Pointer(RT_RCDATA), vCallback.Address, nil)

  Обратите внимание, что объект ExtCallback нужно сохранить в переменной до внешнего вызова.
  Если Callback может вызваться в другие моменты времени, по окончании внешнего вызова,
  например, по событиям, то объект ExtCallback должен удерживаться в течении всего
  времени работы событий. При уничтожении объекта ExtCallback указатель, полученный через Address
  станет невалидным и внешний вызов приведет к ошибке с неопределенным поведением.

  Функция CreateCallback оставлена для совместимости, но помечена как deprecated.

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Исправлены ошибки сериализации Storage в JSON
- Исправлены ошибки в редакторе ресурсов

- В состав исполняемых файлов добавлена библиотека TurboNET.dll для доступа 
  к библиотекам .NET (пока только для Windows)

*** Build 10533 ***

- Исправлены ошибки сериализации Storage в JSON
- Обновлена библиотека TurboNET.dll

*** Build 10534 ***

- Турбо Студия: переделан механизм синтаксической подсветки в текстовом редакторе.
  Теперь идентификаторы подсвечиваются по разному в зависимости от их категории
  (поле, метод, аргумент, локальная переменная и пр.)

  Кроме того:
  - Добавлена подсветка для файлов XML и JS
  - Для HTML файлов поддерживается Folding
  - Для файлов XML/HTML кроме подсветки делается проверка валидности тэгов
  - Переработана страница настроек цветов редактора 
  - Изменился формат сохранения цветовых схем, новое расширение - *.ecs.
    Старый формат (*.ect) - не поддерживается. Так же не поддерживаются 
    пользовательские настройки лексем (*.lex)
  - По умолчанию студия содержит 2 преднастроенные темы "Светлая" и "Тёмная"

  Подсветка идентификаторов опционально отключается:
    Настройки программы -> Редактор текстов -> Отображение
    [v] Подсветка идентификаторов

- Доработан парсер структуры учета для более аккуратной обработки ошибок

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

- Сервер данных: версия SQLite обновлена до 3.38.
- Исправлены ошибки реорганизации под SQLite
- Исправлено сообщение о нарушении уникальности для SQLite

- Сервер расчетов: "холодное" обновление (SQL запросы с условием ModifyDate >=...)
  делается покластерно и в многопоточном режиме.

- Сервер расчетов: возможность принудительной обработки операционных документов
  с датой проведения >= заданной. Можно инициировать только программно. 
  Для этого в функцию Books.Refresh добавлен необязательный параметр ForkDate:

  proc Refresh ({Domain :String}; {All :Logical}; {ReloadDate :Date}; {ForkDate :Date})

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10535 ***

- Сервер расчетов: поддержка закрытых и свернутых периодов.

- ТБ.Скрипт: исправлены ошибки в Storage

*** Build 10536 ***

- Доработки объекта шаблона "Chart"
  - При экспорт шаблона с графиком выгружаются данные графика
  - Улучшена совместимость при чтении выгруженных данных графиков предыдущих версий
  - Рефакторинг настроек 

- Диалог "Информация о сессии": на странице "Записи" добавлена команда 
  "Очистить кэш" (доступна через Popup меню)

- Сервер данных: расширенное логирование при обработке нотификаций

- ТБ.Скрипт: Улучшена генерация отладочной информации для отладки/профилирования,
  для замыканий, описанных в одну строку

- ТБ.Скрипт: исправлены ошибки в Storage

- Доработан контрол для выбора цвета

*** Build 10537 ***

- Исправлены ошибки настроек объекта "Chart"

*** Build 10538 ***

- Сервер расчетов: 
  - В условиях отбора проводок поддерживается фильтрация по имени журнала.
    Для задания условий используется псевдо-параметр Journal(Журнал).
    Примеры:
    
      Journal = "Имя1" или Журнал = "Имя2"
      Journal in ["Имя1", "Имя2"]
      Journal = "Имя*"

    Имя журнала должно задаваться в полном формате "ИмяПроекта.ИмяЖурнала"

    Параметр Journal может использоваться только в условиях отбора, по нему
    нельзя делать разбиение или сортировать. Так-же он не индексируется.

  - Показ проводок по событиям в закрытых периодах
  - "Холодное" досвязывание тоже сделано многопоточным
  - Расширенное логирование связывания

- TXAdm: при создании инф. базы (или восстановлении бэкапа) при указании
  размещения документов можно опускать все внешние группы. Ранее для
  каждой внешней группы нужно было указать размещение, например - #Null.

- Доработана синтаксическая подсветка в текстовом редакторе.

- Исправлена ошибка экспорта шаблонов с TAB-ами в формат TPL.

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10539 ***

- Шаблоны: изменен формат обработчика TemplateCell.OnDraw: добавлен параметр Icon

    event OnDraw :proc (Cell :TemplateCell; Selected :Logical; 
      var Color :Integer; var FieldColor :Integer; Font :Font; var Icon :Image)

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10540 ***

- В диалоге отчетов доработана поддержка синонимов

- Шаблоны: доработаны алгоритмы масштабирования
- Шаблоны: для старых шаблонов, у которых не проставлена опция [ ] Использовать стили
    и проставлена [x] Печатать в цвете, при печати снова учитываются логические цвета

- Метод Subtable.NumberByIndex, в случае если искомый индекс не найден в подтаблице
  не генерирует исключение, а возвращает значение -1

*** Build 10541 ***

- ТБ.Скрипт: Обобщенные классы (generic class)

  Синтаксис описания обобщенных классов аналогичен синтаксису обобщенных процедур:

    class{Тип1:Ограничение1;Тип2:Ограничение2} ...

  создание экземпляра обобщенного класса:

    var L :List{Integer} = List{Integer}.Create
    L.Add(123)
    L.Add("abc")  -- Ошибка: Значение типа "String" используется как "Integer"

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

  VarList.cod:

    class{Any} 
      --

  ObjList.cod:

    class{Any:Object} inherited VarList
      --

  Изменено описание встроенных классов Kernel:
    List       ->  List{T}
    StringList ->  StringList = List{String}

- Исправлена ошибка в шаблонах, появившаяся в Build 10540
- Исправлены ошибки в редакторе ресурсов

*** Build 10542 ***

- Доработка Generic Class - поддержка массивов, исправление ошибок при компиляции

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10543 ***

- Рефакторинг алгоритмов работы с информацией о классах в режиме разработки.
  Уменьшено количество обновлений классов за счет кэширования (повышенного
  потребления памяти)

- ТБ.Скрипт: Доработка Generic Class - исправление ошибок, поддержка в редакторе

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Добавлена поддержка OpenSSL 3 для работы на новых дистрибутивах Linux

- Исправлена ошибка отрисовки Grid'ов

- Еще доработки в диалоге отчетов для поддержки синонимов

*** Build 10544 ***

- ТБ.Скрипт: Доработка Generic Class - поддержка Selftype, поддержка в редакторе

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10545 ***

- Сервер расчетов: исправлены ошибки в аккумуляторах, расширена поддержка Int64

- ТБ.Скрипт: Исправлены ошибки кодогенерации при компиляции локальных процедур

*** Build 10546 ***

- Сервер расчетов: исправлена ошибка обработки потерянной аналитики

- Сервер расчетов: оптимизирована работа инвертированных списков

- Доработки в диалоге отчетов для поддержки Int64

*** Build 10547 ***

- Сервер расчетов: переделано "холодное" обновление по логам изменений
  (оптимизация и исправление ошибок)

- Сервер данных: для PostgreSQL поддержан тип BCD. Работает агрегат SUM(Int64)

- ТБ.Скрипт: В полях EMail.From и EMail.To можно задавать не только адрес, 
  но и имя в формате:

    MyMail.From = `John Dow <johndow@mail.com>`

- Еще доработки в диалоге отчетов для поддержки Int64

*** Build 10548 ***

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

- Расширены проверки при компиляции структуры учета

- Исправлены ошибки при работе Combo-box'ов

- Linux: добавлена библиотека libTXWeb.stub.so

*** Build 10549 ***

- ТБ.Скрипт: исправлена ошибка, которая могла происходить при прерывании
  процесса интерпретации кода в неудачный момент

- ТБ.Скрипт: добавлено ограничение (квота) на количество генерируемых ошибок.
  Если в процессе интерпретации кода обнаруживается, что процесс генерирует 
  и гасит большое количество ошибок, то он прерывается с ошибкой:

    Процесс генерирует слишком много ошибок

  Значение квоты по умолчанию: > 255 ошибок/сек в течении 5 сек.

- Сервер данных: Оптимизация процесса реорганизации инф. баз (MSSQL):
  - При изменении типа DocID используется Bulk Copy вместо Alter Column
  - При Bulk copy индексы создаются после копирования данных.
  - При ALter Column отслеживается наличие дополнительных constraint (статистик)

- Сервер данных: исправлена ошибка в работе кэша CRC под Linux

- Исправлена ошибка при закрытии форм: ModalResult иногда имел неправильное значение

*** Build 10550 ***

- Сервер расчетов: доработаны алгоритмы слияния изоляций. Улучшено слияние под нагрузкой

- Linux: исправлена ошибка работы с файловыми системами, отображаемыми на базу данных (User/Common)

- Добавлена поддержка .NET для Linux.
  Как установить .NET на Linux (достаточно установить Runtime)

    https://docs.microsoft.com/en-us/dotnet/core/install/linux

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10551 ***

- ТБ.Скрипт: доработки и исправление ошибок работы с generic'ами

- ТБ.Скрипт: в класс SignFieldInfo добавлено свойство Loaded для получения информации
  является ли данное свойство справочника загружаемым.

    field Loaded :Logical

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Доработана поддержка .NET, исправлены ошибки диспетчеризации типов

- Сервер данных: обновлен драйвер SQLite, для поддержки старых дистрибутивов Linux

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

- Исправлены ошибки при расчете CRC массивов
- Исправлены ошибки в работе редактора ресурсов
- Исправлены ошибки в работе мастеров администрирования
- Исправлена ошибка создания новой инф. базы через команду Файл -> Новый 

*** Build 10552 ***

- Сервер расчетов: оптимизация работы с памятью. Должна уменьшиться фрагментация
  памяти и ускориться завершение работы расчетной базы.

- Сервер данных: доработан алгоритм создания индексов при создании/реорганизации инф. базы.

- Исправлена ошибка при профилировании кода ТБ.Скрипт с замыканиями

- Редактор ресурсов: добавлена поддержка синонимов в библиотеках
- Редактор ресурсов: исправлена ошибка работы ограничений при выборе класса компонент

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 10553 ***

- WEB сервер: можно использовать регулярные выражения в описании правил HTTP\Access

- Сервер данных: доработан алгоритм создания индексов при реорганизации (SQLite)

- Сервер данных: исправлены ошибки в работе с 64-х разрядными DocID

- Ограничение на размер отчетов может быть > 2G (для x64)

- Исправлены ошибки в сервере расчетов

*** Build 10554 ***

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

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
  (InfobaseAdd, ProjectAdd, ProjectBackup и др.)

- Исправлена ошибка форматирования отчетов: не применялся формат дат

- Исправлена ошибка формирования отчетов в формате HTML

- Сервер расчетов: добавлен отладочный ключ запуска /RefLoadLimit=nnn

- Доработки локализации системных диалогов

*** Build 10555 ***

- Поддержка .NET перенесена на уровень ядра: Kernel.DotNet, Kernel.DotNetObject.
  Проект DotNet более не поддерживается и работать не будет.

- ТБ.Скрипт: при программном импорте записей через класс Kernel.Importer
  можно установить обработчик, который будет вызываться для каждого импортируемого
  документа. В этом обработчике можно изменить значения полей перед записью,
  (провести дополнительную "трансформацию")

  Kernel.Importer:
    event OnImport :func (Sender :Importer; ImportingRecord :Record) :Logical

- Исправлена ошибка: при импорте документов портились иерархические пути

- Automation интерфейс (Windows) - добавлена поддержка новых форматов бэкапов

- ТБ.Студия: Доработана поддержка вызова помощи по свойствам ТБ.Скрипт из
  текстового редактора и броузера классов

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

- Linux: Снято ограничение на количество сокетов (ранее - не больше 1024)
- Linux: улучшена трассировка и диагностика ошибок
- Linux: исправлена ошибка при работе с SQLLite
- Linux: исправлены некоторые ошибки при компиляции проектов из-за несовпадения регистров файлов

*** Build 10556 ***

- Новая команда "Экспорт проводок" (Kernel.Account.TransExport). 
  В будущем планируется что она заменит команду "Итоговый журнал". Пока доступны обе.

- Поддержаны форматные преобразования для типа Int64 (в функции Str и клетках шаблона)

- Исправлена ошибка подключений у серверу процедур с вынесенным сервером расчетов,
  появившаяся в Build 10556

*** Build 10557 ***

- Построение отчетов: предварительная версия форматирования отчетов в форматы ODF

- Шаблоны: Все события OnRearrange (секций, таблиц, картотек) получают новый Action:
    DoubleClickColumn (DoubleClickRow)

- ТБ.Скрипт: В методе PopupMenu класса Console добавлена возможность расширенного 
  описания пунктов меню в массиве Items: для пунктов задаваемых в виде строки 
  (в частности - подменю) можно задать иконку и свойство Disabled. Для этого
  пункт описывается в виде массива, первым элементом которого является значение
  логического типа (Enabled). Пример:

    PopupMenu(
    [
      'Item1',
      [True, GetIconsByName('List'), 'Item2'],
      [True, GetIconsByName('Folder'), 'Submenu'],
        [
         'Subitem1',
         'Subitem2'
        ]
    ])

- ТБ.Скрипт: Метод CopyFile класса Administration допускает копирование между разными
  файловыми системами (локальной/проекта и административной)

- При публикации проектов пропускаются файлы и каталоги с атрибутом Hidden или начинающиеся с "."
  так же эти файлы не показываются редактором проекта

- Automation интерфейс: Добавлена поддержка новых форматов бэкапа (bkpx).
  + При создании/восстановлении инф.баз можно не указывать мэппинг внешних документов

- Исправлена ошибка планировщика: не работало задание "Обработать расчетную базу"

- Сервер данных: доработаны алгоритмы коррекции ссылочной целостности

- Доработаны некоторые системные диалоги для поддержки темной темы и High DPI

*** Build 10558 ***

- Шаблоны: новый стиль клетки логического поля: RadioButton

- WEB Сервер: снято ограничение, что к одной базе нельзя делать несколько селекторов.

- TXAdm: новая команда ActivateKey для активации интернет ключа

- TXAdm: доработки управления сервисами Turbo. Изменен формат команды Service

- Linux: если сервер не имеет терминального окна, то он не пытается запрашивать подтверждения

- Исправлено несколько ошибок в диалоге отчетов

- Доработки Automation интерфейса

*** Build 10559 ***

- Исправлен ошибка в Kernel.Pipe (свойство Empty иногда начинало выдавать неправильные значения) 

- Доработано формирование отчетов в формате HTML: делается установка data-row/data-tab для
  итоговых строк/таблиц

- Сервер процедур: доработаны алгоритмы прерывания исполнения серверных процедур, не делается
  повторное прерывания, пока идет обработка excent/finally кода

- Сервер данных: исправлена ошибка реорганизации в режиме "Помечать конфликтные записи как удаленные"

- TXAdm: доработки управления сервисами Turbo

- Исправлены ошибки запрещения недоступных элементов в ряде системных диалогов

*** Build 10560 ***

- Добавлена новая редакция

*** Build 10561 ***

- Доработаны алгоритмы репликация для поддержки 64-х разрядных DocID

- Доработан сервер расчетов для лучшей поддержки 64-х разрядных параметров

- Шаблоны: Доработано события OnRearrange с Action = DoubleClickColumn/DoubleClickRow

- Шаблоны: исправлена ошибка AV при работе с браузером IE

*** Build 10562 ***

- Оптимизация работы с памятью
    - Локальные кучи сервера расчетов переведены на FastMM и работают в Linux
    - Аллокация через malloc попадает в отчеты отладочной версии (Linux)
    - Добавлен новый менеджер памяти TCMalloc (пока только для Windows)
      По умолчанию отключен, включается ключом /MM=6
      Для его использования требуется libtcmalloc.dll и VCRUNTIME140.dll, 
      если их нет используется менеджер памяти Windows
    - При завершении расчетной базы память принудительно возвращается ОС (актуально для malloc и TCMalloc)

- Сервер расчетов: исправлена ошибка при использовании псевдонимов в аккумуляторах (опять)

- Администрирование: доработки в мастерах 

- Доработки форматирования отчетов в HTML

- Текстовый редактор: доработки команд Enter и RowBegin (Home)

*** Build 10563 ***

- ТБ.Скрипт: Разрешена проверка is для комбинации:
      СлабаяСсылка is ИмяКласса
    Раньше в этом случае приходилось писать
      СлабаяСсылка is weakref ИмяКласса
    Чтобы проверить что выражение является "сильной" ссылкой на объект теперь нужно писать:
      Expr is Object and not Expr is Weakref
    или
      VarType(Expr) = VarObject

-(Doc) ТБ.Скрипт, RTTI: в класс VarInfo добавлено свойство возвращающее тип Backfield для приводимых полей:
    field BackfieldType :ClassInfo

  Пример:

    var Num :IVar as Integer;
  ---
    var vNumInfo :VarInfo = ClassInfo.MemberByName("Num")
    Assert(vNumInfo.ResultType.Name = 'Integer')
    Assert(vNumInfo.BackfieldType.Name = 'IVar')

- ТБ.Скрипт: изменены правила инициализации полей со значением по умолчанию. 
  Теперь, если при вычислении значения по умолчанию возникает исключение, 
  то поле остается непроинициализированным, повторное обращение к полю 
  приведет к повторному вызову инициализатора. 
  Ранее поле оказывалось проинициализированным nil.

-(Doc) ТБ.Скрипт: в класс Kernel.System добавлено свойство:
    func HintMode :Logical
  Свойство возвращает True, если процесс исполняется под отладчиком при вычислении выражения 
  для показа в подсказке или окне просмотра переменных (но не в окне просмотра значения - Evaluate)
  Если нужно защититься от случайного вызова функции под отладчиком при наведении мышкой, 
  можно написать в ее начале:

    if HintMode then
      Abort
    end

-(Doc) ТБ.Скрипт: в перечислимый тип VarTypes добавлена забытое значение
    const VarWeakref  = 51

- Текстовый редактор: доработки команд Enter и RowBegin (Home)

*** Build 10564 ***

- В каталоге Bin можно разместить дополнительный конфигурационный файл Params.ini
  Все строки из этого файла автоматически добавляются в командную строку каждого
  запускаемого процесса (Turbo.exe / TXServer.exe / etc). Параметры из файла добавляются
  после всех параметров заданных в командной строке, т.о. если в командной строке и в
  файле задан один ключ, то его значение из командной строки имеет преимущество.
  Удобно использовать этот файл, для того чтобы передавать параметры в сервисы Windows.
  Пример:

  Params.ini:
  ---
  ;Не показывать Logo при запуске клиента
  /NoLogo

  ;Игнорировать сохраненные настройки при запуске клиента
  ;/IgnoreDesktop

  ;Использовать менеджер памяти TCMalloc
  /MM=6
  ---

- Сервер расчетов: ключ запуска /DisableMerge запрещающий слияние изоляций
  Только для целей отладки!

- Сервер расчетов: исправлена ошибка при "холодном" обновлении 
  (при анализе диапазонов дат изменяемых документов)

- Сервер расчетов: оптимизированы алгоритмы отбора по справочникам,
  (устранена рекурсия)

- Сервер данных: исправлена ошибка подзагрузки полей документов под Linux.

- Сервер данных: исправлена ошибка работы с периодическими полями в SLite

- Сервер данных: исправлены ошибки репликации при использовании 64-х разрядных DocID

- Исправлена ошибка сетевого протокола, которая могла приводить к сбоям при прерываниях

*** Build 10565 ***

-(Doc) Сервер расчетов: Подсказки (хинты) в условиях отбора (полу)проводок.

  Определенные параметры в условии могут быть помечены символом "#'. Сервер будет
  игнорировать индекс по данному параметру и отбирать проводки последовательным перебором.
  В некоторых случаях это может привести к существенному ускорению отбора.  
  Например, условие:
    Контрагент=xxx и Статус=Факт
  Если первая часть условия (Контрагент=xxx) является "сильной" (отбирает небольшое
  количество движений по одному контрагенту) а вторая (Статус=Факт) - "слабой" 
  (большинство движений находится в статусе Факт) то время отбора можно сократить 
  принудительно запретив серверу использовать индекс по полю Статус
    Контрагент=xxx и #Статус=Факт
  Это особенно актуально для разыменованных отборов по большим справочникам, типа:
    Контрагент=xxx и #Процесс.Статус=Факт

  Если по параметру, помеченному хинтом "#" нет индекса - хинт игнорируется.

-(Doc) Расширения формата ресурсов: свойства-группы

  Хранимое поле (stored var) объектного типа можно пометить атрибутом BuildIn=True.
  Редактор ресурсов будет рассматривать такое поле не как ссылку на другой 
  компонент, а как "вложенный объект". В списке свойств компонента появится
  раскрываемая группа, у которой есть собственные свойства. 

  Пример (см. Demo.Ctrl.IMyButton):

    #Attr Category='Look'
    #Attr BuiltIn=True
    stored var Font :Ctrl.Font := Ctrl.Font.CreateEx(Self)

  Замечание 1. Вложенный объект должен создаваться программно в конструкторе 
    корневого компонента (или по требованию)
   
  Замечание 2. Вложенный объект может (но не обязан) быть наследником ICompopent

  Замечание 3. Вложенность вложенных объектов - не ограничена (теоретически), 
    но пока есть недоработки.

- В редакторе ресурсов deprecated классы и свойства отмечаются особой иконкой.
  Так же при проверке ресурсов выдается предупреждение при использовании 
  deprecated классов и свойств.

  В дереве выбора класса Deprecated классы по умолчанию не показываются, 
  но можно включить их через PopupMenu, команда "Показывать устаревшие" (Ctrl+D)

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

-(Doc) Построение отчетов: Доработано форматирования отчетов в форматы ODF.

- В Help'е поддержан поиск назад

- Исправлена ошибка смена пароля пользователя при использовании старой версии
  сервера авторизации


*** Build 10566 ***

- (Doc) Класс Administration - добавлены методы управления сервисами Турбо.

    func GetServices :ServiceInfo[]

  Где:

    Kernel.ServiceInfo
      field Name :String
      field Description :String
      field AllowPause :Logical
      field State :ServiceInfo.ServiceState
      proc UpdateState
      proc Run
      proc Stop ({Check :Logical})
      proc Pause ({Check :Logical})

- (Doc) Программный интерфейс к внутреннему механизму загрузки/сохранения 
  ресурсов - класс Kernel.ComRes:

    Kernel.ComRes
      field AsString :String
      field ParentAsString :String
      field ChildAsString :String
      func SetString (aValue :String) :Logical
      func LoadFromFile (aFileName :String) :Logical
      proc SaveToFile (aFileName :String; {aCopy :Logical})

- Редактор ресурсов:
  - Доработана поддержка свойств-групп
  - Доработана поддержка deprectaed свойств и классов.

- В Help'е поддержана быстрая фильтрация в дереве тем

- Доработаны проверки политик паролей на сервере авторизации

*** Build 10567 ***

- Сервер расчетов: оптимизировано холодное обновление после добавления большого
  количества документов

- Доработан мастер установки проектов: корректно обрабатываются ситуации
  несовпадения регистра в имени проректа или каталоге размещения

- Редактор ресурсов:
  - Доработана поддержка свойств-групп
  - Доработано позиционирование на ошибки

- Текстовый редактор: добалена возможность создания перекрестных ссылок на методы. Пример:
    --Link:Sys.Utils.@HintF

- Календарик: новое представление - несколько месяцев (до года). 
  Переключается кнопкой maximize (F5)

- ТБ.Скрипт: исправлена ошибка в методе Subtable.NumberByIndex для периодических подтаблиц

- Отчеты: исправлены ошибки построения отчетов с вычислимым показателем "Доля"

*** Build 10568 ***

- Новая версия  10.5.1. Переменные условной компиляции:
    Version=10.51
    Build=151xx

- Сервер данных: оптимизация добавления данных
  - Способ передачи аргументов в SQL запросы (по значению или через параметры) 
    настраивается раздельно для запросов на чтение и модификацию данных.
    Для основных SQL серверов (MSSQL, PostgreSQL, SQLite) в запросы модификации
    аргументы теперь передаются через параметры.
  - Для однотипных вставок повторно используются подготовленные (prepared) команды
  - Не рассылается нотификация о добавлении документов клиентам, которые не подписаны
    на них явно

- Сервер расчетов: оптимизировано построение больших отчетов с помощью более
  эффективных структур данных (двоичных деревьев)

- Студия: новая версия профилировщика

*** Build 15101 ***

- Для 64-х разрядного сервера менеджер памяти TCMalloc используется по умолчанию (Windows)

- Сервер периодически вызывает функцию менеджера памяти для освобождения неиспользуемой 
  памяти, возвращая ее операционной системе (для malloc(Linux)/TCMalloc)

- Исправлена ошибка загрузки сценариев импорта

*** Build 15102 ***

- Оптимизация вызова ServerThreadIdle (bIdleLockOpt)

*** Build 15103 ***

- ТБ.Скрипт: Доработки отладочной функции TraceRef
  - В качестве аргумента функция может получать не только класс, но и один объект  
  - Исправлена ошибка при работе с приводимыми полями

- ТБ.Скрипт: Доработки функции VarAddr. Теперь первый аргумент может быть 
  значением любого типа, выдается указатель на внутренний буфер значения.

  Пример, чтение внутреннего представления Numeric как Int64:

    var N :Numeric = 1.0
    var L :Int64
    L = ReadMemory(VarAddr(N), VarInt64)
    Assert( L = 0x3FF0000000000000)

- (Doc) Текстовый редактор: новые команды:
    "Следующая ошибка" (Kernel.Project.Design.NextProblem)  - Ctrl+E
    "Предыдущая ошибка" (Kernel.Project.Design.PrevProblem) - Ctrl+Shift+E
    "Список ошибок" (Kernel.Project.Design.ListProblem)     - Ctrl+Q, E
  Они же доступны из popup-меню на панели "предупреждения" в строке состояния

- Календарик: добавлены опции "Прячется при минимизации" и "Независимое окно",
  аналогично калькулятору.

- Доработано форматирование отчетов в форматы ODF (упаковка, поддержка Linux и др.)

- Сервер расчетов: Исправление ошибок при формировании отчетов

*** Build 15104 ***

- Рефакторинг алгоритмов кэширования файлов проекта при удаленной работе

- Сервер процедур, работающий с удаленным сервером данных тоже кэширует файлы проектов.
  Каталог кэша:  <Turbo>\Temp\Server\Proc\Cache\<RemoteName>

- Улучшена поддержка Linux (работа с файлами из ТБ.Скрипт, примитивы синхронизации и пр.)

- Функция HTTPServer.OpenSession позволяет авторизовать пользователя со сменой пароля,
  если это требуется сервером авторизации. Для этого, новый пароль задается после старого,
  через разделитель char(1).

- (Doc) Шаблоны: программный интерфейс к строке/столбцу секции "по умолчанию", 
  по аналогии с DefaultCell

    Kernel.TemplateSection 
      field DefaultRow :TemplateRow
      field DefaultCol :TemplateColumn

- (Doc) Класс Administration - добавлены методы управления расчетными базами Турбо.

    func GetCalcBases :CalcBaseInfo[]
    func GetCalcBase (aName :String) :CalcBaseInfo

  где

    Kernel.CalcBaseInfo
      field Name :String
      field Clients :Integer
      field State :CalcBaseInfo.CalcbaseState
      field XMLConfig :String
      proc Run
      proc Stop ({Check :Logical})
      proc UpdateState
      func Refresh (Domain :String; {Reset :Books.ResetLevel}; {Refresh :Books.RefreshLevel}; 
        {ReloadDate :Date}; {ForkDate :Date}; {OnProgress :proc (Action :Integer; Status :String)}; {aTimeout :Numeric}) :Logical

- (Doc) Текстовый редактор: Автоматическая подсветка парных скобок. Опционально отключается 
  в настройках текстового редактора на странице "Синтаксис"
  + Новые команды:

    "Парная скобка" (Kernel.Text.Edit.Bracket)           - Ctrl+[
    "Выделить скобки" (Kernel.Text.Edit.SelectBracket)   - Ctrl+Shift+[

- Доработано форматирование отчетов в форматы ODF
- Сервер данных: Исправлена ошибка вызова ServerThreadIdle 
- Сервер данных: Исправлена ошибка вставки записей с мягкими ссылками на документы с 64-х разрядным DocID

*** Build 15105 ***

- (Doc) Класс Administration - добавлены методы управления планировщиком

    func GetTasks :TaskInfo[]
    func AddTask (aXMLText :String) :String
    proc ChangeTask (aIdent :String; aXMLText :String)
    proc DeleteTask (aIdent :String)

  Где

   Kernel.TaskInfo
     field Ident :String
     field Description :String
     field XMLText :String
     field Active :Logical
     field LastError :String
     field State :TaskInfo.TaskState
     field WorkTime :Numeric
     proc Run
     proc Stop
     proc UpdateState

- Ключ запуска /MemReport=sec управляющий периодом выдачи отчета по использованию памяти
  в отладочной версии сервера

- Ключ запуска /MultiplexRPC включающий использование мултиплексирования сетевого протокола
  (пока только для целей отладки)

- Рефакторинг работы с Markdown. Исправлена ошибка с кодировкой помощи в WEB

- Студия: В окне иерархии классов показываются подсказки заданные директивами #Help и #Deprecated
  + Подсказка заданная для базового свойства показывается и для его наследников (если не перекрыта)

- Студия: Доработки профилировщика

- Сервер данных: исправлена ошибка импорта из формата TBC из за конфликта ключевых слов (Period)
- Сервер данных: Исправлена ошибка вызова ServerThreadIdle (холостая нагрузка на процессор
  при наличии разорванных подключений)

*** Build 15106 ***

- Экспорт картотек в форматы ODF

- Доработано форматирование отчетов в форматы ODF

- Планировщик: новый триггер срабатывания - "При старте сервера"

- Студия: В окне иерархии классов работает фильтрация при наборе, в дереве и списке свойств.

- Сервер данных: рефакторинг пула подключений
  - Тестирование подключений не блокирует работу других пользователей
  - Ограничение синхронного создания множества подключений 

- Сервер процедур: исправлена ошибка подзагрузки полей при завершении работы 
  (при сохранении User файлов в базу данных)

- Сервер расчетов: исправлена ошибка построения отчетов при наличии потерянной аналитики

*** Build 15107 ***

- Исправлена ошибка сохранения настроек печати в каталоге Common файлов

- Сервер данных: исправлена ошибка сборки мусора

- Сервер данных: для PostgreSQL в DBtypes.ini поддерживается ключ ConnectionString
  Например, в пользовательском DBTypes.ini можно указать:

  [MyPostgreSQL.Params]
  HostName=...
  Port=...
  ConnectionString=sslmode=disable connect_timeout=5

*** Build 15108 ***

- Linux: исправлена ошибка работы на дистрибутивах без библиотеки libicuuc.so
  Проявлялась, в частности, в TXAdm при установке проектов.

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

- Linux: доработаны функции ТБ.Скрипт, возвращающие пути к файлам проекта

- Linux: поддержана локализация, путем чтения исходного файла перевода (*.transl)
  Только для отладочной версии. Требует указания ключа /UseTransl (как и для Windows).
  В отличии от Windows, наличие файлов *.drc - не требуется

- Сервер данных: Исправлена ошибка многопоточного доступа к БД. 
  Проявлялась при работе с PostgreSQL под нагрузкой в виде различных ошибок dbExpress

- Сервер данных: Исправлена ошибка в ServerThreadIdle при отключении пользователей

- Сервер данных: Доработаны отладочные трассировки об отправке/получении изменений

- Доработаны ключи запуска, задающие привязку Турбо к процессорным ядрам (AffinityMask)
  Кроме ключа /CPU=xxx прямо задающего маску можно использовать ключи /CPU1=n1 и /CPU2=n2,
  задающие диапазон используемых ядер (начинается с 0). Примеры:
    /CPU2=7  -- Первые 8 ядер (0..7)
    /CPU1=8  -- Все ядра, начиная с 8-го
    /CPU1=8 /CPU2=15  -- Ядра 8..15

*** Build 15109 ***

- ТБ.Скрипт: добавлены встроенные функции (intrinsic) Inc/Dec. Соответствующие функции класса
  Mathematic объявлены deprecated. Прототип функций (условный):

    func Inc{T} (var Value :T; {Delta :Integer} ) :T, 
      T = Integer|Int64|Pointer|Enum

- ТБ.Скрипт: оператор DO <Выражение>. Вычисляет выражение, игнорируя результат.
  Аналог discard operator C#. Может использоваться для того чтобы не заводить
  временную переменную для вычисленного значения и подавления предупреждения
  о том что "Результат выражения не используется".
  Допускает несколько выражений, через запятую. Примеры:

    do 2+2
    do СтатусПлан, СтатусФакт
    do vForm.Show

- ТБ.Скрипт: исправлена ошибка в поддержке .Net, приводящая к потере производительности
  при создании большого числа .NET объектов

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
  (ConnectState)

- Шаблоны: изменены алгоритмы позиционирования/прокрутки. При клике мышкой на объект/клетку
  шаблона - прокрутка не делается. При переходе табуляцией - как раньше.

- Шаблоны: добавлена возможность явного указания каталога размещения WebView2
  Задается в TB.ini

  [Client\Paths]
  WebView=...

  Если он не задан - работает как сейчас. Если задан - грузим из него. Возможные варианты

  WebView=.\TXWebView
    или просто
  WebView=TXWebView
    WebView лежит в подкаталоге Bin, раздается клиентам через стандартную процедуру обновления

  WebView=..\TXWebView
    WebView лежит каталоге Turbo, ставится и обновляется инсталлятором.

  WebView=%TXWebView%
    WebView лежит где-то на диске, раскрывается через макрос

  и т.п.

- Картотеки: добавлено управление стилем отображения логических полей: CheckBox/RadioButton
  Для программного управления в класс TableColumn добавлено свойство:

    field LogicalStyle :Template.LogicalStyles

  Допустимые значения - LogicalCheckBox/LogicalRadioButton. Вариант LogicalButton - игнорируется (пока)

- Клиент: в системных диалогах выбора поля (вызываемых из фильтра картотеки или отчета)
  работает фильтрация при наборе

- Сервер данных: информация о последнем бэкапе, сборке мусора, приеме и выгрузке реплик
  перенесена в новый файл Statistics.xml, в корне каталога информационной базы.
  Файлы База.idbx и Схема.xml при этих действиях не меняются, что уменьшает вероятность
  их порчи при сбоях.

- Сервер данных: исправлена ошибка восстановления бэкапов при использовании 64-х
  разрядных мягких ссылок.

- Сервер данных: исправлена ошибка, которая могла происходить при одновременном экспорте
  репликаций по нескольким разным схемам

- Сервер расчетов: исправлено несколько ошибок (AV при слиянии изоляций,
    неправильная блокировка хаба при обработке)

- TXAdm: доработаны команды управления серверами расчетов, назначенными для обработки
  инф. базы: AddCalcServer / DeleteCalcServer / CalcServerList

- TXCompare: исправлена ошибка, не сохранялись результаты сравнения.

*** Build 15110 ***

- ТБ.Скрипт: Доработки классов доступа к RTTI.
  - Свойство TypeInfo.VarType теперь корректно возвращает значения VarClass/VarWeakref
  - Добавлен класс FunctionInfo для доступа к информации о замыканиях
  - Добавлено свойство MemmberInfo.AsString, возвращающее описание в строковом виде:

     Assert(List.ClassInfo.MemberByName('Add').AsString = 'proc Add (Value :Variant)')

- ТБ.Скрипт: Доработки Object.Evaluate. Теперь через него можно "вычислять" процедуры, 
  при этом возвращаемое значение = nil

  Аналогично, можно "вычислять" процедуры через просмотр переменных в отладчике.

  В калькуляторе "вычисление" процедур, наоборот, запрещено

- Сервер данных: в файл Statistics.xml дополнительно пишется дата последнего 
  открытия/закрытия инф. базы. Путем сравнения дат "Backup Date" и "Open Date"
  можно судить об актуальности последнего бэкапа.

  Информация о дате последнего открытия выдается в администрировании.

*** Build 15111 ***

- ТБ.Скрипт: Доработки инициализации массивов

- ТБ.Скрипт: доработки класса Administration для поддержки репликаций.
  Функции ReplicationExport/Import/Transfer доступны для вызова на сервере

- (Doc) ТБ.Скрипт: Расширен программный интерфейс EMail, в метод AddAttach добавлены
   необязательные параметры ID, Type

    proc AddAttach (Name :String; Attach :BinaryObject; Encoding :String; {aID :String}; {aType :String})

- ТБ.Студия: в окне "Свойства проекта" доработан список подпроектов.
  Поддерживается группировка проектов и автодополнение

- Исправлена ошибка при загрузке библиотек .NET, которая могла возникать,
  если на файлах библиотек были установлены расширенные атрибуты.

- Исправлено несколько ошибок (Statistics.xml, FolderExists, Codepages, Утечки памяти)

*** Build 15112 ***

- (Doc) ТБ.Скрипт: Новый класс DBConnection - для исполнения произвольных SQL запросов
  к разным базам, через серверные библиотеки Turbo. Подробное описание:

    http://wiki.tengry.com/confluence/pages/viewpage.action?pageId=115870771

- ТБ.Скрипт: В класс FieldInfo добавлено свойство DBFieldName, возвращающее
  имя физического поля в таблице SQL базы (аналогично RecordClassInfo.DBTableName)

- ТБ.Скрипт: Исправлена ошибка в Importer.LoadCorrespondence

- DotNet: Поддержан возврат значений ref/out параметров в ТБ.Скрипт

- Редактора ресурсов:
  - Доработана поддержка обработчиков с аргументами-замыканиями
  - Доработаны проверка при использовании приводимых типов
  - Доработано позиционирование на ошибки

- Администрирование: доработаны мастера Backup/Restore баз и проектов

- Система обновления Desktop версии (Loader.exe + TXUpdate.dll) теперь использует ZIP архивы.
  Благодаря этому снимается ограничение на размер файлов в каталоге Bin, что позволяет
  размещать в нем большие библиотеки, типа WebView2

  Для совместимости с предыдущими версиями обновление для них отдается в старом формате.
  При этом они не смогут обновиться, если в каталоге Bin размещен WebView2, например.

  Для решение этого конфликта поддержан отдельный файл настроек обновления старых
  клиентов - Config\UpdatesOld.ini, типа:

    *
    -WebView2\*

- (Doc) WEB сервер: настройки роутинга вынесены из файла Servers.ini в отдельный файл HTTP.ini
  Формат настроек HTTP.ini совпадает с соотв. группами из Servers.ini, если из них
  удалить слово HTTP в имени группы:

    Config\HTTP.ini

    [Access]
    ...
    [Alias\Name1]
    ...
    [Alias\Name2]
    ...

  Поддерживается совместимость со старыми версиями: если файл HTTP.ini отсутствует
  настройки считываются из Servers.ini.

- WEB сервер: исправлена ошибка работы под Linux - нарушение работы при большом
  количестве открытых сокетов (> 1024)

*** Build 15113 ***

- DotNet: Исправлена ошибка предыдущей сборки - обновлены библиотеки TurboNet

- Сервер расчетов: исправлена ошибка преждевременного слияния изоляций во время связывания

*** Build 15114 ***

- (Doc) WEB сервер: настройки HTTP.ini могут размещаться в каталоге Bin или Config.
  Приоритет имеют настройки из Config, если они не найдены - ищутся в Bin, если и там нет -
  берутся из Servers.ini

  В сборку включается файл HTTP_Sample.ini, содержащий пример типовых настроек
  с поддержкой "универсального входа" (по имени инф. базы). Его нужно переименовать
  в HTTP.ini перед сборкой инсталлятора

- (Doc) ТБ.Скрипт: с класс Record добавлен метод расширенной блокировки:

    func LockEx (Timeout :Numeric; var UserName :String) :Logical

  он пытается заблокировать запись в течении заданного timeout'а, если удалось -
  возвращает True, если нет - False и имя пользователя, удерживающего блокировку.

- В мастерах импорта/экспорта записей поддерживается автодополнение на страницах мэппинга.

- Исправлена ошибка зависания сервера авторизации после сетевого сбоя
- Исправлено несколько ошибок в классе Administration


*** Build 15115 ***

- (Doc) Новый протокол инициализации именованных подключений WEB сервера
  Для поддержки инициализации выбора роли и SSO добавлены методы:

  HTTPServer:
    func CreateSession ({ProcServer :String}; {DataServer :String}; {Infobase :String}) :String
    func CloseSession (SessionID :String) :Logical
    proc Authenticate (SessionID :String; User :String; {Password :String})
    func AuthenticateSSO (SessionID :String; Request :String; var Response :String) :Logical
    func GetRoles (SessionID :String) :String[]
    proc SelectRole (SessionID :String; Role :String)

    OpenSession - deprecated

  Пример использования нового протокола - Demo.HTTP.Login

- Web сервер: если при запуске не удается инициализировать протокол
  HTTP и/или HTTPS (например, соотв. порт уже занят), то ошибка логируется
  в журнале, а служба Turbo WEB Сервер все равно запускается.
  Это позволяет изменить настройки WEB сервера через диалоги администрирования.

- Расширение функционала схем оформления (*.skin)

  Для каждого класса контролов можно задавать несколько вариантов оформления,
  называемых "Фасон" ("Fashion"). Формат:

    <Button Fashion="Primary">
     ...
    </Button>

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

  Для объектов/клеток шаблона Фасон может быть указан через программный интерфейс:

    TemplateObject, TemplateCell, TemplateStyle
      field Fashion :String

  В настоящий момент Фасоны поддерживается только для объектов Button, CheckBox и RadioButton
  и клеток соотв. стилей

  Файлы *.skin с дополнительными вариантами оформления могут находиться в проекте
  и загружаться через программный интерфейс, например, при запуске сессии.
  Для расширенного управления схемами оформления в класс Console добавлены методы:

   Console
     proc ImportSkin (SkinXML :String)
     func ExportSkin (Element :String) :String
     func GetSkinValue (Element :String) :Variant
     proc SetSkinValue (Element :String; Value :Variant)

  (Интерфейс предварительный и может быть изменен в будущем)

- Шаблоны: поддержано редактирование значений типа Variant.

- DotNet: Возможность опускать необязательные параметры при вызове

- DotNet: Путь для размещения дополнительных сборок DotNet задается
  в TB.ini через ключ DotNetLibs в разделах [Client] и [Server].
  Есть ключ не указан - сборки ищутся в каталоге Bin.
  Ключ влияет только если в DotNet.GetClass / DotNet.CreateObject
  не указан полный путь к сборке.

- DotNet: поддерживается опрос/установка индексных свойств по имени.
  Для получения значения индексного свойства можно использовать
  Invoke, для установки значения - DotNetObject.SetProperty.
  Свойство DotNetObject.Property - удалено. Пример:

    var vList = Sys.dNet.Def.CreateObj("List<int>")
    vList.Add(0)
    vList.SetProperty("Item", 123, 0)
    Assert(vList.Invoke("Item", 0) = 123)

- ТБ.Скрипт: BinaryObject.AsBase64 более не разбивает строки
- ТБ.Скрипт: Исправлена ошибка установки Storage.AsString (AV в нек. случаях)

- Доработки в мастерах импорта/экспорта записей.

- Доработаны алгоритмы кэширования файлов проекта в сессии.
  Исправлена ошибка открытия проектной помощи в отладочной сессии.

- Исправлена ошибка инициализации имени инсталляции (race condition)

- Сервер данных: Исправлена ошибка восстановления старых бэкапов (v 7.4)

*** Build 15116 ***

- (Doc) Шаблоны: новый вид клеток-полей - совмещение метки и значения в одном поле.
  Включается, если у клетки-поля программно установить свойство Caption
  (ранее свойство Caption использовалось для полей-CheckBox'ов )

  Свойства шрифта для Caption берутся из библиотеки стилей, если в ней добавлены
  стили с предопределенным именем:

   #Label - для метки, когда значение не введено (метка центрируется в клетке)
   #Label2 - для метки с введенным значением (метка сдвигается вверх, выше значения)

  Если стиля "#Label2" нет - для обоих состояний используется "#Label".
  Если нет ни одного стиля - используются свойства самой клетки.

  Задавать стили метки индивидуально для каждой клетки сейчас нельзя, они будут
  одинаковые для всего шаблона. Возможно, потом будет доработано.

- (Doc) ТБ.Студия: Иконки в столбцах таблиц и картотек

  Теперь в каждой клетке табличных контролов (Grid, Cardfile, TemplateCardfile...)
  можно выводить иконку с разными настройками, аналогично клеткам шаблона.
  Для управления настройками вывода иконки в класс TableColumn добавлены свойства:

  TableColumn
    field Image :Image
    field ImageAlign :Template.AlignmentTypes
    field ImageSize :Integer

  Если задать иконку в свойствах столбца - она будет одинаковой в каждой клетке
  этого столбца (это можно использовать для создания управляющих элементов).

  Если нужно выводить разные иконки в каждой клетке, эти можно сделать через
  событие OnDraw, для этого в него добавлен параметр Icon (аналогично TemplateCell.OnDraw)

  TableColumn
    event OnDraw :proc (Column :GridColumn; Item :GridItem; Selected :Logical;
      var Color :Integer; Font :Font; var Icon :Image)

- Шаблоны: доработка оформления клеток-кнопок: если цвет надписи не задан явно,
  то он берется из skin'а соотв. фасона.

- Клиент: доработано оформление контролов Edit/ComboBox, добавлена возможность
  настройки оформления бордюров для разных состояний контрола; иконки для
  выпадающего списка и кнопки обзора масштабируются.

  Данные настройки так-же поддерживаются для объектов шаблонов, но пока
  не поддерживаются в клетках-полях.

- (Doc) ТБ.Скрипт: методы AddObject/InsertObject классов Template/TemplateFrame
  объявлены как generic:

    func AddObject{T :TemplateObject} (Class :T) :T
    func InsertObject{T :TemplateObject} (Index :Integer; Class :Class T) :T

- ТБ.Скрипт: исправлено несколько ошибок в классе DBConnection

- ТБ.Студия: исправлена ошибка добавления переменных в окно просмотра отладчика

- TXAdm: при удалении информационной базы одновременно удаляется расчетная база
  (только на этом же сервере)
- TXAdm: при восстановлении бэкапа, сделанного средствами SQL можно не указывать
  тип СУБД. Turbo автоматически найдет СУБД совместимую с бэкапом
  (если их несколько - будет выбрана первая в списке).

- Сервер данных: оптимизировано чтение больших BLOB полей для MSSQL

- Предварительная версия сервера компиляции (TXCompile.dll). Можно вызывать
  из командной строки, через TXAdm, команда Compile:

    TXAdm compile ИмяПроекта.

  Пока компилируются только серверные классы. Это достаточно для работы
  WEB интерфейса, но Desktop-клиент с такими проектами работать не будет.

*** Build 15117 ***

- (Doc) ТБ.Студия: Макросы в столбцах таблиц и картотек:

  TableColumn
    field UseMacro :Logical

- Сервер данных - оптимизация условий отбора перед формированием SQL запросов
  - Оптимизируются константные выражения: 
      Number = 2+2 --> Number = 4
  - Оптимизируются вырожденные условия:  
      Number = 4 and False --> False
      Number = 4 or True --> True
  - В том числе - выражения с ClassType в гетерогенных запросах:
      ClassType = Процесс and ТипПроцесса = XXX --> ТипПроцесса = XXX или False
  - По возможности - раскрываются вложенные скобки

- Шаблоны: исправлена ошибка при отслеживании мыши (OnMouseAction)

*** Build 15118 ***

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
  (Kernel.ReplicationSchema, BaseInfo.ReplicationSchemaList, etc)

- ТБ.Скрипт: расширен программный интерфейс Window. Добавлены свойства:

    field Form :Form
    field Host :Window
    field ChildCount :Integer
    field Childs [Index :Integer] :Window

- ТБ.Скрипт: исправлена ошибка работы класса ComRes под Linux

- Доработки администрирования WEB сервера в Desktop клиенте

- Доработана функция LockEx: параметр UserName - опциональный, оптимизировано быстродействие.
  + Исправлена работа функции Lock, сломанной при добавлении LockEx

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

- Сервер данных: оптимизировано чтение больших BLOB полей для MSSQL
  (доработана оптимизация для memo-полей)

- Сервер данных: исправлена ошибка циклической реорганизации при изменении
  настроек логирования

*** Build 15119 ***

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

  Кэширование справочников работает для программного интерфейса Sign и отчетов.
  Для оптимальной загрузки полей справочника при запросах AnalitQery добавлено
  свойство LoadingFields, в нем можно указать список загружаемых полей, в том числе
  поддерживается разыменование:

    var MyQuery = AnalitQuery.Create("спрТовар")
    MyQuery.LoadingFields = "Имя,Описание,Производитель,Производитель.Имя,Производитель.Описание"

  Текущее состояние кэша Desktop-клиента можно посмотреть в окне "Информация о сессии"
  на странице Справочники. Там же можно принудительно сбросить кэш (для целей отладки, например)

  Ограничение на размер кэша: по умолчанию - 4M. Изменить:
    Настройки Программы -> Журналы и отчеты -> Справочники

- Отчеты: для вывода атрибутов разбиения в отчетах по оборотам/справочникам
  по возможности используется обращение к серверу расчетов а не к серверу данных.
  Если все атрибуты доступны через сервер расчетов - не будет выдано ни одного SQL запроса.
  Если часть атрибутов разбиения не могут быть получены от сервера расчетов
  ("Незагружаемые" поля или прямое обращение к полю записи: #FieldName)
  то будет использован комбинированный запрос - часть информации будет получено
  от сервера расчетов, часть от сервера данных.

  Пока отчет открыт он "удерживает" все элементы справочника от вытеснения из кэша,
  аналогично документам.

  ВНИМАНИЕ: Если в отчет попадают удаленные элементы справочника то значения
  всех атрибутов такого элемента равны nil, кроме имени, которое выводится в виде
  полного DocID. Это отличается от поведения предыдущей версии, которая запрашивала
  данные от сервера данных и могла выводить значения атрибутов даже для удаленных
  элементов (помеченных как удаленные или не попадающие под фильтр справочника)

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

    field UseRefCache :Logical
      -- По умолчанию = True, если присвоить False отчет будет строиться "как раньше"

- ТБ.Скрипт: Новая экспериментальная фича - Design-time классы, позволяющие
  расширять функциональность студии с помощью кода на ТБ.Скрипт, который
  будет грузиться и исполняться при открытии проекта, без запуска сессии.
  В таком коде нужно соблюдать ряд ограничений - нельзя обращаться к классам
  работающим с сервером данных и сервером расчетов и т.п.

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

  Сейчас при открытии проекта грузятся все Design-time классы из него и всех
  его подпроектов (проекты должны быть откомпилированы обычным образом).

  Для открытия Deisgn-time форм можно использовать диалог "Открыть форму (Alt+B)",
  который теперь доступен в во время разработки.

- ТБ.Скрипт: Доработки и исправление ошибок в классе RegExp.
  В перечислимый тип RegExp.Options добавлены элементы:

    SimpleMask - отключается поддержка регулярных выражений,
                 поиск делается по полному совпадению с маской
    WholeWords - Поиск слов (только вместе с SimpleMask)

- ТБ.Скрипт: В класс TextEditor добавлен метод SelectBlock:

    proc SelectBlock (BegRow :Integer; BegCol :Integer; EndRow :Integer; EndCol :Integer; {Box :Logical})

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Desktop клиент: Прикладные формы, имеющие стиль окна "Встраиваемое" (Docked)
  теперь сохраняются на рабочем столе так-же как системные окна.
  (Только если у него установлено свойство "Восстанавливать бланк на рабочем столе")

- Сервер данных: исправлена ошибка сохранения строк в ADO: при сохранении пустой
  строки в поле записывался пробел.

- Исправлена ошибка отображения календаря при нестандартных шрифтах

*** Build 15120 ***

- Клиент: новый стиль навигации (опциональный) - первое полуокно в цепочке закрепляется
  и всегда остается на первом месте, сдвигаются только правые полуокна.
  Включается через Popup меню на панели навигации ("Фиксировать первое окно").
  Там же можно изменить стили навигационной панели.

  Для программного управления режимами навигации в класс Window добавлены свойства:

    field FixFirst :Logical
    field NavigationBar :Logical

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- ТБ.Скрипт: доработки класса SessionInfo для поддержки Design-Time кода.
  Добавлены свойства:

    field DesignMode :Logical
    field ProjectsFolder :String

- Шаблоны: доработки стилей для бордюров клеток

- Редактор ресурсов: доработаны проверки при компиляции. Теперь должно
  корректно обрабатываться исключение библиотек.

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

- Сервер данных: оптимизировано построение SQL запросов для фильтров типа:
    МягкаяСсылка in [...]

- Сервер авторизации: хэш паролей переведен с MD5 на SHA256

- Логирование: добавлено логирование событий безопасности:
    - Изменение любых настроек сервера авторизации
    - Добавление/изменение/удаление пользователей/групп

- Доработки TXAdm compile
    - Компилируются серверные и клиентские классы
    - Ключ /BuildAll - компилирует проекты с подпроектами
    - Ключ /Sign - компилирует и подписывает проекты (требуется лицензия)
      Без ключа /Sign лицензия не требуется, но проекты должны уже быть подписаны.

*** Build 15121 ***

- Рефакторинг стилей (skins) desktop клиента. Добавлен новый стиль TurboX2 (светлый)
  для тестирования нового дизайна

- ТБ.Скрипт: расширен программный интерфейс Window. Добавлены свойства:

    field WindowCount :Integer
    field Windows [Index :Integer] :Window
      - Позволяют перебрать все окна открытые из текущего главного окна,
        включая Docked, Popup и Modal окна. Доступно только для MainWindow,
        для любых других окон WindowCount = 0

    field Fashion :String
      - Позволяет изменить фасон некоторых элементов окна. В настоящий момент
        меняется только фасон Tab'ов для окон, являющихся Tabbed DockHost.

  - Шаблоны: Добавлена настройка, позволяющая исключить определенные секции
    из поиска горячих клавиш (Alt+буква), что может значительно ускорить
    обработку таких комбинаций в шаблонах с очень большими секциями.
    В свойствах секции:
      [x] Горячие клавиши
    Программный интерфейс:
      TemplateSection
        field HandleHotKeys :Logical

  - Шаблоны, Chart: исправлена ошибка установки отступов для дополнительных осей

  - DotNet: добавлена поддержка нестандартных примитивных типов, которые не имеют
    прямых аналогов в ТБ.Скрипт (Byte, UInt32, etc...)

  - Обработчик Record.OnDescribe - можно установить общий обработчик для всех
    классов записей.

  - Сервер данных: исправлена ошибка восстановления бэкапов, при восстановлении
    только одной базы из много-базового бэкапа

  - ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

*** Build 15122 ***

- Отчеты: Вычислимые показатели FirstValue/LastValue теперь поддерживают 
  вычисление итогов с помощью агрегатов Sum/Min/Max. 

  Для программного задания способа вычисления итогов в перечислимый тип 
  Report.IndicatorAggregateMethods добавлен элемент:
    const agrDefault  = -1

  Который является значением по умолчанию для вычислимых показателей.

- Отчеты: доработана поддержка Int64

*** Build 15123 ***

  - Расширен программный интерфейс отчетов, добавлены свойства управляющие
    иерархией параметров разбиения:

    ReportSplit
      field HierarchyByParam :Logical
      field MergeGroups :Logical

    ReportSplitParameter
      field HierarchyDepth :Integer

  - ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

  - Диалог отчетов: улучшена поддержка синонимов

  - Редактор ресурсов: исправлена ошибка отображения и проверки ресурсов
      при наличии некоторых расширений

  - Сервер данных: исправлена ошибка записи периодических структур
  - Сервер данных: исправлена ошибка некорректного отображения периодического поля

*** Build 15124 ***

- Шаблоны: Объект TabSet снова поддерживает индексы закладок, которые были 
  отключены в версиях > 7.4. Индекс закладки задается в списке закладок 
  в формате: Надпись|Подсказка|Индекс
  Пример:

    Tab1|Hint1...|10
    Tab2|Hint2...|20
    Tab3||30

- Исправлена ошибка, которая могла приводить к AV при закрытии сессии в случае
  зацикленных ссылок с участием форм.

- Сервер процедур: Исправлена ошибка, которая могла приводить к AV при открытии WEB сессии

- Доработки дизайна табов и docked окон (стиль TurboX3)

*** Build 15125 ***

- Сервер авторизации: добавлено множество настроек управления политиками:
   - Максимальный срок действия пароля и предупреждение о его приближении.
     При достижении срока требуется принудительная смена пароля
     или происходит блокировка учетной записи (настраивается)
   - Минимальный интервал между сменами пароля
   - Опционально ведется история из N ранее установленных паролей,
     запрещается повторно использовать пароли из истории
   - Опционально проверяется близость нового пароля к текущему
     (расстояние Левенштейна) и запрещается менять пароль на "похожий"
   - Можно настроить список запрещенных к использованию паролей, в файле:
     Config\ForbiddenPasswords.txt
   - Максимальное время "неактивности" учетной записи. Если в течении
     заданного периода пользователь не подключался к программе,
     его учетная запись автоматически блокируется
   - Максимальное количество неудачных попыток логина. При достижении
     этого ограничения учетная запись автоматически блокируется
     на заданное время.
   - Защита от brute-force паролей. Между попытками логина должен
     быть интервал > 1 сек, иначе выдается сообщение об ошибке.

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

  ВНИМАНИЕ: новая версия не совместима со старыми серверами авторизации.
  Если используется выделенный сервер авторизации его нужно обновить
  на последнюю версию (при??? он будет работать со всеми предыдущими
  версиями Турбо)

- Сервер логирования: поддержка прав доступа при работе с логом:
   - Список событий фильтруется в зависимости от прав администратора.
     Например, если у администратора нет прав администрирования
     сервера авторизации, то он не увидит все события у которых
     свойство Сервис=TXAuth (события безопасности), и т.п.
   - Настройку свойств журнала событий и его удаление могут
     делать только администраторы сервера авторизации.

- ТБ.Скрипт: доработка объекта Storage:
  - Storage объявлен generic-классом ( Storage{T} )
  - Добавлен метод перебора элементов Storage:
      func Each (Callback :proc (Value :Variant; Name :String)) :String
  - Добавлен метод Storage.RemoveSpaces, который удаляет из Storage
    "пробелы" - пустые элементы, которые остаются после DeleteField
  - В метод DeleteField добавлен необязательный параметр RemoveSpace
    который удаляет поле не оставляя "пробела"
      proc DeleteField (Name :String; {RemoveSpace :Logical})

    ВНИМАНИЕ: Многократное использование DeleteField("Name", True)
    на больших коллекциях может привести к _очень_ значительному
    замедлению. Если нужно удалить несколько элементов коллекции
    не оставляя пробелов предпочтительно вызывать DeleteField("Name")
    а потом - RemoveSpaces.

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Редактор ресурсов: при сворачивании групповых свойств в редакторе выводится сводная
  информация обо всех установленных свойствах внутри группы.

- Шаблоны: поддержано свойство Fashion для TemplateFrame.
  Влияет на внешний вид строки закладок.

- Администрирование: исправлено несколько ошибок
- Диалог отчетов: исправлено несколько ошибок

*** Build 15126 ***

- Новый макрос шаблона: гиперссылка. Пример:

    Текст <HRef:Link1>Гиперссылка 1<HRef> тест <HRef:Link2>Гиперссылка 2<HRef>

  При наведении мышкой на гиперссылку меняется форма курсора мыши, а событие
  OnClick получает Action=Template.HRefPressed. Узнать на какую ссылку щелкнули
  можно через свойство шаблона Template.LastHRef, которое будет = "Link1" или "Link2".
  (сделано через свойство шаблона а не входящий аргумент, чтобы не менять формат
  обработчика OnClick)

  Поддерживается в клетках,таблицах и картотеках шаблона.

- Исправлена ошибка запуска под Linux (появилась в Build 15126)

*** Build 15127 ***

- Доработки TXAdm compile. Новые ключи: /Build /All /Warnings (см. help)
  + Наконец работает компиляция под Linux

- Шаблоны: настройка внутренних отступов для клеток. Программный интерфейс:
  TemplateCell
    field TextMargins :Numeric[]

- Журнал событий: экспорт событий в формате JSON

- Сервер процедур: исправлено зависание при остановке сервера Turbo, которое могло происходить
  из-за сервисов, вызвавших блокирующую функцию, например - Pipe.Get

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
- ТБ.Скрипт: исправлена ошибка постоянной компиляции помощи в режиме make

- Шаблоны: исправлено несколько ошибок (установка фасонов для фреймов, установка MarginsEx)
- Редактор ресурсов: исправлена ошибка позиционирования на ошибочное свойство внутри группы

*** Build 15128 ***

- В программный интерфейс Administration добавлена возможность программного вызова
  сервера компиляции:

    proc CompileProject (Name :String; {Options :Administration.CompilationFlags[]};
      {Callback :proc (Type :Administration.CompileMessageType; Message :String)})

- Шаблоны: событие OnClick с Action = SingleClick снова вызывается на всех клетках,
  в том числе на клетках со статическим текстом.
  Внимание: это может привести к проблемам совместимости в шаблонах, которые
  не проверяли Action.

- Шаблоны: расширена возможность управлять стилем разделителя фреймов.
    TemplateFrame:
      field SplitterStyle :Template.SplitterStyles
    type SplitterStyles = enumeration
      const FlatSplitter  = 0
      const DefaultSplitter  = 1
      const LineSplitter  = 2

  свойство TemplateFrame.SplitterRaised - объявлено deprecated.

- Редактор ресурсов: расширен список проверок при компиляции. Добавлены предупреждения:

    Компонент с именем "..." уже существует
    Класс компонента ... (...) не совместим с базовым классом (...)

- ТБ.Скрипт: исправлена ошибка - AV при проверке типа неинициализированного замыкания

*** Build 15129 ***

- Сервер компиляции: исправлено несколько ошибок (не работал вызов из сервера процедур)

- Шаблоны: доработана конвертация старых бланков (7.4) для перечислимых полей

- Добавлено сообщение при принудительном закрытии Desktop сессии при подключении
  одноименного пользователя с другого рабочего места

- Картотеки: исправлена ошибка позиционирования на записи при inplace редактировании

- Исправлены некоторые ошибки отрисовки контролов Windows Desktop клиентом

*** Build 15130 ***

- Исправлена привнесённая ошибка AV при компиляции некоторых файлов MTL

*** Build 15131 ***

- Доработки Design-time расширений. Добавлены настройки для проектов-расширений,
  которые всегда грузятся при открытии студии, вне зависимости являются ли они
  подпроектами текущего проекта. Задаются в диалоге "Настройки программы":
    Разработка->Расширения:
      Загружать расширения из проектов...
      [v] Загружать расширения из текущего проекта

  Список проектов-расширений сейчас задается вручную, через запятую.

- Доработки класса Administration для вызова сервера компиляции

- ТБ.Скрипт: исправлена ошибка компиляции некоторых проектов
- ТБ.Скрипт: исправлена ошибка - AV при вызове RemoveSpaces на пустом Storage

- Сервер данных: исправлена ошибка восстановления резервных копий


*** Build 15132 ***

- ТБ.Скрипт: в директивах условной компиляции можно использовать define'ы, определенные
  в подпроектах:

  #if Com.WebExportVersion = 3 then
    ---
  #end

- Настройка сервера авторизации: Время неактивности пользователя до завершения сессии.
  Пока поддерживается только Desktop клиентом.
  Доступна программно, через SessionInfo:
   field ClientMaxIdlePeriod :Integer
  ВНИМАНИЕ: Требуется обновление сервера авторизации

- Журналы событий: добавлена настройка, позволяющая дублировать события в сервис SysLog
  по сетевому протоколу UDP/TCP. События записываются в формате CEF.
  Текущая версия дублируются все события, в будущем будет добавлена настройка фильтрации.

- Сервер авторизации: доработана поддержка LDAP каталогов под Linux
- Сервер авторизации: доработана обработка ошибок аутентификации через протокол Kerberos

- Сервер данных: исправлены ошибки доступа к инф. базе при порче файла Statistics.xml.

- TXAdm: при ошибках компиляции возвращается код ошибки

- ТБ.Скрипт: Исправлена ошибка компиляции при ссылке на базовый класс по синониму
- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
  (добавление доменных пользователей, компиляции проектов)

- Добавлено управление кодировкой и EOL для отладочных логов.
  По умолчанию под Linux теперь используется UTF8 / LF.

*** Build 15133 ***

- Журнал событий: Категории. Добавлено новое обязательное свойство события - Категория
  Для встроенных событий категория определяется инструментарием, как иерархическая строка:
    Infobase.Create, Infobase.Backup, Logon.User, Logoff.User и т.п.

  Для прикладных событий категорию можно указывать явно, через необязательный параметр
  процедуры System.LogEvent (если опущен - категория = Custom.Information (Warning/Error) )

    proc LogEvent (Type :System.LogEventTypes; Message :String; {Category :String})

  Категория используется для фильтрации/настройки событий (см. далее)

  ВНИМАНИЕ: Новая версия несовместима по формату журнала событий с предыдущими.
  Журнал будет начат заново, все старые события будут недоступны,

- Журнал событий: Фильтры событий. Можно исключить часть событий из записи в журнал
  и/или отправки в SysLog. Для этого в каталоге Config может быть размещен файл
  Events.ini. Подробно формат файла будет описан в отдельной статье.

- Неудачные попытки смены пароля пользователем записываются в журнал событий.

- При подключении/отключении пользователей в журнал событий записывается роль пользователя.

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

- Шаблоны: перечислимые поля со множественным выбором (combobox с checkbox'ами)
  У полей перечислимого типа можно дополнительно установить свойство "множественный выбор"
  тогда в списке вариантов выбора появятся CheckBox'ы и может быть выбрано несколько элементов.
  Пока доступно только для вычислимых полей, обработчики OnOutput/OnInput должны
  возвращать/получать массив значений (целые или строки)

  Программно:

  TemplateCell
    field MultiValue :Logical

  FieldEdit;
    field FindMaskFormat :Cardfile.FindMaskFormats


- Шаблоны: исправлено несколько ошибок (отрисовка обводки, полосы прокрутки в картотеках,
  внутренние отступы в картотеках)

- ТБ.Скрипт: В класс UserInfo добавлено свойство GroupInfo возвращающее информацию
  о группах, в которые входит пользователь:

    field GroupInfo :UserGroupInfo[]

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования

- Сервер авторизации: доработана обработка ошибок аутентификации через протокол Kerberos

- Поддержана работа с электронными ключами Senselock в Linux версии.
  Подробно о настройке ключа для работе под Linux будет описано в отдельной статье.

- Добавлена CLI утилита диагностики ключей Senselock: TXKey (Windows и Linux)

- Desktop клиент: если при истечении таймаута неактивности приложение находится в
  модальном режиме и не может быть закрыто - оно принудительно отключается от сервера.

- Исправлена ошибка запуска серверных процедур из планировщика
- Исправлена ошибка в сервера процедур при загрузке испорченного файла classes.dbt

*** Build 15134 ***

- Шаблоны: доработки внутренних отступов в картотеках

- Шаблоны: доработки суммирования выделенных блоков

- ТБ.Скрипт: Исправлена ошибка компиляции условных директив #if с условием на CurrentProject

- ТБ.Скрипт: доработки класса Administration для поддержки WEB администрирования
  (обслуживание инф. баз)

- ТБ.Скрипт: доработки класса DBConnection (исправлено несколько ошибок,
  добавлены проверки при передаче параметров)

- Исправлено несколько ошибок при создании пользовательских тем помощи в сессии

- Добавлено логирование событий компиляции проектов через сервер компиляции.

- Исправлено несколько ошибок при импорте документов (при нарушении иерархических путей,
  при неправильном мэппинге мягких ссылок)

- Исправлена ошибка восстановления бэкапа (при наличии полей с #Override)

- Сервер данных: Исправлена ошибка записи пустых строк в транзакциях (PostgreSQL)

*** Build 15135 ***