Во встроенном языке 1С используется динамическая типизация переменных, т.е. при объявлении переменной в коде невозможно указать для нее допустимые типы значений. Тип значения переменной гарантированно становится известен только во время выполнения присвоения ей значения. Это придает языку простоту освоения, лаконичность, легкость и гибкость, но приносит с собой и сложности. К ним в частности относится вычисление типа значения выражения в режиме разработки (design-time), без чего не будут работать многие важные помощники при написании и анализе кода
Помощники опирающиеся на вычисление типа
1 Контекстная подсказка (автодополнение) (Ctrl+Space)
2 Подсказка по параметрам метода (Ctrl+Shift+Space)
3 Переход к определению (F12)
Принцип работы вычислителя типов режима разработки
- Определяется текущее выражение в тексте модуля
- Выделяются все переменные и функции, от которых оно зависит
- Для каждой переменной выполняется поиск выше по тексту присвоения ей выражения
- Для каждой функции выполняется анализ типа возвращаемого ею значения. В конфигураторе 1С это к большому сожалению реализовано только для системных функций, но EDT это реализовано и для прикладных функций.
- Для каждого присвоения повторяются шаги 2-4
На платформе 1С 7.7 штатного вычислителя типов в режиме разработки не было. Но благодаря Орефкову Александру появилось стороннее API конфигуратора OpenConf. На базе него было сделано расширение с вычислением типов Телепат, которое стало прорывом в удобстве редактирования кода.
На платформе 1С 8.0 в конфигураторе появился свой вычислитель типов, но с заметно более скудными возможностями, чем Телепат 7.7 . Он НЕ умеет вычислять тип результата прикладной функции, колонки таблицы/дерева значений и многое другое, что умел Телепат 7.7. Позже появился сторонний API конфигутора Снегопат от того же Орефкова Александра. Но на его базе насколько мне известно так и не появилось расширения для продвинутого вычисления типа.
Привыкая к помощникам, опирающимся на вычислитель типов, начинаешь испытывать дискомфорт в случаях, где вычислителю не удается определить типы. Например при вызове автодополнения на иллюстрации
мы не увидим ожидаемого списка реквизитов строки табличной части Параметры справочника ирАлгоритмы. Хотя мы точно знаем, что в качестве параметра Алгоритм будет приходить всегда значение типа СправочникСсылка.ирАлгоритмы, вычислителю конфигуратора это не удастся понять.
Но можно заставить вычислитель режима разработки думать, что переменная имеет нужный тип, написав не исполняемый код присвоения этой переменной выражения с легко вычисляемым нужным типом.
Способ №1
Лучшим способом для конфигуратора 1С 8 является вставка всегда удаляемой инструкции препроцессора. Такой код всегда не будет компилироваться и потому не будет влиять на скорость компиляции и исполнения кода.
#Если Сервер И Не Сервер Тогда
<Здесь пишем присвоение переменной выражения с нужным типом>
#КонецЕсли
Пример 1. Нужно указать переменной Алгоритм тип СправочникСсылка.ирАлгоритмы
#Если Сервер И Не Сервер Тогда
Алгоритм = Справочники.ирАлгоритмы.ПустаяСсылка();
#КонецЕсли
Теперь будет работать контекстная подсказка у выражения, зависящего только от этой переменной:
Пример 2. Нужно указать переменной Отбор тип ОтборКомпоновкиДанных
#Если Сервер И Не Сервер Тогда
_ = Новый НастройкиКомпоновкиДанных;
Отбор = _.Отбор;
#КонецЕсли
Способ №2
Другим способом для конфигуратора 1С 8 является вставка всегда не исполняемого кода через всегда ложное условие. Такой код будет компилироваться. Исполняться (вычисляться) будет только выражение условия "Ложь", но не код внутри ветки Тогда. Здесь хотя и очень незначительное, но есть влияние на скорость компиляции и исполнения кода.
Если Ложь Тогда
<Здесь пишем присвоение переменной выражения с нужным типом>
КонецЕсли;
Пример 1. Нужно указать переменной Алгоритм тип СправочникСсылка.ирАлгоритмы
Если Ложь Тогда
Алгоритм = Справочники.ирАлгоритмы.ПустаяСсылка();
КонецЕсли;
Шаблоны текста для вспомогательных инструкций
Чтобы не набирать каждый раз вручную эти длинные конструкции, разумно добавить себе шаблон текста
Шаблон для способа 1
#Если Сервер И Не Сервер Тогда
<?>
#КонецЕсли
Шаблон для способа 2
Если Ложь Тогда
<?>
КонецЕсли;
Ссылки на методы
Иногда в коде приходится использовать ссылки на методы, т.е. не вызывать метод сразу, а передавать ссылку на него куда то, где его уже будут вызывать. На момент написания статьи в объектной модели 1С ссылки на методы поддерживаются в
- ФоновыеЗадания.Выполнить(<ПолноеИмяМетода>,...)
- Новый ОписаниеОповещения(<ИмяМетода>, <Модуль>,...)
-
<ОбъектИнтерфейсаПользователя>.УстановитьДействие(..., <ИмяМетода>)
-
КомандаФормы.Действие
-
КнопкаКоманднойПанели.Действие
-
ПодключитьОбработчикОжидания(<ИмяМетода>,...)
-
ДобавитьОбработчик ..., <ОбработчикСобытия>;
Недостатки
- Из-за того, что эти вспомогательные инструкции не относятся к полезной логике программы, они затрудняют чтение кода и даже могут привести читателя кода в замешательство, если он не знаком с этим приемом.
- При переходе к определению переменной (F12) редактор будет активизировать нашу вспомогательную строку для присвоения типа. Нужно будет еще раз выполнить команду перехода (F12), чтобы перейти к настоящему определению.
Про EDT
На горизонте 1С появился EDT (Enterprise development tools) - новая среда разработки, которая по задумке должна стать лучше конфигуратора во всем, кроме задач администрирования. Там в частности реализован более умный чем в конфигураторе 1С 8 вычислитель, который должен превзойти Телепат 7.7. К сожалению описанные выше способы не будут работать с поумневшим вычислителем типов EDT. Он сразу понимает, что этот код не будет выполняться и потому не учитывает такой код при вычислении типов. Зато в EDT предусмотрена возможность гибко описывать типы параметров и возвращаемых значений методов для вычислителя типов. Выглядит это примерно так
Я пытался донести до разработчиков EDT потребность указывать типы в любом месте кода, но пока не был услышан.