Встроенный язык 1С с нуля: синтаксис, метаданные, запросы и отладка
Содержание
Язык 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 запросов. Выбирайте всё одним запросом, а нужные значения ищите в результате через ТаблицаЗначений.Найти() или Соответствие.
Отладка и замер производительности
Код, который вы не прошли отладчиком, вы не понимаете до конца. Отладчик в Конфигураторе:
- Поставьте точку останова: строка кода и клавиша
F9. - Запустите отладку:
F5илиОтладка → Начать отладку. Откроется режим 1С:Предприятие. - Выполните действие, которое вызывает код. Конфигуратор остановится на точке.
- Шагайте:
F10— без захода в процедуру,F11— с заходом. - Смотрите значения: наведите курсор на переменную или выделите выражение и откройте «Вычислить выражение» (
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С. «1С:Профессионал по платформе» — компьютерный тест на знание платформы. «1С:Специалист» — практический экзамен: за ограниченное время нужно решить задачу в конфигураторе. Работодатели на рынке 1С эти статусы спрашивают часто.
Частые вопросы
Нужно ли знать бухгалтерию, чтобы программировать на 1С?
Можно ли выучить язык 1С без знания других языков программирования?
Платформа 8.2 и 8.3 — разные языки?
Асинх и Ждать. Учить имеет смысл сразу 8.3 и управляемые формы.