Урок 5. Встроенный язык: переменные, условия, циклы
Встроенный язык 1С — язык, на котором пишут код конфигураций. Ключевые слова в нём русские: Если, Тогда, Цикл, Процедура. Код живёт в модулях — у формы, у объекта, общие модули конфигурации — и выполняется, когда что-то происходит: пользователь нажал кнопку, документ проводится, форма открывается.
Где писать код для упражнений
Удобнее всего — во внешней обработке: это отдельный файл .epf, который открывается в любой базе и ничего в её конфигурации не меняет. Сделайте её один раз:
- В конфигураторе выберите меню Файл → Новый… → Внешняя обработка. Задайте имя
Практика. - На закладке Формы добавьте форму обработки и в конструкторе формы нажмите Готово.
- В редакторе формы откройте закладку Команды и добавьте команду с именем
Пример. - В свойстве команды Действие нажмите кнопку с лупой и выберите создание обработчика на клиенте — в модуле формы появится процедура
Пример. - Перетащите команду мышью в список элементов формы — на форме появится кнопка «Пример».
- Сохраните обработку: Файл → Сохранить, например в
C:\1C\Practice.epf.
Откройте любую базу в режиме 1С:Предприятие, выберите в главном меню Файл → Открыть… и укажите файл. Нажмите кнопку «Пример» — выполнится код процедуры. После каждой правки сохраните обработку в конфигураторе, закройте её форму в 1С:Предприятии и откройте файл снова.
Подробнее о внешних обработках — в справке Как создать внешнюю обработку.
Первая программа
Впишите в процедуру Пример одну строку:
&НаКлиенте
Процедура Пример(Команда)
Сообщить("Привет, 1С!");
КонецПроцедурыПривет, 1С!Сообщить выводит текст в окно сообщений внизу формы. Строка &НаКлиенте — директива: код выполняется на компьютере пользователя. Что это значит и чем отличается &НаСервере — в следующем уроке.
Правила записи:
- каждая инструкция заканчивается точкой с запятой
;; - регистр букв не важен:
Сообщить,сообщитьиСООБЩИТЬ— одно и то же; - комментарий — от
//до конца строки; - у языка есть и английское написание (
If,Then,EndIf), но код типовых конфигураций пишут по-русски.
Переменные и типы
Переменная появляется, когда ей присваивают значение. Объявлять её заранее не обязательно, а если хочется — словом Перем в начале процедуры.
&НаКлиенте
Процедура Пример(Команда)
Товар = "Карандаш";
Количество = 12;
Цена = 2;
Сумма = Количество * Цена;
Сообщить(Товар + ": " + Количество + " шт. на сумму " + Сумма);
КонецПроцедурыКарандаш: 12 шт. на сумму 24Тип переменной определяется значением и может меняться. Основные типы:
| Тип | Пример значения | Пояснение |
|---|---|---|
| Число | 12, 2.5, -7 | в коде дробная часть — через точку |
| Строка | "Карандаш" | в двойных кавычках; кавычка внутри — две подряд: "Фирма ""Луч""" |
| Дата | '20251231' | в одинарных кавычках: год, месяц, день, можно и время '20251231235959' |
| Булево | Истина, Ложь | да или нет |
| Неопределено | Неопределено | значения нет |
Длинную строку можно разбить на несколько: перенесите строку внутри кавычек, а следующую начните с |:
Текст = "Первая строка
|Вторая строка";Числа и строки
Арифметика обычная: +, -, *, /, а % — остаток от деления: 7 % 3 равно 1. Целую часть даёт функция Цел: Цел(7 / 2) равно 3.
Если сложить строку с числом, число превратится в строку. Но платформа делает это так же, как при показе пользователю: большие числа — с пробелами между разрядами, дробные — с запятой (при русских региональных настройках базы). Чтобы получить число без пробелов, используйте Формат с параметром ЧГ=0:
&НаКлиенте
Процедура Пример(Команда)
Сумма = 1500;
Сообщить("Сумма: " + Сумма);
Сообщить("Сумма: " + Формат(Сумма, "ЧГ=0"));
КонецПроцедурыСумма: 1 500
Сумма: 1500Пробел в 1 500 — неразрывный. Если такое число попадёт в имя файла, адрес или текст для другой программы, оно не распознается. Всегда, когда число нужно «как есть», пишите Формат(Число, "ЧГ=0").
Обратно строку в число превращает функция Число("12"), в строку число — Строка(12).
Условия
&НаКлиенте
Процедура Пример(Команда)
Остаток = 3;
Если Остаток = 0 Тогда
Сообщить("Товара нет");
ИначеЕсли Остаток < 5 Тогда
Сообщить("Товар заканчивается");
Иначе
Сообщить("Товара достаточно");
КонецЕсли;
КонецПроцедурыТовар заканчиваетсяСравнения: =, <> (не равно), <, >, <=, >=. Знак = значит и присваивание, и сравнение — что именно, понятно по месту. Условия соединяются словами И, ИЛИ, НЕ: Если Остаток > 0 И Цена > 0 Тогда.
Короткое условие в одну строку — ?(условие, если да, если нет):
Текст = ?(Остаток > 0, "в наличии", "нет в наличии");Циклы
Цикл Для — по счётчику, шаг всегда 1:
&НаКлиенте
Процедура Пример(Команда)
Для Номер = 1 По 3 Цикл
Сообщить("Шаг " + Номер);
КонецЦикла;
КонецПроцедурыШаг 1
Шаг 2
Шаг 3Цикл Пока — пока условие верно:
&НаКлиенте
Процедура Пример(Команда)
Сумма = 0;
Н = 1;
Пока Сумма < 20 Цикл
Сумма = Сумма + Н;
Н = Н + 1;
КонецЦикла;
Сообщить("Сумма " + Сумма + ", следующее слагаемое " + Н);
КонецПроцедурыСумма 21, следующее слагаемое 7Прервать выходит из цикла, Продолжить переходит к следующему шагу:
&НаКлиенте
Процедура Пример(Команда)
Для Номер = 1 По 10 Цикл
Если Номер % 2 = 0 Тогда
Продолжить;
КонецЕсли;
Если Номер > 7 Тогда
Прервать;
КонецЕсли;
Сообщить(Номер);
КонецЦикла;
КонецПроцедуры1
3
5
7Массив и цикл Для Каждого
Массив — список значений с номерами от нуля. Перебирать его удобнее всего циклом Для Каждого:
&НаКлиенте
Процедура Пример(Команда)
Товары = Новый Массив;
Товары.Добавить("Карандаш");
Товары.Добавить("Ручка");
Товары.Добавить("Тетрадь");
Для Каждого Товар Из Товары Цикл
Сообщить(Товар);
КонецЦикла;
Сообщить("Всего: " + Товары.Количество());
Сообщить("Первый: " + Товары[0]);
КонецПроцедурыКарандаш
Ручка
Тетрадь
Всего: 3
Первый: КарандашТем же циклом перебирают строки таблиц, элементы выборок и другие коллекции — дальше в курсе он встретится часто.
Частые ошибки
- Забыта точка с запятой или
КонецЕсли;/КонецЦикла;— конфигуратор при сохранении покажет ошибку с номером строки. Проверить модуль без сохранения можно командой проверки синтаксиса в меню модуля. - «Переменная не определена» — опечатка в имени или переменная используется раньше, чем ей присвоено значение.
- «Деление на 0» — делитель оказался нулём; проверяйте его условием перед делением.
- Пробелы в числе в строке —
Формат(Число, "ЧГ=0").
Коротко
- Код пишут в модулях; для упражнений удобна внешняя обработка с кнопкой.
Сообщитьвыводит текст в окно сообщений; инструкции заканчиваются;, регистр не важен, комментарий —//.- Типы: Число, Строка, Дата, Булево, Неопределено; строка + число = строка с разрядами, без них —
Формат(…, "ЧГ=0"). - Условие —
Если … Тогда … ИначеЕсли … Иначе … КонецЕсли;, короткое —?( , , ). - Циклы:
Для … По … Цикл,Пока … Цикл,Для Каждого … Из … Цикл, все заканчиваютсяКонецЦикла;.