1C-Code → Основы 1С → Переменные: где программа хранит данные
С самого начала и по шагам. Половина главы — упражнения: вы пишете код прямо здесь.
Глава 2 из 36 · чтение примерно 25 минут
Переменная — первое понятие программирования: если оно не уложилось, дальше не уложится ничего. Поэтому глава подробная.
Упражнения лучше делать все — они короткие, и навык остаётся именно от них: читать про код и писать код — разные умения.
Число само по себе программе негде хранить: посчитала — и забыла. Чтобы значение можно было использовать дальше, ему дают имя.
Переменная — это не «ячейка памяти», а имя, за которым закреплено значение. Вы называете число «Цена» и дальше говорите про него «Цена», а не «двести пятьдесят».
Цена = 250;
| Часть | Что означает |
|---|---|
Цена | имя переменной — вы придумываете его сами |
= | знак присваивания: «положить в то, что слева, то, что справа» |
250 | значение, которое кладём |
; | точка с запятой — конец команды, как точка в конце предложения |
Прочитайте эту строку вслух так: «переменной Цена присвоить 250». Не «Цена равно 250» — это важное различие, к нему мы ещё вернёмся.
После этой строки в программе появилось имя Цена, и оно означает 250. Можно писать Цена * 4 — получится 1000.
Упражнение 1. Ваша первая переменная
Создайте переменную Цена и положите в неё число 250. Одна строка. Не забудьте точку с запятой в конце.
Решается в тренажёре: код запускается и проверяется сразу.
Имя переменной ни на что не влияет технически: программа одинаково выполнит Цена = 250 и ЫФВА = 250. Влияет оно на людей — на вас через неделю и на того, кто откроет этот код через год.
Правила простые:
ЦенаТовара;СуммаБезСкидки. Так принято в 1С, и код сразу выглядит своим;2Цена — ошибка, Цена2 — можно;Контрагент читается лучше, чем Kontragent.Заглавные и строчные буквы не различаются
В 1С Цена, цена и ЦЕНА — одна и та же переменная. Это удобно, но и опасно: опечатка в регистре не приведёт к ошибке, а вот опечатка в букве — приведёт.
И отдельная ловушка, на которой теряют часы: русская С и латинская C выглядят одинаково, а для программы это разные буквы. Сумма с латинской C — уже другая переменная. Тренажёр такие случаи узнаёт и говорит об этом прямо.
Упражнение 2. Имя из двух слов
Создайте переменную КоличествоТоваров со значением 12. Обратите внимание: без пробела, второе слово с заглавной буквы.
Решается в тренажёре: код запускается и проверяется сразу.
Слово «переменная» означает ровно это: значение можно заменить на другое. Каждое новое присваивание затирает старое.
Остаток = 100;
Остаток = 80;
Остаток = Остаток - 30;
| Часть | Что означает |
|---|---|
первая строка | в Остатке 100 |
вторая строка | сотня забыта, теперь 80 — старое значение не сохраняется |
третья строка | сначала считается правая часть: 80 − 30 = 50, потом кладётся в Остаток |
итог | в Остатке 50 |
Почему «Остаток = Остаток − 30» — не уравнение
В математике запись x = x − 30 не имеет решений. В программировании это не равенство, а команда: «возьми то, что сейчас в Остатке, вычти 30 и положи обратно в Остаток».
Правая часть считается первой, целиком, и только потом результат попадает налево. Если помнить этот порядок, такие строки перестают выглядеть странно.
Упражнение 3. Изменение значения
Дано: Остаток = 100;. Допишите одну строку так, чтобы из остатка вычлось 35 и результат остался в той же переменной.
Решается в тренажёре: код запускается и проверяется сразу.
Не только числа. Значения бывают разных типов, и от типа зависит, что со значением можно делать. Складывать два числа — можно. Складывать число и дату — уже другой разговор.
Четыре типа, которые встречаются постоянно:
| Тип | Как выглядит в коде | Что это |
|---|---|---|
| Число | Цена = 250; Доля = 0.15; | Целое или дробное. Дробная часть — через ТОЧКУ, не запятую |
| Строка | Имя = "Иванов"; | Текст. Всегда в двойных кавычках |
| Булево | Проведён = Истина; | Только два значения: Истина или Ложь |
| Дата | Срок = '20240515'; | Момент времени. В одинарных кавычках, ГГГГММДД |
Кавычки разные, и это не мелочь
Двойные кавычки — строка: "250" это текст из трёх знаков.
Одинарные — дата: '20240515' это 15 мая 2024 года.
Число в кавычках — уже не число. "250" + 10 не даст 260: программа не станет складывать текст с числом и сообщит об ошибке. Это одна из самых частых ошибок при загрузке данных из файлов, где всё приходит строками.
Упражнение 4. Разные типы
Создайте три переменные: Товар со значением "Гвозди" (строка, в двойных кавычках), Количество со значением 50 и Итого, равную количеству, умноженному на 7.
Решается в тренажёре: код запускается и проверяется сразу.
Во многих языках тип переменной пишут заранее: «здесь будет число». В 1С это не нужно. Тип определяется тем, что вы положили.
Больше того — в одну переменную можно последовательно положить значения разных типов. Программа не возражает.
Значение = 250; // сейчас это Число
Значение = "двести"; // а теперь Строка
Значение = Истина; // теперь Булево
| Часть | Что означает |
|---|---|
// после кода | комментарий — текст для человека, программа его не выполняет |
Значение | одна и та же переменная |
тип | меняется сам, вслед за тем, что положили |
вывод | удобно, но требует внимательности: что лежит внутри, надо помнить самому |
Комментарии
Две косые черты // означают: всё до конца строки — заметка для человека. Программа её пропускает.
Комментарии пишут не для того, чтобы пересказать код словами (// увеличиваем счётчик рядом со строкой, которая увеличивает счётчик, бесполезен), а чтобы объяснить почему сделано именно так. Это привычка, которая отличает хороший код от просто работающего.
Пока вы пишете код, значения переменных не видны. Чтобы заглянуть внутрь, есть команда Сообщить — она выводит значение на экран.
Это первый инструмент отладки: когда непонятно, что происходит, выводят значения и смотрят.
Упражнение 5. Посмотреть значение
Создайте переменную Приветствие со значением "Здравствуйте" и выведите её командой Сообщить(Приветствие);
Решается в тренажёре: код запускается и проверяется сразу.
Программа выполняется сверху вниз, строка за строкой. Если обратиться к переменной, которой ещё нет, выполнение прекратится с ошибкой «Переменная не определена».
Звучит очевидно, но на практике это самая частая ошибка новичка — и почти всегда из-за опечатки в имени: объявили СуммаДокумента, а обратились к СумаДокумента. Для программы это разные имена, и второго она не знает.
✓ Так работает
Цена = 250;
Итого = Цена * 2;Цена появилась строкой выше — к моменту второй строки она уже есть.
✕ А так — ошибка
Итого = Цена * 2;
Цена = 250;В первой строке Цены ещё не существует. Программа остановится на ней.
Упражнение 6. Найдите ошибку
Этот код не работает. Исправьте порядок строк так, чтобы Сумма получилась равной 1000.
Решается в тренажёре: код запускается и проверяется сразу.
«Переменная пустая» — в 1С не одно состояние, а несколько разных, и путаница между ними даёт ошибки, которые трудно искать.
Неопределено — значения нет вообще. Так выглядит переменная, которой ничего не присвоили, непереданный параметр, ключ, которого нет в соответствии.
NULL — совсем другое: это «в базе данных по этому полю нет строки». Приходит только из запросов, из левых соединений. NULL не равен Неопределено, и это отдельный тип.
Пустое значение типа — ноль для числа, пустая строка для строки, пустая дата, пустая ссылка. Значение есть, оно просто пустое.
| Проверка | Что отвечает | Когда применять |
|---|---|---|
| ЗначениеЗаполнено(Х) | Ложь для нуля, пустой строки, пустой даты, пустой ссылки, Неопределено и NULL | почти всегда — это «есть ли тут что-нибудь осмысленное» |
| Х = Неопределено | только про отсутствие значения | проверить, передали ли параметр; есть ли ключ в соответствии |
| Х = NULL | только про отсутствие строки в базе | разбор результата запроса без ЕСТЬNULL |
| ПустаяСтрока(Х) | Истина и для "", и для строки из одних пробелов | проверка текста, введённого человеком |
| Х = 0 | ровно про ноль | когда ноль — настоящее значение, а не «не заполнено" |
ЗначениеЗаполнено и ноль
ЗначениеЗаполнено(0) — это Ложь. Для 1С ноль и есть «пусто».
Обычно это удобно, но иногда губительно: скидка 0% — настоящее значение, остаток 0 — настоящий остаток, количество 0 в строке — ошибка оператора, которую надо поймать, а не проглотить.
Правило: ЗначениеЗаполнено — когда ноль действительно означает «не заполнено»; явное = 0 — когда ноль это значение.
Упражнение 7. Первое заполненное
Напишите ПервоеЗаполненное(Первое, Второе, Третье): вернуть первое из трёх значений, которое заполнено; если первые два пусты — третье. Проверка передаёт пустую строку, ноль и Основной.
Решается в тренажёре: код запускается и проверяется сразу.
Переменная в 1С принимает значения любого типа, и иногда надо спросить, что в ней сейчас лежит. Для этого две команды, и работают они в паре.
ТипЗнч(Значение) — возвращает тип того, что лежит. Тип("Число") — тип по имени. Сравнивают их между собой:
Если ТипЗнч(Значение) = Тип("Число") Тогда
Сумма = Сумма + Значение;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
Текст = Текст + Значение;
КонецЕсли;
| Часть | Что означает |
|---|---|
ТипЗнч(Значение) | тип того, что лежит в переменной прямо сейчас |
Тип("Число") | имя типа строкой; опечатка в нём — ошибка во время выполнения, а не при компиляции |
СправочникСсылка.Номенклатура | так пишут имена ссылочных типов: Тип("СправочникСсылка.Номенклатура") |
сравнение | типы сравниваются обычным «равно» — это обычные значения |
Упражнение 8. Это число?
Напишите ЭтоЧисло(Значение): вернуть Истина, если в переменной лежит число. Проверка передаёт строку "5" — и ждёт Ложь.
Решается в тренажёре: код запускается и проверяется сразу.
Три команды с именами типов превращают одно в другое: Число("250"), Строка(250), Дата("20260115"), Булево("Да").
Работают они не всегда, и это важно: Число("двести") не возвращает ноль, а прекращает выполнение. Про то, как с этим жить, будет глава про ошибки и исключения.
А ещё преобразование происходит само, когда типы встречаются в одном выражении. Правило одно и было в первой главе: смотрят на то, что слева. "Итого: " + 250 — строка, 250 + "Итого: " — ошибка.
В 1С пишут по-русски, и имена переменных — тоже. Это не вопрос вкуса: в типовых конфигурациях так пишут все, и латинские имена посреди русского кода читаются как ошибка.
Слова в имени соединяют без пробелов, каждое с большой буквы: СуммаДокумента, СтрокаТабличнойЧасти, НайденныйЭлемент.
Что режет глаз проверяющему: имена из одной буквы там, где это не счётчик (с, т, м); сокращения, понятные только автору (СумДок, КолТов); и имена, которые врут — Сумма, в которой лежит количество.
Короткие имена допустимы в одном месте: счётчик цикла и переменная, живущая две строки рядом. Всё остальное называют полным словом — читать код будут гораздо чаще, чем писать.
Перем: объявление, которое обычно не нужно
В 1С есть слово Перем — явное объявление переменной: Перем Итого;. Внутри процедуры оно не нужно: переменная и так появляется при первом присваивании.
Нужно оно в одном месте — в начале модуля, до всех процедур. Такая переменная живёт, пока живёт модуль, и видна всем его процедурам. На формах так хранят состояние между обработчиками событий.
Пользоваться этим стоит осторожно: переменная модуля — общая память, её меняют из разных мест, и отследить, кто испортил значение, тяжело. Передать значение параметром почти всегда понятнее.
Вы уже умеете главное: создавать переменные, менять их, использовать в вычислениях и смотреть, что внутри. Этого достаточно, чтобы начать решать задачи — и в разделе «Код» есть простые, где ничего сверх этого не нужно.
В следующих главах: как хранить не одно значение, а список (коллекции), как оформить код в функцию, чтобы его можно было вызывать, и как заставить программу выбирать путь в зависимости от данных.
Если что-то не уложилось
Вернитесь к упражнениям и сделайте их ещё раз, не подглядывая в подсказки: навык даёт письмо, а не чтение. Через несколько повторов работа с переменными перестанет требовать внимания.
Читать про код и писать код — разные умения. В тренажёре к этой главе идут упражнения: вы пишете решение, оно запускается на настоящем интерпретаторе 1С и проверяется сразу, без установки платформы.
← Первая программа: код, который что-то делает
→ Функции и процедуры: как код делится на части