Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 ноя 2023, 15:36

Как присвоить переменной значение?

Автор Ликол, 22 июл 2022, 22:56

0 Пользователей и 1 гость просматривают эту тему.

Ликол

Есть две процедуры, одна создает массив и называет его СписокЧисел. Я хочу запустить в другой процедуре цикл, в котором переменной x последовательно присваивается значения чисел из этого массива.

Для н = 0 по 99 Цикл
       
 
х = СписокНомеров[н];

Конфигуратор выдает сообщение:

{ОбщаяФорма.Форма2.Форма(26,7)}: Переменная не определена (СписокНомеров)
      х = <<?>>СписокНомеров[н];


Что я делаю не так?

alexandr_ll

Ликол, Список Номеров разве равно Список Чисел?

Ликол

alexandr_ll, это я сейчас оговорился.

СписокНомеров первая процедура называет, так что решение, увы, не в этом...

alexandr_ll

Ликол, Если вы хотите одну переменную использовать в разных процедурах, в самом начале модуля объявите ее
Перем СписокНомеров;https://capitally.ru/1c-development/izuchenie-1s/language-1c/1s-obyavlenie-peremennyh/

1С объявление переменных

Переменные

Это именованное значение данных для хранения и последующего доступа.

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

Далее под «модулем» будет подразумеваться блок исполнения кода, который связан с объектами системы (приложение,форма, справочник, документ и другие), детально будут рассмотрены в других разделах.

Под «контекстом» будет подразумеваться модуль и окружение которому этот модуль принадлежит.

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

Объявление переменных

Явное объявление переменных в 1с, в общем случае, не обязательно и может производится непосредственно перед использованием.

Для явного используется служебное имя «Перем«, которое регистронезависимое (допустимо использование, например»ПеРЕМ«).

Примеры явного объявления переменной:

// обычная переменная
Перем МояПеременная1;
// экспортная переменная
Перем МояВидимаяПеременная2 Экспорт;

Пример объявления в функции:

В данном случае мы видим две переменные :

  • «ПараметрФункции«, которую нам передали при вызове, она объявлена в месте вызова, и возможно с другим именем.
  • «ПеременнаяФункции1» - новая переменная, которая действует только в рамках функции
Функция НекаяФункция(ПараметрФункции)
Перем ПеременнаяФункции1;
//Далее код
КонецФункции

Именование переменных

Переменные должны именоваться, начинаясь с символов русского или английского алфавита или символа подчеркивания(«_»).

Не могут начинаться на цифру, но могут ее содержать.

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

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

Имя должно быть понятным, запоминаемым. Допускается использование префиксов для удобства восприятия, например: лЛокальнаяПеременная, фПеременнаяФормы.

Обычно применяется выделение регистром для визуального осмысления: ВременнаяПеременнаяДляХраненияПромежуточныхРасчетов

Длина имени переменных не ограничена в разумных пределах, опирайтесь на удобство чтения кода.

Инициализация переменных

Платформа инициализирует переменные значением «Неопределено» по умолчанию

В момент объявления переменные явно присвоить значение возможно только, если это параметр функции

В примере ниже:

  • ПараметрфункцииИнициализируемый - если не передан параметр в функцию он будет инициализирован строковым значением 123
  • ПеременнаяФункции2 - переменная инициализирована после объявления
  • ПеременнаяФункции3 - переменная инициализирована по имени и значением, без явного объявления
Функция НекаяФункция(ПараметрФункцииИнициализируемый="123")
Перем ПеременнаяФункции2;
ПеременнаяФункции2 = 321;
ПеременнаяФункции3 = "321Пуск";
КонецФункции

Последний вариант ничем не хуже второго и повсеместно используется, но явная инициализация, признается более «правильной«

Также не является обязательным инициализация ранее объявленной переменной сразу, это может быть сделано непосредственно перед использование.

Допустимо не переопределять значение «Неопределено«, т.к. всегда можно проверить тип значение или содержимое

Видимость переменных

В версии 8 в отличии от 7.7. глобальных переменных не существует и их видимость определяется контекстом исполнения

  • под контекстом в данном случае понимается модуль текущего объекта
  • в некоторых модулях допустима инициализация переменных в начале, что позволит использовать переменных неограниченно в любой точке данного модуля (модуль приложения, формы, объекта и другие)
  • в других такое недопустимо (модуль команды, модуль веб-сервисов)
  • допустима передача значений или ссылки на значение переменой в функции(процедуры)
  • к экспортным переменным допустимо обращение из других объектов (модулей, объявляются служебным регистронезависимым словом «Экспорт» через пробел от имени)

Передача значений переменных

  • Не ограничивается передача значений внутри процедуры или функции
  • Передача значений между процедурами внутри модуля объекта, допустимо при совместимых местах исполнения («клиент<->клиент»,»сервер<->сервер»)
  • Ограниченная передача при несовместимых местах выполнения кода или передача в другие объект
    • примитивные типы: строка, число, дата переносятся без ограничений
    • объектные типы и коллекции переносятся, если в среде возможно использование данных типов, либо не запрещается их передача («мутабельные» типы)

Более подробно на последнем случае останавливаться не буду, т.к. это один уроков, который вы должны пройти самостоятельно. Система вам сообщит, когда вы наступите на «грабли«, а объяснить простыми не получится.

В случае, если вам все-таки требуется передать значение, необходимо:

  • подумать над тем, верный ли выбрали тип или место исполнения (возможно вы гоняете не те данные или не туда)
  • использовать более универсальный тип для передачи
  • преобразовывать тип в более простой перед транспортировкой, и обратно преобразовывать в месте получения

Конвертация значений будет рассмотрена в других разделах.

Замечу лишь, что примитивные типы конвертируется более просто, при соблюдении условий «авто-приведения», объекты обычно через их методы, либо уже написанием кода преобразования.

Люди в массе своей терпеть не могут рекламу. Они никогда не читают рекламных объявлений как таковых. Но они читают подряд все, что их заинтересует, и иногда этим оказывается рекламное объявление.


Ликол

alexandr_ll, определить переменную перед процедурами? Сейчас у меня начало кода стало выглядеть вот так:

Перем СписокНомеров;//определим переменную

&НаКлиенте
Процедура СоздатьМассив(Команда)
   // Вставить содержимое обработчика.

    СписокНомеров = Новый Массив(100);
 
     
   Для n=0 по 99 Цикл
    СписокНомеров[n] = n; // заполним массив данными
     
        КонецЦикла;
 
КонецПроцедуры

&НаКлиенте
Процедура АвтобусыТроллейбусы(Команда)
Строка1="Автобусы";
Строка2="Троллейбусы";

Для н = 0 по 99 Цикл
        //Сообщить(СписокНомеров [н]);
      
      х = СписокНомеров[н];

Когда программа доходит до этого места, все равно выдает сообщение, что переменная не определена.

Чувствую, что здесь какая-то тонкость передачи данных, которой я не знаю(


nvj84

&НаКлиенте
Перем СписокНомеров;

Ликол

nvj84, спасибо, сделал, как Вы посоветовали, а также прошелся по коду с целью выявить, нет ли где-то путаницы между кириллицей и латинницей (допустим, оказалось бы, что где-то я указываю х как латинскую букву, а где-то кириллицей)

Теперь сообщений про неопределенную переменную больше не выдает, но появилось сообщение:
"Получение элемента по индексу для значения не определено".

Не очень понимаю смысл этой фразы. Если в программе :
Для н = 0 по 99 Цикл
        //Сообщить(СписокНомеров [н]);
      
      x = СписокНомеров[н];

то по идее это должно значить, что x будут последовательно присваиваться значения из массива СписокНомеров, верно? В чем ошибка?

LexaK

Ликол,
что бы из массива брать какие-то значения, их туда сначала положить надо!  :befhbt:
по вашему коду, в момент ошибки, ваша переменная  СписокНомеров равна Неопределено!
если помогло нажмите: Спасибо!

Ликол

LexaK,тогда получается - эта процедура не работает?
 &НаКлиенте
Процедура СоздатьМассив(Команда)
   // Вставить содержимое обработчика.

    СписокНомеров = Новый Массив(100);
 
     
   Для n=0 по 99 Цикл
    СписокНомеров[n] = n; // заполним массив данными
     
        КонецЦикла;
 
КонецПроцедуры
 

Вообще, где нужно определять переменную СписокНомеров - в начале модуля для всех процедур, или после слов &НаКлиенте, как в предложении nvj84?

В последнем случае, определение действует только внутри данной процедуры?

LexaK

Ликол, вообще ваша задача ставит всех в тупик!
вроде по вашей регистрации вы программист 1С с 2017 года!
а задаете какие-то совсем уже элементарнейшие вопросы,

типа как переменной А присвоить значение 2, и почему мой код А = 2; не работает?
попробуйте сами ответить на эти вопросы
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск