Перейти к содержимому

Как определить переменную в 1с

  • автор:

Использование переменных в программных модулях

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие . Поскольку область видимости (использования) таких переменных сложно контролировать, то они зачастую становятся источником трудновоспроизводимых ошибок.

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

2. Неоправданные примеры использования переменных в модулях объектов (справочников, документов, наборов записей, обработок, отчетов и пр.).

2.1. Для передачи параметров между обработчиками подписок на события и в обработчики событий модуля объекта из внешнего кода рекомендуется использовать свойство объекта ДополнительныеСвойства . Например, неправильно:

Перем КонвертацияФайлов Экспорт;

Если КонвертацияФайлов Тогда
.

// вызывающий код
ФайлОбъект.КонвертацияФайлов = Истина;
ФайлОбъект.Записать();

Если ДополнительныеСвойства.Свойство(«КонвертацияФайлов») Тогда
.

// вызывающий код
ФайлОбъект.ДополнительныеСвойства.Вставить(«КонвертацияФайлов», Истина);
ФайлОбъект.Записать();

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

Перем ПредыдущееЗначениеОрганизации; // значение реквизита «Организация» до записи объекта в базу

Процедура ПередЗаписью(Отказ)
ПредыдущееЗначениеОрганизации = . ; // с помощью запроса выясняем значение до записи объекта в базу
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
Если ПредыдущееЗначениеРеквизита <> Организация Тогда
// отрабатываем изменение значения реквизита при записи
.
КонецЕсли;

2.2. Для обработки кодов возврата (ошибок) в логике программного модуля рекомендуется использовать строковые константы.
Например, неправильно:

Перем НетОшибок,
Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка проверки заполнения вернула отказ
Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение
Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта

Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = Ошибка_ЗаписиОбъекта Тогда
.
ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
.
ИначеЕсли .

НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;

Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = «ОшибкаЗаписиОбъекта» Тогда
.
ИначеЕсли Результат = «ОшибкаБлокировкиОбъекта» Тогда
.
ИначеЕсли .

2.3. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений на время вызова сервера.

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

3. Неоправданные примеры использования переменных в модулях форм.

3.1. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений.

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

3.2. Для хранения и передачи промежуточных результатов вычислений между разными процедурами и функциями формы следует использовать

  • Параметры процедур и функций – для передачи результатов по цепочке вызовов дочерних процедур и функций в контексте одного вызова.
  • Реквизиты формы – если требуется сохранять промежуточные результаты между разными вызовами с клиента. (Следует иметь в виду, что значения серверных переменных модуля формы не сохраняются между вызовами с клиента.)

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

4. Переменные управляемого и обычного приложения следует использовать для хранения «клиентских параметров сеанса». Подробнее см. статью Использование параметров сеанса.

Переменные в 1С 8.2 и 8.3

Во встроенном языке программирования 1С используются переменные. Имена переменных должны начинаться с английского или русского символа, или подчеркивания. Нельзя чтобы наименование переменной начиналось с цифры. Не рекомендуется именовать переменные зарезервированными синтаксическими конструкциями. Имена переменных должны носить осмысленный характер. Это улучшает читабельность программного кода. Что в последующем увеличивает скорость разработки или доработки приложения. При объявлении переменных не требуется указывать тип значения, как это делается во многих других языках программирования. Тип значения определяется автоматически системой.

Локальные переменные

Локальные переменные определяются внутри процедур или функций. Перед ними необязательно писать ключевое слово «Перем». Область доступности таких переменных ограничена границами своей процедуры или функции. То есть, к такой переменной нельзя обратиться в другой процедуре или функции или из глобального контекста.

Функция РассчитатьСумму() 
Сумма = 1;
Возврат Сумма;
КонецФункции;

Глобальные переменные

Во многих языках программирования предусмотрено создание глобальных переменных. Во встроенном языке 1С, так же есть возможность создавать глобальные переменные. Такие переменные доступны во всех процедурах и функциях модуля в котором они определены. В языке программирования 1С глобальные переменные могут быть определены в любых модулях (объектов, форм, и т.д) кроме общих модулей. Глобальные переменные задаются в самом верху модуля, перед определением всех процедур и функций. Перед именем переменной пишется ключевое слово «Перем». Значение указывать нельзя. Значение глобальной переменной можно задать в процедурах, функциях модуля или в конце модуля после всех процедур и функций.

