Встроенный язык 1С:Предприятия 8 — как на нём пишут конфигурации
Содержание
Конфигурации 1С:Предприятия 8 пишут на встроенном языке 1С — собственном языке платформы. Это не Pascal, не Visual Basic и не C#, хотя синтаксис напоминает первые два. Ключевые слова русские (Если … Тогда … КонецЕсли), но у каждого есть английский двойник (If … Then … EndIf), и оба варианта работают.
Частое заблуждение — что «язык 1С» один. На деле разработчик пользуется сразу несколькими: встроенным языком для логики, языком запросов для выборки данных (он похож на SQL) и языком выражений системы компоновки данных для отчётов. Платформа сама переводит запросы в SQL той СУБД, на которой стоит база.
Как развивался встроенный язык 1С: от 7.7 до 8.3
Язык растёт вместе с платформой. Каждое крупное поколение добавляло в него не столько новые операторы, сколько новые правила, где и как выполняется код.
| Поколение | Что изменилось для программиста |
|---|---|
| 1С:Предприятие 7.7 | Встроенный язык уже есть, но объектов метаданных меньше, а запросы пишутся на собственном, совсем не SQL-подобном языке |
| 8.0 / 8.1 | Новая объектная модель: справочники, документы, регистры как типы. Язык запросов в стиле SQL. Обычные формы |
| 8.2 | Управляемые формы, тонкий клиент и веб-клиент. Появились директивы &НаКлиенте и &НаСервере — код разделился на клиентский и серверный |
| 8.3 | Мобильная платформа, клиент под Linux и macOS, расширения конфигурации (с 8.3.6), HTTP-сервисы, асинхронные Асинх/Ждать (с 8.3.18) |
Главный перелом — переход на управляемые формы в 8.2. До него код формы выполнялся там же, где и вся логика. После — программист обязан явно указать, на клиенте или на сервере работает каждая процедура. Это определяет почти весь стиль современного кода 1С.
Если вы учите язык сейчас, начинайте сразу с управляемых форм и 8.3. Код обычных форм встречается в старых конфигурациях, но новые решения на них не пишут.
Синтаксис языка 1С и ключевые слова
Язык процедурный, с динамической типизацией. Переменную не нужно объявлять с типом: тип определяет значение, которое в неё положили.
Основные конструкции
- 🔹 Процедуры и функции:
Процедура … КонецПроцедуры,Функция … КонецФункции, возврат значения —Возврат. - 🔹 Условия:
Если … Тогда … ИначеЕсли … Иначе … КонецЕсли. Есть и тернарный вариант:?(Условие, Значение1, Значение2). - 🔹 Циклы:
Для Сч = 1 По 10 Цикл,Для Каждого Элемент Из Коллекция Цикл,Пока Условие Цикл. Конец цикла —КонецЦикла, выход —Прервать, переход к следующей итерации —Продолжить. - 🔹 Исключения:
Попытка … Исключение … КонецПопытки, свою ошибку бросают черезВызватьИсключение. - 🔹 Переменные: объявляются через
Перем(необязательно внутри процедуры), сЭкспортстановятся доступны снаружи модуля.
Каждый оператор заканчивается точкой с запятой. Регистр букв не важен: сообщить и Сообщить — одно и то же. Комментарий начинается с //.
Пример на русском и английском
Функция СуммаСНДС(Сумма, Ставка = 20) Экспорт
Если Сумма <= 0 Тогда
Возврат 0;
КонецЕсли;
Возврат Окр(Сумма * (100 + Ставка) / 100, 2);
КонецФункции
Function AmountWithVAT(Amount, Rate = 20) Export
If Amount <= 0 Then
Return 0;
EndIf;
Return Round(Amount * (100 + Rate) / 100, 2);
EndFunction
Для суммы 1 000 и ставки 20 обе функции вернут 1 200. Смешивать языки в одном модуле технически можно, но в типовых конфигурациях пишут по-русски — так проще читать чужой код.
Инструкции препроцессора и области
#Область Имя … #КонецОбласти— группирует код, в редакторе блок сворачивается.#Если Сервер Тогда … #КонецЕсли— часть модуля компилируется только в указанном контексте.
Чего в языке нет
| Привычное по другим языкам | В 1С |
|---|---|
| Свои классы, наследование | Нет. Типы создаются через объекты метаданных в дереве конфигурации |
| Лямбды, анонимные функции | Нет. Есть вызов по имени через Выполнить() и ОписаниеОповещения |
| Статическая типизация | Нет. Тип проверяется во время выполнения |
| Подключение сторонних библиотек пакетом | Нет. Общие модули, внешние компоненты, расширения |
Отсутствие классов многих пугает. На практике роль «класса» играет объект метаданных: справочник Номенклатура сам даёт тип ссылки, тип объекта, менеджер и модуль, куда пишется его поведение.
Где выполняется код: клиент, сервер и директивы компиляции
Это самый важный раздел для понимания, как устроен язык 1С:Предприятия 8 сейчас. Один и тот же модуль формы содержит процедуры, которые физически работают на разных компьютерах.
Директивы компиляции
| Директива | Где работает | Что доступно |
|---|---|---|
&НаКлиенте | На компьютере пользователя | Данные формы, интерактивные действия, диалоги |
&НаСервере | На сервере 1С | Данные формы и база. Форма передаётся на сервер целиком |
&НаСервереБезКонтекста | На сервере 1С | Только база и переданные параметры, данные формы не передаются |
&НаКлиентеНаСервереБезКонтекста | И там, и там | Только переданные параметры |
Каждый вызов с клиента на сервер — это сетевой запрос. Отсюда главное правило производительности: собирать работу в один серверный вызов, а не дёргать сервер в цикле.
&НаКлиенте
Процедура Рассчитать(Команда)
Итог = ПосчитатьНаСервере(Объект.Ссылка);
Сообщить("Итого: " + Формат(Итог, "ЧДЦ=2"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПосчитатьНаСервере(Ссылка)
// работа с базой: запрос, чтение объекта
Возврат 0;
КонецФункции
Здесь &НаСервереБезКонтекста выбран намеренно: форма не уходит на сервер, передаётся только ссылка. Для формы с большой табличной частью разница в скорости заметна.
Общие модули и их флаги
Общие модули не используют директивы перед каждой процедурой. Контекст задаётся флажками в свойствах модуля: Сервер, Клиент (управляемое приложение), Вызов сервера, Внешнее соединение, Привилегированный, Глобальный. Флаг Вызов сервера разрешает вызывать экспортные процедуры модуля с клиента.
Асинхронность
В веб-клиенте нельзя заблокировать браузер модальным окном. Поэтому вопросы и диалоги в современном коде либо работают через ОписаниеОповещения с процедурой-обработчиком, либо, начиная с 8.3.18, через Асинх и Ждать:
&НаКлиенте
Асинх Процедура Удалить(Команда)
Ответ = Ждать ВопросАсинх("Удалить строку?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
// удаление
КонецЕсли;
КонецПроцедуры
Язык запросов 1С: как код работает с базой
Читать данные можно двумя путями: через объектную модель (Справочники.Номенклатура.НайтиПоКоду("00001")) или через запрос. Для выборок больше пары записей правильный путь — запрос.
Как выглядит запрос в коде
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%бумага%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Результат можно обойти выборкой, как выше, или выгрузить в таблицу значений методом Выгрузить().
Чем язык запросов 1С отличается от SQL
- 📌 Обращается к объектам метаданных, а не к таблицам СУБД:
Справочник.Номенклатура,Документ.РеализацияТоваровУслуг. - 📌 Разыменование через точку:
Документ.Контрагент.ИНН— платформа сама построит соединение. - 📌 Виртуальные таблицы регистров:
Остатки,Обороты,ОстаткиИОбороты,СрезПоследних. Считать остатки вручную по движениям не нужно. - 📌 Только чтение.
UPDATEиDELETEнет — запись идёт через объекты и наборы записей. - 📌 Пакетные запросы и временные таблицы (
ПОМЕСТИТЬ) для сложных выборок.
Запросы транслируются в SQL конкретной СУБД: Microsoft SQL Server, PostgreSQL, IBM Db2, Oracle или в файловую базу . Поэтому один и тот же код работает на любой из них.
Запрос внутри цикла по строкам документа — классическая причина тормозов. Соберите все ключи в массив, передайте параметром и сделайте один запрос с условием В (&Список).
Писать текст запроса руками необязательно: в Конфигураторе и EDT есть конструктор запроса, который собирает текст по таблицам и полям мышкой.
Типы данных и объектная модель
Примитивные типы
Число, Строка, Дата, Булево, Неопределено, Null, Тип. Даты задаются литералом '20261007' или функцией Дата(2026, 10, 7). Null приходит из запросов, когда поля нет, — его проверяют ЕСТЬNULL() в запросе или сравнением в коде.
Универсальные коллекции
| Коллекция | Когда брать |
|---|---|
Массив | Упорядоченный список значений |
Структура | Набор именованных полей, ключи — строки-идентификаторы |
Соответствие | Словарь, ключом может быть любое значение, например ссылка |
СписокЗначений | Список с представлением и пометкой, часто для выбора в форме |
ТаблицаЗначений | Таблица в памяти: сортировка, свёртка, поиск по колонкам |
ДеревоЗначений | Иерархические данные |
Прикладные типы из метаданных
Каждый объект конфигурации порождает несколько типов. Для справочника Контрагенты:
СправочникСсылка.Контрагенты— ссылка, хранится в реквизитах и регистрах;СправочникОбъект.Контрагенты— объект для изменения и записи;СправочникМенеджер.Контрагенты— доступен черезСправочники.Контрагенты, ищет и создаёт элементы.
Чтобы изменить элемент, ссылку превращают в объект: Объект = Ссылка.ПолучитьОбъект();, меняют реквизиты и вызывают Объект.Записать();. Логику объекта пишут в модуле объекта — в обработчиках ПередЗаписью, ОбработкаПроведения и других событий.
Обращение к реквизиту через точку у ссылки (Ссылка.ИНН) каждый раз читает объект из базы. Для одного поля это нормально, для сотни в цикле — используйте запрос.
Интеграция 1С с внешними системами и компоненты
Встроенный язык закрывает почти все сценарии обмена без сторонних инструментов.
Встроенные механизмы
- 🌐 HTTP-сервисы — база сама отдаёт REST-подобный API, обработчики пишутся на встроенном языке.
- 🌐 Веб-сервисы (SOAP) — для систем, которым нужен WSDL.
- 🌐 OData — стандартный интерфейс, открывает объекты конфигурации для чтения и записи без кода.
- 🌐
HTTPСоединение— исходящие запросы к чужим API. - 🌐 JSON и XML —
ЧтениеJSON,ЗаписьJSON,ЧтениеXML,ЗаписьXML, а также XDTO. - 🌐 COM-соединение — внешняя программа подключается к базе через
V83.COMConnectorи выполняет код 1С.
Внешние компоненты
Если встроенного языка не хватает — работа с оборудованием, криптографией, специфичными библиотеками, — подключают внешнюю компоненту. Современный вариант — технология Native API: компонента пишется на C++ и работает на Windows, Linux и в мобильной платформе. Старый вариант — COM-компоненты, только Windows.
Подключение в коде — ПодключитьВнешнююКомпоненту() или асинхронный ПодключитьВнешнююКомпонентуАсинх() на клиенте.
Внешние обработки и расширения
- 📦 Внешние обработки и отчёты (
.epf,.erf) — код на встроенном языке, который запускают без изменения конфигурации. - 📦 Расширения (
.cfe) — дорабатывают типовую конфигурацию , не снимая её с поддержки. Можно перехватить процедуру типового модуля аннотациями&Перед,&После,&Вместо.
Для доработок типовых БП 3.0, ЗУП 3.1 или УТ 11 расширение — основной способ сегодня: обновление типовой конфигурации проходит без ручного сравнения и объединения.
Инструменты: в чём пишут и отлаживают код 1С
Две среды разработки
| Конфигуратор | 1C:Enterprise Development Tools (EDT) | |
|---|---|---|
| Что это | Встроенный режим платформы | Отдельная среда на базе Eclipse |
| Хранение | В базе или в хранилище конфигурации | Исходники в файлах проекта |
| Командная работа | Хранилище конфигурации с захватом объектов | Git: ветки, слияние, ревью |
| Требования | Скромные | Нужно больше памяти, ориентир — от 8 ГБ |
Конфигуратор запускают из окна запуска 1С кнопкой Конфигуратор. EDT ставится отдельно и работает с базой через подключение к информационной базе.
Отладка
- 🐞 Точки останова —
F9в Конфигураторе, условные точки останова по выражению. - 🐞 Пошаговое выполнение — шаг с заходом, шаг через, выход из процедуры.
- 🐞 Вычисление выражений и табло — просмотр значений переменных и коллекций в момент останова.
- 🐞 Замер производительности — показывает, сколько времени заняла каждая строка кода. Первый инструмент при жалобе «тормозит».
- 🐞 Отладка серверного кода — для клиент-серверной базы на сервере 1С включается отладка, после этого серверные процедуры останавливаются на точках так же, как клиентские.
Включение отладки на рабочем сервере 1С требует перезапуска службы сервера — у всех пользователей оборвутся сеансы. Делайте это на тестовом сервере или в согласованное окно.
Что ещё помогает
- Синтакс-помощник — встроенный справочник всех типов, методов и свойств с описанием параметров. Открывается из меню
СправкаКонфигуратора. - Проверка конфигурации — находит ошибки компиляции во всех контекстах сразу, а не только в том, который вы запустили.
- Автотесты — открытый проект Vanessa Automation для сценарных тестов на языке Gherkin.
- OneScript — независимая открытая реализация языка 1С для скриптов вне платформы. Удобна для автоматизации сборки и деплоя, но объектов конфигурации в ней нет.