Встроенный язык 1С:Предприятия: какие задачи он решает и кому нужен
Содержание
Язык программирования 1С нужен, чтобы описывать бизнес-логику учётных программ на платформе 1С:Предприятие 8.3: как проводится документ, что считает отчёт, как база обменивается данными с банком, сайтом или маркетплейсом. Отдельно от платформы он не применяется — это встроенный язык, а не язык общего назначения.
Если вы бухгалтер и хотите понять, что именно делает программист 1С, или разработчик, который присматривается к нише, — ниже конкретика: где пишут код, какие задачи на нём решают, чем он похож и не похож на Python или Java и сколько примерно платят.
Что такое встроенный язык 1С и как он устроен
Официально его называют «встроенный язык 1С:Предприятия». Код на нём живёт в модулях объектов конфигурации: справочников, документов, регистров, форм, общих модулей. Отдельного файла .exe нет: платформа сама исполняет код, когда пользователь нажимает кнопку или проводит документ.
Главные черты языка:
- 🇷🇺 Двойной синтаксис. Ключевые слова есть на русском и английском:
Если ... ТогдаиIf ... Then. В типовых конфигурациях фирмы 1С пишут по-русски. - 🔤 Динамическая типизация. Тип переменной не объявляют, он определяется значением. Переменная может сначала хранить число, потом строку.
- 🧩 Прикладные типы из коробки.
СправочникСсылка.Контрагенты,ДокументОбъект.РеализацияТоваровУслуг,ТаблицаЗначений,Структура,Соответствие— с ними работают без подключения библиотек. - 🗄️ Свой язык запросов. Похож на SQL (
ВЫБРАТЬ ... ИЗ ... ГДЕ), но обращается к объектам конфигурации, а не к таблицам СУБД. Один и тот же запрос работает на файловой базе, MS SQL Server и PostgreSQL. - 🖥️ Директивы компиляции. Каждая процедура формы помечается, где её выполнять:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста. - ⚠️ Обработка исключений через
Попытка ... Исключение ... КонецПопыткииВызватьИсключение.
Небольшой пример — функция, которая ищет контрагентов по ИНН. Так выглядит типичный серверный код:
Функция КонтрагентыПоИНН(ИНН) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", ИНН);
Результат = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат Результат;
КонецФункции
Тот же фрагмент на английском синтаксисе начинался бы с Function ... Export и Query = New Query;. Платформа понимает оба варианта, даже вперемешку, но в команде так не пишут.
Синхронный и асинхронный код
Веб-клиент и браузеры не любят модальные окна, которые блокируют страницу. Поэтому вопросы пользователю и диалоги выбора файлов в современных конфигурациях работают асинхронно.
- Старый способ — обработчики оповещения:
Новый ОписаниеОповещения("ИмяПроцедуры", ЭтотОбъект)и отдельная процедура, которую платформа вызовет после ответа пользователя. - Новый способ — ключевые слова
АсинхиЖдать, появились в платформе 8.3.18. Код с ними читается сверху вниз, как обычный:Ответ = Ждать ВопросАсинх("Удалить строку?", РежимДиалогаВопрос.ДаНет);.
Если вы читаете чужой код и видите оба подхода в одной базе — это нормально: типовые конфигурации переходят на новый синтаксис постепенно.
Где пишут код
| Инструмент | Для чего | Кому подходит |
|---|---|---|
| Конфигуратор | Классическая среда, входит в платформу. Метаданные, модули, формы, отладка | Всем, особенно для поддержки типовых баз |
| 1С:Enterprise Development Tools (EDT) | Среда на базе Eclipse, хранит конфигурацию в файлах, дружит с Git | Командам, крупным проектам |
Внешние обработки и отчёты (.epf, .erf) | Код вне конфигурации, подключается к базе без её изменения | Разовым задачам, печатным формам |
Какие задачи решают на языке 1С
Почти всё, что пользователь видит в 1С:Бухгалтерии, ЗУП или УТ, написано на этом языке. Программист 1С обычно занимается не «программированием вообще», а конкретными учётными задачами.
Типичные заказы в рабочей базе
- 🧾 Логика проведения документов. Какие движения по регистрам формирует документ, что контролировать при проведении: остатки, лимиты, заполненность реквизитов.
- 📊 Отчёты. Через систему компоновки данных (СКД): запрос плюс настройки группировок, отборов и оформления. Пользователь потом сам меняет вариант отчёта, не трогая код.
- 🖨️ Печатные формы. Счета, акты, этикетки по макету заказчика. Часто делаются внешней обработкой или в расширении.
- 📥 Загрузка данных. Из Excel, XML, JSON: прайсы, остатки при старте учёта, выписки нестандартного формата.
- ⚙️ Регламентные задания. Код, который сервер запускает по расписанию: ночной пересчёт, выгрузка на сайт, рассылка.
- 🔐 Права и роли. Ограничение доступа на уровне записей (RLS): менеджер видит только своих клиентов.
Что делают реже, но дороже
- Разработка отраслевых решений с нуля на платформе — склад, производство, медицина, автосервис.
- Оптимизация медленных запросов и блокировок на больших базах.
- Переход с нетиповой доработанной конфигурации на свежую типовую.
Бухгалтеру полезно знать границу: настройка учётной политики, счетов и видов операций делается в пользовательском режиме и программиста не требует. Код нужен, когда типового поведения не хватает.
Чем язык 1С отличается от Python, Java и C#
Язык 1С часто ругают за «несерьёзность», но сравнивать его с языками общего назначения напрямую не совсем честно. Это предметно-ориентированный язык: он заточен под учёт и платит за это универсальностью.
| Критерий | Встроенный язык 1С | Python / Java / C# |
|---|---|---|
| Где выполняется | Только внутри платформы 1С:Предприятие | Где угодно: сервер, десктоп, мобильные, встраиваемые системы |
| Работа с БД | Объекты и язык запросов встроены, СУБД скрыта | Через драйверы, ORM, ручной SQL |
| Интерфейс | Формы описываются декларативно, платформа сама рисует их в тонком клиенте и браузере | Нужен фреймворк |
| ООП | Нет классов и наследования; есть прикладные объекты и их модули | Полноценные классы, интерфейсы, наследование |
| Библиотеки | Типовая библиотека — БСП (Библиотека стандартных подсистем) | Огромные экосистемы пакетов |
| Порог входа | Низкий для первых доработок, высокий для архитектуры | Зависит от языка и задачи |
| Рынок | В основном Россия и страны СНГ | Мировой |
Что из этого следует на практике:
- ✅ Справочник с формой списка, формой элемента и правами доступа на 1С собирается за час. На Java для того же нужен каркас приложения, слой БД и веб-интерфейс.
- ❌ Написать на 1С игру, драйвер или нейросеть нельзя. Тяжёлые вычисления выносят во внешние сервисы.
- ⚠️ Код почти всегда разделён на клиентский и серверный. Начинающие спотыкаются о то, что на клиенте нельзя выполнить запрос к базе — нужен серверный вызов.
Клиент и сервер: самая частая ловушка
&НаКлиенте
Процедура ЗаполнитьКомандой(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
// здесь доступны запросы и объекты базы
Объект.Комментарий = "Заполнено " + Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy");
КонецПроцедуры
Каждый такой вызов — поход клиента на сервер. Если дёргать его в цикле по строкам табличной части, форма начнёт тормозить даже на хорошем железе. Опытный разработчик собирает данные и делает один серверный вызов.
Расширения и доработки без снятия с поддержки
Раньше любую доработку типовой конфигурации вносили прямо в неё. Конфигурацию «снимали с поддержки» или включали возможность изменения, и каждое обновление превращалось в ручное сравнение-объединение.
С версии платформы 8.3.6 появились расширения конфигурации
(файлы .cfe). Это главный приём, без которого современная доработка не обходится.
Как работают расширения
- 🧩 Расширение хранится отдельно от основной конфигурации и подключается к ней.
- 🔁 В расширение заимствуют нужные объекты и меняют поведение через аннотации
&Перед,&После,&Вместои&ИзменениеИКонтроль. - 📦 Можно добавить свои реквизиты, формы, отчёты, роли.
- ⬆️ Типовая конфигурация обновляется штатно, а расширение остаётся. После обновления его надо проверить: если изменился заимствованный объект, платформа предупредит.
Пример: нужно запретить проведение реализации без договора. В расширении заимствуют модуль объекта документа и добавляют обработчик с аннотацией &После("ОбработкаПроверкиЗаполнения"). Типовой код не тронут.
Расширение не универсальная таблетка. Сложная переделка механизма проведения через десятки перехватов становится такой же хрупкой, как правка типовой. И любое расширение сначала проверяйте на копии базы, а не в рабочей.
Когда что выбрать
Интеграция с внешними системами
Учётная база редко живёт в изоляции. Банк, сайт, маркетплейс, ЭДО, складской терминал — всё это стыкуют с 1С кодом на встроенном языке.
Основные способы обмена
| Механизм | Что делает | Пример задачи |
|---|---|---|
HTTPСоединение | 1С сама обращается к внешнему REST API | Загрузить курсы, заказы с маркетплейса |
| HTTP-сервисы | Внешняя система обращается к 1С по REST | Сайт отправляет заказ в базу |
| Web-сервисы (SOAP) | Обмен по WSDL | Интеграция со старыми корпоративными системами |
| Стандартный интерфейс OData | Автоматический REST-доступ к объектам базы | Выгрузка данных в BI-систему |
| Планы обмена | Регистрация изменений и синхронизация баз | Связка УТ и Бухгалтерии, распределённая база филиалов |
| COM-соединение | Подключение к базе из другой программы на Windows | Скрипт, который читает базу из Excel или другой 1С |
| Внешние компоненты | Подключение библиотек на C++ | Работа с торговым оборудованием |
Обмен между типовыми конфигурациями идёт через формат EnterpriseData, а правила для нестандартных обменов готовят в конфигурации «Конвертация данных ».
Так выглядит запрос к внешнему API:
&НаСервереБезКонтекста
Функция ПолучитьДанныеСервиса()
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/v1/rates");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Сервис вернул код " + Формат(Ответ.КодСостояния, "ЧГ=0");
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Возврат Данные;
КонецФункции
Адрес api.example.ru условный. Последний параметр конструктора включает HTTPS, а 30 — таймаут в секундах: без него зависший сервис подвесит и сеанс пользователя.
Логины, пароли и токены внешних сервисов не пишите в код. В типовых конфигурациях для этого есть безопасное хранилище данных, а в своих разработках — константы или отдельный регистр с ограниченным доступом.
Востребованность программистов 1С и как войти в профессию
Почти каждая российская компания ведёт учёт в 1С, а значит, кто-то эти базы сопровождает, обновляет и дорабатывает. Работодатели — франчайзи 1С, внутренние ИТ-отделы и интеграторы, а также фриланс.
Уровни и ориентировочные доходы
Цифры примерные, по открытым вакансиям в крупных городах; в регионах ниже, в Москве выше.
| Уровень | Что умеет | Ориентир, тыс. ₽ в месяц |
|---|---|---|
| Стажёр / младший | Отчёты на СКД, печатные формы, мелкие правки | 60–110 |
| Средний | Расширения, обмены, доработка проведения | 150–250 |
| Старший / ведущий | Архитектура, оптимизация, крупные внедрения | 250–400 и выше |
| Архитектор, эксперт по производительности | Высоконагруженные базы, кластеры серверов | по договорённости |
Что даёт преимущество
- 📚 Знание учёта. Программист, понимающий, что такое закрытие месяца и НДС, ценится выше «чистого» кодера.
- 🏅 Сертификаты фирмы 1С. «1С:Специалист» по платформе и конфигурациям подтверждает уровень; франчайзи их требуют, потому что от числа сертифицированных сотрудников зависит их статус.
- 🛠️ Инструменты. EDT, Git, автотесты, стандарты разработки 1С — признаки зрелой команды.
- 🗂️ БСП. Умение использовать типовые подсистемы вместо самописных велосипедов.
С чего начать
Учебная версия бесплатна и предназначена для обучения. Для работы с реальными данными компании она не подходит: у неё есть ограничения, и использовать её в коммерческом учёте нельзя.