Встроенный язык 1С глазами программиста на Python, Java и C#

· 9 мин

Содержание

Встроенный язык 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. Виртуальные таблицы — Остатки, Обороты, ОстаткиИОбороты. Остаток на дату получается одной строкой, без ручных сумм приходов и расходов.
  2. Разыменование через точку прямо в запросе: Документ.Контрагент.ИНН. Платформа сама добавит соединение таблиц.
  3. Временные таблицы через ПОМЕСТИТЬ и пакетные запросы, разделённые точкой с запятой.

Многострочный текст в 1С записывается строкой, где каждая следующая строка начинается с |. Это ещё одна деталь, которой нет в других языках.

Расширения конфигурации

Типовую конфигурацию дорабатывают не правкой исходников, а расширением — отдельным слоем, который перехватывает методы и добавляет реквизиты. По смыслу это похоже на патчинг или аспекты: исходный код поставщика остаётся нетронутым, и обновления ставятся проще.

С какого языка проще прийти в 1С

Готовых «лучших» языков нет: каждый опыт помогает в своей части работы.

Ваш опытЧто поможет сразуЧто придётся перестроить
Pythonдинамика типов, коллекции, чтение чужого кодазакрывающие слова вместо отступов, нечувствительность к регистру
JavaScriptсобытия, клиент-сервер, асинхронностьотсутствие лямбд и функций как значений
Java, C#архитектура, транзакции, дисциплина кодаотказ от своих классов, жизнь без компилятора типов
Pascal, Visual Basicпочти весь синтаксиссама прикладная модель платформы
SQLязык запросов, соединения, группировкивиртуальные таблицы регистров

Самый недооценённый навык — SQL. Большая часть производительности решений 1С упирается в запросы. Тот, кто умеет думать множествами, а не циклами, пишет быстрый код с первого дня.

Второй по важности навык — понимание бухгалтерского и складского учёта. Язык выучивается за пару недель. Предметная область — то, ради чего 1С вообще используют, и без неё код получается правильным технически, но бесполезным для пользователя.

Проверьте себя
Как в 1С записать «не равно»?
С какого номера начинается индекс массива в 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.
Нужно ли знать другой язык, чтобы начать программировать в 1С?
Нет. Язык 1С подходит и как первый. Опыт в другом языке ускоряет старт, но главное время уходит на изучение платформы и учёта, а не синтаксиса.
Как в 1С вызвать код на Python или другом языке?
Через внешние компоненты, COM-объекты в Windows или HTTP-сервис: платформа умеет отправлять HTTP-запросы и сама публиковать HTTP-сервисы. Чаще всего связывают системы именно через HTTP и JSON.