Перем гСумма;

Функция РассчитатьСумму()
гСумма = 1;
КонецФункции;

//При данном варианте, значение переменной устанавливается при создании объекта
гСумма = 2;

Экспортные переменные

Глобальную переменную можно сделать экспортной, указав ключевое слово «Экспорт». Например, если экспортная переменная создаётся в модуле объекта справочника, то к ней можно обратиться через объект этого справочника, СправочникОбъект.ИмяПеременной.

Перем гСумма Экспорт; 

Инструкция объявления переменной

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

пер Переменная1: Строка|Число|Булево = 0
  • слитно с предыдущим типом, если типов всего два;
  • через символ | , если типов больше двух.
пер Переменная1: Строка? пер Переменная1: Строка|Число|?

В этом случае переменная инициализируется значением Неопределено .

Если нужно объявить переменную произвольного типа, то следует указать для нее тип Объект? .

Общие рекомендации

Объявляя типизированную переменную надо понимать, что во время компиляции модуля «1С:Исполнитель» будет проверять совместимость типов в выражении. Другими словами, если переменная объявлена как числовая, а ей пытаются присвоить строковое значение — это приведет к ошибке. Но если переменная объявлена с типом неизвестно , то во время компиляции модуля контроль совместимости типов выполняться не будет. Однако проверки времени исполнения будут выполняться в любом случае.

  • Не поддерживается объявление нескольких переменных в одной инструкции.
  • Переменная не может быть объявлена дважды в одной области видимости. Допускается объявлять переменную или описывать параметр метода так, что имя переменной или параметра будет совпадать с константой или именем свойства глобального контекста.
  • Имя переменной не может совпадать с именем параметра метода.
  • Переменная не может быть использована без предварительного объявления.
  • Переменная не может быть использована в собственном инициализаторе.
  • Не поддерживается объявление переменной без указания типа или явного значения инициализации.
  • Если при объявлении переменной не указан тип, то тип будет вычислен из значения инициализации.

Пример

метод Скрипт() // Допустимые объявления переменных пер А: неизвестно // Неопределено пер Б: Число // 0 пер В: Строка // пустая строка пер Г: Строка? // Неопределено пер Д: Строка|Число = 5 // 5 конст К = "myZip.zip" // Недопустимы объявления переменных пер Е: Строка|Число // не указано значение инициализации пер Ж: Строка = [1, 2] // данные инициализации не совпадают с указанным типом ;

Как определить переменную в 1с

Переменные 1С могут быть объявлены внутри функции или процедуры, а также в начале модуля (кроме общих модулей). Если переменная 1С объявлена в начале модуля — то ее можно назвать глобальной переменной 1С — для этого модуля.

Чтобы иметь к глобальной переменной 1С из другого модуля — необходимо объявить ее экспортной (слово ЭКСПОРТ после имени переменной 1С). Чтобы обратиться к такой переменной 1С необходимо написать имя модуля, точка, имя экспортной переменной 1С.

Далее — подробнее про переменные 1С, с примерами.

Создание переменной 1С в модуле, например:
ПЕРЕМ Переменная1;

Начальное значение у такой переменной 1С будет Неопределено (см. далее), пока далее в коде не будет присвоено явно другое значение.

ПЕРЕМ можно использовать только в начале модуля или в начале процедуры/функции. Нельзя использовать в общих модулях.

Так как переменную 1С гораздо проще создать, когда она нужна, просто назначив ей значение, например:
Переменная1 = 22;
, то ПЕРЕМ обычно используют для создания глобальных (экспортных) переменных 1С.

Простая переменная 1С доступна («видна») в том модуле (в той процедуре/функции), где она создана. Если же переменная 1С глобальная, то она будет видна из других модулей.

Особенностью является то, что переменные 1С объявленные внутри цикла, условия Если — видны во всей функции/процедуре, а не только в объявленной части модуля. Если при выполнении в данное «Если» захода не было, то значение переменной НЕОПРЕДЕЛЕНО.

Пример создания экспортной переменной 1С:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Пример доступа к экспортной переменной 1С, созданной в модуле объекта справочника Номенклатура:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Пример доступа к экспортной переменной 1С, созданной в модуле формы элемента справочника Номенклатура:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Проголосовать за этот пост:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *