Встроенный язык 1С:Предприятия: от проводок до REST-интеграций
Содержание
На языке 1С можно написать почти любую учётную систему целиком: документы и их проведение, отчёты любой сложности, обмен с сайтами и банками по HTTP и JSON, печатные формы, работу со сканерами и кассами, фоновые расчёты по расписанию. Нельзя на нём писать драйверы, игры и системные утилиты — язык работает только внутри платформы 1С:Предприятие 8.3.
Частое заблуждение — считать встроенный язык 1С «языком для бухгалтерских проводок». На деле проводки — малая часть. Большая часть кода в типовых конфигурациях отвечает за интерфейс, обмены, права доступа и обработку данных, а вся БП 3.0 или ЗУП 3.1 написана на том же языке, что доступен любому программисту в Конфигураторе.
Как устроен язык 1С и где выполняется код
Встроенный язык — не самостоятельный язык общего назначения, как Python или C#. Он опирается на объекты платформы: справочники, документы, регистры. Программист не создаёт таблицы в СУБД вручную — он описывает объект метаданных, а платформа сама строит под него таблицы в файловой базе, MS SQL Server или PostgreSQL.
Из чего складывается разработка:
- 🧱 Метаданные — дерево объектов конфигурации: справочники, документы, регистры, планы счетов, обработки, отчёты.
- 📝 Модули — код, привязанный к объекту (модуль объекта, менеджера, формы) или общий (общие модули).
- 🔎 Язык запросов — SQL-подобный, для выборки данных. Пишется внутри кода как строка.
- 🖼 Формы и макеты — внешний вид и печатные формы.
- 🔐 Роли — права пользователей на объекты и записи.
Код выполняется в двух контекстах: на клиенте и на сервере. Это задают директивы компиляции &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Обращение к базе данных возможно только на сервере, а работа с файлами пользователя и диалогами — на клиенте.
Язык двуязычный: каждое ключевое слово имеет английский аналог (Если — If, Процедура — Procedure). Типовые конфигурации написаны по-русски, но смешивать оба варианта в одном модуле платформа позволяет.
| Инструмент | Где пишут код | Для чего |
|---|---|---|
| Конфигуратор | встроен в платформу | основная разработка, обновление конфигураций |
| 1С:EDT | отдельная среда на базе Eclipse | командная разработка, работа с Git |
Внешние обработки и отчёты (.epf, .erf) | файл вне базы | доработки без изменения конфигурации |
Расширения (.cfe) | подключаются к базе | доработка типовой без снятия с поддержки |
Для доработки типовой БП 3.0 или ЗУП 3.1 сначала рассматривают расширение конфигурации (механизм есть с платформы 8.3.6). Типовая остаётся на поддержке, обновления ставятся без ручного сравнения и объединения.
Автоматизация учёта и документооборота на языке 1С
Ядро любой конфигурации — связка «документ → регистр». Документ фиксирует факт: продажу, приход, начисление зарплаты. При проведении код модуля документа записывает движения в регистры. Отчёты потом читают уже регистры, а не документы.
Какие объекты есть в распоряжении программиста:
- 📚 Справочники — номенклатура, контрагенты, сотрудники.
- 📄 Документы — первичка с проведением и нумерацией.
- 📊 Регистры сведений — данные с историей: цены, курсы, ставки.
- 📦 Регистры накопления — остатки и обороты: склад, взаиморасчёты.
- 🧾 Регистры бухгалтерии вместе с планом счетов — проводки Дт/Кт с субконто.
- 💰 Регистры расчёта и планы видов расчёта — зарплата с перерасчётами и периодами действия.
- 🔄 Бизнес-процессы и задачи — маршруты согласования: кто утверждает счёт, кому уходит задача после.
На встроенном языке пишут обработчики событий этих объектов. Самые ходовые:
ОбработкаПроведения— формирует движения документа.ПередЗаписью— проверка и заполнение данных до записи.ОбработкаПроверкиЗаполнения— контроль обязательных реквизитов.ОбработкаЗаполнения— заполнение нового документа на основании другого.
Документооборот в 1С — тоже код. Согласование договора, визы руководителей, напоминания исполнителю собираются из бизнес-процессов, задач и регламентных заданий. На этих механизмах построена, например, «1С:Документооборот».
Правка ОбработкаПроведения в рабочей базе меняет учёт задним числом только после перепроведения документов. Изменения проверяют на копии базы, а перепроведение за закрытый период согласуют с главным бухгалтером.
Отчёты и анализ данных: запросы и СКД
Отчёты на языке 1С строятся в два слоя: запрос достаёт данные, система компоновки данных (СКД) раскладывает их по группировкам, отборам и диаграммам. Пользователь затем сам меняет настройки отчёта, не трогая код.
Язык запросов похож на SQL, но знает объекты 1С. У регистров есть виртуальные таблицы — Остатки, Обороты, ОстаткиИОбороты, — которые сразу отдают итог на дату или за период без ручного суммирования.
Пример: обороты по условному регистру накопления «Продажи» за период с сортировкой по сумме.
&НаСервере
Функция ПродажиЗаПериод(ДатаНачала, ДатаОкончания)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты
|УПОРЯДОЧИТЬ ПО
| Сумма УБЫВ";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция вернёт ТаблицаЗначений — коллекцию строк в памяти, с которой дальше можно делать что угодно: свернуть, отфильтровать, выгрузить в файл.
Что ещё доступно для аналитики:
- 📈 Диаграммы — круговые, гистограммы, графики, диаграммы Ганта.
- 🧮 Сводные таблицы — через группировки СКД по строкам и колонкам.
- 🖨 Табличный документ — печатные формы по макету: счёт, накладная, акт. Сохраняется в PDF, XLSX, DOCX.
- 🧩 Внешние отчёты — подключаются к базе без изменения конфигурации, удобны для разовых задач.
Отчёт на СКД почти всегда лучше «ручного» вывода в табличный документ: пользователь сам добавит колонку или отбор, а программиста не придётся звать ради каждой мелочи.
Интеграция 1С с внешними системами и сервисами
Обмен данными — вторая по объёму задача после учёта. Встроенный язык умеет и отправлять запросы во внешние сервисы, и сам публиковать API, к которому обращаются сайт, мобильное приложение или другая база.
| Механизм | Направление | Типичная задача |
|---|---|---|
HTTPСоединение | 1С → сервис | REST API банка, маркетплейса, Telegram-бота |
| HTTP-сервисы | сервис → 1С | свой REST API для сайта или приложения |
| Web-сервисы (SOAP) | в обе стороны | интеграции с корпоративными системами |
| Стандартный интерфейс OData | сервис → 1С | чтение и запись объектов без программирования API |
COM-соединение (V83.COMConnector) | Windows-программа → 1С | обращение из Excel, другой базы 1С |
| Файлы: XML, JSON, CSV, DBF | в обе стороны | выгрузка в банк, загрузка прайсов |
| Внешние источники данных | 1С → чужая СУБД | чтение таблиц другой системы как своих |
| Планы обмена | 1С ↔ 1С | синхронизация баз, распределённая база |
Для работы с форматами есть встроенные объекты: ЧтениеJSON и ЗаписьJSON, ЧтениеXML и ЗаписьXML, фабрика XDTO для XML по схеме. Почта отправляется через ИнтернетПочта, файлы на FTP — через FTPСоединение.
Пример запроса к REST-сервису с разбором JSON-ответа (адрес условный):
&НаСервереБезКонтекста
Функция ПолучитьДанныеСервиса()
Соединение = Новый HTTPСоединение("api.example.ru", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/rates?base=RUB");
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение СтрШаблон("Сервис вернул код %1", Ответ.КодСостояния);
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Возврат Данные;
КонецФункции
ПрочитатьJSON по умолчанию превращает объект JSON в Структура, массив — в Массив. Таймаут 30 секунд задан явно: без него зависший сервис подвесит и сеанс пользователя.
Обмен между типовыми конфигурациями (БП ↔ УТ, БП ↔ ЗУП) уже написан фирмой 1С на формате EnterpriseData. Свои правила для нетиповых обменов пишут в «Конвертации данных».
Формы и интерфейс пользователя
Интерфейс в 8.3 строится на управляемых формах. Программист не рисует окно по пикселям: он описывает реквизиты формы, элементы и команды, а платформа сама раскладывает их для тонкого клиента , веб-клиента и мобильного устройства.
Что задаётся кодом и настройками формы:
- 🖱 Команды — кнопки и пункты меню с обработчиками.
- 🔁 События элементов —
ПриИзменении,НачалоВыбора,Нажатие: пересчёт суммы при изменении количества, подбор из списка. - 👁 Видимость и доступность — скрыть поле для одной организации, запретить правку после закрытия периода.
- 🎨 Условное оформление — подсветить просроченные заказы красным без единой строки кода.
- 📱 Мобильная платформа — те же формы и язык для приложения под Android и iOS.
Главная техническая тонкость — граница клиента и сервера. Каждый вызов &НаСервере из клиентской процедуры — это обращение по сети с передачей данных формы. Десять серверных вызовов в цикле дают заметную задержку в веб-клиенте и при работе через интернет
. Опытный программист собирает работу в один серверный вызов и, где форма не нужна, использует &НаСервереБезКонтекста.
Диалоги на клиенте пишут асинхронно: ПоказатьВопрос, ПоказатьПредупреждение с ОписаниеОповещения или, в новых версиях платформы, через Асинх и Ждать. В современных конфигурациях свойство «Режим использования модальности» выключено, и старый код с Вопрос() вызывает ошибку.
Работа с оборудованием и периферией
Напрямую с COM-портом или USB встроенный язык не работает . Связь с железом идёт через внешние компоненты — библиотеки, написанные на C++ по технологии Native API или как COM-объекты. Код 1С подключает компоненту и вызывает её методы так же, как методы обычного объекта.
В типовых конфигурациях для этого есть Библиотека подключаемого оборудования (БПО). Через неё подключают:
- 🧾 онлайн-кассы (ККТ) по 54-ФЗ — через драйверы производителей;
- 🔫 сканеры штрихкодов и 2D-сканеры для маркировки;
- ⚖️ весы, в том числе с печатью этикеток;
- 📟 терминалы сбора данных для инвентаризации;
- 💳 эквайринговые терминалы;
- 🏷 принтеры этикеток и чеков.
Простой случай — сканер в режиме эмуляции клавиатуры: он «печатает» штрихкод в поле формы, и драйвер не нужен. Но так теряются символы-разделители кода маркировки, поэтому для «Честного знака» сканер настраивают через драйвер в режиме COM-порта или HID.
Подключение оборудования в БП 3.0 и УТ 11 делается без программирования: в разделе Администрирование есть настройки подключаемого оборудования, где выбирают тип устройства и драйвер. Код нужен только для нестандартного устройства.
Администрирование, фоновые задачи и производительность
Часть возможностей языка не видна пользователю, но держит систему в рабочем состоянии.
Регламентные задания — процедуры, которые сервер запускает по расписанию: загрузка курсов валют, обмен с сайтом в 3 часа ночи, отправка рассылок. Расписание задаётся в Конфигураторе или программно. В файловой базе они выполняются только пока открыт сеанс, в клиент-серверной — силами кластера.
Фоновые задания — запуск долгой операции отдельно от формы. Пользователь продолжает работать, а расчёт идёт параллельно:
Параметры = Новый Массив;
Параметры.Добавить(ДатаНачала);
ФоновыеЗадания.Выполнить("РасчетыСервер.ПересчитатьОстатки", Параметры, , "Пересчёт остатков");
Здесь РасчетыСервер — общий серверный модуль, а ПересчитатьОстатки — его экспортная процедура. Несколько фоновых заданий дают настоящую параллельность на многоядерном сервере.
Другие инструменты администратора и программиста:
- 🔐 Роли и RLS — права на объекты и ограничение доступа на уровне записей: менеджер видит только своих контрагентов.
- 🔒 Управляемые блокировки — объект
БлокировкаДанныхзащищает остатки от двойного списания при одновременном проведении. - 📜 Журнал регистрации — запись событий кодом через
ЗаписьЖурналаРегистрации. - ⏱ Замер производительности в отладчике — показывает, какая строка кода тормозит.
- 🧰 Транзакции —
НачатьТранзакцию,ЗафиксироватьТранзакцию,ОтменитьТранзакциюдля атомарной записи набора объектов.
Регламентные и фоновые задания, которые меняют данные, сначала запускают на копии базы — ошибка в них повторяется автоматически при каждом запуске.
Чего не умеет встроенный язык и как это обходят
У языка есть границы. Их полезно знать до того, как обещать заказчику доработку.
| Ограничение | Как обходят |
|---|---|
| Нет классов и наследования | общие модули, модули менеджеров, структуры данных |
| Нет прямого доступа к железу и WinAPI | внешние компоненты Native API |
| Нет потоков внутри одного сеанса | фоновые задания |
| Код работает только внутри платформы | HTTP-сервисы, COM, OData для внешних программ |
| Нет своего движка СУБД | платформа использует файловую базу, MS SQL Server, PostgreSQL, Oracle, IBM Db2 |
Типичные ошибки начинающих:
- ❌ Запрос в цикле. Сотня запросов по одной строке медленнее одного запроса с пакетной выборкой в десятки раз.
- ❌ Доработка типовой «по живому». Правка модулей конфигурации на поддержке превращает каждое обновление в ручное сравнение. Расширение решает ту же задачу без этой цены.
- ❌ Обращение через точку в цикле.
Документ.Контрагент.ИННв цикле по тысяче документов — тысяча скрытых чтений из базы. Нужные поля берут одним запросом. - ❌ Склейка числа со строкой без
Формат— в тексте появятся неразрывные пробелы между разрядами, и сравнение строк сломается.