Куда и как добавлять программный код в 1С
Содержание
Код в 1С живёт в модулях — программных контейнерах, которые привязаны к объектам конфигурации, формам, внешним файлам или расширениям. Куда именно писать, зависит от задачи: разовый пересчёт удобнее сделать внешней обработкой, а постоянную проверку при проведении документа — в модуле этого документа.
Главная ошибка новичка — открыть типовую конфигурацию (Бухгалтерию, ЗУП, УТ), снять её с поддержки и править модули напрямую. После первого же обновления правки либо слетят, либо обновление встанет на конфликтах. Типовую конфигурацию в режиме сравнения-объединения трогать не нужно. Для своих доработок есть расширения — они живут отдельно и переживают обновления.
Ниже — где физически размещается встроенный язык, чем модуль объекта отличается от модуля формы и как загрузить готовый код в базу через командную строку.
С чего начать: Конфигуратор и режим изменения
Код пишут в Конфигураторе — классической среде разработки платформы 8.3. Запустите базу из списка в режиме Конфигуратор, затем откройте дерево через меню Конфигурация → Открыть конфигурацию.
Чтобы вносить правки в типовую конфигурацию, у неё нужно разрешить изменение: Конфигурация → Поддержка → Настройка поддержки, кнопка Включить возможность изменения. Но это крайняя мера. Для прикладных доработок правильнее подключить расширение
(раздел ниже) и не снимать основную конфигурацию с замка.
Если видите у объектов жёлтый замок — конфигурация на поддержке и защищена от изменений. Это нормальное состояние для типовых решений.
Собственную пустую конфигурацию (не типовую) можно редактировать сразу — никаких замков на ней нет.
Модули конфигурации: где хранится встроенный язык
У каждого объекта метаданных есть свои модули. Открываются двойным щелчком по объекту или через контекстное меню Открыть модуль …. Основные контейнеры кода:
- 📦 Модуль объекта — логика конкретного документа или справочника: обработчики
ПередЗаписью,ПриПроведении,ОбработкаПроведения. - 📋 Модуль менеджера — процедуры уровня всего объекта, а не отдельного экземпляра (например, печать по списку).
- 🖥 Модуль формы — код конкретной формы и её элементов (разбираем отдельно ниже).
- 🔁 Общие модули — переиспользуемый код, доступный из всей конфигурации. Создаются в ветке
Общие → Общие модули. - ⚙️ Модуль приложения (управляемого и обычного) — то, что выполняется при старте сеанса:
ПриНачалеРаботыСистемы. - 🔒 Модуль сеанса — установка параметров сеанса в самом начале, до запуска.
Для серверного кода в общих модулях важны флаги в свойствах: Сервер, Клиент (управляемое приложение), Вызов сервера. Они определяют, где процедура может выполняться. Комбинация этих флагов задаёт «контекст» модуля — например, модуль только с флагом Сервер недоступен с клиента напрямую, а флаг Вызов сервера открывает его экспортные процедуры клиентскому коду.
Пример процедуры в общем модуле — она пересчитывает сумму строки табличной части:
Процедура ПересчитатьСумму(СтрокаТЧ) Экспорт
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецПроцедуры
Ключевое слово Экспорт обязательно, если процедуру вызывают из других модулей. Без него она видна только внутри своего модуля — частая причина ошибки «процедура не обнаружена».
Отдельно стоит модуль команды — он привязан к команде объекта или общей команде и срабатывает по её нажатию. В нём пишут то, что должно выполниться, когда пользователь выбирает команду в интерфейсе.
Обработчики событий формы
Самый частый сценарий доработки — отреагировать на действие пользователя на форме: ввод значения в поле, нажатие кнопки, открытие формы.
Порядок такой:
- Откройте нужную форму объекта в Конфигураторе (ветка
Формывнутри справочника или документа). - Выделите элемент — поле ввода, кнопку, саму форму — и перейдите на закладку
Событияв палитре свойств. - Напротив нужного события нажмите на значок лупы — платформа создаст пустую процедуру-обработчик в модуле формы и подставит её имя.
- Впишите код внутрь созданной процедуры.
Над каждой процедурой формы стоит директива компиляции — она говорит, где выполняется код:
&НаКлиенте— на компьютере пользователя (работа с интерфейсом, вопросы, сообщения).&НаСервере— на сервере (чтение и запись данных, запросы).&НаСервереБезКонтекста— серверный вызов без передачи данных формы, самый экономный.
Пример клиентского обработчика события «при изменении» для поля даты:
&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
Если Объект.ДатаНачала > Объект.ДатаОкончания Тогда
Объект.ДатаОкончания = Объект.ДатаНачала;
КонецЕсли;
КонецПроцедуры
Напрямую обращаться к базе из &НаКлиенте нельзя. За данными идут на сервер — через отдельную процедуру с директивой &НаСервере или &НаСервереБезКонтекста.
Внешние обработки и отчёты
Если задача разовая или её нужно переносить между базами, код оформляют внешней обработкой — это отдельный файл .epf (отчёт — .erf), не входящий в конфигурацию.
Создаётся в Конфигураторе: меню Файл → Новый → Внешняя обработка. Внутри можно добавить реквизиты, формы, табличные части и модуль объекта обработки. Готовый файл сохраняется на диск и открывается в режиме 1С:Предприятие через Файл → Открыть.
Чтобы обработка была доступна пользователям постоянно, её подключают как дополнительную через механизм библиотеки стандартных подсистем. В типовых конфигурациях путь — Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. Там обработку добавляют в список и назначают, в каких документах или справочниках она появится.
Минимальный модуль обработки, которая выводит сообщение:
Процедура ВыполнитьДействие() Экспорт
Сообщить("Обработка запущена: " + ТекущаяДата());
КонецПроцедуры
При подключении дополнительной обработки платформа спрашивает про безопасный режим. В нём обработке запрещены потенциально опасные операции — работа с файлами, запуск внешних программ, COM. Для доверенной обработки своей разработки безопасный режим можно отключить, но снимать его с чужого непроверенного файла рискованно.
Внешние обработки удобны тем, что не требуют снятия конфигурации с поддержки и не мешают обновлениям. Минус — их сложнее централизованно обновлять на многих базах: каждый файл приходится заменять вручную или через механизм дополнительных обработок.
Расширения конфигурации: доработка без правки типовой
Расширение — это отдельная мини-конфигурация поверх основной. Механизм появился в платформе 8.3.6 и стал основным способом дорабатывать типовые решения, не снимая их с поддержки. Файл расширения — .cfe.
В Конфигураторе список открывается через Конфигурация → Расширения конфигурации. Кнопкой + добавляете расширение, задаёте имя и префикс, затем через Конфигурация → Открыть конфигурацию расширения правите уже его дерево.
В расширение «заимствуют» нужный объект типовой конфигурации (контекстное меню Добавить в расширение) и переопределяют его форму или добавляют свой обработчик. Код в модулях расширения помечается аннотациями &Перед, &После, &Вместо — они указывают, как ваша процедура встраивается в типовую.
Загрузка готового .cfe в рабочую базу — два разных шага, не путайте их:
Конфигурация → Расширения конфигурации → Загрузить конфигурацию из файла— платформа принимает файл.Конфигурация → Обновить конфигурацию базы данных(клавиша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?
Почему после загрузки расширения ничего не изменилось?
Обновить конфигурацию базы данных (F7). Загрузка .cfe только принимает файл, а применяет изменения именно обновление базы.Короткий ориентир, какой способ выбрать под вашу задачу: