Как объявить переменную в 1с
Использование переменных в программных модулях
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие . Поскольку область видимости (использования) таких переменных сложно контролировать, то они зачастую становятся источником трудновоспроизводимых ошибок.
Примеры некорректного использования и исключений из этого правила приведены далее. Рекомендации по оформлению переменных в коде программных модулей см. в статье Структура модуля.
2. Неоправданные примеры использования переменных в модулях объектов (справочников, документов, наборов записей, обработок, отчетов и пр.).
2.1. Для передачи параметров между обработчиками подписок на события и в обработчики событий модуля объекта из внешнего кода рекомендуется использовать свойство объекта ДополнительныеСвойства . Например, неправильно:
Перем КонвертацияФайлов Экспорт;
Если КонвертацияФайлов Тогда
.
// вызывающий код
ФайлОбъект.КонвертацияФайлов = Истина;
ФайлОбъект.Записать();
Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда
.
// вызывающий код
ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
ФайлОбъект.Записать();
В то же время, для передачи внутренних параметров между обработчиками событий модуля объекта целесообразно использовать неэкспортные переменные модуля объекта, которые недоступны из внешнего кода.
Например:
Перем ПредыдущееЗначениеОрганизации; // значение реквизита "Организация" до записи объекта в базу
Процедура ПередЗаписью(Отказ)
ПредыдущееЗначениеОрганизации = . ; // с помощью запроса выясняем значение до записи объекта в базу
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ПредыдущееЗначениеРеквизита <> Организация Тогда
// отрабатываем изменение значения реквизита при записи
.
КонецЕсли;
2.2. Для обработки кодов возврата (ошибок) в логике программного модуля рекомендуется использовать строковые константы.
Например, неправильно:
Перем НетОшибок,
Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка проверки заполнения вернула отказ
Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение
Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта
Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = Ошибка_ЗаписиОбъекта Тогда
.
ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
.
ИначеЕсли .
НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;
Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = "ОшибкаЗаписиОбъекта" Тогда
.
ИначеЕсли Результат = "ОшибкаБлокировкиОбъекта" Тогда
.
ИначеЕсли .
2.3. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений на время вызова сервера.
Исключение из этого правила составляют случаи, когда по соображениям безопасности возвращать результат вычисления в экспортной функции недопустимо. В этом случае они размещаются в локальной переменной модуля.
3. Неоправданные примеры использования переменных в модулях форм.
3.1. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений.
При этом не следует кешировать статическую и легко вычисляемую информацию. В частности, не следует кешировать в клиентских переменных модуля формы значения предопределенных элементов и перечислений. Для их получения на клиенте предназначен метод ПредопределенноеЗначение .
3.2. Для хранения и передачи промежуточных результатов вычислений между разными процедурами и функциями формы следует использовать
- Параметры процедур и функций – для передачи результатов по цепочке вызовов дочерних процедур и функций в контексте одного вызова.
- Реквизиты формы – если требуется сохранять промежуточные результаты между разными вызовами с клиента. (Следует иметь в виду, что значения серверных переменных модуля формы не сохраняются между вызовами с клиента.)
Исключение из этого правила составляют случаи использования клиентских переменных формы для хранения промежуточных результатов в обработчиках ожидания формы, в обработчиках внешних событий и в клиентских обработчиках событий элементов формы.
Например:
&НаКлиенте
Перем ПорядковыйНомерИзображения; // счетчик-нумератор для наименования файлов при сканирования нескольких изображений
.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
Если ПорядковыйНомерИзображения = Неопределено Тогда
ПорядковыйНомерИзображения = 1;
КонецЕсли;
ПорядковыйНомерИзображения = ПорядковыйНомерИзображения + 1;
// Сохранение отсканированного документа в файл с номером ПорядковыйНомерИзображения
// .
КонецЕсли;
КонецПроцедуры
4. Переменные управляемого и обычного приложения следует использовать для хранения «клиентских параметров сеанса». Подробнее см. статью Использование параметров сеанса.
Эта статья посвящена базовым понятиям работы с переменными и основным приемам. Мы рассмотрим требования и подходы к именованию переменных, разберем общепринятые кейсы использования переменных в языке 1С, а также имеющиеся ограничения на использование переменных.
Также есть видео версия статьи.
Что такое переменные и зачем они нужны?
В языке 1С значение помещается в переменную при помощи оператора присваивания
а = 1; // Переменной а присвоили значение 1
Использование переменных позволяет отделить логику от данных, сделать код универсальным и переиспользуемым.
Стандарты и требования к наименованиям переменных в языке 1С
В языке 1С имена переменных должны соответствовать некоторым требованиям.
Но помимо требований платформы 1С, существуют еще негласные соглашения и общепринятые подходы, которыми пользуются большинство разработчиков. А также есть система стандартов и методик разработки и от самой компании 1С, где даются рекомендации и требования, как следует именовать переменные.
Вот основные критерии хорошего имени переменной
- состоит не из одной буквы
- Не начинается с подчеркивания
- Каждое слово, из которого состоит имя, начинается с заглавной буквы.
- отражает прикладное назначение и смысл переменной
Что не рекомендуется:
- Без необходимости смешивать русские и латинские буквы в имени
- Писать имя полностью заглавными или полностью строчными
- Использовать сокращения, в результате которых теряется смысл имени
Основные приемы работы с переменными
Объявление переменных
Переменные можно объявить тремя способами.
Явным образом, используя ключевое слово Перем. Можно указать сразу несколько переменных через запятую
Неявно объявить переменную при первом присвоении ей значения
Неявно объявить переменную в качестве итератора цикла при обходе коллекции:
Использование переменных в выражениях языка 1С
Нельзя обращаться к переменным, которые еще не объявлены:
Типизация
Язык 1С поддерживает нестрогую динамическую типизацию. т.е. тип значения переменной определяется ее содержимым, и явным образом не декларируется.
Поэтому разработчику особенно важно следить за корректностью использования переменной, и по возможности обеспечивать защиту от ошибок.
Контекст, область видимости и время жизни переменных в языке 1С
Переменные, объявленные внутри процедуры или функции, являются локальными, и видны только в пределах этой процедуры или функции. Время жизни переменной начинается с момента ее объявления. После завершения кода процедуры, переменная перестает существовать. Платформа сама следит за временем жизни переменных, и уничтожает их, высвобождая память, после того, как переменная перестает использоваться.
Свойства и методы глобального контекста доступны из любой точки кода (но следует уточнить, что код делится на клиентский и серверный, и компилируется на клиенте и на сервере отдельно).
Если объявить переменную в разделе объявления переменных модуля, то она будет доступна в пределах всего текста этого модуля. Ее значение можно будет менять как внутри методов, так и в разделе основной программы Пример:
Еще ниже уровнем располагается локальный контекст метода, который состоит из параметров и переменных, объявленных в этом методе. Переменные, объявленные внутри процедуры или функции, называются локальными.
Расширение контекста при помощи слова Экспорт
Модуль приложения
Модуль формы
Как видно из примера, экспортная переменная модуля приложения расширяет контекст модуля формы, и доступна в нем как в разделе процедур и функций, так и в разделе основной программы. А вот Переменная ЛокальнаяПеременнаяМодуля в контексте модуля формы будет недоступна.
Важно! Локальные переменные методов нельзя сделать экспортными, т.е. при попытке сохранить конфигурацию с нижеследующим кодом платформа выдает ошибку:
Важно! При явном объявлении переменных в нижлежащем контексте, они будут перекрывать переменные с таким же именем, но из более высокого уровня контекста. Переменные модуля будут перекрывать одноименные глобальные переменные, а локальные переменные будут перекрывать переменные модуля.
Глобальная переменная >> Переменная модуля >> Локальная переменная метода
Пример:
Модуль приложения
Модуль формы
Таким образом, несмотря на одинаковые названия, это будут разные переменные, т.е. они будут занимать разные адреса в памяти, а изменение значения одной переменной не будет приводить к изменениям в значениях других переменных.
Некоторые итоги и рекомендации
Во встроенном языке программирования 1С используются переменные. Имена переменных должны начинаться с английского или русского символа, или подчеркивания. Нельзя чтобы наименование переменной начиналось с цифры. Не рекомендуется именовать переменные зарезервированными синтаксическими конструкциями. Имена переменных должны носить осмысленный характер. Это улучшает читабельность программного кода. Что в последующем увеличивает скорость разработки или доработки приложения. При объявлении переменных не требуется указывать тип значения, как это делается во многих других языках программирования. Тип значения определяется автоматически системой.
Локальные переменные
Локальные переменные определяются внутри процедур или функций. Перед ними необязательно писать ключевое слово "Перем". Область доступности таких переменных ограничена границами своей процедуры или функции. То есть, к такой переменной нельзя обратиться в другой процедуре или функции или из глобального контекста.
Глобальные переменные
Во многих языках программирования предусмотрено создание глобальных переменных. Во встроенном языке 1С, так же есть возможность создавать глобальные переменные. Такие переменные доступны во всех процедурах и функциях модуля в котором они определены. В языке программирования 1С глобальные переменные могут быть определены в любых модулях (объектов, форм, и т.д) кроме общих модулей. Глобальные переменные задаются в самом верху модуля, перед определением всех процедур и функций. Перед именем переменной пишется ключевое слово "Перем". Значение указывать нельзя. Значение глобальной переменной можно задать в процедурах, функциях модуля или в конце модуля после всех процедур и функций.
Экспортные переменные
Глобальную переменную можно сделать экспортной, указав ключевое слово "Экспорт". Например, если экспортная переменная создаётся в модуле объекта справочника, то к ней можно обратиться через объект этого справочника, СправочникОбъект.ИмяПеременной.
Комментарии (0)
В тексте модуля все что идет после двойного слеша «//» является комментарием. При компиляции программного модуля комментарии игнорируются.
Операторы встроенного языка
Это основной блок программного модуля. Между собой разделяются точкой с запятой «;». На одной строке можно расположить несколько операторов. Также один оператор может быть на нескольких строках (тогда в конце первой строки не нужно ставить «;»).
Операторы бывают двух видов:
- Операторы объявления переменных
- Исполняемые операторы, которые манипулируют с переменными
При написании кода на встроенном языке можно писать на русском, на английском и даже смешивать.
Регистр не имеет значения:
Структура модуля
- раздел описания переменных
- раздел описания процедур и функций
- раздел основной программы (исполняется при инициализации модуля).
События
В отличии от других языков программирования в 1С нет метода Main с которого начинается выполнение программы. Модули выполняются в определенных ситуациях, которые заранее известны и называются событиями.
У прикладного решения 1С есть определенный жизненный цикл. При запуске открывается основной раздел. Затем пользователь может открыть какую-то форму списка документов, создать новый документ, открыв его форму и т.п.
Этот жизненный цикл нельзя изменить. Но в него можно вмешаться через события. Примеры событий: При начале работы системы, При открытии формы, При записи и т.п.
Клиент-серверная архитектура
Клиентская часть 1С и сервер 1С могут находиться на разных компьютерах. При компиляции модуля он может быть скомпилирован только на клиенте, только на сервере, или на клиенте и на сервере одновременно. При этом, работа с базой данных возможна только на сервере.Нужно учитывать, что не все объекты доступны на клиенте, и не все объекты можно передавать с клиента на сервер.
Читайте также: