Встроенный язык 1С:Предприятия: устройство, задачи и инструменты
Содержание
Язык программирования 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С в компании:
- Дорабатывает типовую конфигурацию под процессы фирмы: новое поле в документе, своя проверка при проведении.
- Пишет внешние отчёты и обработки — файлы
.erfи.epf, которые подключают без изменения конфигурации. - Создаёт внешние печатные формы: счёт, акт, накладную в фирменном виде.
- Настраивает обмены между базами и с внешними сервисами.
- Разбирает медленную работу: ищет тяжёлые запросы и блокировки.
- Обновляет доработанные конфигурации на новые релизы.
Доработку типовой конфигурации лучше делать в расширении, а не снимать её с поддержки. Расширения появились в платформе 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: ветки, код-ревью, история изменений. Требовательнее к памяти компьютера, чем Конфигуратор.
Для командной работы в Конфигураторе есть хранилище конфигурации: разработчик захватывает объект, правит и помещает обратно, остальные видят изменения.
Чем отлаживают код:
- Точки останова. Ставятся клавишей
F9, запуск отладки —F5. Выполнение остановится на строке, и можно посмотреть значения переменных. - Пошаговое выполнение. Шаг с заходом в процедуру —
F11, шаг через —F10. - Вычисление выражений. В остановленном коде можно вычислить любое выражение и заглянуть в коллекцию или результат запроса.
- Замер производительности. Показывает, сколько времени заняла каждая строка кода. Главный инструмент, когда пользователи жалуются на тормоза.
- Отладка на сервере. Чтобы остановиться в серверном коде клиент-серверной базы, на сервере 1С включают режим отладки, а в Конфигураторе подключаются к нужному предмету отладки.
- Технологический журнал. Настраивается файлом
logcfg.xmlна сервере и пишет события платформы: долгие запросы, блокировки, ошибки. Нужен, когда проблема воспроизводится только у пользователей.
Перед изменением рабочей базы снимите копию и отлаживайте доработку на ней. Отладка в рабочей базе с остановками на точках держит транзакции и мешает пользователям.
Для проверки качества кода используют стандарты разработки фирмы 1С и автоматические проверки: в EDT встроены проверки кода, есть и сторонние анализаторы для языка 1С (например, на базе SonarQube).
Ошибки, которые делают в начале работы с языком 1С
- ❌ Правка типовой конфигурации напрямую. После этого каждое обновление превращается в ручное объединение. Начинайте с расширения или внешней обработки.
- ❌ Запрос к базе в клиентской процедуре. Код не скомпилируется или упадёт с ошибкой: объект
Запросна клиенте недоступен. Выносите чтение данных в серверную функцию. - ❌ Склейка числа со строкой.
"Сумма: " + 1500даст «Сумма: 1 500» с неразрывным пробелом-разделителем разрядов. Для кодов и номеров используйтеФормат(Число, "ЧГ=0")илиСтрШаблон. - ❌ Удаление строк коллекции в прямом цикле. Индексы сдвигаются, часть строк пропускается. Обходите коллекцию с конца:
Для Сч = 1 По Товары.Количество() Цикл
Строка = Товары[Товары.Количество() - Сч];
Если Строка.Количество = 0 Тогда
Товары.Удалить(Строка);
КонецЕсли;
КонецЦикла;
- ❌ Ловля всех исключений без записи в журнал. Пустой блок
Исключение … КонецПопыткипрячет ошибку. ПишитеЗаписьЖурналаРегистрациис текстом изОписаниеОшибки().
Частые вопросы о языке 1С
Можно ли писать на языке 1С по-английски?
Работает ли код 1С без платформы?
Есть ли в языке 1С объектно-ориентированное программирование?
Где взять справку по методам языка?
Чем язык 1С отличается от языка запросов 1С?
Запрос из встроенного языка.