Встроенный язык 1С с нуля: синтаксис, метаданные, запросы и отладка

· 10 мин

Содержание

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

Встроенный язык 1С похож на Pascal и Visual Basic с русскими ключевыми словами. Но он не живёт сам по себе. Каждая строка кода привязана к объекту конфигурации и выполняется в конкретном контексте. Кто понимает эти две вещи, тот читает чужой код в типовой Бухгалтерии без паники.

С чего начать: инструменты и учебная база

Для старта нужны три вещи, и все бесплатные или почти бесплатные.

  • 🧰 Учебная версия платформы 1С:Предприятие 8.3. Её распространяет фирма 1С вместе с учебными книгами и на сайте для изучающих. Ограничения есть по объёму данных и числу пользователей, но для обучения их хватает с запасом.
  • 📘 Синтакс-помощник. Встроен в Конфигуратор: Справка → Синтакс-помощник. Там описан каждый метод, свойство и тип. Это главный справочник разработчика, к нему обращаются и через 10 лет работы.
  • 🗂 Пустая конфигурация. Добавьте новую информационную базу в окне запуска, выберите создание базы без конфигурации и откройте её кнопкой Конфигуратор.

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

Не начинайте с типовой Бухгалтерии или ЗУП. Там тысячи модулей и общие подсистемы БСП. Сначала соберите свою маленькую конфигурацию из трёх-четырёх объектов: справочник товаров, документ поступления, регистр остатков.

Кроме Конфигуратора есть среда 1C:Enterprise Development Tools (EDT) на базе Eclipse. Она удобна для командной разработки и Git, но новичку в ней сложнее. Учиться лучше в Конфигураторе, а на EDT переходить, когда появится работа в команде.

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

Синтаксис здесь прощает многое. Регистр букв не важен: Сообщить и сообщить — одно и то же. Каждый оператор заканчивается точкой с запятой. Комментарий начинается с //.

Минимальный пример:

Процедура ПоказатьИтог()
	
	Количество = 3;
	Цена = 150.50;
	Сумма = Количество * Цена;
	
	Если Сумма > 400 Тогда
		Сообщить("Сумма: " + Формат(Сумма, "ЧДЦ=2"));
	Иначе
		Сообщить("Маленькая сумма");
	КонецЕсли;
	
КонецПроцедуры

Здесь 3 × 150,50 = 451,50, поэтому выведется «Сумма: 451,50». Число склеено со строкой через Формат — так вы управляете видом вывода, а не надеетесь на автоматическое преобразование.

Ключевые понятия

ТерминЧто значит
ПроцедураБлок кода без возвращаемого значения: Процедура … КонецПроцедуры
ФункцияВозвращает значение через Возврат: Функция … КонецФункции
ПеременнаяОбъявляется присваиванием, тип не указывается (динамическая типизация)
ЭкспортДелает процедуру или функцию доступной из других модулей
МодульФайл кода, привязанный к объекту: модуль формы, объекта, менеджера, общий модуль

Типы и коллекции, которые нужны сразу

  • 🔢 Примитивные: Число, Строка, Дата, Булево, а также особые значения Неопределено и NULL.
  • 📦 Массив — упорядоченный список значений, индексы с нуля.
  • 🔑 Структура — пары «ключ — значение», ключ только строка-идентификатор.
  • 🗺 Соответствие — то же, но ключом может быть любое значение, например ссылка на товар.
  • 📊 ТаблицаЗначений — таблица в памяти с колонками. С ней работают чаще всего.

Циклы три вида: Для Сч = 1 По 10 Цикл, Для Каждого Элемент Из Коллекция Цикл и Пока Условие Цикл. Все закрываются КонецЦикла;.

Язык двуязычный: вместо Если … Тогда можно писать If … Then. В типовых конфигурациях пишут по-русски, придерживайтесь того же — так ваш код будут читать коллеги.

Метаданные: почему без них язык 1С не понять

Главное отличие 1С от универсальных языков — код почти никогда не создаёт структуру данных. Таблицы, поля и связи описываются в дереве метаданных мышкой. Код только наполняет и обрабатывает их.

Основные виды объектов:

  • 📇 Справочники — списки: товары, контрагенты, сотрудники.
  • 📄 Документы — события с датой: поступление, реализация, начисление.
  • 📈 Регистры накопления — остатки и обороты. Документ при проведении пишет в них движения.
  • 📋 Регистры сведений — данные, привязанные к измерениям и часто к периоду: цены, курсы.
  • 📒 Регистры бухгалтерии и расчёта — бухгалтерские проводки и сложные начисления.
  • 🔘 Перечисления, константы, общие модули, обработки, отчёты.

Пример связки. Документ «Поступление» при проведении увеличивает остаток товара в регистре накопления. Код проведения пишется в модуле объекта документа, в обработчике ОбработкаПроведения:

