Переменные и типы данных
Переменная в 1С — это именованная ячейка, в которую можно положить значение любого типа, а тип определяется тем, что вы туда положили.
Динамическая типизация — подход, при котором тип не привязан к переменной жёстко: одна и та же переменная может сегодня хранить число, а через строку кода — уже строку. 1С сама следит за типом «на лету».
Если вы приходили из Паскаля, C# или Java, первое, что удивляет в 1С — переменные не нужно объявлять с типом. Вы не пишете int Количество или string Наименование. Вы просто присваиваете значение — и переменная готова. Это и мощь, и источник ошибок, поэтому давайте разберёмся, как всё устроено под капотом.
Зачем это нужно на практике
1С — язык для быстрой разработки учётных решений. Бухгалтеру, который дорабатывает конфигурацию, важнее скорость написания кода, чем строгий контроль типов на этапе компиляции. Динамическая типизация позволяет за пять строк собрать обработку, которая читает документ, считает сумму и выводит результат. Плата за скорость — часть ошибок вы увидите только в момент выполнения, а не заранее. Понимание типов помогает эти ошибки предвидеть.
Объявление переменных: Перем и присваивание
Есть два способа «завести» переменную. Первый — явно объявить через оператор Перем (сокращение от «переменная»). Обычно это делают в самом начале модуля или процедуры, чтобы перечислить все переменные скопом.
Перем Наименование;
Перем Количество, Цена, Сумма; // можно объявить несколько через запятую
Наименование = "Клавиатура";
Количество = 3;
Цена = 1500;
Сумма = Количество * Цена;Второй способ — вообще без Перем: переменная возникает в момент первого присваивания. Так в 1С пишут чаще всего.
// Переменные создаются прямо при присваивании
Сотрудник = "Иванов И.И.";
ДатаПриёма = '20240115'; // литерал даты в одинарных кавычках
Оклад = 80000;
Сообщить(Сотрудник + ": оклад " + Оклад);Результат:
Иванов И.И.: оклад 80000Обратите внимание на Сообщить() — это встроенная процедура, которая выводит текст в окно сообщений пользователя. Мы будем пользоваться ей постоянно, чтобы «подсмотреть» значения.
Русский и английский синтаксис
Встроенный язык 1С — двуязычный. Почти у каждого ключевого слова есть английский синоним: Перем и Var, Процедура и Procedure, Если и If. Работают оба варианта, но в реальных проектах в СНГ пишут по-русски — так принято, и вся типовая конфигурация (1С:Бухгалтерия, 1С:УТ) написана русскими ключевыми словами. Английский синтаксис встречается разве что в старом коде или у разработчиков с зарубежным бэкграундом. В этом курсе весь код — на русском, как в живой практике.
Примитивные типы данных
Четыре типа встречаются в каждом модуле:
| Тип | Что хранит | Пример литерала |
Строка | текст любой длины | "Привет" |
Число | целое или дробное, произвольной точности | 42, 3.14 |
Дата | дату и/или время | '20240301120000' |
Булево | Истина или Ложь | Истина |
Строки в 1С — в двойных кавычках, а вот даты — в одинарных, в формате ГГГГММДДЧЧММСС. Число можно писать с точкой как разделителем дробной части. Булево принимает ровно два значения: Истина и Ложь (по-английски True / False).
Комментарий = "Товар со склада";
ВесКг = 2.5;
ДатаОтгрузки = '20240301';
Оплачено = Ложь;
Если НЕ Оплачено Тогда
Сообщить("Внимание: заказ не оплачен");
КонецЕсли;Как узнать тип значения
Когда типизация динамическая, иногда нужно проверить, что лежит в переменной. Для этого есть функция ТипЗнч() (тип значения) и удобная ЗначениеЗаполнено(), которая говорит, «пустое» ли значение (пустая строка, ноль, пустая дата — всё это считается незаполненным).
Значение = 0;
Если НЕ ЗначениеЗаполнено(Значение) Тогда
Сообщить("Число равно нулю — считаем незаполненным");
КонецЕсли;
Строка = "";
Если НЕ ЗначениеЗаполнено(Строка) Тогда
Сообщить("Пустая строка тоже незаполнена");
КонецЕсли;Преобразование типов
Часто данные приходят «не в том» виде: количество из формы — строкой, дата — текстом из файла. Для приведения типов есть функции-конструкторы: Строка(), Число(), Дата(), Булево().
ТекстКоличества = "7";
Количество = Число(ТекстКоличества); // строка -> число
Итого = Количество + 3; // теперь 10, а не "73"
Сообщить("Итого: " + Строка(Итого)); // число -> строка для конкатенации
ДатаИзТекста = Дата("20240301"); // строка -> дата
Сообщить(ДатаИзТекста);Результат:
Итого: 10
01.03.2024 0:00:00Ключевой момент: оператор + ведёт себя по-разному в зависимости от типов. Если оба операнда — числа, это сложение. Если хотя бы один — строка, это склейка (конкатенация). Поэтому "7" + 3 и Число("7") + 3 дадут совершенно разные вещи.
Как это работает
Внутри платформа хранит каждое значение как контейнер: «тип + сами данные». Когда вы пишете А = 5, создаётся значение типа Число, и ссылка на него кладётся в переменную А. Присваивание А = "текст" просто заменяет содержимое контейнера на значение типа Строка — старое число выбрасывается. Переменная — это лишь имя, указывающее на текущее значение. Именно поэтому 1С не может на этапе компиляции проверить, что вы складываете число с числом: до запуска ей неизвестно, что окажется в переменной. Проверка типов случается в рантайме, в момент выполнения строки.
Частые ошибки
Склейка вместо сложения. Классика новичка: Итого = ПолеВвода1 + ПолеВвода2, где оба поля пришли строками. Вместо суммы получается "100200". Всегда оборачивайте в Число(), если ждёте арифметику.
Опечатка в имени переменной. Из-за динамической типизации 1С не ругается, если вы обратились к Колличество вместо Количество — она молча создаст новую пустую переменную. Ошибка всплывёт позже и неочевидно. Лекарство — объявлять переменные через Перем и включать проверку модуля в конфигураторе.
Даты в кавычках не того типа. Дата = "20240301" кладёт в переменную строку, а не дату. Литерал даты пишется в одинарных кавычках: '20240301'. Со строкой не сработают операции над датами (прибавить дни, сравнить по времени).
Сравнение Булево с «истиной» вручную. Писать Если Оплачено = Истина Тогда избыточно. Булево уже само по себе — условие: достаточно Если Оплачено Тогда, а для отрицания — Если НЕ Оплачено Тогда.
Итоги
- В 1С типизация динамическая: тип определяет значение, а не объявление переменной.
- Переменную можно объявить через
Перемили создать первым присваиванием. - Четыре базовых типа: Строка (двойные кавычки), Число (точка — разделитель), Дата (одинарные кавычки, ГГГГММДД), Булево (Истина/Ложь).
- Преобразование — функциями
Строка(),Число(),Дата(),Булево(); следите за тем, как ведёт себя+. - Синтаксис двуязычный, но в реальных проектах пишут по-русски.