Куда и как добавлять программный код в 1С

· 9 мин

Содержание

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

Главная ошибка новичка — открыть типовую конфигурацию (Бухгалтерию, ЗУП, УТ), снять её с поддержки и править модули напрямую. После первого же обновления правки либо слетят, либо обновление встанет на конфликтах. Типовую конфигурацию в режиме сравнения-объединения трогать не нужно. Для своих доработок есть расширения — они живут отдельно и переживают обновления.

Ниже — где физически размещается встроенный язык, чем модуль объекта отличается от модуля формы и как загрузить готовый код в базу через командную строку.

С чего начать: Конфигуратор и режим изменения

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

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

Если видите у объектов жёлтый замок — конфигурация на поддержке и защищена от изменений. Это нормальное состояние для типовых решений.

Собственную пустую конфигурацию (не типовую) можно редактировать сразу — никаких замков на ней нет.

Модули конфигурации: где хранится встроенный язык

У каждого объекта метаданных есть свои модули. Открываются двойным щелчком по объекту или через контекстное меню Открыть модуль …. Основные контейнеры кода:

  • 📦 Модуль объекта — логика конкретного документа или справочника: обработчики ПередЗаписью, ПриПроведении, ОбработкаПроведения.
  • 📋 Модуль менеджера — процедуры уровня всего объекта, а не отдельного экземпляра (например, печать по списку).
  • 🖥 Модуль формы — код конкретной формы и её элементов (разбираем отдельно ниже).
  • 🔁 Общие модули — переиспользуемый код, доступный из всей конфигурации. Создаются в ветке Общие → Общие модули.
  • ⚙️ Модуль приложения (управляемого и обычного) — то, что выполняется при старте сеанса: ПриНачалеРаботыСистемы.
  • 🔒 Модуль сеанса — установка параметров сеанса в самом начале, до запуска.

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

Пример процедуры в общем модуле — она пересчитывает сумму строки табличной части:

Процедура ПересчитатьСумму(СтрокаТЧ) Экспорт
    СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецПроцедуры

Ключевое слово Экспорт обязательно, если процедуру вызывают из других модулей. Без него она видна только внутри своего модуля — частая причина ошибки «процедура не обнаружена».

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

Обработчики событий формы

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

Порядок такой:

  1. Откройте нужную форму объекта в Конфигураторе (ветка Формы внутри справочника или документа).
  2. Выделите элемент — поле ввода, кнопку, саму форму — и перейдите на закладку События в палитре свойств.
  3. Напротив нужного события нажмите на значок лупы — платформа создаст пустую процедуру-обработчик в модуле формы и подставит её имя.
  4. Впишите код внутрь созданной процедуры.

Над каждой процедурой формы стоит директива компиляции — она говорит, где выполняется код:

  • &НаКлиенте — на компьютере пользователя (работа с интерфейсом, вопросы, сообщения).
  • &НаСервере — на сервере (чтение и запись данных, запросы).
  • &НаСервереБезКонтекста — серверный вызов без передачи данных формы, самый экономный.

Пример клиентского обработчика события «при изменении» для поля даты:

&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
    Если Объект.ДатаНачала > Объект.ДатаОкончания Тогда
        Объект.ДатаОкончания = Объект.ДатаНачала;
    КонецЕсли;
КонецПроцедуры

Напрямую обращаться к базе из &НаКлиенте нельзя. За данными идут на сервер — через отдельную процедуру с директивой &НаСервере или &НаСервереБезКонтекста.

Внешние обработки и отчёты

Если задача разовая или её нужно переносить между базами, код оформляют внешней обработкой — это отдельный файл .epf (отчёт — .erf), не входящий в конфигурацию.

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

Чтобы обработка была доступна пользователям постоянно, её подключают как дополнительную через механизм библиотеки стандартных подсистем. В типовых конфигурациях путь — Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. Там обработку добавляют в список и назначают, в каких документах или справочниках она появится.

Минимальный модуль обработки, которая выводит сообщение:

Процедура ВыполнитьДействие() Экспорт
    Сообщить("Обработка запущена: " + ТекущаяДата());
КонецПроцедуры

При подключении дополнительной обработки платформа спрашивает про безопасный режим. В нём обработке запрещены потенциально опасные операции — работа с файлами, запуск внешних программ, COM. Для доверенной обработки своей разработки безопасный режим можно отключить, но снимать его с чужого непроверенного файла рискованно.

Внешние обработки удобны тем, что не требуют снятия конфигурации с поддержки и не мешают обновлениям. Минус — их сложнее централизованно обновлять на многих базах: каждый файл приходится заменять вручную или через механизм дополнительных обработок.

Расширения конфигурации: доработка без правки типовой

Расширение — это отдельная мини-конфигурация поверх основной. Механизм появился в платформе 8.3.6 и стал основным способом дорабатывать типовые решения, не снимая их с поддержки. Файл расширения — .cfe.

В Конфигураторе список открывается через Конфигурация → Расширения конфигурации. Кнопкой + добавляете расширение, задаёте имя и префикс, затем через Конфигурация → Открыть конфигурацию расширения правите уже его дерево.

В расширение «заимствуют» нужный объект типовой конфигурации (контекстное меню Добавить в расширение) и переопределяют его форму или добавляют свой обработчик. Код в модулях расширения помечается аннотациями &Перед, &После, &Вместо — они указывают, как ваша процедура встраивается в типовую.

Загрузка готового .cfe в рабочую базу — два разных шага, не путайте их:

  1. Конфигурация → Расширения конфигурации → Загрузить конфигурацию из файла — платформа принимает файл.
  2. Конфигурация → Обновить конфигурацию базы данных (клавиша F7) — изменения реально применяются к базе.

Второй шаг меняет структуру базы и требует монопольного доступа — активные сеансы пользователей прервутся. Делайте это в нерабочее время и после резервной копии.

Расширение можно подключить и в режиме 1С:Предприятие: Функции для технического специалиста → Стандартные → Управление расширениями конфигурации (пункт появляется, если включён режим технического специалиста в настройках).

1С:EDT — среда разработки на базе Eclipse

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

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

Когда EDT оправдан:

  • в проекте несколько разработчиков и нужен Git с ветками и слиянием;
  • нужна история изменений по каждой строке;
  • удобнее работать в текстовом формате, а не в бинарном .cf.

Готовый проект EDT выгружается обратно в формат конфигурации (.cf или напрямую в базу) для запуска. Для небольших доработок одного человека проще остаётся Конфигуратор — EDT тяжелее и требует привыкания.

Пакетная загрузка кода через командную строку

Когда правки нужно накатывать на несколько баз или встроить в автоматическую сборку, Конфигуратор запускают в пакетном режиме — ключом DESIGNER. Команда вызывает исполняемый файл 1cv8.exe из каталога bin установленной платформы.

Базовый вызов для загрузки готовой конфигурации из файла .cf и применения к базе:

"C:\Program Files\1cv8\8.3.24.xxxx\bin\1cv8.exe" DESIGNER ^
  /F "C:\base" /N "Администратор" /P "пароль" ^
  /LoadCfg "C:\new.cf" /UpdateDBCfg

Ключевые параметры:

ПараметрЧто делает
/LoadCfg файл.cfзагружает конфигурацию из файла
/UpdateDBCfgприменяет изменения к структуре базы
/DumpConfigToFiles каталогвыгружает конфигурацию в текстовые файлы
/LoadConfigFromFiles каталогсобирает конфигурацию из текстовых файлов

Выгрузка и загрузка в текстовые файлы (DumpConfigToFiles / LoadConfigFromFiles) — тот самый формат, с которым дружит Git, если вы не используете EDT.

Чтобы пакетный запуск не останавливался на вопросах и его можно было встроить в скрипт сборки, добавляют служебные ключи:

  • /DisableStartupDialogs — не показывать стартовые диалоги;
  • /DisableStartupMessages — не показывать стартовые сообщения;
  • /Out "C:\log.txt" — писать результат и ошибки в файл журнала.

Параметры подключения к базе (/F для файловой, /S для серверной), логин и пароль указывают до ключей режима. Весь вызов обычно оформляют одним .bat-файлом и ставят в планировщик или в конвейер сборки.

Ключ /UpdateDBCfg требует монопольного доступа к базе: все активные сеансы будут завершены. В клиент-серверной базе планируйте запуск на окно обслуживания. Точные доступные ключи смотрите в справке запуска — вызовите 1cv8.exe /?.

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

Типичные ошибки новичков

Ошибки, из-за которых код «не ставится» или ломает базу:

  • 🔴 Правка типовой напрямую. Сняли конфигурацию с поддержки, поправили модуль — и на ближайшем обновлении получили ворох конфликтов. Решение: расширение вместо правки оригинала.
  • 🔴 Забыли F7. Загрузили .cf или .cfe, но не обновили конфигурацию базы данных — изменения не применились. Загрузка и обновление базы — два отдельных действия.
  • 🔴 Клиент лезет в базу. Обращение к справочникам и регистрам из процедуры &НаКлиенте вызывает ошибку компиляции. Данные читают и пишут на сервере.
  • 🔴 Нет Экспорт у процедуры. Процедуру общего модуля или модуля объекта, которую вызывают извне, нужно помечать ключевым словом Экспорт, иначе она не видна снаружи.
  • 🔴 Обновление без копии и без монополии. Применение изменений структуры прерывает сеансы. Перед /UpdateDBCfg или F7 — выгрузка базы в .dt и работа в окно обслуживания.

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

Нужно ли снимать типовую конфигурацию с поддержки, чтобы добавить код?
Нет. Для доработок используйте расширение конфигурации — оно подключается поверх типовой и не снимает её с поддержки. Снятие с замка оправдано только для сложных изменений, которые нельзя сделать расширением.
Чем модуль объекта отличается от модуля формы?
Модуль объекта хранит логику самого документа или справочника (запись, проведение) и работает независимо от того, открыта ли форма. Модуль формы отвечает за поведение конкретной формы и её элементов на экране.
Можно ли писать код в режиме 1С:Предприятие, без Конфигуратора?
Встроенный язык конфигурации — только через Конфигуратор или EDT. В режиме Предприятия доступны лишь внешние обработки, которые вы открываете через Файл → Открыть, и подключение готовых расширений.
Что выбрать для командной разработки — Конфигуратор или EDT?
Для нескольких разработчиков и работы через Git удобнее EDT: конфигурация хранится в текстовых файлах. Для доработок одного специалиста обычно достаточно Конфигуратора.
Почему после загрузки расширения ничего не изменилось?
Скорее всего, не выполнен второй шаг — Обновить конфигурацию базы данных (F7). Загрузка .cfe только принимает файл, а применяет изменения именно обновление базы.

Короткий ориентир, какой способ выбрать под вашу задачу:

Куда поставить код в вашем случае?