Разработка и Конфигурация · 11 мин
Как написать макрос в 1С: практическое руководство
Как написать макрос в 1С на встроенном языке: где писать код, синтаксис, обработчики событий, внешние обработки, отладка и типичные ошибки новичков.
Под макросом в 1С обычно понимают фрагмент кода на встроенном языке платформы, который автоматизирует повторяющиеся действия: заполнение документов, расчёт значений, обработку справочников, формирование печатных форм. В отличие от макросов в Excel, в 1С нет «рекордера действий» — код пишется вручную в конфигураторе или во внешней обработке, и это даёт больше контроля над логикой.
Прежде чем писать первый макрос, определите, где именно он должен жить: в модуле формы документа, в общем модуле конфигурации или во внешней обработке (файл с расширением .epf). Для разовых задач и экспериментов удобнее внешняя обработка — она не требует изменения конфигурации и не ломает обновление программы.
Ниже разобран полный цикл: от подготовки инструментов до проверки результата и типичных ошибок, которые допускают начинающие разработчики 1С.
Что понадобится перед началом работы
Для написания макроса нужен доступ к конфигуратору — это отдельный режим запуска 1С, в котором редактируется структура и код. Убедитесь, что у вашей учётной записи есть права на конфигурирование, а конфигурация не находится на полной поддержке с запретом изменений, если планируете править именно модули конфигурации.
Также понадобится тестовая база. Никогда не отлаживайте новый код сразу на рабочей базе с реальными данными: ошибка в цикле записи может испортить сотни документов, и восстановление потребует резервной копии. Сделайте копию базы через конфигуратор (Администрирование → Выгрузить информационную базу) или через SQL-средства, если база клиент-серверная.
Изучите базовый синтаксис встроенного языка: он похож на смесь паскалевского стиля с русскоязычными ключевыми словами. Процедуры и функции, условия «Если…Тогда…КонецЕсли», циклы «Для…Цикл» и «Для Каждого…Из…Цикл» — этого минимума хватает для большинства прикладных макросов.
Где размещать код макроса
В 1С код привязан к контексту исполнения. Модуль формы отвечает за поведение конкретной формы (кнопки, поля, события открытия), модуль объекта — за логику записи и проведения документа или справочника, общие модули — за переиспользуемые функции, доступные всей конфигурации.
Для разовой автоматизации — например, пересчитать цены в справочнике или сформировать файл выгрузки — оптимальна внешняя обработка. Создайте её в конфигураторе через «Файл → Новый → Внешняя обработка», добавьте форму с кнопкой и напишите код в модуле формы. Полученный файл .epf можно открыть в любом режиме предприятия без изменения конфигурации.
Когда внешняя обработка не подходит
Если макрос должен срабатывать автоматически — при записи документа, по расписанию, при старте системы — потребуется встраивание в конфигурацию: подписки на события, регламентные задания, общие модули. Это уже доработка конфигурации, и её нужно планировать с учётом будущих обновлений.
Сравнение вариантов размещения кода
Подходит для разовых задач и экспериментов; не требует изменения конфигурации, но не запускается автоматически по событиям.
Для логики интерфейса: кнопки, реакция на ввод. Работает только пока открыта форма.
Для проверок и расчётов при записи и проведении. Требует снятия конфигурации с полной поддержки.
Для функций, вызываемых из разных мест. Требует вдумчивой настройки флагов (Сервер, Клиент, Вызов сервера).
Пишем первый макрос: пошаговый пример
Классическая учебная задача — макрос, который выводит сообщение и выполняет простой расчёт. Создайте внешнюю обработку, добавьте в модуль формы процедуру и привяжите её к команде кнопки:
&НаКлиенте
Процедура ВыполнитьМакрос(Команда)
Сумма = 1000;
СтавкаНДС = 20;
СуммаНДС = Сумма * СтавкаНДС / (100 + СтавкаНДС);
Сообщить("Сумма НДС: " + Формат(СуммаНДС, "ЧДЦ=2"));
КонецПроцедуры
Директива &НаКлиенте означает, что код выполняется на стороне клиента. Обращения к базе данных — запросы, создание объектов документов — в обычных и тонком клиенте делаются на сервере, поэтому для работы с данными процедуру помечают &НаСервере или вызывают серверную процедуру из клиентской.
Более практичный пример — обход справочника с изменением реквизита. Такой код выполняется на сервере:
&НаСервере
Процедура ЗаполнитьКомментарии()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура
|ГДЕ Комментарий = """"";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Элемент = Выборка.Ссылка.ПолучитьОбъект();
Элемент.Комментарий = "Заполнено макросом";
Элемент.Записать();
КонецЦикла;
КонецПроцедуры
- 1Сделайте копию базы или переключитесь на тестовую
- 2Откройте конфигуратор и создайте внешнюю обработку (Файл → Новый)
- 3Добавьте форму, кнопку и команду для запуска
- 4Напишите процедуру с нужной логикой, соблюдая контекст (Клиент/Сервер)
- 5Сохраните файл .epf и откройте его в режиме 1С:Предприятие
- 6Запустите макрос на тестовых данных и проверьте результат
- 7Только после успешной проверки применяйте на рабочей базе
Обработчики событий: макрос, который срабатывает сам
Если код должен выполняться автоматически, используются предопределённые обработчики. В модуле формы это ПриОткрытии, ПередЗаписью, ПослеЗаписи; в модуле объекта — ОбработкаПроведения, ПередЗаписью, ПриЗаписи. Например, автоматическая подстановка комментария при записи документа реализуется в модуле объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Комментарий = "Создан " + ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр Отказ: установка Отказ = Истина прерывает запись. Это механизм контроля — например, можно запретить проведение документа, если не заполнено обязательное поле, и вывести пользователю понятное сообщение.
Отладка: как найти ошибку в макросе
Конфигуратор включает полноценный отладчик. Поставьте точку останова на нужной строке (щелчок слева от номера строки или F9), запустите отладку через «Отладка → Начать отладку» и выполните действие в режиме предприятия. Выполнение остановится на точке, и вы сможете смотреть значения переменных через «Вычислить выражение» (Shift+F9) или табло.
Для внешних обработок отладка тоже работает, но файл должен быть открыт в конфигураторе, а обработка запущена именно из-под отладки. Если точка останова не срабатывает, проверьте, не открыта ли в предприятии другая версия файла .epf.
Полезный приём — временные вызовы Сообщить() в ключевых точках логики: они показывают, до какой строки дошло выполнение и какие значения были у переменных. После отладки такие сообщения удаляют, чтобы не засорять панель сообщений пользователей.
Как проверить результат работы макроса
Макрос завершился, окно сообщений пустое или содержит только ожидаемые уведомления
Текст ошибки платформы, прерывание выполнения
Изменилось ровно то количество объектов, что планировалось; значения корректны
Лишние изменённые объекты, пустые или неверные значения
Документы проводятся, движения по регистрам соответствуют ожиданиям
Отказ в проведении, отсутствующие или дублированные движения
Типичные ошибки новичков и как их избежать
Самая частая проблема — путаница клиентского и серверного контекста. Попытка выполнить запрос к базе в процедуре &НаКлиенте приводит к ошибке компиляции или выполнения. Правило простое: всё, что обращается к данным, — на сервере; всё, что работает с интерфейсом, — на клиенте.
Вторая распространённая ошибка — обращение к реквизитам по имени, которого нет в конфигурации, или опечатки в именах. Встроенный язык не всегда ловит это на этапе сохранения модуля, поэтому проверяйте имена реквизитов точно по дереву метаданных.
Третья группа ошибок — работа с объектами через ссылку без ПолучитьОбъект(). Ссылка позволяет только читать данные; для изменения нужно получить объект, изменить и записать. Забытый Записать() — причина «макрос отработал, но ничего не изменилось».
Ограничения и когда стоит привлечь специалиста
Самостоятельно разумно писать макросы локального действия: заполнение реквизитов, простые проверки, выгрузки, печатные формы. Задачи, затрагивающие проведение документов, движения по регистрам, обмены между базами и права доступа, требуют понимания архитектуры конфигурации — ошибка там влияет на учётные данные и отчётность.
Также учтите лицензионную сторону: изменение типовой конфигурации усложняет её обновление. Если доработка нужна постоянно, рассмотрите механизм расширений конфигурации (.cfe) — он позволяет добавлять код, не снимая конфигурацию с поддержки.
Как выбрать подход
Частые вопросы
Можно ли записать макрос в 1С автоматически, как в Excel?
Нет, в платформе 1С нет записи действий пользователя в код. Макросы пишутся вручную на встроенном языке. Частично ускорить работу помогают шаблоны кода и готовые фрагменты из синтакс-помощника конфигуратора.
Нужно ли снимать конфигурацию с поддержки для внешней обработки?
Нет. Внешняя обработка (.epf) — отдельный файл, который не затрагивает конфигурацию. Она открывается через «Файл → Открыть» и работает на типовых конфигурациях без каких-либо изменений режима поддержки.
Почему макрос работает в толстом клиенте, но не работает в тонком или веб-клиенте?
В тонком и веб-клиенте недоступен ряд возможностей толстого клиента: прямой доступ к данным на клиенте, некоторые COM-объекты и методы работы с файловой системой. Код нужно переписать с разделением на клиентскую и серверную части.
Как отменить изменения, если макрос испортил данные?
Штатной кнопки «отменить» для массовых изменений нет. Восстановление возможно из резервной копии базы или, при частичной порче, обратным макросом, если известны исходные значения. Поэтому перед запуском всегда делайте выгрузку базы (.dt) или снапшот.
Чем расширение конфигурации лучше изменения типовой конфигурации?
Расширение (.cfe) накладывается поверх типовой конфигурации и не снимает её с поддержки, поэтому обновления устанавливаются проще. Изменение типовой конфигурации требует сопоставления при каждом обновлении и увеличивает трудозатраты на сопровождение.
Где искать описание методов встроенного языка?
В конфигураторе есть встроенный синтакс-помощник (меню «Справка → Синтакс-помощник» или Ctrl+F1 на имени метода). Там описаны процедуры, функции, объекты и события платформы с примерами использования.
Что важно запомнить
Макрос в 1С — это код на встроенном языке в модуле формы, объекта или внешней обработке. Начинайте с внешней обработки на тестовой базе, разделяйте клиентский и серверный контекст, проверяйте результат по количеству изменённых объектов и всегда делайте резервную копию перед запуском на рабочих данных.