Встроенный язык 1С:Предприятия: устройство, задачи и инструменты

· 10 мин

Содержание

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

Разработчики используют его для трёх больших задач: доработка типовых конфигураций (Бухгалтерия, ЗУП, УТ, ERP), создание своих решений с нуля и интеграция 1С с внешними системами.

Как устроен встроенный язык 1С и его синтаксис

Язык 1С — предметно-ориентированный. Его создавали не для игр и не для веба, а под учёт: документы, справочники, остатки, проводки. Поэтому многое, что в универсальных языках пишут руками, в 1С уже есть в платформе как готовые объекты.

Главные особенности:

  • 🇷🇺 Русский синтаксис. Ключевые слова — Процедура, Если, Тогда, Для Каждого, Пока. У каждого есть английский аналог (Procedure, If, Then), их можно смешивать, но в типовых конфигурациях пишут по-русски.
  • 🔤 Регистр букв не важен. ТекущаяДата() и текущаядата() — одно и то же.
  • 🧩 Динамическая типизация. Тип переменной не объявляют: Сумма = 0 — число, через строку Сумма = "ноль" — уже строка.
  • 🏗️ Объектная модель без своих классов. Создать собственный класс с наследованием нельзя. Вместо этого есть объекты метаданных: справочники, документы, регистры, перечисления. Разработчик добавляет объект в дереве конфигурации, а платформа сама создаёт таблицы в базе и методы для работы с ними.
  • 📦 Модули. Код живёт не в файлах, а в модулях объектов: модуль объекта, модуль менеджера, модуль формы, общие модули, модуль сеанса, модуль приложения.

Пример простого кода — процедура считает сумму по строкам табличной части:

Процедура ПересчитатьИтог()

	Итог = 0;
	Для Каждого Строка Из Товары Цикл
		Строка.Сумма = Строка.Количество * Строка.Цена;
		Итог = Итог + Строка.Сумма;
	КонецЦикла;

	СуммаДокумента = Итог;

КонецПроцедуры

Код исполняется платформой: перед запуском она переводит текст модулей во внутреннее представление. Отдельной сборки в exe-файл, как у C# или Go, нет.

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

Чем язык 1С отличается от универсальных языков

ПризнакЯзык 1СPython, Java, C#
Где выполняетсяТолько внутри платформы 1С:ПредприятиеЛюбая среда с интерпретатором или рантаймом
Работа с базойВстроена: объекты метаданных, язык запросовЧерез библиотеки и ORM
Свои классы и наследованиеНетЕсть
ИнтерфейсФормы строятся платформой по описаниюПишется отдельно или через фреймворки
Типичные задачиУчёт, документооборот, отчётностьЧто угодно

Где применяют язык 1С в бизнес-автоматизации

На встроенном языке написаны почти все прикладные решения фирмы 1С и партнёров. Когда бухгалтер нажимает «Провести», срабатывает код модуля документа, который формирует движения по регистрам.

Основные сферы применения:

  • 📊 Бухгалтерский и налоговый учёт. Проведение документов, закрытие месяца , расчёт налогов в 1С:Бухгалтерии.
  • 👥 Зарплата и кадры. Расчёт начислений, удержаний, отпускных и больничных в ЗУП.
  • 🏬 Торговля и склад. Резервы, заказы, ценообразование, остатки в УТ и ERP.
  • 🏭 Производство и управленческий учёт. Планирование, себестоимость, бюджетирование в ERP.
  • 📁 Документооборот, CRM, отраслевые решения. Медицина, строительство, общепит, логистика.
  • 📱 Мобильные приложения. Мобильная платформа 1С позволяет собрать приложение для Android и iOS на том же языке.

Что конкретно делает программист 1С в компании:

  1. Дорабатывает типовую конфигурацию под процессы фирмы: новое поле в документе, своя проверка при проведении.
  2. Пишет внешние отчёты и обработки — файлы .erf и .epf, которые подключают без изменения конфигурации.
  3. Создаёт внешние печатные формы: счёт, акт, накладную в фирменном виде.
  4. Настраивает обмены между базами и с внешними сервисами.
  5. Разбирает медленную работу: ищет тяжёлые запросы и блокировки.
  6. Обновляет доработанные конфигурации на новые релизы.

Доработку типовой конфигурации лучше делать в расширении, а не снимать её с поддержки. Расширения появились в платформе 8.3.6. Код в них лежит отдельно от основной конфигурации, и обновление типового релиза проходит без ручного сравнения и объединения каждого модуля.

Язык запросов 1С: как код работает с данными

Читать данные из базы в 1С принято не перебором объектов, а запросами. Язык запросов похож на SQL, но работает с объектами метаданных, а не с таблицами СУБД напрямую. Одна и та же конфигурация работает на файловой базе, MS SQL Server и PostgreSQL — текст запроса при этом не меняется.

Отличия от обычного SQL:

  • 🔗 Обращение через точку. Документ.Контрагент.ИНН — платформа сама построит соединение таблиц.
  • 📐 Виртуальные таблицы. Остатки, Обороты, ОстаткиИОбороты у регистров накопления, СрезПоследних у регистров сведений. Не нужно вручную суммировать движения.
  • 🗂️ Временные таблицы и пакеты. Конструкция ПОМЕСТИТЬ сохраняет промежуточный результат, а пакетный запрос выполняет несколько шагов за одно обращение.
  • 🛠️ Конструктор запроса. Текст можно собрать мышкой в визуальном редакторе, а затем поправить руками.

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Остатки.Номенклатура КАК Номенклатура,
|	Остатки.КоличествоОстаток КАК Количество
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК Остатки";

Запрос.УстановитьПараметр("НаДату", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(СтрШаблон("%1: %2", Выборка.Номенклатура, Выборка.Количество));
КонецЦикла;

Условие Склад = &Склад стоит в параметрах виртуальной таблицы, а не в секции ГДЕ. Так платформа отбирает данные до расчёта остатков, и запрос выполняется быстрее.

Запись данных идёт через объекты: Справочники.Номенклатура.СоздатьЭлемент(), Документы.<Имя>.СоздатьДокумент(), затем Записать(). Язык запросов в 1С только читает данные — UPDATE и DELETE в нём нет.

Для отчётов есть отдельный механизм — система компоновки данных (СКД). Разработчик пишет запрос и настраивает схему, а группировки, отборы и оформление пользователь меняет сам, без программиста.

Клиент, сервер и производительность кода

В 1С:Предприятии 8.3 код выполняется в двух местах: на клиенте (тонкий клиент, веб-клиент) и на сервере. Где именно — указывают директивы компиляции перед процедурой в модуле формы.

ДирективаГде выполняетсяДоступ к данным формы
&НаКлиентеНа компьютере пользователяЕсть
&НаСервереНа сервереЕсть, данные формы передаются на сервер
&НаСервереБезКонтекстаНа сервереНет, только параметры
&НаКлиентеНаСервереБезКонтекстаИ там, и тамНет

На клиенте нельзя выполнить запрос к базе — только на сервере. Каждый вызов сервера из клиентского кода — это обращение по сети. В локальной сети это быстро, а через интернет или веб-клиент задержки заметны.

Пример правильного разделения:

&НаКлиенте
Процедура ПоказатьДолг(Команда)
	Долг = ДолгКонтрагента(Объект.Контрагент);
	ПоказатьПредупреждение(, СтрШаблон("Долг контрагента: %1", Долг));
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДолгКонтрагента(Контрагент)
	// здесь запрос к регистру взаиморасчётов, возвращаем число
	Возврат 0;
КонецФункции

&НаСервереБезКонтекста не тащит на сервер всю форму, поэтому вызов лёгкий. Если функции нужны только параметры, выбирайте её.

Что чаще всего тормозит код 1С:

  • 🐢 Запрос в цикле. 1000 строк — 1000 обращений к базе. Лучше один запрос с отбором по списку значений.
  • 🐢 Обращение через точку к ссылке в цикле. Строка.Номенклатура.Артикул каждый раз читает объект из базы. Получите реквизиты запросом заранее.
  • 🐢 Лишние вызовы сервера с клиента. Несколько вызовов подряд объединяйте в один.
  • 🐢 Длинные транзакции. Чем дольше транзакция, тем дольше держатся блокировки, и другие пользователи ждут. В современных конфигурациях используют управляемые блокировки — разработчик сам указывает, что и как блокировать.

Интеграция 1С с внешними системами и веб-сервисами

Встроенный язык умеет обмениваться данными почти с чем угодно: сайтом, банком, маркетплейсом, другой базой 1С. Способ выбирают по задаче.

СпособНаправлениеКогда подходит
HTTPСоединение1С обращается наружуЗапросы к REST API сервиса, загрузка курсов, отправка заказов
HTTP-сервисыВнешняя система обращается к 1ССвой REST API для сайта или мобильного приложения
Web-сервисы (SOAP)В обе стороныОбмен с системами, которые работают по WSDL
Стандартный интерфейс ODataВнешняя система к 1СБыстрый доступ к данным без написания кода сервиса
COM-соединениеВнешняя программа к 1СТолько Windows, скрипты и старые интеграции
Внешние компоненты1С к оборудованию и библиотекамКассы, сканеры, весы, своя DLL
Планы обменаМежду базами 1СРаспределённые базы, синхронизация БП и УТ

HTTP-сервисы и веб-сервисы публикуются на веб-сервере (Apache или IIS) через публикацию информационной базы.

Пример — получить JSON от внешнего сервиса:

Соединение = Новый HTTPСоединение("api.example.ru", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/rates");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	Данные = ПрочитатьJSON(Чтение);
	Чтение.Закрыть();
КонецЕсли;

ПрочитатьJSON по умолчанию возвращает структуру, к полям которой обращаются через точку. Для формирования JSON есть обратная пара — ЗаписьJSON и ЗаписатьJSON.

Для XML в языке есть ЧтениеXML, ЗаписьXML и механизм XDTO — с ним удобно работать по XSD-схемам, например с форматом обмена EnterpriseData между типовыми конфигурациями.

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

Средства разработки и отладки кода 1С

Писать на языке 1С можно в двух средах.

Конфигуратор — классический режим запуска платформы. Здесь редактор модулей, дерево метаданных, конструкторы запросов и форм, синтакс-помощник со справкой по каждому методу. Подходит для большинства задач, работает из коробки.

1С:Enterprise Development Tools (EDT) — среда на базе Eclipse. Хранит конфигурацию в виде файлов, поэтому с ней удобно работать через Git: ветки, код-ревью, история изменений. Требовательнее к памяти компьютера, чем Конфигуратор.

Для командной работы в Конфигураторе есть хранилище конфигурации: разработчик захватывает объект, правит и помещает обратно, остальные видят изменения.

Чем отлаживают код:

  1. Точки останова. Ставятся клавишей F9, запуск отладки — F5. Выполнение остановится на строке, и можно посмотреть значения переменных.
  2. Пошаговое выполнение. Шаг с заходом в процедуру — F11, шаг через — F10.
  3. Вычисление выражений. В остановленном коде можно вычислить любое выражение и заглянуть в коллекцию или результат запроса.
  4. Замер производительности. Показывает, сколько времени заняла каждая строка кода. Главный инструмент, когда пользователи жалуются на тормоза.
  5. Отладка на сервере. Чтобы остановиться в серверном коде клиент-серверной базы, на сервере 1С включают режим отладки, а в Конфигураторе подключаются к нужному предмету отладки.
  6. Технологический журнал. Настраивается файлом logcfg.xml на сервере и пишет события платформы: долгие запросы, блокировки, ошибки. Нужен, когда проблема воспроизводится только у пользователей.

Перед изменением рабочей базы снимите копию и отлаживайте доработку на ней. Отладка в рабочей базе с остановками на точках держит транзакции и мешает пользователям.

Для проверки качества кода используют стандарты разработки фирмы 1С и автоматические проверки: в EDT встроены проверки кода, есть и сторонние анализаторы для языка 1С (например, на базе SonarQube).

Ошибки, которые делают в начале работы с языком 1С

  • ❌ Правка типовой конфигурации напрямую. После этого каждое обновление превращается в ручное объединение. Начинайте с расширения или внешней обработки.
  • ❌ Запрос к базе в клиентской процедуре. Код не скомпилируется или упадёт с ошибкой: объект Запрос на клиенте недоступен. Выносите чтение данных в серверную функцию.
  • ❌ Склейка числа со строкой. "Сумма: " + 1500 даст «Сумма: 1 500» с неразрывным пробелом-разделителем разрядов. Для кодов и номеров используйте Формат(Число, "ЧГ=0") или СтрШаблон.
  • ❌ Удаление строк коллекции в прямом цикле. Индексы сдвигаются, часть строк пропускается. Обходите коллекцию с конца:
Для Сч = 1 По Товары.Количество() Цикл
	Строка = Товары[Товары.Количество() - Сч];
	Если Строка.Количество = 0 Тогда
		Товары.Удалить(Строка);
	КонецЕсли;
КонецЦикла;
  • ❌ Ловля всех исключений без записи в журнал. Пустой блок Исключение … КонецПопытки прячет ошибку. Пишите ЗаписьЖурналаРегистрации с текстом из ОписаниеОшибки().

Частые вопросы о языке 1С

Можно ли писать на языке 1С по-английски?
Да. У всех ключевых слов и методов есть английские синонимы, а в Конфигураторе можно выбрать вариант встроенного языка. В российских типовых конфигурациях код написан по-русски.
Работает ли код 1С без платформы?
Нет. Код исполняет только 1С:Предприятие. Чтобы запустить программу, нужна платформа и лицензия; для обучения есть учебная версия платформы с ограничениями.
Есть ли в языке 1С объектно-ориентированное программирование?
Частично. Есть объекты, свойства и методы, но своих классов и наследования нет. Повторное использование кода строят на общих модулях и объектах метаданных.
Где взять справку по методам языка?
В синтакс-помощнике Конфигуратора и EDT. Там описан каждый объект, метод, параметр и контекст, где его можно вызвать: клиент, сервер, внешнее соединение.
Чем язык 1С отличается от языка запросов 1С?
Встроенный язык описывает алгоритм: условия, циклы, запись объектов. Язык запросов только читает данные из базы и похож на SQL. Текст запроса передают в объект Запрос из встроенного языка.