На чём пишут в 1С:Предприятии 8.3 и как устроен встроенный язык
Содержание
В 1С 8.3 программируют на встроенном языке 1С:Предприятия. Это собственный язык платформы: синтаксис похож на Pascal и Visual Basic, ключевые слова можно писать по-русски или по-английски, типизация динамическая. Код исполняет сама платформа, отдельный компилятор или среда выполнения не нужны.
Для выборки данных рядом работает второй язык — язык запросов. Он похож на SQL, но только читает данные и знает про объекты конфигурации: справочники, документы, регистры. Программист 1С пишет на обоих языках одновременно, часто в одном и том же модуле.
Откуда взялся встроенный язык 1С и как он менялся
Язык появился вместе с платформой 1С:Предприятие 7.x и с тех пор развивается без смены основы. Ключевые слова Процедура, Если, Цикл разработчик 7.7 узнает и в 8.3. Поменялось окружение: объектная модель, формы, место выполнения кода.
Основные вехи:
- 📦 Версия 7.x — язык уже был, но объектов мало, формы обычные, весь код работает в одном процессе.
- 🧱 Платформа 8.0–8.1 — появились прикладные объекты метаданных (справочники, документы, регистры) со своими модулями, язык запросов в нынешнем виде, клиент-серверный вариант на СУБД.
- 🌐 Платформа 8.2 — управляемые формы и тонкий клиент. Код формы разделился на клиентский и серверный, появились директивы компиляции
&НаКлиентеи&НаСервере. - 🚀 Платформа 8.3 — интерфейс «Такси», веб-клиент и мобильная платформа, расширения конфигурации
(с 8.3.6), асинхронные
АсинхиЖдать(с 8.3.18).
Тот же синтаксис используют и вне платформы. OneScript — независимый открытый интерпретатор языка 1С для скриптов автоматизации: сборки, деплоя, выгрузки отчётов. Он запускается без лицензии 1С, но объектов конфигурации там нет.
Синтаксис языка 1С 8.3: конструкции и структура модуля
Язык не чувствителен к регистру: Сообщить, сообщить и СООБЩИТЬ — одно и то же. Операторы разделяются точкой с запятой, комментарий начинается с //. Блоки закрываются парным словом: КонецЕсли, КонецЦикла, КонецПроцедуры.
Процедуры и функции
Процедура выполняет действия, функция возвращает значение через Возврат. Слово Экспорт делает метод доступным из других модулей. Параметры по умолчанию передаются по ссылке; Знач перед именем передаёт копию значения.
// Сумма с НДС, округление до копеек
Функция СуммаСНДС(Знач Сумма, СтавкаПроцент = 20) Экспорт
Возврат Окр(Сумма * (100 + СтавкаПроцент) / 100, 2);
КонецФункции
Вызов СуммаСНДС(1000) вернёт 1200, а СуммаСНДС(1000, 10) — 1100.
Условия, циклы и исключения
| Конструкция | Синтаксис | Английский вариант |
|---|---|---|
| Условие | Если … Тогда … ИначеЕсли … Иначе … КонецЕсли; | If … Then … ElsIf … Else … EndIf; |
| Цикл со счётчиком | Для Сч = 1 По 10 Цикл … КонецЦикла; | For … To … Do … EndDo; |
| Перебор коллекции | Для Каждого Элемент Из Коллекция Цикл … КонецЦикла; | For Each … In … Do … EndDo; |
| Цикл с условием | Пока Условие Цикл … КонецЦикла; | While … Do … EndDo; |
| Обработка ошибок | Попытка … Исключение … КонецПопытки; | Try … Except … EndTry; |
| Тернарный оператор | ?(Условие, Значение1, Значение2) | ?(…) |
Внутри циклов работают Прервать и Продолжить. Пример обработки ошибки записи с фиксацией в журнале регистрации:
Попытка
СправочникОбъект.Записать();
Исключение
ЗаписьЖурналаРегистрации("Запись контрагента",
УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение без параметров пробрасывает ошибку дальше. Так пользователь видит сообщение, а администратор находит подробности в журнале.
Из чего состоит модуль
Модуль — это текст кода, привязанный к объекту конфигурации. Порядок внутри него фиксирован:
- Раздел объявления переменных (
Перем ИмяПеременной;). - Раздел процедур и функций.
- Раздел основной программы — операторы, которые выполняются при создании объекта.
Для навигации код делят на области #Область ИмяОбласти … #КонецОбласти. Их сворачивает редактор, на исполнение они не влияют. Инструкции препроцессора #Если Сервер Тогда … #КонецЕсли отсекают код, который не должен компилироваться в определённом окружении.
Где живёт код в конфигурации:
- 📄 Модуль объекта — события конкретного документа или элемента:
ПередЗаписью,ОбработкаПроведения,ОбработкаЗаполнения. - 🗂️ Модуль менеджера — методы уровня всего справочника или документа, например печать или поиск.
- 🖼️ Модуль формы — обработчики кнопок и полей.
- 🔧 Общие модули — библиотеки процедур, которые вызывают из любого места.
- ⚙️ Модули приложения и сеанса — код при запуске программы и установке параметров сеанса.
Типы данных и коллекции во встроенном языке
Переменная получает тип в момент присвоения. Одна и та же переменная может сначала хранить число, а потом строку. Проверка типа — через ТипЗнч(Значение) = Тип("Строка").
Примитивные и ссылочные типы
| Тип | Пример литерала | Что важно знать |
|---|---|---|
| Число | 1500.75 | Десятичная точка, длину и точность задают в метаданных |
| Строка | "Счёт № 15" | Кавычка внутри строки удваивается: "ООО ""Ромашка""" |
| Дата | '20260115' | Хранит и дату, и время; пустая дата — '00010101' |
| Булево | Истина, Ложь | — |
| Неопределено | Неопределено | Значение «ничего не присвоено» |
| Null | NULL | Приходит из запросов при пустом соединении таблиц |
| Ссылка | Справочники.Валюты.ПустаяСсылка() | Указатель на объект базы: СправочникСсылка.Валюты |
Ссылка — главное отличие 1С от языков общего назначения. Через неё читают реквизиты прямо через точку: Документ.Контрагент.ИНН. Каждое такое обращение — скрытый запрос к базе, поэтому в цикле по тысяче строк оно тормозит.
Универсальные коллекции
- 📋 Массив — упорядоченный список с индексом от 0.
Массив.Количество(),Массив.Добавить(). - 🔑 Структура — пары «ключ — значение», ключ только строка-идентификатор:
Новый Структура("Код, Наименование", "001", "Бумага"). - 🗺️ Соответствие — то же, но ключом может быть любое значение, включая ссылку.
- 📑 СписокЗначений — массив с представлениями и пометками, удобен для выбора в форме.
- 📊 ТаблицаЗначений — таблица в памяти с колонками, сортировкой, поиском и сворачиванием (
Свернуть("Товар", "Количество, Сумма")). - 🌳 ДеревоЗначений — иерархия строк, например для группировок.
У массива, структуры и соответствия есть фиксированные варианты — ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие. Их нельзя изменить, поэтому их удобно возвращать из кешируемых функций.
Удаляйте элементы из коллекции обратным циклом. Прямой цикл с удалением пропускает элементы, потому что индексы сдвигаются.
Всего = Товары.Количество();
Для Сч = 1 По Всего Цикл
Индекс = Всего - Сч;
Если Товары[Индекс].Количество = 0 Тогда
Товары.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
Границу Всего считают один раз до цикла. Элементы с индексом выше текущего уже проверены, поэтому их сдвиг ничего не ломает.
Где выполняется код: клиент, сервер и директивы компиляции
В 8.3 код формы выполняется в двух местах. Клиент — компьютер пользователя (тонкий клиент или браузер). Сервер — сервер 1С, а в файловом варианте серверная часть работает в том же процессе, но правила разделения действуют так же.
Место выполнения метода формы задаёт директива перед ним:
| Директива | Где выполняется | Доступ к данным формы | Когда применять |
|---|---|---|---|
&НаКлиенте | На клиенте | Да | Реакция на нажатия, диалоги, работа с полями |
&НаСервере | На сервере | Да, форма передаётся на сервер | Нужны и данные формы, и база |
&НаСервереБезКонтекста | На сервере | Нет, только параметры | Запрос к базе по одному-двум значениям |
&НаКлиентеНаСервереБезКонтекста | Там, откуда вызвали | Нет | Простые расчёты, нужные с обеих сторон |
Каждый вызов с клиента на сервер — сетевой обмен. &НаСервере вдобавок гоняет туда и обратно всю форму с табличными частями. Поэтому серверную логику по возможности выносят в &НаСервереБезКонтекста или в общий модуль.
&НаКлиенте
Процедура ПоказатьОстаток(Команда)
Количество = ОстатокТовараНаСервере(Объект.Номенклатура);
Сообщить("Остаток: " + Формат(Количество, "ЧДЦ=3; ЧН=0"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОстатокТовараНаСервере(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК Остатки";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Количество;
КонецФункции
Регистр ТоварыНаСкладах здесь условный, в вашей конфигурации имя будет своим. Запрос с агрегатом без группировки всегда возвращает одну строку, поэтому Следующий() без проверки безопасен.
У общих модулей место выполнения задают флажки в свойствах: Клиент (управляемое приложение), Сервер, Вызов сервера, Внешнее соединение, Привилегированный, Глобальный. Флаг Вызов сервера разрешает вызывать серверные процедуры модуля с клиента. Без него экспортная процедура серверного модуля с клиента не видна.
Привилегированный модуль выполняется без проверки прав. Не кладите туда код, который пишет данные по параметрам, пришедшим с клиента без проверки.
Сериализуемые значения — числа, строки, ссылки, массивы, структуры — проходят между клиентом и сервером. ТаблицаЗначений, объект Запрос и СправочникОбъект на клиенте недоступны: их создают и обрабатывают на сервере, а на клиент возвращают результат.
Язык запросов 1С и чем он отличается от SQL
Запрос пишут строкой и выполняют через объект Запрос. Текст похож на SQL: ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, ОБЪЕДИНИТЬ ВСЕ, соединения ЛЕВОЕ СОЕДИНЕНИЕ. Платформа переводит его в SQL нужной СУБД: MS SQL Server, PostgreSQL, Oracle, IBM DB2 или в обращения к файловой базе.
| Признак | SQL | Язык запросов 1С |
|---|---|---|
| Изменение данных | INSERT, UPDATE, DELETE | Нет, только чтение. Запись — через объекты встроенного языка |
| Источники | Таблицы СУБД | Объекты конфигурации: Справочник.Контрагенты, Документ.РеализацияТоваровУслуг |
| Связанные данные | Явный JOIN | Разыменование через точку: Контрагент.ГоловнойКонтрагент.ИНН |
| Остатки и обороты | Считать самому | Виртуальные таблицы Остатки, Обороты, СрезПоследних |
| Параметры | Зависит от драйвера | &ИмяПараметра + УстановитьПараметр() |
| Промежуточные итоги | ROLLUP, оконные функции | ИТОГИ ПО … ИЕРАРХИЯ |
| Временные таблицы | #temp, CREATE TEMP | ПОМЕСТИТЬ ИмяТаблицы в пакете запросов через ; |
Полезные функции: ЕСТЬNULL(Поле, 0) заменяет NULL, ВЫРАЗИТЬ(Поле КАК Строка(100)) приводит тип, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) обрезает дату, ВЫБОР КОГДА … ТОГДА … КОНЕЦ работает как CASE.
Три приёма, которые отличают опытного разработчика:
- Параметры виртуальной таблицы задают в скобках, а не в
ГДЕ.Остатки(&Дата, Склад = &Склад)отбирает данные до расчёта остатков,ГДЕ— после, на порядок медленнее. - Длинные цепочки через точку по составным типам порождают лишние соединения. Нужное поле лучше выбрать один раз во временную таблицу.
- Запрос в цикле заменяют одним запросом с условием
В (&СписокСсылок).
Текст запроса удобно собирать конструктором запроса: в модуле нажмите правой кнопкой внутри строки запроса и выберите Конструктор запроса. Он показывает таблицы конфигурации, поля и связи, а готовый текст вставляет обратно.
Инструменты разработки и отладка кода 1С
Основная среда — Конфигуратор: он запускается из окна выбора баз кнопкой Конфигуратор. В нём дерево метаданных, редактор модулей с подсветкой и контекстной подсказкой, конструкторы форм и запросов.
Синтакс-помощник (Справка → Синтакс-помощник) — встроенный справочник по всем объектам и методам. Каждая статья указывает, где метод доступен: тонкий клиент, сервер, веб-клиент, мобильное приложение. Это первое место, куда смотреть при ошибке «метод не найден» на клиенте.
Альтернатива Конфигуратору — 1С:Enterprise Development Tools (EDT). Это среда на базе Eclipse: проект хранится в файлах, работает с Git, есть рефакторинг и проверки кода. Для командной разработки EDT удобнее, для правки одной базы большинство остаются в Конфигураторе.
Как отлаживать
- 🔴 Точки останова —
F9на строке модуля, затем запуск отладки из менюОтладка → Начать отладку. На остановке видно значения переменных, можно идти по шагам. - 🧮 Вычисление выражений — в режиме остановки вычисляет любое выражение и показывает содержимое коллекций и таблиц.
- ⏱️ Замер производительности — включается в меню
Отладкаи показывает, какие строки кода заняли больше всего времени и сколько раз выполнялись. - 📒 Журнал регистрации — ошибки пользователей и записи из
ЗаписьЖурналаРегистрации. - 🛠️ Технологический журнал — настраивается файлом
logcfg.xml, пишет запросы к СУБД, блокировки и исключения на сервере. Это инструмент для разбора тормозов в клиент-серверных базах.
Чтобы отлаживать код на сервере 1С, отладку нужно разрешить на самом сервере: агент запускают с ключом -debug. Без этого точки останова в серверных процедурах в клиент-серверной базе не срабатывают.
Перезапуск службы агента сервера, чтобы добавить ключ -debug, обрывает все сеансы пользователей. Делайте это на тестовом сервере или в нерабочее время.
Для автоматических тестов сообщество использует открытые инструменты. Например, Vanessa Automation прогоняет сценарии на языке Gherkin прямо через интерфейс клиента.
Частые ошибки при программировании на 1С
- ❌ Запрос в цикле. 500 строк табличной части — 500 обращений к базе. Соберите ссылки в массив и выполните один запрос.
- ❌ Чтение реквизитов через точку на клиенте. В управляемой форме
Объект.Контрагент.ИННна клиенте не сработает: реквизиты ссылки читают на сервере. - ❌ Лишний
&НаСервере. Метод не использует данные формы, но объявлен с контекстом — каждый вызов гонит форму целиком. - ❌ Склеивание числа со строкой без
Формат."Итого: " + 1500000даст строку с неразрывными пробелами между разрядами, это ломает выгрузки. ИспользуйтеФормат(Число, "ЧГ=0"). - ❌ Правка типовой конфигурации напрямую. Снятие с поддержки усложняет каждое обновление. Доработки делайте в расширении конфигурации.
- ❌ Пустая обработка исключения.
Попытка … Исключение КонецПопытки;без записи в журнал скрывает ошибку, и её потом ищут неделями.
Частые вопросы
Встроенный язык 1С — это компилируемый или интерпретируемый язык?
Можно ли писать код 1С на английском?
Procedure, If, Message. Можно смешивать варианты в одном модуле, но в типовых конфигурациях принят русский.