Встроенный язык 1С:Предприятия 8.3 — синтаксис, объекты, клиент и сервер

· 11 мин

Содержание

Язык программирования 1С — это встроенный язык платформы 1С:Предприятие 8.3. На нём пишут логику типовых конфигураций: Бухгалтерии, ЗУП, Управления торговлей, ERP. Код живёт внутри конфигурации, в модулях объектов, форм и общих модулях. Отдельно от платформы он не запускается. Синтаксис похож на Visual Basic и Pascal, только ключевые слова по умолчанию русские: Если … Тогда, Для Каждого … Из … Цикл, КонецПроцедуры.

Главная особенность языка — он заточен под учётные задачи. Справочники, документы, регистры и проводки уже есть в платформе как готовые типы объектов. Программист не проектирует таблицы базы данных и не пишет код подключения к СУБД. Он описывает объекты в дереве конфигурации, а на языке задаёт их поведение: что проверить при записи, какие движения сделать при проведении, как заполнить форму.

Как выглядит синтаксис языка 1С

Код состоит из процедур и функций. Процедура просто выполняет действия, функция возвращает значение через Возврат. Строки заканчиваются точкой с запятой, комментарии начинаются с //. Регистр букв в именах не важен: Сумма и СУММА — одна и та же переменная.

// Считает сумму с НДС по ставке в процентах
Функция СуммаСНДС(Сумма, Ставка) Экспорт
	Если Ставка = 0 Тогда
		Возврат Сумма;
	КонецЕсли;
	Возврат Окр(Сумма * (100 + Ставка) / 100, 2);
КонецФункции

Для СуммаСНДС(1000, 20) функция вернёт 1200. Слово Экспорт делает функцию доступной из других модулей. Без него она видна только внутри своего модуля.

Русский и английский синтаксис

У каждого ключевого слова есть английский вариант: Если — If, Процедура — Procedure, Новый Массив — New Array. Оба варианта можно смешивать в одном модуле, платформа поймёт. На практике типовые конфигурации написаны по-русски, и команды, которые их дорабатывают, держатся русского синтаксиса. Вариант встроенного языка для новых модулей задаётся в свойствах конфигурации.

Типы данных и переменные

Язык динамически типизирован. Тип переменной при объявлении не указывают, он определяется значением. В одну и ту же переменную можно сначала положить число, потом строку — ошибки не будет.

  • 🔢 Примитивные типы: Число, Строка, Дата, Булево.
  • ⭕ Особые значения: Неопределено (значение не задано) и Null (чаще всего приходит из запроса, когда в соединении нет записи).
  • 🧩 Ссылочные типы: ссылки на элементы справочников, документы, перечисления — например, СправочникСсылка.Номенклатура.

Переменную можно объявить словом Перем, но обычно её просто создают присваиванием. Параметры процедур передаются по ссылке. Чтобы передать копию значения, перед параметром пишут Знач.

Универсальные коллекции

Без коллекций не обходится ни одна обработка. Основные из них:

КоллекцияДля чегоПример обращения
Массивупорядоченный список значенийМассив[0], Массив.Добавить(Значение)
Структуранабор «ключ — значение» с ключами-строкамиПараметры.Организация
Соответствиеключом может быть любое значение, в том числе ссылкаЦены[Номенклатура]
ТаблицаЗначенийтаблица в памяти с колонкамиТаблица.Добавить(), Таблица.Свернуть(…)
СписокЗначенийсписок с пометками и представлениямивыбор из списка на форме

Индексация массива начинается с нуля. Если в массиве 5 элементов, последний — Массив[4], а Массив.Количество() вернёт 5.

Управляющие конструкции

Набор привычный для любого процедурного языка:

  1. Условие: Если … Тогда … ИначеЕсли … Тогда … Иначе … КонецЕсли;
  2. Цикл со счётчиком: Для Сч = 1 По 10 Цикл … КонецЦикла;
  3. Обход коллекции: Для Каждого Строка Из Таблица Цикл … КонецЦикла;
  4. Цикл с условием: Пока Условие Цикл … КонецЦикла;
  5. Обработка ошибок: Попытка … Исключение … КонецПопытки;, своё исключение — ВызватьИсключение "Текст";

Тернарный оператор записывается так: ?(Условие, ЗначениеЕслиДа, ЗначениеЕслиНет). Склеивать строку с числом лучше через Формат(Число, "ЧГ=0") или СтрШаблон, чтобы не получить неожиданные пробелы-разделители разрядов.

Объекты метаданных и объектная модель

Конфигурация — это дерево объектов метаданных. Его видно в Конфигураторе слева: Справочники, Документы, Регистры, Отчёты, Обработки и так далее. Для каждого такого объекта платформа сама создаёт таблицы в базе и набор типов во встроенном языке.

Какие объекты бывают

  • 📚 Справочники — списки: номенклатура, контрагенты, сотрудники.
  • 📄 Документы — факты хозяйственной жизни: реализация, поступление, начисление зарплаты.
  • 📊 Регистры сведений — данные с привязкой к измерениям и, при необходимости, к дате (например, курсы валют).
  • 📦 Регистры накопления — остатки и обороты: товары на складах, взаиморасчёты.
  • 🧾 Регистры бухгалтерии — проводки по плану счетов.
  • 🧮 Регистры расчёта — начисления и удержания с периодами действия.
  • ⚙️ Константы, перечисления, планы счетов, планы видов характеристик, планы обмена, бизнес-процессы и задачи.

Ссылка, объект, менеджер

У каждого справочника и документа в языке есть несколько типов. Их различие — первое, что нужно усвоить новичку.

ТипЧто этоКогда нужен
Менеджер (Справочники.Номенклатура)точка входа ко всему справочникунайти элемент, создать новый, получить выборку
Ссылка (СправочникСсылка.Номенклатура)указатель на запись в базехранить в реквизитах, передавать в процедуры, читать реквизиты
Объект (СправочникОбъект.Номенклатура)редактируемая копия записи в памятиизменить реквизиты и записать

Пример: найти товар по коду и поменять ему наименование.

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00-00000015");
Если НЕ Ссылка.Пустая() Тогда
	Объект = Ссылка.ПолучитьОбъект();
	Объект.Наименование = "Бумага офисная А4";
	Объект.Записать();
КонецЕсли;

Имя справочника и формат кода здесь условные, в вашей конфигурации они могут быть другими.

Модули и события

Код привязывается к объектам через модули. В модуле объекта пишут обработчики событий: ПередЗаписью, ОбработкаПроведения, ОбработкаЗаполнения. В модуле менеджера — процедуры, которые работают со всем справочником или документом. Модуль формы отвечает за поведение конкретного окна. Общие модули хранят процедуры, которые вызывают отовсюду.

Есть и модули уровня приложения: модуль сеанса (выполняется на сервере при старте сеанса) и модуль управляемого приложения (на клиенте). В типовых конфигурациях в них мало прикладного кода — основную логику держат в общих модулях.

Язык запросов: как код получает данные

Читать большие объёмы данных перебором объектов в цикле медленно. Для этого в 1С есть отдельный язык запросов. Он похож на SQL, но работает не с таблицами СУБД, а с объектами конфигурации и тоже имеет русские ключевые слова.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Контрагенты.Ссылка КАК Контрагент,
|	Контрагенты.ИНН КАК ИНН
|ИЗ
|	Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|	НЕ Контрагенты.ПометкаУдаления
|	И Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7700000000");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Выборка.Контрагент);
КонецЦикла;

Что в языке запросов есть сверх обычного SQL:

  • 🔗 Обращение через точку к реквизитам ссылок: Документ.Контрагент.ИНН — платформа сама построит соединение.
  • 📈 Виртуальные таблицы регистров: Остатки, Обороты, ОстаткиИОбороты, СрезПоследних с параметрами периода.
  • 🗂 Временные таблицы и пакетные запросы — несколько запросов за одно обращение к базе.
  • 🔐 Автоматическое наложение ограничений доступа на уровне записей (RLS), если их настроили в ролях.

Отчёты в типовых конфигурациях строят на системе компоновки данных (СКД). Запрос в ней — источник, а группировки, отборы и оформление настраивает пользователь без программирования.

Писать текст запроса вручную не обязательно. В Конфигураторе есть конструктор запроса: он вызывается из контекстного меню модуля и собирает текст по выбранным таблицам и полям.

Клиент и сервер: где выполняется код

В 8.3 с управляемыми формами код делится на клиентский и серверный. Клиент — это тонкий клиент или браузер у пользователя. Сервер — сервер 1С или, в файловом варианте, тот же компьютер, но в отдельном серверном контексте. Где выполнять процедуру, указывает директива компиляции перед её объявлением.

ДирективаГде выполняетсяЧто доступно
&НаКлиентена клиентеформа и её данные, интерактивные действия; запросы недоступны
&НаСерверена серверебаза данных и данные формы, переданные с клиента
&НаСервереБезКонтекстана серверебаза данных, но без данных формы
&НаКлиентеНаСервереБезКонтекстатам, откуда вызвалитолько то, что есть в обоих контекстах

Типовой шаблон команды формы выглядит так:

&НаКлиенте
Процедура Заполнить(Команда)
	ЗаполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()
	// здесь запрос к базе и заполнение табличной части формы
КонецПроцедуры

Почему серверные вызовы дорогие

Каждый переход с клиента на сервер — это сетевой запрос. Если форма в цикле по 200 строкам вызывает серверную функцию, будет 200 обращений, и через интернет или терминал это заметно тормозит.

Что делают опытные разработчики:

  1. Собирают все нужные данные за один серверный вызов и возвращают их структурой.
  2. Предпочитают &НаСервереБезКонтекста, когда данные формы не нужны: с клиента на сервер не гоняется вся форма.
  3. Не пишут запросы в цикле. Вместо 200 запросов по одной ссылке — один запрос с условием В (&Список).
  4. Не читают реквизиты через точку от ссылки на клиенте — в управляемом приложении это не работает . На сервере точка тоже читает объект целиком, поэтому в типовых конфигурациях используют функции Библиотеки стандартных подсистем вроде ОбщегоНазначения.ЗначенияРеквизитовОбъекта.
Проверьте себя
Где нельзя выполнить запрос к базе данных?
Какой тип позволяет изменить реквизиты элемента справочника и записать его?
С какого номера начинается индексация массива в 1С?

Расширения, внешние обработки и компоненты

Менять типовую конфигурацию напрямую невыгодно: каждое обновление превращается в сравнение и объединение. Поэтому в 8.3 доработки стараются выносить наружу.

Расширения конфигурации

Расширения появились в платформе 8.3.6. Это отдельный слой поверх основной конфигурации: в нём можно добавить свои объекты, реквизиты, формы и перехватить типовые процедуры. Основная конфигурация при этом остаётся на поддержке, и обновлять её проще.

Перехват делается аннотациями:

&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
	Если ПустаяСтрока(ЭтотОбъект.Наименование) Тогда
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

Кроме &После есть &Перед, &Вместо и &ИзменениеИКонтроль. Последняя копирует текст типовой процедуры и подсвечивает правки — если после обновления типовой код изменится, платформа сообщит об этом при проверке расширения.

Внешние обработки и отчёты

Файлы .epf и .erf подключают без изменения конфигурации. В типовых решениях для этого есть раздел Администрирование → Печатные формы, отчеты и обработки. Так обычно делают свои печатные формы, загрузки из Excel и разовые обработки данных.

Интеграция и внешние компоненты

  • 🌐 HTTP-сервисы и веб-сервисы — 1С отдаёт и принимает данные по HTTP, их публикуют на веб-сервере.
  • 🔌 HTTPСоединение — обращение 1С к внешним REST API.
  • 🧱 Внешние компоненты по технологии Native API — библиотеки на C++ для торгового оборудования, сканеров и нестандартных задач. Старые компоненты бывают на COM, они работают только в Windows.
  • 🔁 COM-соединение — подключение к базе 1С из внешней программы на Windows.

Отладка и проверка кода

Отладчик встроен в Конфигуратор. Запустите базу из Конфигуратора в режиме отладки, поставьте точку останова (F9) на нужной строке и выполните действие в программе. Выполнение остановится, и можно смотреть значения переменных.

Основные приёмы:

  • 🐞 Пошаговое выполнение: F11 — зайти внутрь процедуры, F10 — перешагнуть.
  • 👁 Табло и «Вычислить выражение» (Shift+F9) — посмотреть значение любой переменной или выражения, в том числе содержимое таблицы значений.
  • ⏱ Замер производительности — показывает, какие строки кода съели больше всего времени. Первое, что смотрят при жалобе «документ долго проводится».
  • 📜 Технологический журнал — лог платформы на сервере: долгие запросы, блокировки, исключения. Настраивается файлом logcfg.xml.
  • ✅ Синтаксический контроль и проверка конфигурации в Конфигураторе — ловят неизвестные переменные, ошибки директив и вызовы, недоступные на клиенте.

