Как объявить переменную в 1с
Во встроенном языке программирования 1С используются переменные. Имена переменных должны начинаться с английского или русского символа, или подчеркивания. Нельзя чтобы наименование переменной начиналось с цифры. Не рекомендуется именовать переменные зарезервированными синтаксическими конструкциями. Имена переменных должны носить осмысленный характер. Это улучшает читабельность программного кода. Что в последующем увеличивает скорость разработки или доработки приложения. При объявлении переменных не требуется указывать тип значения, как это делается во многих других языках программирования. Тип значения определяется автоматически системой.
Локальные переменные
Локальные переменные определяются внутри процедур или функций. Перед ними необязательно писать ключевое слово "Перем". Область доступности таких переменных ограничена границами своей процедуры или функции. То есть, к такой переменной нельзя обратиться в другой процедуре или функции или из глобального контекста.
Глобальные переменные
Во многих языках программирования предусмотрено создание глобальных переменных. Во встроенном языке 1С, так же есть возможность создавать глобальные переменные. Такие переменные доступны во всех процедурах и функциях модуля в котором они определены. В языке программирования 1С глобальные переменные могут быть определены в любых модулях (объектов, форм, и т.д) кроме общих модулей. Глобальные переменные задаются в самом верху модуля, перед определением всех процедур и функций. Перед именем переменной пишется ключевое слово "Перем". Значение указывать нельзя. Значение глобальной переменной можно задать в процедурах, функциях модуля или в конце модуля после всех процедур и функций.
Экспортные переменные
Глобальную переменную можно сделать экспортной, указав ключевое слово "Экспорт". Например, если экспортная переменная создаётся в модуле объекта справочника, то к ней можно обратиться через объект этого справочника, СправочникОбъект.ИмяПеременной.
Комментарии (0)
Это именованное значение данных для хранения и последующего доступа.
Могут быть произвольного допустимого в рамках 1С и контекста типа.
Далее под «модулем» будет подразумеваться блок исполнения кода, который связан с объектами системы (приложение,форма, справочник, документ и другие), детально будут рассмотрены в других разделах.
Под «контекстом» будет подразумеваться модуль и окружение которому этот модуль принадлежит.
Объявление переменных
Явное объявление переменных в 1с, в общем случае, не обязательно и может производится непосредственно перед использованием.
Для явного используется служебное имя «Перем«, которое регистронезависимое (допустимо использование, например»ПеРЕМ«).
Примеры явного объявления переменной:
Пример объявления в функции:
В данном случае мы видим две переменные :
- «ПараметрФункции«, которую нам передали при вызове, она объявлена в месте вызова, и возможно с другим именем.
- «ПеременнаяФункции1» — новая переменная, которая действует только в рамках функции
Именование переменных
Переменные должны именоваться, начинаясь с символов русского или английского алфавита или символа подчеркивания(«_»).
Не могут начинаться на цифру, но могут ее содержать.
Не рекомендуется именовать переменные используя имена конструкций языка, свойств реквизитов объектов, в некоторых случаях система не даст этого сделать, в других может привести к неявным ошибкам.
Например, находясь в контексте формы, нельзя использовать имя переменной Заголовок, т.к. в этом случае будет происходить непосредственное изменение заголовка окна формы.
Имя должно быть понятным, запоминаемым. Допускается использование префиксов для удобства восприятия, например: лЛокальнаяПеременная, фПеременнаяФормы.
Обычно применяется выделение регистром для визуального осмысления: ВременнаяПеременнаяДляХраненияПромежуточныхРасчетов
Длина имени переменных не ограничена в разумных пределах, опирайтесь на удобство чтения кода.
Инициализация переменных
Платформа инициализирует переменные значением «Неопределено» по умолчанию
В момент объявления переменные явно присвоить значение возможно только, если это параметр функции
- ПараметрфункцииИнициализируемый — если не передан параметр в функцию он будет инициализирован строковым значением 123
- ПеременнаяФункции2 — переменная инициализирована после объявления
- ПеременнаяФункции3 — переменная инициализирована по имени и значением, без явного объявления
Последний вариант ничем не хуже второго и повсеместно используется, но явная инициализация, признается более «правильной«
Также не является обязательным инициализация ранее объявленной переменной сразу, это может быть сделано непосредственно перед использование.
Допустимо не переопределять значение «Неопределено«, т.к. всегда можно проверить тип значение или содержимое
Видимость переменных
В версии 8 в отличии от 7.7. глобальных переменных не существует и их видимость определяется контекстом исполнения
- под контекстом в данном случае понимается модуль текущего объекта
- в некоторых модулях допустима инициализация переменных в начале, что позволит использовать переменных неограниченно в любой точке данного модуля (модуль приложения, формы, объекта и другие)
- в других такое недопустимо (модуль команды, модуль веб-сервисов)
- допустима передача значений или ссылки на значение переменой в функции(процедуры)
- к экспортным переменным допустимо обращение из других объектов (модулей, объявляются служебным регистронезависимым словом «Экспорт» через пробел от имени)
Передача значений переменных
- Не ограничивается передача значений внутри процедуры или функции
- Передача значений между процедурами внутри модуля объекта, допустимо при совместимых местах исполнения («клиентклиент»,»серверсервер»)
- Ограниченная передача при несовместимых местах выполнения кода или передача в другие объект
- примитивные типы: строка, число, дата переносятся без ограничений
- объектные типы и коллекции переносятся, если в среде возможно использование данных типов, либо не запрещается их передача («мутабельные» типы)
Более подробно на последнем случае останавливаться не буду, т.к. это один уроков, который вы должны пройти самостоятельно. Система вам сообщит, когда вы наступите на «грабли«, а объяснить простыми не получится.
В случае, если вам все-таки требуется передать значение, необходимо:
- подумать над тем, верный ли выбрали тип или место исполнения (возможно вы гоняете не те данные или не туда)
- использовать более универсальный тип для передачи
- преобразовывать тип в более простой перед транспортировкой, и обратно преобразовывать в месте получения
Конвертация значений будет рассмотрена в других разделах.
Замечу лишь, что примитивные типы конвертируется более просто, при соблюдении условий «авто-приведения», объекты обычно через их методы, либо уже написанием кода преобразования.
Легче сочинить 10 правильных сонетов, чем хорошее рекламное объявление.
— Олдос ХакслиВ 1С очень много предопределенных типов значений, их можно подразделить на несколько групп.
Группы типов данных
- простые (примитивные) типы
- типы-объекты и их подчиненные
- типы-объекты из метаданных (прикладные типы)
- интерфейсные типы
- прочие типы общего назначения
Простые типы
- Строка (задается значением в кавычках «»)
- Число (Задается десятичным числом)
- Дата (дата и время)
- Булево (Истина,Ложь.
Типы-объекты
- Коллекции значений (Массивы, Структуры, ТаблицыЗначений и другие)
- Интеграционные (Com, файлы, внешние объекты, zip, WS)
- Общего назначения
Объекты из метаданных (прикладные)
- Константы
- Справочники
- Документы
- Перечисления
- Отчеты
- Обработки
- Планы счетов
- Задачи
- Регистры сведений
- Регистры накоплений
- Регистры бухгалтерского учета
- и другие…
Интерфейсные
Связанные с окнами, формами и элементами форм (полей, надписей, табличных данных и других)
Другие варианты подразделения значений
- Значения, которые можно записать в реквизит объекта (в поле информационной базы) и те, которые нельзя
- Объекты, которые можно визуально представить, и те, которые имеют виртуальную сущность
- Типы значений которые, связаны с конфигурацией и ее объектами или работающие обособленно
- Которые могут быть разграничены по правам пользователей- не могут
- Могут достаточно просто преобразовываться — либо требуется вспомогательная конвертация
- Есть свойства и методы — либо отсутствуют
Задание типов значений
Значение может быть установлено:
Непосредственно
Через создание объекта
Через результат вызова системной функции
Через обращение к свойству объекта
Составные и простые типы
Если не указано специально, то тип значений не ограничивается.
В случае реквизитов объектов метаданных, тип значений задается на этапе конфигурирования из типов доступных к записи (примитивные, ссылки на объекты, хранилище значений), а так же от вида объекта и контекста(среды, места) исполнения. При этом доступно ограничение реквизита одним типом или несколькими. Например, нам необходимо записывать в одно поле, либо значение «строки», либо «числа».
Для других объектов, тип реквизитов может остаться не ограниченными (произвольного типа), либо ограничен через специальный тип «ОписаниеТипов«
Например, для простого случая
Данный объект также используется для ограничения выбора или внесения данных в диалоговых формах
Приведение значений
Производится автоматически при присвоении к реквизиту (свойству) объекта, если данный реквизит не может хранить данное значение
Также при операциях конкатенации, производится к сначала первому слагаемому, при вычитании, если допустимо, ко втором, а затем уже к результату.
Такие «сложные» преобразования требуется проводить с осторожностью.
Приведение значений через встроенные функции преобразования
Следует обратить внимание, что некоторые преобразования система не сможет сделать, и это вызовет ошибку исполнения, поэтому проверка должна производится разработчиком
Проверка типов
Сравнение производится через специальные функции ТипЗнч() и Тип().
Первая возвращает значение передаваемого типа, вторая задает тип для проверки
ЭтоЧисло = 15; //ответ на вопрос: тип значения переменной "ЭтоЧисло" является ли типом "Число" ЭтоБулево = ТипЗнч(ЭтоЧисло) = Тип("Число"); //Первый знак "=" - присвоение //Второй " i-11">Сравнение значений
Более подробно на типах останавливаться не буду, лучше их прочувствовать в реальных задачах или узких примерах
Не реклама копирует жизнь, а жизнь копирует рекламу.
— Фредерик БегбедерКаждый из указанных элементов может отсутствовать. Наличие первого и последнего, может быть запрещено на уровне системы.
Пример:
Данные блоки отделяются формально и не имеют четких границ.
Модули подразделяются на общие и модули, связанные с прикладными объектами. Данное разделение в большей мере ограничивает доступность или недоступность локальных данных (подробней ниже).
Блок объявлений переменных
Служит для объявления имен переменных, а также для указания их доступности извне через директиву « экспорт «. Эти переменные обычно называются переменными модуля, либо экспортными переменными объекта (формы).
Может содержать:
В модуле управляемой формы, модуле веб-сервисов, в общих модулях, в модуле команды не могут иметь блока переменных (детально данные модули в статье описываться не будут)
Блок кода процедур или функций
Предназначен для размещения текста функций и процедур. Этот блок возможно использовать во всех модулях.
Для модуля объекта или формы предоставляется возможность обращения к реквизитам данного объекта (формы, в том числе к элементам диалогов).
Для версий, начиная с 8.2 возможно указание директив исполнения ( &НаСервере, &НаКлиенте, &НаСервереБезКонтекста )
В модулях обычного приложения использование директив требуется производить с глубокой проверкой, иначе возможно.
Для модуля формы обращение к реквизитам недоступно для функции или процедур с директивой &НаСервереБезКонтекста
Во всех версиях 8 (в отличии от 7.7), последовательность процедур и функции для доступности вызова не имеет значение (в 7.7. такое возможно было при использовании директив «Далее», без данной директивы они были доступны снизу вверх)
Имена процедур должны быть уникальны в пределах локальной видимости (самого модуля или например, модуля объекта и формы для экспортных процедур)
Возможно наличие пустых строк и комментариев, как между процедурами(функциями), так и внутри самой процедуры
Блок тела модуля
Блок содержит код, который выполняется в момент создания объекта (формы или других прикладных объектов).
В нем доступны переменные модуля и возможна их инициализация.
Если модуль является модулем объекта или формы, видны и возможна записи реквизитов текущего объекта.
Так же возможен вызов процедур и модулей как данного модуля, так и других модулей, при допустимости их совместного использования (клиент-серверная реализация), глобальной видимости
Половина денег, которые идут на рекламу, выбрасываются впустую; но как узнать, какая именно половина?
— Уильям Гескет ЛеверЭта статья посвящена базовым понятиям работы с переменными и основным приемам. Мы рассмотрим требования и подходы к именованию переменных, разберем общепринятые кейсы использования переменных в языке 1С, а также имеющиеся ограничения на использование переменных.
Также есть видео версия статьи.Что такое переменные и зачем они нужны?
Переменная – это именованное хранилище в памяти компьютера, куда можно помещать и откуда можно получать данные. Эти данные, которые размещаются по адресу переменной, называются значением переменной.
В языке 1С значение помещается в переменную при помощи оператора присваивания
а = 1; // Переменной а присвоили значение 1
Использование переменных позволяет отделить логику от данных, сделать код универсальным и переиспользуемым.
Стандарты и требования к наименованиям переменных в языке 1С
В языке 1С имена переменных должны соответствовать некоторым требованиям.
- могут начинаться с нижнего подчеркивания, латинской или русской буквы
- могут содержать в себе символы подчеркивания, буквы и цифры
- никакие другие символы (спец. символы или пробелы) в именах переменных не допускаются
- имена переменных не должны совпадать с зарезервированными словами языка или с именами свойств, доступных из текущего контекста(см. раздел “Контекст, область видимости и время жизни переменных в языке 1С”).
Но помимо требований платформы 1С, существуют еще негласные соглашения и общепринятые подходы, которыми пользуются большинство разработчиков. А также есть система стандартов и методик разработки и от самой компании 1С, где даются рекомендации и требования, как следует именовать переменные.
Язык 1С – регистронезависимый, то есть, для платформы не важно, заглавными или строчными буквами написана переменная или ключевое слово. И это следует учитывать при создании имен переменных в 1С, и при их дальнейшем использовании в коде.
Вот основные критерии хорошего имени переменной
- состоит не из одной буквы
- Не начинается с подчеркивания
- Каждое слово, из которого состоит имя, начинается с заглавной буквы.
- отражает прикладное назначение и смысл переменной
Что не рекомендуется:
- Без необходимости смешивать русские и латинские буквы в имени
- Писать имя полностью заглавными или полностью строчными
- Использовать сокращения, в результате которых теряется смысл имени
- Придерживаться одного языка при написании кода. Если пишете конфигурацию на английском, то и все переменные на английском, если на русском – соответственно, все переменные на русском.
- Использовать одинаковое написание имени переменной во всех местах ее использования
Основные приемы работы с переменными
Объявление переменных
Переменные можно объявить тремя способами.
Явным образом, используя ключевое слово Перем. Можно указать сразу несколько переменных через запятую
Неявно объявить переменную при первом присвоении ей значения
Неявно объявить переменную в качестве итератора цикла при обходе коллекции:
Использование переменных в выражениях языка 1С
Нельзя обращаться к переменным, которые еще не объявлены:
Типизация
Язык 1С поддерживает нестрогую динамическую типизацию. т.е. тип значения переменной определяется ее содержимым, и явным образом не декларируется.
Поэтому разработчику особенно важно следить за корректностью использования переменной, и по возможности обеспечивать защиту от ошибок.
Контекст, область видимости и время жизни переменных в языке 1С
Контекст – это окружение программного кода, доступные из данной точки кода переменные, объекты языка и методы. Контекст – это очень важное понятие для качественного программирования в 1С. Различают три вида контекста – локальный контекст, контекст модуля, и глобальный контекст.
И прежде чем перейти дальше к определениям, давайте рассмотрим еще одно понятие, тесно связанное с контекстом – область видимости переменной. Рассмотрим простой пример:
Переменные, объявленные внутри процедуры или функции, являются локальными, и видны только в пределах этой процедуры или функции. Время жизни переменной начинается с момента ее объявления. После завершения кода процедуры, переменная перестает существовать. Платформа сама следит за временем жизни переменных, и уничтожает их, высвобождая память, после того, как переменная перестает использоваться.
Контексты, можно сказать, вложены один в другой. На самом верхнем уровне лежит глобальный контект. Он в первую очередь состоит из методов и свойств, предоставляемых самой платформой, а также из системных перечислений и системных наборов значений. В справке и синтакс-помощнике есть отдельная большая ветка, которая так и называется “глобальный контекст”.
Свойства и методы глобального контекста доступны из любой точки кода (но следует уточнить, что код делится на клиентский и серверный, и компилируется на клиенте и на сервере отдельно).
Каждый программный модуль – например, модуль приложения, модуль формы или модуль объекта – также имеет свой контекст, который называется локальным контекстом модуля. Контекст модуля определяет – какие методы, переменные и объекты языка “видны” в конкретном модуле.
Если объявить переменную в разделе объявления переменных модуля, то она будет доступна в пределах всего текста этого модуля. Ее значение можно будет менять как внутри методов, так и в разделе основной программы Пример:
Еще ниже уровнем располагается локальный контекст метода, который состоит из параметров и переменных, объявленных в этом методе. Переменные, объявленные внутри процедуры или функции, называются локальными.
Расширение контекста при помощи слова Экспорт
Часть контекста модуля можно сделать “публичной”, добавив ключевое слово Экспорт для нужных переменных, процедур или функций. В этом случае такие экспортные переменные и методы будут дополнять контекст других модулей, и станут “видны” в других точках кода. Пример:
Модуль приложения
Модуль формы
Как видно из примера, экспортная переменная модуля приложения расширяет контекст модуля формы, и доступна в нем как в разделе процедур и функций, так и в разделе основной программы. А вот Переменная ЛокальнаяПеременнаяМодуля в контексте модуля формы будет недоступна.
Важно! Локальные переменные методов нельзя сделать экспортными, т.е. при попытке сохранить конфигурацию с нижеследующим кодом платформа выдает ошибку:
Важно! При явном объявлении переменных в нижлежащем контексте, они будут перекрывать переменные с таким же именем, но из более высокого уровня контекста. Переменные модуля будут перекрывать одноименные глобальные переменные, а локальные переменные будут перекрывать переменные модуля.
Глобальная переменная >> Переменная модуля >> Локальная переменная метода
Пример:Модуль приложения
Модуль формы
Таким образом, несмотря на одинаковые названия, это будут разные переменные, т.е. они будут занимать разные адреса в памяти, а изменение значения одной переменной не будет приводить к изменениям в значениях других переменных.
Некоторые итоги и рекомендации
Следует по возможности уменьшать область видимости переменной. Если есть возможность обойтись без экспортной глобальной переменной – лучше обойтись. Если можно не создавать переменную модуля – лучше не создавать.
Почему? Чем больше время жизни переменной и чем больше ее область видимости, тем в больших контекстах она будет доступна. Возрастает возможность ошибки, когда переменную изменит код, который для этого не предназначался. Поведение выполнения программы может стать менее предсказуемым, а также это затруднит анализ и доработку кода.Старайтесь давать переменным осмысленные имена, отражающие их прикладное назначение и по возможности – тип принимаемых значений. Пользуйтесь отладчиком, контекстной подсказкой и табло выражений для анализа и отладки переменных.
Эту и многие другие темы более подробно вы можете изучить при помощи моего видеокурса “Разработчик 1С с нуля”.
Читайте также: