Вспомогательные инструкции в коде 1С

01.03.19

Разработка - Механизмы платформы 1С

Помогаем редактору кода 1С помогать нам писать и анализировать код.

Во встроенном языке 1С используется динамическая типизация переменных, т.е. при объявлении переменной в коде невозможно указать для нее допустимые типы значений. Тип значения переменной гарантированно становится известен только во время выполнения присвоения ей значения. Это придает языку простоту освоения, лаконичность, легкость и гибкость, но приносит с собой и сложности. К ним в частности относится вычисление типа значения выражения в режиме разработки (design-time), без чего не будут работать многие важные помощники при написании и анализе кода

Помощники опирающиеся на вычисление типа

1 Контекстная подсказка (автодополнение) (Ctrl+Space)

2 Подсказка по параметрам метода (Ctrl+Shift+Space)

3 Переход к определению (F12)

Принцип работы вычислителя типов режима разработки

  1. Определяется текущее выражение в тексте модуля
  2. Выделяются все переменные и функции, от которых оно зависит
  3. Для каждой переменной выполняется поиск выше по тексту присвоения ей выражения
  4. Для каждой функции выполняется анализ типа возвращаемого ею значения. В конфигураторе 1С это к большому сожалению реализовано только для системных функций, но EDT это реализовано и для прикладных функций.
  5. Для каждого присвоения повторяются шаги 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С ссылки на методы поддерживаются в

  1. ФоновыеЗадания.Выполнить(<ПолноеИмяМетода>,...)
  2. Новый ОписаниеОповещения(<ИмяМетода>, <Модуль>,...)
  3. <ОбъектИнтерфейсаПользователя>.УстановитьДействие(..., <ИмяМетода>)
  4. КомандаФормы.Действие
  5. КнопкаКоманднойПанели.Действие
  6. ПодключитьОбработчикОжидания(<ИмяМетода>,...)
  7. ДобавитьОбработчик ..., <ОбработчикСобытия>;
В таких случаях в конфигураторе 1С не сработает команда "Перейти к определению" и потому переходить к определению метода приходится вручную. Тут тоже помогут вспомогательные инструкции. В них нужно указать вызов нужного метода и в любой момент можно будет переходить к нему командой "Перейти к определению".
 

Недостатки

  1. Из-за того, что эти вспомогательные инструкции не относятся к полезной логике программы, они затрудняют чтение кода и даже могут привести читателя кода в замешательство, если он не знаком с этим приемом.
  2. При переходе к определению переменной (F12) редактор будет активизировать нашу вспомогательную строку для присвоения типа. Нужно будет еще раз выполнить команду перехода (F12), чтобы перейти к настоящему определению.

Про EDT

На горизонте 1С появился EDT (Enterprise development tools) - новая среда разработки, которая по задумке должна стать лучше конфигуратора во всем, кроме задач администрирования. Там в частности реализован более умный чем в конфигураторе 1С 8 вычислитель, который должен превзойти Телепат 7.7. К сожалению описанные выше способы не будут работать с поумневшим вычислителем типов EDT. Он сразу понимает, что этот код не будет выполняться и потому не учитывает такой код при вычислении типов. Зато в EDT предусмотрена возможность гибко описывать типы параметров и возвращаемых значений методов для вычислителя типов. Выглядит это примерно так

Я пытался донести до разработчиков EDT потребность указывать типы в любом месте кода, но пока не был услышан.

Другие статьи по этой теме

контекстная подсказка Сервер

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4509    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5287    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18471    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8818    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15983    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
98. Бэнни 203 26.05.19 23:51 Сейчас в теме
(97) вы немного не поняли. Люди здесь пытаются расширить контекстную подсказку. Чтобы не держать все в голове и не печатать больше чем стоило бы. А вы на борот стремитесь побольше хранить в голове. Написанного кода с каждым днем все больше и больше, а мозгов все меньше и меньше.
shu_vol; tormozit; +2 Ответить
100. rpgshnik 3631 06.09.19 05:25 Сейчас в теме
Фактически можно использовать турбоконф https://infostart.ru/public/180406/
101. Brawler 454 30.11.20 13:27 Сейчас в теме
ИМХО Увеличение кода программы и снижение производительности компилятора/интерпретатора не слишком позитивно сказывается на общей производительности системы! И все в угоду прекрасной жизни программиста.

Уж лучше тогда просто ввести в платформе возможность (не обязательную) явно описывать тип объектов везде и будет счастье!
102. tormozit 7136 30.11.20 15:26 Сейчас в теме
(101)
снижение производительности компилятора/интерпретатора

О чем ты? Препроцессор отрабатывает первым и очень быстро вырезает все эти куски. Это - ничтожные затраты при компиляции модуля. Подумай еще.
103. Brawler 454 30.11.20 16:02 Сейчас в теме
(102) Мне в общем-то достаточно, что вы уже признали, что затраты есть, а на таких базах как ERP у которых исходный код весит и так не балуй, то все эти микро затраты выливаются в реку, плюс перерасход памяти и большие массивы перегоняемых текстовых данных для из базы к компилятору/интерпретатору + передача между клиентами и сервером.
Вы видимо редко работает с модулями весящими 4+ мегабайт, с 74000+ строк, а если туда влить еще этого сахара с инструкциями препроцессора, так эти модули еще сильнее раздует.
А когда таких модулей много?
А когда они все одновременно используются?

В общем не обольщайтесь, на микро как кажется затратах, потом висит система.

Само логичное, что может вам помочь жить красиво, так это введение в язык возможности описывать типы переменных, параметров методов, возвращаемого результата методов. Не думаю, что 1С не смогла бы это все заложить в язык, просто не хочет.
104. tormozit 7136 30.11.20 16:32 Сейчас в теме
(103)
Красивый прием "затуманивание", но не поможет представить муху в качестве слона =)
Про кэш метаданных ты конечно слышал, но забыл? На клиенте метаданные кэшируются, в т.ч. модули и форм и общие. Поэтому вырезание препроцессором для одного типа клиента делается один раз после изменения модуля в конфигурации БД. Поэтому с сервера на клиент это микро объемы гоняются очень редко. Из базы данных в память существующего рабочего процесса передаются тоже крайне редко. На все сеансы одной базы одного поколения метаданных в рабочем процессе используются единые объекты метаданных и загружаются при первом обращении и сидят там пока есть в базе сеансы.
105. DrAku1a 1679 20.03.21 10:19 Сейчас в теме
Возможно, в EDT поумневший вычислитель можно обмануть конструкциями типа
Если 1=2 Тогда
или
Если 1="1" Тогда
, т.к. это всё ещё нужно для второй части ("Перейти к определению процедуры/функции").
107. tormozit 7136 22.01.22 12:24 Сейчас в теме
(105) Нельзя его так обмануть.
108. пользователь 25.06.23 14:30
Сообщение было скрыто модератором.
...
109. PerlAmutor 129 25.06.23 14:33 Сейчас в теме
Теперь чтобы подавить ошибку в EDTможно так написать:

    #Если Сервер И Не Сервер Тогда //@skip-check code-never-compilied
        ИнформацияОбОшибке = ИнформацияОбОшибке();
    #КонецЕсли
Оставьте свое сообщение