Процедура ОбработкаПроведения(Отказ, Режим)
	
	Движения.ОстаткиТоваров.Записывать = Истина;
	
	Для Каждого СтрокаТЧ Из Товары Цикл
		Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
		Движение.Период = Дата;
		Движение.Номенклатура = СтрокаТЧ.Номенклатура;
		Движение.Количество = СтрокаТЧ.Количество;
	КонецЦикла;
	
КонецПроцедуры

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

Ссылка и объект

Новички спотыкаются здесь чаще всего. Справочники.Номенклатура.НайтиПоКоду("00001") возвращает ссылку — лёгкий указатель на запись. Прочитать реквизит по ссылке можно. А чтобы изменить и записать, нужен объект: Ссылка.ПолучитьОбъект(), затем изменения и Записать().

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

В управляемом приложении код выполняется в двух местах. Форма работает на клиенте — на компьютере пользователя, в тонком клиенте или браузере. Данные базы доступны только на сервере. Даже в файловом варианте платформа соблюдает это разделение.

Где выполнять процедуру, указывают директивы компиляции перед ней:

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

Типичный пример в модуле формы:

&НаКлиенте
Процедура ЗаполнитьКомментарий(Команда)
	Объект.Комментарий = ТекстКомментария();
КонецПроцедуры

&НаСервереБезКонтекста
Функция ТекстКомментария()
	Возврат "Заполнено " + Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy");
КонецФункции

Каждый вызов сервера с клиента — это обмен по сети. Не вызывайте сервер в цикле на клиенте: 100 строк таблицы — 100 обращений. Соберите данные в массив и передайте их одним вызовом.

&НаСервере передаёт на сервер всю форму со всеми данными. Если серверной функции нужны только два параметра, используйте &НаСервереБезКонтекста. На тяжёлых формах разница заметна пользователю.

В модулях объектов и менеджеров директивы обычно не ставят: этот код и так работает на сервере. В общих модулях место выполнения задают флажки в свойствах модуля: «Клиент», «Сервер», «Вызов сервера».

Язык запросов: выборка данных из базы

Перебирать справочник циклом через Выбрать() можно, но в рабочем коде данные получают запросом. Язык запросов 1С похож на SQL: ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, соединения.

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

Запрос.УстановитьПараметр("Шаблон", "%кабель%");

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Выборка.Наименование);
КонецЦикла;

Чем запросы 1С отличаются от обычного SQL:

  • 🔗 Разыменование через точку. Документ.Контрагент.ИНН — платформа сама построит соединение. Удобно, но каждое разыменование — лишнее соединение в итоговом SQL.
  • 🧮 Виртуальные таблицы регистров. РегистрНакопления.ОстаткиТоваров.Остатки(&Дата) сразу даёт остатки на дату. Условия по измерениям пишут в параметрах виртуальной таблицы, а не в ГДЕ — так быстрее.
  • 🗃 Временные таблицы и пакеты. Несколько запросов в одном тексте через ; и ПОМЕСТИТЬ.
  • 🧭 Иерархия. В ИЕРАРХИИ отбирает элемент со всеми подчинёнными.

Писать текст вручную необязательно. Щелкните правой кнопкой мыши в модуле и выберите «Конструктор запроса»: он соберёт текст из выбранных таблиц и полей. Новичку полезно строить запрос конструктором, а потом читать получившийся текст.

Самая частая ошибка начинающих — запрос внутри цикла. 1000 строк документа — 1000 запросов. Выбирайте всё одним запросом, а нужные значения ищите в результате через ТаблицаЗначений.Найти() или Соответствие.

Отладка и замер производительности

Код, который вы не прошли отладчиком, вы не понимаете до конца. Отладчик в Конфигураторе:

  1. Поставьте точку останова: строка кода и клавиша F9.
  2. Запустите отладку: F5 или Отладка → Начать отладку. Откроется режим 1С:Предприятие.
  3. Выполните действие, которое вызывает код. Конфигуратор остановится на точке.
  4. Шагайте: F10 — без захода в процедуру, F11 — с заходом.
  5. Смотрите значения: наведите курсор на переменную или выделите выражение и откройте «Вычислить выражение» (Shift+F9).

Для клиент-серверной базы отладку на сервере должен разрешить администратор: сервер 1С запускают с ключом -debug. В файловой базе всё работает сразу.

Где программа тормозит

Отладка → Замер производительности включается во время сеанса отладки. После выполнения действия Конфигуратор покажет таблицу: сколько раз выполнилась каждая строка и сколько времени она заняла. Сортируйте по времени — виновник обычно в первых трёх строках.

Что ищут в первую очередь:

  • 🐢 запрос или обращение к реквизиту по ссылке внутри цикла;
  • 🐢 серверный вызов из клиентского цикла;
  • 🐢 разыменование через несколько точек в больших запросах;
  • 🐢 запись объектов по одному там, где хватило бы записи набора регистра.

