На чём пишут в 1С:Предприятии 8.3 и как устроен встроенный язык

· 10 мин

Содержание

В 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)?(…)

Внутри циклов работают Прервать и Продолжить. Пример обработки ошибки записи с фиксацией в журнале регистрации:

Попытка
    СправочникОбъект.Записать();
Исключение
    ЗаписьЖурналаРегистрации("Запись контрагента",
        УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

ВызватьИсключение без параметров пробрасывает ошибку дальше. Так пользователь видит сообщение, а администратор находит подробности в журнале.

Из чего состоит модуль

Модуль — это текст кода, привязанный к объекту конфигурации. Порядок внутри него фиксирован:

  1. Раздел объявления переменных (Перем ИмяПеременной;).
  2. Раздел процедур и функций.
  3. Раздел основной программы — операторы, которые выполняются при создании объекта.

Для навигации код делят на области #Область ИмяОбласти … #КонецОбласти. Их сворачивает редактор, на исполнение они не влияют. Инструкции препроцессора #Если Сервер Тогда … #КонецЕсли отсекают код, который не должен компилироваться в определённом окружении.

Где живёт код в конфигурации:

  • 📄 Модуль объекта — события конкретного документа или элемента: ПередЗаписью, ОбработкаПроведения, ОбработкаЗаполнения.
  • 🗂️ Модуль менеджера — методы уровня всего справочника или документа, например печать или поиск.
  • 🖼️ Модуль формы — обработчики кнопок и полей.
  • 🔧 Общие модули — библиотеки процедур, которые вызывают из любого места.
  • ⚙️ Модули приложения и сеанса — код при запуске программы и установке параметров сеанса.

Типы данных и коллекции во встроенном языке

Переменная получает тип в момент присвоения. Одна и та же переменная может сначала хранить число, а потом строку. Проверка типа — через ТипЗнч(Значение) = Тип("Строка").

Примитивные и ссылочные типы

ТипПример литералаЧто важно знать
Число1500.75Десятичная точка, длину и точность задают в метаданных
Строка"Счёт № 15"Кавычка внутри строки удваивается: "ООО ""Ромашка"""
Дата'20260115'Хранит и дату, и время; пустая дата — '00010101'
БулевоИстина, Ложь—
НеопределеноНеопределеноЗначение «ничего не присвоено»
NullNULLПриходит из запросов при пустом соединении таблиц
СсылкаСправочники.Валюты.ПустаяСсылка()Указатель на объект базы: СправочникСсылка.Валюты

Ссылка — главное отличие 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. Параметры виртуальной таблицы задают в скобках, а не в ГДЕ. Остатки(&Дата, Склад = &Склад) отбирает данные до расчёта остатков, ГДЕ — после, на порядок медленнее.
  2. Длинные цепочки через точку по составным типам порождают лишние соединения. Нужное поле лучше выбрать один раз во временную таблицу.
  3. Запрос в цикле заменяют одним запросом с условием В (&СписокСсылок).

Текст запроса удобно собирать конструктором запроса: в модуле нажмите правой кнопкой внутри строки запроса и выберите Конструктор запроса. Он показывает таблицы конфигурации, поля и связи, а готовый текст вставляет обратно.

Инструменты разработки и отладка кода 1С

Основная среда — Конфигуратор: он запускается из окна выбора баз кнопкой Конфигуратор. В нём дерево метаданных, редактор модулей с подсветкой и контекстной подсказкой, конструкторы форм и запросов.

Синтакс-помощник (Справка → Синтакс-помощник) — встроенный справочник по всем объектам и методам. Каждая статья указывает, где метод доступен: тонкий клиент, сервер, веб-клиент, мобильное приложение. Это первое место, куда смотреть при ошибке «метод не найден» на клиенте.

Альтернатива Конфигуратору — 1С:Enterprise Development Tools (EDT). Это среда на базе Eclipse: проект хранится в файлах, работает с Git, есть рефакторинг и проверки кода. Для командной разработки EDT удобнее, для правки одной базы большинство остаются в Конфигураторе.

Как отлаживать

  • 🔴 Точки останова — F9 на строке модуля, затем запуск отладки из меню Отладка → Начать отладку. На остановке видно значения переменных, можно идти по шагам.
  • 🧮 Вычисление выражений — в режиме остановки вычисляет любое выражение и показывает содержимое коллекций и таблиц.
  • ⏱️ Замер производительности — включается в меню Отладка и показывает, какие строки кода заняли больше всего времени и сколько раз выполнялись.
  • 📒 Журнал регистрации — ошибки пользователей и записи из ЗаписьЖурналаРегистрации.
  • 🛠️ Технологический журнал — настраивается файлом logcfg.xml, пишет запросы к СУБД, блокировки и исключения на сервере. Это инструмент для разбора тормозов в клиент-серверных базах.

Чтобы отлаживать код на сервере 1С, отладку нужно разрешить на самом сервере: агент запускают с ключом -debug. Без этого точки останова в серверных процедурах в клиент-серверной базе не срабатывают.

Перезапуск службы агента сервера, чтобы добавить ключ -debug, обрывает все сеансы пользователей. Делайте это на тестовом сервере или в нерабочее время.

Для автоматических тестов сообщество использует открытые инструменты. Например, Vanessa Automation прогоняет сценарии на языке Gherkin прямо через интерфейс клиента.

Проверьте себя
Где выполняется метод с директивой &НаСервереБезКонтекста?
Может ли язык запросов 1С изменять данные?
С какого индекса нумеруются элементы Массива?

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

  • ❌ Запрос в цикле. 500 строк табличной части — 500 обращений к базе. Соберите ссылки в массив и выполните один запрос.
  • ❌ Чтение реквизитов через точку на клиенте. В управляемой форме Объект.Контрагент.ИНН на клиенте не сработает: реквизиты ссылки читают на сервере.
  • ❌ Лишний &НаСервере. Метод не использует данные формы, но объявлен с контекстом — каждый вызов гонит форму целиком.
  • ❌ Склеивание числа со строкой без Формат. "Итого: " + 1500000 даст строку с неразрывными пробелами между разрядами, это ломает выгрузки. Используйте Формат(Число, "ЧГ=0").
  • ❌ Правка типовой конфигурации напрямую. Снятие с поддержки усложняет каждое обновление. Доработки делайте в расширении конфигурации.
  • ❌ Пустая обработка исключения. Попытка … Исключение КонецПопытки; без записи в журнал скрывает ошибку, и её потом ищут неделями.

Частые вопросы

Встроенный язык 1С — это компилируемый или интерпретируемый язык?
Код модулей платформа переводит во внутренний байт-код и исполняет своей виртуальной машиной. Отдельного шага компиляции в исполняемый файл нет.
Можно ли писать код 1С на английском?
Да. У всех ключевых слов и методов есть английские имена: Procedure, If, Message. Можно смешивать варианты в одном модуле, но в типовых конфигурациях принят русский.
Нужно ли знать SQL, чтобы писать запросы в 1С?
Не обязательно, но помогает. Логика соединений и группировок та же. Специфику 1С — виртуальные таблицы и разыменование ссылок — всё равно придётся изучить отдельно.
Чем расширение конфигурации лучше прямой доработки?
Расширение хранится отдельно от типовой конфигурации и подключается поверх неё. Типовая остаётся на поддержке и обновляется штатно, а доработку после обновления достаточно проверить.
Где запускать код 1С без конфигурации, например скрипт для сервера?
Для этого подходит OneScript — открытый интерпретатор с синтаксисом встроенного языка. Объектов базы в нём нет, но есть работа с файлами, HTTP, JSON и запуск внешних программ.