Типизация кода

Описание

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

В платформе 1С:Предприятие нет обязательной типизации кода, однако есть набор приемов задания типизации, которые рассматриваются ниже.

В случае если не типизирован код то статический анализатор в 1C:EDT не может вычислить владельца свойства или метода к которому выполняется обращение. Так же, для разных объектов платформы есть свойства или методы на русском языке, которые на английский переводятся по-разному - для корректного перевода в этих местах необходимо точно знать тип объекта.

Правильный перевод исходного кода в полном объеме возможен только после решения всех проблем связанных с типизацией. Для обеспечения контроля полноты типизации 1C:Language Tool предоставляет средства валидации кода. Он позволяют в окне редактирования кода явно выделить фрагменты с проблемами типизации, которые необходимо решить для дальнейшей работы.

Валидация кода

Чтобы найти все фрагменты исходного кода, который не типизирован, а значит не может быть переведен однозначно корректно, можно включить валидацию неоднозначности перевода кода. Для этого в каталоге рабочего проекта разместить файл \ProjectName\.settings\com.e1c.langtool.v8.dt.bsl.prefs

Валидации качества кода:

Валидации наличия переводов:

Каждый параметр может принимать одно из следующих значений:

Пример файла:

eclipse.preferences.version=1

validation/checkTranslationAmbiguity=error

validation/checkStringLiteralTranslationAmbiguity=error

validation/checkStringLiteralTypeAmbiguity=error

validation/checkVariableTranslation=error

validation/checkVariableNotAllowedTranslation=error

validation/checkMethodTranslation=error

validation/checkNstrLiteralTranslation=error

validation/checkStringLiteralTranslation=error

validation/checkNstrLiteralParamInTranslation=error

validation/checkRegionTranslation=error

validation/checkComputedStringTranslation=error

Алгоритм перевода нетипизированного кода

Для методов и свойств объекта или глобального контекста применяется следующий алгоритм:

  1. По свойству или методу EDT вычисляет объект-источник, который предоставляет данное свойство/метод. Если источник найден (т.е. код типизирован) - то перевод запрашивается по источнику.
  2. Если объект-источник не найден системой типизиации EDT - то код считается "не типизированным" в данном месте.

Для нетипизированного кода выполняются шаги получения перевода в следующем порядке:

  1. Запрашиваем в системе контекстный перевод для текущего свойства/метода, если доступно контекстное хранилище переводов (не общий словарь).
  2. Если это свойство выборки результата запроса то может быть использован кэш всех переведенных полей всех запросов в текущем контексте (например в текущем методе).
  3. Если это свойство объекта XDTO - то такое ствойство не переводится и остается без изменений. Т.к. объекты XDTO являются объектами другой (чужой) системы - они не переводстся.
  4. Запрашиваем в системе перевод по всем хранилищам переводов (контекстным и не контекстным словарям) в том порядке, в котором они настроены в проекте.
  5. Если это свойство/метод какого-либо объекта, а не глобального контекста (Например: МойОбъект.МоеСвойство) - выполняется расчет системы догадок по всем возможным объектам платформы и их свойствам, с учетом доступности этих объектов в разных окружениях (клиент, сервер, веб-клиент и т.д.).

Критерием типизированности кода в текущем месте может служить контент-ассист (контекстный помощник ввода, вызывается по Ctrl+Space) - если он подсказывает ввод текущего свойства/метода - значит в этом месте код типизирован достаточно для определения объекта-источника, по которому будет запрошен перевод.

Приемы типизации

Документирующие комментарии

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

Стандарт опубликован на сайте ИТС.

Типизация переменной в строке инициализации

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

Пример:

МояПеременная = ФункцияБезВозвращаемогоТипа(ВходящаяПеременная); // СправочникСсылка.Товары - по коду тут только один тип возвращается.

Рефакторинг кода

Код должен быть написан таким образом, чтобы статический анализатор в EDT корректно понимал код. В частности это достигается путем явного указания типа переменной в коде перед обращением к её свойствам или методам, как показано в примере ниже.

Пример:

Если ТипЗнч(МояПеременная) = Тип("СправочникСсылка.Товары") Тогда МояПеременная.Ссылка… КонецЕсли;

Ограничения типизации

На текущий момент 1С:EDT не поддерживается типизация в следующих случаях:

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