Программирование в Конфигураторе 1С 8.3: от первого модуля до отладки

· 10 мин

Содержание

Код в 1С пишут в модулях объектов конфигурации: откройте базу в режиме Конфигуратор, выполните Конфигурация → Открыть конфигурацию, найдите в дереве нужный объект, щёлкните по нему правой кнопкой и выберите модуль (объекта, менеджера или формы). Откроется редактор, где пишут процедуры и функции на встроенном языке. Изменения сохраняют через Ctrl+S, а в базу применяют клавишей F7 — «Обновить конфигурацию базы данных».

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

Подготовка: куда можно писать код, не ломая обновления

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

СпособКогда подходитЧем рискуете
Расширение конфигурацииДоработки типовой БП, ЗУП, УТПочти ничем: основная конфигурация не меняется
Внешняя обработка или отчётРазовые задачи, эксперименты, выгрузкиНичем, файл .epf живёт отдельно от базы
Снятие с поддержки (включение изменений)Собственная, глубоко переработанная конфигурацияОбновления придётся ставить через сравнение и объединение

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

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

&После("ОбработкаПроверкиЗаполнения")
Процедура МояПроверкаЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если Не ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
		Сообщить("Не указан договор контрагента");
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

Если всё же решили менять основную конфигурацию, путь такой: Конфигурация → Поддержка → Настройка поддержки → кнопка Включить возможность изменения.

Перед изменением рабочей конфигурации выгрузите информационную базу в файл .dt (Администрирование → Выгрузить информационную базу). Применение изменений через F7, затрагивающее структуру данных, требует монопольного доступа: попросите пользователей выйти.

Редактор модулей: окно, горячие клавиши и настройки

Модули бывают разных видов, и место кода определяет, когда он выполнится.

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

Клавиши, без которых работа в редакторе идёт втрое медленнее:

ДействиеКлавиши
Контекстная подсказка (методы, свойства, переменные)Ctrl+Пробел
Подсказка по параметрам методаCtrl+Shift+Пробел
Перейти к определению процедурыF12
Список процедур и функций модуляCtrl+Alt+P
Проверка синтаксиса модуляCtrl+F7
Поиск и замена в модулеCtrl+F, Ctrl+H
Глобальный поиск по конфигурацииCtrl+Shift+F
Перейти к строке по номеруCtrl+G
Синтакс-помощникCtrl+F1

Настройки редактора — Сервис → Параметры, вкладка Модули. Там задают ширину табуляции, автоотступ, работу контекстной подсказки и проверку синтаксиса при сохранении.

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

💡 Шаблоны текста (Сервис → Шаблоны текста) ускоряют набор типовых блоков. Напишите Если, нажмите Ctrl+Q — вставится заготовка Если … Тогда … КонецЕсли;.

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

Модуль делится на три части, и их порядок фиксирован:

  1. Раздел объявления переменных — Перем ИмяПеременной; в начале модуля. Слово Экспорт делает переменную доступной снаружи.
  2. Раздел процедур и функций — основная часть.
  3. Раздел основной программы — операторы после последней процедуры. Выполняются при создании экземпляра модуля. Используется редко.

Код группируют областями — это упрощает навигацию и сворачивается в редакторе:

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	Если Сумма < 0 Тогда
		Сообщить("Сумма не может быть отрицательной");
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

Основные правила синтаксиса:

  • 🔹 каждый оператор заканчивается точкой с запятой ;;
  • 🔹 регистр букв не важен: сообщить и Сообщить — одно и то же, но принято писать с заглавной;
  • 🔹 комментарий начинается с // и действует до конца строки;
  • 🔹 строки — в двойных кавычках; кавычка внутри строки удваивается: "Договор ""Основной""";
  • 🔹 многострочная строка продолжается символом | в начале каждой следующей строки;
  • 🔹 переменные не объявляют заранее: она создаётся при первом присваивании.

Процедура ничего не возвращает, функция возвращает значение через Возврат. Основные конструкции:

Функция СуммаСНДС(Сумма, Ставка = 20) Экспорт
	Возврат Сумма + Сумма * Ставка / 100;
КонецФункции

// Цикл по числовому счётчику
Для Сч = 1 По 10 Цикл
	Итог = Итог + Сч;
КонецЦикла;

// Цикл по коллекции
Для Каждого Строка Из Товары Цикл
	Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;

// Обработка исключений
Попытка
	ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;

Числа со строкой склеивайте через Формат(Число, "ЧГ=0") или СтрШаблон("Найдено %1 записей", Количество), иначе получите разделители разрядов и неожиданный вид чисел.

Обращение к справочникам, документам и регистрам из кода

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

Создать и записать элемент справочника:

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Бумага А4";
НовыйЭлемент.Записать();

Найти и изменить: НайтиПоКоду() и НайтиПоНаименованию() возвращают ссылку. Ссылку можно читать, но не изменять. Чтобы изменить, получите объект:

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

Прочитать константу и последний курс:

ОсновнаяВалюта = Константы.ВалютаРегламентированногоУчета.Получить();
ДанныеКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(),
	Новый Структура("Валюта", Валюта));
Курс = ДанныеКурса.Курс;

Константа ВалютаРегламентированногоУчета и регистр КурсыВалют есть в типовых конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11). В своей конфигурации имена будут другими — смотрите дерево.

Запросы. Для выборки данных используйте язык запросов, а не перебор объектов. Запрос работает на сервере и читает только нужные поля:

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

Выборка = Запрос.Выполнить().Выбрать();
ЧислоДокументов = 0;
Если Выборка.Следующий() Тогда
	ЧислоДокументов = Выборка.ЧислоДокументов;
КонецЕсли;

Значения передавайте только через параметры &Имя, а не склейкой строк: так запрос не ломается на кавычках в наименованиях и быстрее выполняется.

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

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

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

