Встроенный язык 1С:Предприятия 8 — как на нём пишут конфигурации

· 10 мин

Содержание

Конфигурации 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С для скриптов вне платформы. Удобна для автоматизации сборки и деплоя, но объектов конфигурации в ней нет.
Проверьте себя
Какая директива не передаёт данные формы на сервер?
Можно ли изменить данные в базе запросом 1С?
С какой версии платформы есть расширения конфигурации?

Частые вопросы о языке программирования 1С

Встроенный язык 1С компилируется или интерпретируется?
Модули компилируются платформой во внутренний байт-код, который исполняет виртуальная машина 1С. Исполняемого файла на выходе нет, код хранится в конфигурации.
Нужно ли знать SQL, чтобы писать на 1С?
Нет, но знание SQL заметно ускоряет освоение языка запросов: соединения, группировки и подзапросы устроены похоже. Отличия — обращение к метаданным, виртуальные таблицы и запрет на запись.
Можно ли писать конфигурации 1С на Python или C#?
Нет. Логика конфигурации пишется только на встроенном языке. Другие языки подключаются снаружи: через HTTP-сервисы, COM-соединение или внешние компоненты на C++.
Где учебная версия для практики?
У фирмы 1С есть учебная версия платформы для изучения программирования. Она бесплатна и работает с ограничениями по объёму данных, но для освоения синтаксиса, запросов и форм её хватает.
Чем язык 1С 8.3 отличается от языка 7.7?
Синтаксис операторов похож, но объектная модель, язык запросов и разделение на клиент и сервер в 8.х другие. Код 7.7 в 8.3 напрямую не переносится, его переписывают.