
Intellisence for OpenConf

=====================================================
Представляет из себя скрипт для плагина OpenConf(см. одноименный раздел на сайте клуба профессионалов)
Автор плагина: Орефков Александр
Автор скрипта: Реутов Дмитрий
icq 177067865
email: dimoff66@mail.ru
Соавторы:
	Алексей Диркс aka ADirks
	email: adirks@ngs.ru
	Артур Аюханов aka artbear
	email: artbear@bashnet.ru
	Александр Кунташов aka a13x
	Дмитрий Трошин aka trdm
	(в связи с тем, что автор прекратил поддержку скрипта, с вопросами и предложениями
	 обращаться следует к соавторам)


Описание установки и работы со скриптами см. также на http://www.script-coding.info/Intellisense.html


=====================================================
Порядок установки:
- В архиве папка Intell. Кладем её в Bin\Config, не переименовывая.
- Регистрируем (если ещё не зарегистрированы) следующие скриптлеты и COM-объекты:
	CommonServices.wsc
	Collections.wsc
	SyntaxAnalysis.wsc
	SelectValue.dll
	SelectDialog.dll
	svcsvc.dll
Регистрация выполняется командой regsvr32. Например так:
regsvr32 "C:\Program Files\1Cv77\Bin\Config\System\CommonServices.wsc"
- Intellisence.vbs кладем в папку Scripts
- Редактируем параметры в файле Intell\intell.ini по своему усмотрению
- В некоторых случаях может потребоваться переустановка Windows Scripting Host (WSH)
  для Win 2000, XP: http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=c717d943-7e4b-4622-86eb-95a22b832caa
  для Win 98, Millenium, NT4: http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=0a8a18f6-249c-4a72-bfcf-fc6af26dc390

==================================================
Использование:
- Вешаем скрипт MethodsList() на хоткей (меню-OpenConf-Макросы-Клавиатура)
- Набираем Имя переменной или Имя переменной плюс атрибут и, вызываем макрос,
из списка выбираем метод или атрибут.
- Чтобы макрос автоматически вызывался ПРИ НАЖАТИИ ТОЧКИ, а не по вызову через горячие клавиши
с использованием Ctrl, Alt и т.д., нужен телепат версии не ниже 2.0.0r
В этом случае для корректной работы с точкой необходима версия Intellisence.vbs
не ниже 1.1.8

==================================================
Функционал:

1) Распознает
- переменные модуля, созданные функциями СоздатьОбъект
- Ссылки на объекты, созданные через присвоение
- Реквизиты текущего объекта, к которому привязан модуль
- Элементы диалога, имеющие агрегатный тип данных, в том числе поля ввода,списки и таблицу значений
- Тип колонки таблицы значений, у которой он был определен функциями НоваяКолонка, ВставитьКолонку
через методы Выгрузить, Загрузить, ВыгрузитьТабличнуюЧасть объектов типа ТаблицаЗначений, Документ, Запрос
- Параметры процедур и функций.
- Тип значения, возвращаемое функцией

2) Выводит список:
- Атрибутов и методов для большинства объектов 1С
- Колонки таблицы значений
- Возможных значений в параметрах некоторых методов, таких как Итог, НайтиЗначение
и т.д. (в этих примерах выводится список колонок таблицы значений в 1м и 3м параметрах соответственно)

3) При выборе методов с приставкой "+ Автозаполнение" осуществляет автоматическое заполнение кода
строками в виде
<Объект>.<Реквизит> = ;

Подобные строки существуют для методов Новый() и НоваяСтрока()
объектов Справочник, Документ, ТаблицаЗначений

4) Поддерживает конструкцию //_С_ИмяОбъекта
как аналог "With ObjectName" в VisualBasic и Delphi
Если подобная строка определена в процедуре, то при нажатии точки вывалится список методов объекта,
а его имя будет подставлено автоматически.

5) Поддерживает явное задание типа переменных, если они определены вне доступного контекста.
Тип задаётся конструкцией
// <ИмяПеременной> //:<ИмяТипа>
 или
Перем <ИмяПеременной>; //:<ИмяТипа>
пробелы роли не играют.

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

Если здесь вызвать главный макрос Интелла MethodList, будет выдан  список  всех
классов.

