Встроенный язык 1С глазами программиста на Python, Java и C#
Содержание
Встроенный язык 1С больше всего похож на смесь Паскаля и Visual Basic по синтаксису и на Python или JavaScript по поведению. Блоки закрываются словами (КонецЕсли, КонецЦикла, КонецПроцедуры), типы переменных не объявляются, а проверяются во время выполнения. Отдельно стоит язык запросов: он почти дословно повторяет SQL, только с русскими ключевыми словами.
Если вы пишете на Python, Java или C#, программирование в 1С освоите быстро: циклы, условия и функции здесь те же. Сложность не в синтаксисе, а в платформе: объекты задаются не кодом, а в дереве метаданных, а код живёт то на клиенте, то на сервере. Ловушки чаще всего прячутся именно там.
Что в языке 1С узнает любой программист
Базовые конструкции повторяют классику процедурного программирования. Вот что работает привычно:
- 🔁 Циклы трёх видов: со счётчиком (
Для ... По ... Цикл), по коллекции (Для Каждого ... Из ... Цикл) и с условием (Пока ... Цикл). ЕстьПрерватьиПродолжить— аналогиbreakиcontinue. - 🔀 Условия
Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли. Тернарный оператор записывается как?(Условие, Значение1, Значение2). - 🧩 Процедуры и функции. Функция возвращает значение через
Возврат, процедура — нет. Ключевое словоЭкспортделает метод доступным из других модулей, какpublic. - 🛡️ Исключения:
Попытка ... Исключение ... КонецПопытки, свой выброс черезВызватьИсключение. Это прямой аналогtry/catch. - 💬 Комментарии начинаются с
//, как в C-подобных языках.
Ключевые слова можно писать по-русски или по-английски: Если и If, Цикл и Do, КонецЕсли и EndIf. В типовых конфигурациях принят русский вариант, и смешивать два стиля в одном модуле не стоит.
Сравните одну и ту же функцию:
Функция СуммаПоСтрокам(Таблица) Экспорт
Итого = 0;
Для Каждого Строка Из Таблица Цикл
Итого = Итого + Строка.Сумма;
КонецЦикла;
Возврат Итого;
КонецФункции
def summa_po_strokam(tablica):
itogo = 0
for stroka in tablica:
itogo += stroka.summa
return itogo
Логика один в один. Разница в оформлении: в 1С нет отступов как части синтаксиса, нет фигурных скобок, а каждый оператор заканчивается точкой с запятой. Оператора += нет — пишут Итого = Итого + ....
Язык 1С и Python: родство по поведению
С Python у 1С общее главное — динамическая типизация. Переменная не объявляется заранее и может хранить что угодно: число, строку, ссылку на документ. Тип проверяется только в момент выполнения.
| Что сравниваем | Python | Язык 1С |
|---|---|---|
| Типизация | динамическая | динамическая |
| Объявление переменной | при присваивании | при присваивании, Перем — по желанию |
| Границы блоков | отступы | ключевые слова Конец... |
| Регистр имён | различается | не различается |
| Пустое значение | None | Неопределено, а из запросов приходит ещё и NULL |
| Словарь | dict | Соответствие, Структура |
| Список | list | Массив, СписокЗначений |
| Таблица данных | pandas DataFrame | ТаблицаЗначений |
Нечувствительность к регистру удивляет питонистов первой. Сумма, сумма и СУММА — одна и та же переменная. Платформа не ругается, но в типовом коде принято писать имена с заглавной буквы каждого слова.
ТаблицаЗначений — ближайший аналог DataFrame из мира Python. У неё есть колонки, строки, сортировка, группировка (Свернуть), поиск по отбору. Многие задачи, которые в Python решают через pandas, в 1С закрывает именно она.
💡 Чего в 1С нет из привычного Python: генераторов списков, лямбд, распаковки кортежей, срезов a[1:3]. Всё это заменяется обычным циклом.
Сходства с JavaScript: объекты, свойства и события
С JavaScript язык 1С роднит работа с объектами через точку и событийная модель. Обращение Документ.Контрагент.ИНН выглядит так же, как order.client.inn в JS. Если по пути встретится пустая ссылка, вы получите пустое значение, а не падение, — похоже на опциональную цепочку ?..
Событийная модель тоже знакома фронтендерам. Код формы реагирует на действия пользователя через обработчики:
- 🖱️
ПриСозданииНаСервере— форма открывается, аналог инициализации компонента; - ✏️
ПриИзмененииу поля — аналогonchange; - 💾
ПередЗаписьюу объекта — с параметромОтказ, установкаОтказ = Истинаотменяет запись, какpreventDefault().
Ещё одна параллель — асинхронность. Современные конфигурации работают без модальных окон (так требует веб-клиент и мобильное приложение), поэтому вопросы и диалоги вызываются асинхронно. Раньше для этого писали обработчик-продолжение через ОписаниеОповещения, что напоминает колбэки. В новых версиях платформы появились Асинх и Ждать — по смыслу это async и await.
Разделение кода на клиентский и серверный тоже ближе к веб-разработке, чем к десктопной. Перед каждой процедурой формы стоит директива:
&НаКлиенте
Процедура КнопкаЗаполнитьНажатие(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
// здесь доступна база данных
КонецПроцедуры
Клиент не видит базу напрямую, как браузер не видит СУБД. Каждый вызов серверной процедуры — это запрос по сети, и его стоимость надо учитывать.
C# и Java: где 1С похожа, а где совсем нет
Программисту на Java или C# язык 1С покажется знакомым и чужим одновременно. Знакомое — архитектура прикладного решения. Чужое — отсутствие классического ООП.
Что похоже
- 🏗️ Платформа и среда исполнения. Как JVM или .NET, платформа 1С исполняет код и берёт на себя работу с базой, транзакциями, правами, интерфейсом.
- 📦 Модули как контейнеры кода. Общий модуль похож на статический класс со статическими методами. Модуль менеджера справочника — на фабрику или репозиторий.
- 🔐 Транзакции.
НачатьТранзакцию,ЗафиксироватьТранзакцию,ОтменитьТранзакцию— знакомая схема для тех, кто работал с ORM. - 🧱 Слоистость. Форма, объект, менеджер и общие модули разделяют ответственность примерно как контроллер, модель и сервисы.
Что не похоже
- ❌ Нельзя объявить свой класс. В коде нет
class, наследования, интерфейсов, конструкторов. Новый тип объекта — справочник, документ, регистр — создаётся в дереве метаданных Конфигуратора, а код лишь дописывается в его модули. - ❌ Нет статической типизации. Компилятор не подскажет, что вы передали строку вместо числа. Ошибку покажет только выполнение.
- ❌ Нет перегрузки методов и обобщений. Для разных вариантов вызова используют необязательные параметры со значениями по умолчанию.
Получается, что ООП в 1С есть, но «готовое»: объекты дают платформа и конфигурация, а программист пользуется ими и расширяет их поведение событиями. Ближе всего это к работе внутри фреймворка, где модели описаны в дизайнере, а код пишется только в обработчиках.
Конструкции, которых нет в других языках
Самое ценное в 1С — не синтаксис, а прикладные механизмы, которые встроены прямо в язык и платформу.
Объекты метаданных
Справочники, Документы, РегистрыНакопления, РегистрыСведений — это глобальные коллекции, доступные из любого места кода. Строка Справочники.Контрагенты.НайтиПоКоду("000001") сразу ищет запись в базе. Ни SQL, ни ORM-маппинга писать не надо.
Проведение документа
У документа есть событие ОбработкаПроведения. В нём код формирует движения — записи в регистры. Регистр накопления сам считает остатки и обороты на любую дату. В обычной разработке такую подсистему пишут неделями, в 1С она есть из коробки.
Язык запросов
Он похож на SQL, но с отличиями, которые экономят много кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Номенклатура);
КонецЦикла;
Имя регистра здесь условное — в каждой конфигурации оно своё. Важнее три особенности:
- Виртуальные таблицы —
Остатки,Обороты,ОстаткиИОбороты. Остаток на дату получается одной строкой, без ручных сумм приходов и расходов. - Разыменование через точку прямо в запросе:
Документ.Контрагент.ИНН. Платформа сама добавит соединение таблиц. - Временные таблицы через
ПОМЕСТИТЬи пакетные запросы, разделённые точкой с запятой.
Многострочный текст в 1С записывается строкой, где каждая следующая строка начинается с |. Это ещё одна деталь, которой нет в других языках.
Расширения конфигурации
Типовую конфигурацию дорабатывают не правкой исходников, а расширением — отдельным слоем, который перехватывает методы и добавляет реквизиты. По смыслу это похоже на патчинг или аспекты: исходный код поставщика остаётся нетронутым, и обновления ставятся проще.
С какого языка проще прийти в 1С
Готовых «лучших» языков нет: каждый опыт помогает в своей части работы.
| Ваш опыт | Что поможет сразу | Что придётся перестроить |
|---|---|---|
| Python | динамика типов, коллекции, чтение чужого кода | закрывающие слова вместо отступов, нечувствительность к регистру |
| JavaScript | события, клиент-сервер, асинхронность | отсутствие лямбд и функций как значений |
| Java, C# | архитектура, транзакции, дисциплина кода | отказ от своих классов, жизнь без компилятора типов |
| Pascal, Visual Basic | почти весь синтаксис | сама прикладная модель платформы |
| SQL | язык запросов, соединения, группировки | виртуальные таблицы регистров |
Самый недооценённый навык — SQL. Большая часть производительности решений 1С упирается в запросы. Тот, кто умеет думать множествами, а не циклами, пишет быстрый код с первого дня.
Второй по важности навык — понимание бухгалтерского и складского учёта. Язык выучивается за пару недель. Предметная область — то, ради чего 1С вообще используют, и без неё код получается правильным технически, но бесполезным для пользователя.
Ловушки для тех, кто переходит с других языков
Синтаксис осваивается за день. А вот привычки из другого языка дают ошибки, которые всплывают уже в рабочей базе.
- ⚠️ Запрос в цикле. Привычка «получить объект, обработать, получить следующий» в 1С превращается в тысячи обращений к базе. Данные выбирают одним запросом заранее, потом обходят выборку.
- ⚠️ Лишние вызовы сервера. Каждая процедура
&НаСервере, вызванная из клиентского кода, — это сетевой запрос. Пять вызовов подряд на кнопке заметно тормозят форму. Собирайте работу в один серверный вызов. - ⚠️ Разные индексы у массивов и строк. Массив нумеруется с 0, а позиции в строке — с 1:
Сред(Строка, 1, 3)возвращает первые три символа. Выход за границу массива вызывает ошибку. - ⚠️ Знак
=в двух ролях. Он и присваивает, и сравнивает — смысл зависит от места. Операторы==и!=не работают; «не равно» пишется как<>, логика — словамиИ,ИЛИ,НЕ. - ⚠️ Забытый NULL. Поле из левого соединения в запросе может прийти как
NULL, и сложение с ним даст ошибку в коде. В запросе используютЕСТЬNULL(Поле, 0). - ⚠️ Правка типовой конфигурации напрямую. Изменения в коде поставщика усложняют каждое обновление. Доработки делают в расширении.
- ⚠️ Ссылка вместо объекта.
Справочники.Контрагенты.НайтиПоКоду(...)возвращает ссылку. Чтобы изменить запись, нуженСсылка.ПолучитьОбъект(), затемЗаписать().
Регулярно запускайте синтаксический контроль модуля и пользуйтесь синтакс-помощником — он показывает методы и параметры каждого типа. Он частично заменяет подсказки, к которым вы привыкли в IDE со статической типизацией.
Для тех, кто привык к современной IDE, есть 1С:Enterprise Development Tools (EDT) — среда на базе Eclipse с работой через Git. Классический Конфигуратор при этом никуда не делся, и в большинстве компаний пишут именно в нём.
Частые вопросы
Язык 1С компилируемый или интерпретируемый?
Можно ли писать на 1С по-английски?
If, Procedure, Query. Типовые конфигурации написаны по-русски, поэтому в командной работе принят русский вариант.Похож ли язык 1С на Basic?
Процедура и Функция как отдельные виды методов напоминают Visual Basic.