Отлаживайте на копии базы. Если остановить код на точке останова внутри транзакции в рабочей базе, другие пользователи будут ждать на блокировках, пока вы не продолжите выполнение.

Для отладки серверного кода в клиент-серверном варианте отладку нужно разрешить на сервере 1С. В актуальных релизах 8.3 для этого используют отладку по протоколу HTTP через сервер отладки.

Чем язык 1С отличается от других языков

1С часто сравнивают с универсальными языками, и сравнение не всегда честное: это предметно-ориентированный язык внутри платформы.

Вопрос1СPython, Java, C#
Работа с базойобъекты метаданных и язык запросов из коробкиORM или SQL подключают отдельно
Интерфейсформы описываются декларативно, платформа рисует их сама для клиента и браузераотдельные фреймворки
Типизациядинамическаяу Python динамическая, у Java и C# статическая
ООПнет своих классов и наследования, объектная модель задана платформойполноценные классы
Где запускаетсятолько внутри 1С:Предприятиягде угодно
Ключевые словарусские или английскиеанглийские

Отсутствие классов — самое частое удивление программистов, пришедших из других языков. Повторное использование кода в 1С строится на общих модулях и библиотеках вроде БСП, а «наследование» заменяют расширения и подписки на события.

Плюс языка — скорость прикладной разработки. Справочник с формой, правами и отчётом делается за час, без проектирования базы и интерфейса. Минус — знания мало переносятся за пределы экосистемы 1С.

Экосистема и развитие языка

Платформа 8.3 развивается непрерывно, новые релизы добавляют методы и объекты встроенного языка. Сам синтаксис меняется редко: код, написанный десять лет назад, в большинстве случаев компилируется и сейчас.

Вокруг языка сложилась своя инфраструктура:

  • 🛠 Конфигуратор — классическая среда разработки, встроенная в платформу.
  • 🧭 1С:Enterprise Development Tools (EDT) — среда на базе Eclipse: хранение конфигурации в файлах, работа с Git, рефакторинг, проверки кода на лету.
  • 📏 Стандарты разработки — правила оформления и проектирования кода, которых придерживаются в типовых конфигурациях.
  • 🔍 Статический анализ — АПК (автоматизированная проверка конфигураций) и открытый BSL Language Server, который работает в VS Code и SonarQube.
  • 🧪 Тестирование — сообщество использует, например, Vanessa-Automation для сценарных тестов на русском языке .
  • 🧱 Библиотека стандартных подсистем (БСП) — общий фундамент типовых конфигураций: пользователи, права, печать, обмены, общие функции.

Отдельно фирма 1С развивает платформу 1С:Предприятие.Элемент для облачных приложений. У неё свой язык, похожий по духу, но не совместимый с встроенным языком 8.3 напрямую. Для работы с Бухгалтерией, ЗУП и ERP по-прежнему нужен именно язык 8.3.

С чего начать изучение

  1. Поставьте учебную версию платформы — она бесплатна и не требует лицензии, но ограничена по объёму данных.
  2. Создайте пустую конфигурацию, добавьте справочник, документ и регистр накопления.
  3. Напишите обработку проведения документа и отчёт на СКД по регистру.
  4. Откройте модуль типового документа в демо-базе и пройдите его отладчиком построчно.
Язык 1С — это настоящий язык программирования?
Да. Он полный по возможностям: переменные, условия, циклы, процедуры, обработка исключений. Но он предметно-ориентированный и работает только внутри платформы 1С:Предприятие.
Можно ли писать на 1С по-английски?
Да, у каждого ключевого слова и метода есть английское имя. Русский и английский синтаксис совместимы и могут встречаться в одном модуле.
Есть ли в 1С классы и наследование?
Нет. Объектную модель задаёт платформа через объекты метаданных. Свои классы объявить нельзя, общий код выносят в общие модули.
Чем язык запросов 1С отличается от SQL?
Он обращается к объектам конфигурации, а не к таблицам СУБД, умеет читать реквизиты через точку и даёт виртуальные таблицы регистров с остатками и оборотами. Писать в базу через запрос нельзя — только читать.
Где хранится код конфигурации?
В самой информационной базе, вместе с данными. Выгрузить его в файлы можно командой Конфигурация → Выгрузить конфигурацию в файлы или работать в EDT, где проект изначально хранится в файлах.