6) Понимает классы 1С++. Для формировния файлов *.ints для классов нужно явно вызвать макрос
Update1CppInts. После любого изменения классов нужно также вызывать этот макрос.
В состав методов и переменных класса, показываемых Intellisence, включается всё, что объявлено
с ключевым словом "Экспорт" в модуле класса. Хедеры классов никак не анализируются.

Для задания типа метода или переменной, ссылающийся на текущий экземпляр класса можно использовать
конструкцию //:Контекст  - тогда имя класса будет определено из имени файла или обработки.
Возможные варианты написания:
// (!! в одной строке !!)
Функция Сам(Конт) Возврат Конт; КонецФункции //:Контекст

Функция Конт(Конт) Возврат Конт; КонецФункции //:Контекст
Функция Сам() Возврат Конт(Контекст); КонецФункции

Перем Сам; //:Контекст


==================================================
Версия 1.29
- Поддержка 1С++ встроена в скрипт
- Возможность совместного использования с dots.vbs от trdm. Для этого в папке с Intellisence.vbs
должен лежать RunAllIntellisence.vbs и dots.vbs
- В ini-файл добавлен параметр TELEPAT. Если его установить в НЕТ, то события телепата отрабатываться
не будут - т.е. после нажатия на точку список методов выдаваться не будет.

	* Intellisence.vbs 1.6 - 1.29:
		[-] выдавалась ошибка, если ints-файл пуст
		[+] В intell.ini добавлен параметр TELEPAT
		[-] забыл инициализировать объект общего скриптлета;
		[*] рефакторинг: использование методов общего скриптлета
		[-] бесконечный цикл при определении типа выражения
		[+] добавил автовставку версии скрипта в текст скрипта;
		[*] Более надёжная проверка наличия RunAllIntellisence.vbs
		[-] ошибка объединения списков методов
		[-] ошибка при нажатии Esc
		[-] ошибка при определении необходимости обработки событий телепата
		[*] небольшой рефакторинг
		[*] убрана отладочная печать
		[-] неверный коммент;
		[-] баг в работе GetType();
		[-] баг при использовании SelectDialog.dll;
		[-] мелкие ошибки
		[*] Если присутствует скрипт RunAllIntellisence.vbs, то обработка
		 событий телепата не запускается
		[*] убрано отладочное сообщение
		[*] Небольшие поправки на совместимость
		[-] Ошибка в методе PossibleTypes()
		[*] MethodsList() теперь функция. Возвращает статус завершения.
		[-] Исправлена ошибка определения конструкции СоздатьОбъект("|
		[*] Список типов для конструкции СоздатьОбъект("|  считывается из файла CreateObject.ints или СоздатьОбъект.ints
		[*] Удалён дубль метода AutoFill
		[*] Построение списка классов происходит при первом обращении к м
		етоду CppClassList() а не при старте скрипта
		[*] Удалён код, анализирующий файл classes.ints - он нам больше не понадобится
		[*] В список типов, выдаваемых в конструкциях СоздатьОбъект(" и ПолучитьПустоеЗначение(" добавляются классы 1С++
		[*] Для заданных расширений (vbs, js, wsc) функционал интеллисенс не вызывается
		[*] При генерации файлов *.ints для классов 1С++ туда помещаются
		методы базовых классов
		[-] Исправлена ошибка при вызове из Telepat_OnShowMemberList
		[*] В файлы *.ints для классов записываем и список экспортируемых
		 переменных
		[*] Убраны пробелы в концах строк, пробельные отступы заменены на табуляции
		[*] Более эффективное использование регулярных выражений
		[*] Игнорируются комментарии в модулях
		[*] Более интеллектуальный анализ текстов запросов (объект "Запрос")
		[+] Генерация файлов *.ints для классов 1С++

	* Intellisence.vbs 1.3 - 1.5:
		[*] восстановил возможность использования классов 1С++, в имени к
		оторых встречается точка (Общие.ТаблицаЗначений).
		[+] Добавлен метод GetExprType() для использования в других скриптах.
		[*] Исправлен метод GetMainType(). Теперь он понимает типы 1С++, где может быть более одной точки в имени.
		[*] возможность использования классов 1С++, в имени которых встречается точка (Общие.ТаблицаЗначений) (artbear)
		[- ]
		    Исправлен возникший в версии 1.1.2 глюк при выполнении макросов автозаполнения.
		[+] Добавлена попытка распознавания типа объекта по конструкциям
		Если ТипЗначенияСтр(ИмяОбъекта) = ...
		Если ИмяОбъекта.Вид() = ...
		[+] Добавлена поддержка классов 1С++
		[-] Исправлен баг: если имя объекта совпадало с окончанием имени другого объекта
		то тип определялся неправильно.

==================================================
Версия 1.1.8

Общее:
- В связи с выходом новой версии telepat.dll, позволяющей после набора точки вызвать
и программно заполнить стандартный телепатовский список выбора - решена-таки
проблема потери окном фокуса. Отныне если на точку не повешен макрос вызываться и заполняться
из скрипта будет именно этот список. Пока данный механизм сделан на скорую руку, поэтому есть некоторые
неудобства: отсутствуют иконки и в конструкциях типа "Выбрать... + Цикл" каретка не ставится в
нужное место. Думаю в ближайшее время это будет доработано.

Внимание:
- Для работы новой системы выбора скопируйте включенный в поставку telepat.dll в папку Config,
заменив существующий.
- если макрос MethodsList() повешен на точку - назначьте ему любой другой хоткей.
Только в этом случае будет вызван список телепата.


==================================================
Версия 1.1.6

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

Скрипт:
- Введен механизм ключевых методов, если тип объекта определить невозможно(например
когда он передан в форму в качестве параметра), скрипт пытается определить его тип по
использующимся в модуле уникальным методам. Например если в модуле встретится строка
<ИмяОбъекта>.РазмерСписка(), то система будет считать данный объект списком значений.
Пары "<КлючевойМетод> <Тип>" определены в файле Key Methods.ints, Который при желании Вы
можете дополнить. (идею подкинул Трошин Дмитрий aka trdm)
- При вызове скрипта внутри кавычек конструкции СоздатьОбъект("") скрипт выдаст для выбора
все возможные типы объектов.
- В список методов объекта Операция добавлен пункт НоваяПроводка() + Автозаполнение
- Исправлена ситуация когда при открытом списке телепата курсор при наборе точки оставался перед ней.
(за алгоритм исправления спасибо Oleg-у)
- Добавлен файл XBase.ints (Составил Трошин Дмитрий)
............................................................
SelectValue.dll
-Обязательно обновить и перерегистрировать.

==================================================
Версия 1.1.5
Справка:
- В комплект поставки включен справочный файл Описание.chm, позволяющий просматривать
описание в структурированном виде.

..................................................
Скрипт:
- Добавлена обработка вызова макроса после знака равенства для выбора возможных значений
сравнения или присвоения. Обрабатываются случаи:
---- Форма.АктивныйЭлемент() =  ... выдает список идентифкаторов элементов диалога формы
---- Объект.Вид() = ... определяет тип объекта и выдает список возможных видов
---- СпрНом.ТипНоменклатуры = ... если правая часть выражения имеет тип Перечисление -
определяется его вид и выдается список возможных значений вида, после выбора конструкция
Перечисление.ТипПеречисления.<ВыбранноеЗначение> добавляется в код автоматически.
- Оптимизировано определение типа и вида объекта по конструкциям ТипЗначенияСтр(Объект) =
и Объект.Вид() =
- Исправлен баг: при обращении к полям таблицы значений, созданной методом Выгрузить объекта
 Запрос, скрипт вылетал с ошибкой.

..................................................
SelectValue.dll
- Оптимизировано определение места появления списка выбора. Если список не помещается справа
или снизу от места курсора - окно выбора появляется выше или правее.
- Добавлена возможность фильтрации по типу иконки списка, для этого достаточно выделить строку
с нужной иконкой и нажать Ctrl + Пробел, повторное нажатие данной комбинации клавиш приведет
к отключению фильтрации.

==================================================
Версия 1.1.2
************************************************************************************
ВАЖНО: при использовании версии 1.1.2 использовать последнюю версию SelectValue.dll
обязательно!!!
************************************************************************************
Скрипт:
- Добавлена попытка распознавания типа объекта по конструкциям
Если ТипЗначенияСтр(ИмяОбъекта) = ...
Если ИмяОбъекта.Вид() = ...

- Добавлена поддержка классов 1С++
Если Вы собираетесь работать с классами 1С++, то необходимо:
а) В папке Intell\1C++ создать файл classes.ints, Где определить каждый класс,
с которым Вы работаете - с новой строки в формате
<Имя класса><Пробел><Имя родительского класса>
Например
СписокЗнРасш СписокЗначений
ТаблРасш ТаблицаЗначений
б) В папке Intell\1C++ создать для каждого класса файл <ИмяКласса>.ints
с перечислением методов и атрибутов класса. Формат можно подсмотреть в файлах ints  стандартных классов.
Конвертор файлов prm в файлы ints(IntsConvert.ert) От Вахрина Андрея (aka Dolter) - в папке Intell/1С++
Важно: Если имя класса содержит в себе знак "." - замените его в имени файла на "_"

- Исправлен баг: если имя объекта совпадало с окончанием имени другого объекта
то тип определялся неправильно.
...
SelectValue.dll
- В список добавлены иконки для визуального различия типов полей объекта.


==================================================
Версия 1.1.1
Скрипт:
- В параметры Intell.ini добавлен параметр POINT_AFTER_ESC, Позволяющий определить
ставить ли точку в месте вызова скрипта, если в окне выбора методов нажат ESC
- Исправлены неприятные глюки
--- Скрипт зависал при работе с таблицей значений, созданной методом Выгрузить
--- Скрипт выдавал ошибку при обращении к методам элемента диалога, имевшего агрегатный тип
со слишком большим значением ID.
..........
SelectValue.dll
- По мере отсортировки значений визуальный размер окна списка выбора уменьшается,
подобно тому, как это происходит в стандартном списке телепата.

==================================================
Версия 1.1.0
Скрипт:
- В методы документов, справочников и таблиц значений добавлены строки
НоваяСтрока() + Автозаполнение
Новый() + Автозаполнение

Выбор данных строк вместо НоваяСтрока(0 и Новый() приведет к автоматическому проставлению полей
в формате
<ИмяОбъекта>.<ИмяПоля> = ;

- Добавлен функционал определения типа значения, возвращаемого функцией текущего модуля.
- Добавлена работа с метаданными и V77.Application
Файлы Ints По метаданным составлены Викторией Шушуновой (царство ей земное)
- В список атрибутов документа теперь попадают и общие реквизиты
- Анализ текста переведен на регулярные выражения,
что вероятно исключит задержки при появлении списка.
- Список колонок(и тип колонки) таблицы значений определяется на основании полей
запроса, если таблица создана методом Запрос.Выгрузить()
- Определяется тип объекта, созданного через функцию ПолучитьПустоеЗначение(),
а также англоязычным вариантом функции СоздатьОбъект(CreateObject)

.......
SelectValue.dll:

- Изменена обработка выбора значения, набранного в поле ввода списка методов,
но не присутствующего в списке. Теперь всё стало логичнее: при нажатии ESC
окно просто исчезает, при нажатии ENTER набранное слово добавляется
в место вызова макроса как атрибут.
- Добавлена возможность увидеть в списке только поля объекта,
для этого при открытии списка можно нажать "1". Чтобы увидеть только методы "2".

==================================================
Версия 1.1.1
Скрипт:
- В параметры Intell.ini добавлен параметр POINT_AFTER_ESC, Позволяющий определить
ставить ли точку в месте вызова скрипта, если в окне выбора методов нажат ESC
- Исправлены неприятные глюки
--- Скрипт зависал при работе с таблицей значений, созданной методом Выгрузить
--- Скрипт выдавал ошибку при обращении к методам элемента диалога, имевшего агрегатный тип
со слишком большим значением ID.
..........
SelectValue.dll
- По мере отсортировки значений визуальный размер окна списка выбора уменьшается,
подобно тому, как это происходит в стандартном списке телепата.

==================================================
Версия 1.1.0
Скрипт:
- В методы документов, справочников и таблиц значений добавлены строки
НоваяСтрока() + Автозаполнение
Новый() + Автозаполнение

Выбор данных строк вместо НоваяСтрока(0 и Новый() приведет к автоматическому проставлению полей
в формате
<ИмяОбъекта>.<ИмяПоля> = ;

- Добавлен функционал определения типа значения, возвращаемого функцией текущего модуля.
- Добавлена работа с метаданными и V77.Application
Файлы Ints По метаданным составлены Викторией Шушуновой (царство ей земное)
- В список атрибутов документа теперь попадают и общие реквизиты
- Анализ текста переведен на регулярные выражения,
что вероятно исключит задержки при появлении списка.
- Список колонок(и тип колонки) таблицы значений определяется на основании полей
запроса, если таблица создана методом Запрос.Выгрузить()
- Определяется тип объекта, созданного через функцию ПолучитьПустоеЗначение(),
а также англоязычным вариантом функции СоздатьОбъект(CreateObject)

.......
SelectValue.dll:

- Изменена обработка выбора значения, набранного в поле ввода списка методов,
но не присутствующего в списке. Теперь всё стало логичнее: при нажатии ESC
окно просто исчезает, при нажатии ENTER набранное слово добавляется
в место вызова макроса как атрибут.
- Добавлена возможность увидеть в списке только поля объекта,
для этого при открытии списка можно нажать "1". Чтобы увидеть только методы "2".


==================================================
Версия 1.0.9
Скрипт:
- Внесены необходимые изменения для корректной работы макроса в случае вызова через точку
- Сымитирована работа конструкции With, Известной по языкам VB и Delphi
Если известно что в модуле Вы будете многократно вызывать методы одного и того же объекта
внесите в начало модуля(или же в начало процедуры/функции) строку
"//_С_<ИдентификаторОбъекта>
В этом случае нажатие точки приведет к автоматическому появлению списка
методов определенного в блоке "_С_" объекта и, в случае выбора, добавления
строки <ИдентификаторОбъекта>.<ВыбранныйМетод> в место вызова макроса.
- Добавлена обработка методов ТекущийЭлемент(), ТекущийДокумент() в модулях форма справочника, документа, журнала
- Теперь корректно выводится список колонок таблицы значений, заполненной методом
ВыгрузитьТабличнуюЧасть в форме документа.
- В папку Intel добаволен файл intell.ini для пользователского определения параметров Intellisence
.......
SelectValue.dll:
- Добавлена обработка параметров FONTSIZE и FONT, заданных ф Ini-файле
и поределяющих шрифт и размер методов в списке.


==================================================
Версия 1.0.8
- Если курсор стоит в начале строки, то вызов макроса приводит к появлению списка предопределенных
процедур
- При вызове макроса внутри процедур Итог, НайтиЗначение, ПолучитьЗначение, УстановитьЗначение в соответствующем параметре
при работе с объектом Таблица значений выводится список колонок.
То же происходит при вызове макроса для метода Итог переменных типа Документ.
- Добавлен файл ЖурналРасчетов.Ints для работы с журналами расчетов
- Добавлен файл Запрос.Ints Для работы с запросами
- При работе с запросами анализируется текст запроса. На основании анализа для объекта типа запрос выдается
список переменных и функций запроса. Определяется тип переменных.
- Теперь список колонок таблицы значений корректно определяется в случаях, когда они были созданы
методами Выгрузить или ВыгрузитьТабличнуюЧасть.
- Определяется тип переменной в случае, когда она была передана параметром из другой процедуры.
- Расширено и удлинено окно списка выбора.

==================================================
Версия 1.0.7
- Исправлены мелкие ошибки

==================================================
Версия 1.0.6
- Добавлен метод CopyLine. Копирует строку или часть текущей строки слева от курсора на следующую строку
Его также имеет смысл повесить на хоткей. Особенно удобно при инициализации колонок таблицы значений.
- После выбора из списка метода с параметрами выводится стандартная подсказка телепата по параметрам.
- Отчасти исправлена ошибка: иногда после выбора из списка фокус переходил не
на окно конфигуратора, а на соседнее. В настоящий момент фокус возвращается на окно конфигуратора,
но мелькание заметно.
- Оптимизировано представление методов объекта Регистр
- В файл Документы.Ints добавлены реквизиты НомерДок и ДатаДок.

==================================================
Версия 1.0.5
- Список выбора уменьшен и подстраивается под место выбора
==================================================
Версия 1.0.4
- исправлен баг: при запросе к методам объекта, находящегося внутри скобок скрипт вылетал с ошибкой
- Добавлена работа с объектом Форма, выдает как методы объекта Форма, так и идентификаторы элементов диалога
- Добавлена работа с объектами Регистр, Таблица
- Оптимизирована работа с объектами Перечисление, БухгалтерскиеИтоги
- Исправлена ошибка при определении списка колонок ТЗ, добавлено определение типа колонки ТЗ.