Расширение возможностей: обработки, расширения и интеграции

Типовую конфигурацию не обязательно править напрямую. Есть три способа добавить своё.

СпособФайлКогда подходитЧто учесть
Внешняя обработка или отчёт.epf, .erfразовые задачи, печатные формы, загрузка данныхв типовых подключается через справочник дополнительных обработок
Расширение конфигурации.cfeдоработки, которые должны пережить обновление типовойпоявились в платформе 8.3.6
Правка основной конфигурации—когда без неё нельзяснятие с поддержки, обновления сложнее

Внешнюю обработку для пробы откроют через Файл → Открыть в режиме 1С:Предприятие (нужны права). В Бухгалтерии 3.0 постоянное подключение — Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.

Расширение создают в Конфигураторе через Конфигурация → Расширения конфигурации. Изучите его до первой рабочей задачи: в реальных проектах большинство доработок типовых делают именно расширениями. Ключевой приём — аннотации &Перед, &После и &Вместо над процедурой: они позволяют встроиться в типовой метод, не трогая его код.

Для обмена с внешним миром в платформе есть:

  • 🌐 HTTP-сервисы и веб-сервисы — 1С сама принимает запросы, после публикации базы на веб-сервере;
  • 🔌 HTTPСоединение — 1С обращается к чужому REST API;
  • 📡 Стандартный интерфейс OData — чтение и запись данных без написания сервиса;
  • 🧩 COM-соединение — внешняя программа под Windows подключается к базе через V83.COMConnector.

Путь развития: от пользователя до архитектора

Опыт работы пользователем — большое преимущество. Бухгалтер, который знает, как проводится реализация и что такое закрытие месяца , понимает задачу заказчика без перевода.

Примерная лестница, по которой растут разработчики:

ЭтапЧто умеетеОриентир по времени
Пользовательработаете в типовой, знаете учёт—
Начинающий разработчиксинтаксис, справочники, документы, регистры, простые запросы2–4 месяца регулярных занятий
Разработчикформы, клиент-сервер, расширения, отчёты на СКД1–2 года практики
Ведущий разработчикпроизводительность, блокировки, обмены, БСП3–5 лет
Архитекторпроектирование систем, нагрузка, внедрения ERPот 5 лет

Сроки ориентировочные. Они сильно зависят от того, есть ли реальные задачи. Год практики на живых базах даёт больше, чем три курса подряд.

Что изучать по порядку:

  1. Синтаксис и коллекции: массив, структура, таблица значений.
  2. Справочники, документы, проведение по регистрам накопления.
  3. Язык запросов, виртуальные таблицы, временные таблицы.
  4. Управляемые формы и директивы компиляции.
  5. Система компоновки данных (СКД) — на ней построены почти все отчёты типовых.
  6. Расширения конфигурации и библиотека стандартных подсистем (БСП).
  7. Производительность и управляемые блокировки.

Проверить уровень помогают сертификаты фирмы 1С. «1С:Профессионал по платформе» — компьютерный тест на знание платформы. «1С:Специалист» — практический экзамен: за ограниченное время нужно решить задачу в конфигураторе. Работодатели на рынке 1С эти статусы спрашивают часто.

Проверьте себя
Где выполнится процедура с директивой &НаСервереБезКонтекста?
Что вернёт Справочники.Номенклатура.НайтиПоКоду()?
Куда в запросе лучше ставить условие по измерению регистра остатков?

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

Нужно ли знать бухгалтерию, чтобы программировать на 1С?
Для старта нет. Но на типовых конфигурациях без понимания учёта вы будете писать код, не понимая задачу. Основы счетов, проводок и регистров учёта сильно ускоряют рост.
Можно ли выучить язык 1С без знания других языков программирования?
Да. Встроенный язык 1С — один из самых доступных для первого знакомства: русские ключевые слова, динамическая типизация, готовая база данных. Опыт в других языках ускоряет старт, но не обязателен.
Платформа 8.2 и 8.3 — разные языки?
Нет, язык тот же. В 8.3 добавлены новые методы и объекты, расширения конфигурации, асинхронные вызовы Асинх и Ждать. Учить имеет смысл сразу 8.3 и управляемые формы.
Что такое БСП и когда её изучать?
Библиотека стандартных подсистем — общий фундамент типовых конфигураций: права, печать, дополнительные обработки, версионирование. Изучайте её после основ, когда начнёте дорабатывать Бухгалтерию, ЗУП или УТ.
Где тренироваться, если нет рабочих задач?
Возьмите свой учёт: домашние финансы, склад знакомого магазина, учёт заявок. Соберите конфигурацию с документами, регистром и отчётом на СКД. Такой проект можно показать на собеседовании.