Правило практика: обработчик кнопки всегда &НаКлиенте, работа с базой — в серверной процедуре, и по возможности &НаСервереБезКонтекста. Такой вызов не тащит на сервер всю форму с табличными частями, поэтому быстрее.

&НаКлиенте
Процедура ПоказатьКоличество(Команда)
	Число = КоличествоРеализаций(Объект.Контрагент);
	ПоказатьПредупреждение(, СтрШаблон("Проведённых реализаций: %1", Число));
КонецПроцедуры

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

Что нужно помнить о границе клиент — сервер:

  • 🚫 на клиенте нельзя читать реквизиты ссылки через точку: Объект.Контрагент.ИНН в клиентской процедуре вызовет ошибку — получите ИНН серверной функцией;
  • 🚫 на клиенте нет запросов, ПолучитьОбъект() и записи объектов;
  • 🔁 каждый вызов сервера из цикла — отдельный сетевой запрос; собирайте данные одним вызовом;
  • 🧩 в общих модулях место выполнения задают флажки в свойствах: Клиент (управляемое приложение), Сервер, Вызов сервера, Внешнее соединение. Без флажка Вызов сервера серверную функцию общего модуля с клиента не вызвать.

Внутри одного модуля можно разграничить код инструкциями препроцессора #Если Сервер Тогда … #КонецЕсли.

Модальные окна (Предупреждение(), Вопрос()) в современных конфигурациях отключены: при вызове появится Использование модальных окон в данном режиме запрещено. Используйте ПоказатьПредупреждение(), ПоказатьВопрос() с описанием оповещения, а начиная с 8.3.18 — асинхронные функции с Асинх и Ждать.

Отладка кода в Конфигураторе

Отладчик запускается клавишей F5 (Отладка → Начать отладку): Конфигуратор откроет 1С:Предприятие, подключённое к отладке. Дальше работаете в программе как обычно, а выполнение останавливается на точках останова.

Основные команды:

КомандаКлавиши
Поставить или снять точку остановаF9
Шаг с заходом в процедуруF11
Шаг с обходом (без захода)F10
Выйти из текущей процедурыShift+F11
Продолжить до следующей точкиF5
Вычислить выражениеShift+F9
Табло (окно наблюдения)Ctrl+Alt+W

Во время остановки наведите курсор на переменную — увидите значение. Через Shift+F9 можно посмотреть содержимое таблицы значений, результата запроса или структуры и даже вычислить произвольное выражение, например Выборка.Количество().

Полезные приёмы:

  1. Остановка по ошибке. Включите её в меню Отладка — отладчик сам встанет на строке, где возникло исключение, даже внутри Попытка.
  2. Условная точка останова. В контекстном меню точки задайте условие (например, Строка.НомерСтроки = 57), чтобы не пролистывать цикл вручную.
  3. Замер производительности. Отладка → Замер производительности показывает, сколько времени заняла каждая строка. Так находят запросы в цикле.
  4. Отладка на сервере. В клиент-серверном варианте отладка серверного кода работает, только если на сервере 1С включена отладка: служба агента запускается с ключом -debug. Изменение ключа требует перезапуска службы, а это оборвёт сеансы всех пользователей — делайте вне рабочего времени и только на тестовом сервере.
Диагностика: выберите симптом

Как писать код, который не придётся переписывать

Частые ошибки начинающих, которые не ловит проверка синтаксиса, но потом тормозят базу:

  • 🐢 Запрос в цикле. Сто строк документа — сто запросов. Передайте в запрос массив значений и условие В (&Массив), получите всё за один раз.
  • 🐢 Обращение к реквизитам через точку на сервере в цикле. Строка.Номенклатура.ЕдиницаИзмерения каждый раз читает объект из базы. Получите нужные поля одним запросом.
  • 🔒 Запись в транзакции без отката. Если используете НачатьТранзакцию(), в блоке Исключение обязательно вызывайте ОтменитьТранзакцию(), иначе следующая запись упадёт с ошибкой.
  • 🧾 Молча проглоченные ошибки. Пустой блок Исключение скрывает проблему. Минимум — ЗаписьЖурналаРегистрации() с текстом ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()).
  • ✏️ Правка типового кода вместо расширения. Каждая такая правка — конфликт при следующем обновлении.

Перед тем как отдать доработку, прогоните Конфигурация → Проверка конфигурации с включённой проверкой логической целостности и модулей в разных режимах (тонкий клиент, сервер). Она найдёт вызовы, которые на клиенте недоступны, — Ctrl+F7 этого не покажет, потому что проверяет только текущий модуль.

Если над конфигурацией работают двое и больше, подключите хранилище конфигурации (Конфигурация → Хранилище конфигурации): объекты захватываются на редактирование, и разработчики не затирают изменения друг друга.

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

Нужно ли знать английский, чтобы программировать в 1С?
Нет. Встроенный язык поддерживает русский и английский синтаксис, типовые конфигурации написаны на русском. Английские имена встречаются только в технических строках и интеграциях.
Можно ли писать код 1С не в Конфигураторе?
Да. Есть среда 1C:Enterprise Development Tools (EDT) на основе Eclipse. Конфигуратор при этом остаётся нужен для администрирования базы и быстрых правок.
Почему не активна команда «Обновить конфигурацию базы данных»?
Изменений, требующих обновления, нет, или конфигурация не сохранена. Сохраните её через Ctrl+S и повторите F7.
Как сравнить свой код с тем, что был до правок?
Конфигурация → Сравнить конфигурации покажет различия основной конфигурации и конфигурации базы данных, вплоть до строк модуля.
Где хранится код внешней обработки?
Внутри файла .epf. В базе его нет, пока обработку не добавят в справочник дополнительных отчётов и обработок.