Правка кода модуля в Конфигураторе 1С 8.3: от снятия замка до проверки в отладчике
Содержание
Чтобы отредактировать модуль в 1С, откройте базу в режиме Конфигуратор, выполните Конфигурация → Открыть конфигурацию, найдите объект в дереве, щёлкните по нему правой кнопкой и выберите нужный модуль. Внесите правку, проверьте синтаксис (Ctrl+F7) и примените изменения через Конфигурация → Обновить конфигурацию базы данных (F7). В типовой конфигурации, которая стоит на поддержке, модуль сначала откроется только для чтения — замок снимают в настройках поддержки или, что правильнее, вносят изменение через расширение.
Порядок одинаков для всех конфигураций на платформе 8.3: БП 3.0, ЗУП 3.1, УТ 11 и самописных. Разница только в том, где лежит нужный код и закрыт ли он поставщиком.
Какие бывают модули и где какой код живёт
Первая ошибка новичка — правка не в том модуле. Код кнопки на форме не найти в модуле объекта, а обработчик проведения документа — в модуле формы. Прежде чем открывать Конфигуратор, определите, какой модуль вам нужен.
| Модуль | Где находится | Что в нём пишут |
|---|---|---|
| Модуль объекта | У документа, справочника, обработки, отчёта | Обработчики ПередЗаписью, ОбработкаПроведения, ОбработкаЗаполнения |
| Модуль менеджера | Там же, рядом с модулем объекта | Функции, которые не требуют конкретного экземпляра: печать, выборки, служебные методы |
| Модуль формы | У каждой формы объекта | Реакция на кнопки, изменение полей, открытие формы |
| Общий модуль | Ветка Общие → Общие модули | Процедуры, которые вызываются из разных мест |
| Модуль набора записей | У регистров | Обработчики записи движений |
| Модуль команды | У команды объекта или общей команды | Действие при нажатии команды в интерфейсе |
| Модуль сеанса | Корень конфигурации | Установка параметров сеанса |
| Модуль управляемого приложения | Корень конфигурации | События при запуске и завершении клиента |
| Модуль внешнего соединения | Корень конфигурации | События при подключении через COM |
💡 Если правка касается того, что пользователь видит и нажимает, — ищите модуль формы или команды. Если правка про то, что происходит при записи или проведении, — модуль объекта или набора записей.
У общих модулей есть флажки в свойствах: Клиент, Сервер, Вызов сервера, Глобальный, Привилегированный. Они определяют, откуда процедуру модуля можно вызвать. Если вы перенесли функцию в общий модуль без флажка Вызов сервера, клиентский код её просто не увидит.
Подготовка: права, резервная копия и вход в Конфигуратор
Без трёх вещей начинать правку нельзя.
- Права. Пользователь должен иметь право администрирования. В типовых конфигурациях это роль «Полные права» (в БП 3.0 и ЗУП 3.1 обычно вместе с ролью «Администратор системы»). Без этого права платформа не пустит пользователя в Конфигуратор и сообщит о нарушении прав доступа.
- Резервная копия. В Конфигураторе:
Администрирование → Выгрузить информационную базу— получите файл.dt. Отдельно сохраните исходную конфигурацию:Конфигурация → Сохранить конфигурацию в файл— файл.cf. Его удобно сравнивать с изменённой версией. - Копия базы для экспериментов. Загрузите
.dtв новую пустую базу и правьте там. В рабочей базе работают люди, и ошибка в модуле проведения остановит их всех.
Не правьте рабочую базу напрямую, пока изменение не проверено на копии.
Войти в Конфигуратор можно из окна запуска: выберите базу и нажмите кнопку Конфигуратор. То же из командной строки:
"C:\Program Files\1cv8\8.3.25.1257\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh_test" /N "Администратор" /P "пароль"
Для клиент-серверной базы вместо /F указывают /S "server\base". Номер версии в пути подставьте свой — посмотрите папку C:\Program Files\1cv8.
После входа дерево объектов ещё не видно. Откройте его: Конфигурация → Открыть конфигурацию.
Как найти нужный модуль и открыть его на редактирование
Через дерево конфигурации
Раскройте ветку (Документы, Справочники, Обработки, Общие → Общие модули), щёлкните правой кнопкой по объекту. В контекстном меню будут пункты Открыть модуль объекта и Открыть модуль менеджера. Чтобы попасть в модуль формы, раскройте у объекта ветку Формы, откройте форму двойным щелчком и перейдите на вкладку Модуль внизу редактора формы.
Быстрый поиск по дереву: встаньте в дерево и начните набирать имя объекта — курсор перескочит на совпадение.
Через поиск по тексту
Когда известен текст ошибки или кусок сообщения, но не известно, где он формируется, используйте глобальный поиск по всем модулям: Ctrl+Shift+F. Введите фразу, например «Не заполнен контрагент», отметьте поиск по всей конфигурации. В результатах двойной щелчок ведёт прямо на строку.
Внутри одного модуля работают обычный поиск Ctrl+F и переход к определению процедуры F12: поставьте курсор на имя вызываемой функции, и редактор откроет место, где она описана.
Если модуль не редактируется: поддержка поставщика
У типовых конфигураций все объекты на поддержке. На значке объекта висит замок, а текст модуля открывается серым, только для чтения. Вариантов два.
Вариант 1. Включить возможность изменения.
Конфигурация → Поддержка → Настройка поддержки.- Кнопка
Включить возможность изменения, подтвердите. - Для нужного объекта выберите правило «Объект поставщика редактируется с сохранением поддержки».
После этого модуль становится редактируемым. Плата за это — каждое следующее обновление типовой придётся проводить через сравнение и объединение, вручную разбирая конфликты в изменённых модулях.
Вариант 2. Расширение конфигурации . Механизм появился в платформе 8.3.6, и для доработок типовых баз он основной.
Конфигурация → Расширения конфигурации→Добавить.- В основной конфигурации правой кнопкой по объекту →
Добавить в расширение. - В модуле объекта внутри расширения правой кнопкой по нужному обработчику в исходной конфигурации и выберите создание перехватчика: перед, после, вместо или с изменением и контролем.
Пример перехвата процедуры модуля объекта документа:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Комментарий = "Создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
КонецЕсли;
КонецПроцедуры
Аннотация &ИзменениеИКонтроль позволяет вставить строки внутрь типовой процедуры, отмечая добавленное директивами #Вставка и #КонецВставки. Если при обновлении поставщик изменит эту процедуру, платформа сообщит о расхождении, а не тихо сломает логику. Эта аннотация доступна в платформе 8.3.16 и новее.
| Способ | Когда подходит | Риски |
|---|---|---|
| Правка самописной конфигурации | Объект не на поддержке | Минимальные, нужна только резервная копия |
| Снятие замка с объекта | Глубокая переделка, которую не сделать расширением | Трудоёмкие обновления, конфликты при объединении |
| Расширение | Доработка типовой БП, ЗУП, УТ | Нужно проверять расширение после каждого обновления |
Правила написания кода в модуле
Встроенный язык 1С прощает многое, но несколько правил нарушать нельзя.
- 📌 Директивы компиляции в модуле формы. Каждая процедура формы помечается:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста,&НаКлиентеНаСервереБезКонтекста. Без директивы процедура формы считается серверной. - 📌 Клиент не видит базу. Запрос к данным, обращение к объекту справочника или регистру — только в серверной процедуре. Из клиентской процедуры вызывайте серверную.
- 📌 Каждая инструкция заканчивается точкой с запятой. Пропуск даёт синтаксическую ошибку на следующей строке, а не на той, где забыли символ.
- 📌 Числа к строке приводите явно.
"Сумма: " + Формат(Сумма, "ЧДЦ=2"), а не голое сложение. - 📌 Области. Группируйте код через
#Область ИмяОбласти…#КонецОбласти— так устроены типовые модули, и в них проще ориентироваться.
Пример клиентской кнопки, которая вызывает серверную функцию:
&НаКлиенте
Процедура ПроверитьДолг(Команда)
Долг = ПолучитьДолгНаСервере(Объект.Контрагент);
Сообщить("Долг контрагента: " + Формат(Долг, "ЧДЦ=2; ЧН=0"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДолгНаСервере(Контрагент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Остатки.СуммаОстаток), 0) КАК Долг
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(, , , Субконто1 = &Контрагент) КАК Остатки";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Долг;
КонецФункции
Здесь функция вызывается без контекста формы, поэтому на сервер не передаются данные формы целиком — так быстрее. Код учебный: в реальной задаче отбирайте и по счетам расчётов.
Комментируйте свои правки в типовом модуле одной узнаваемой строкой, например // ДоработкаИвановой: проверка комментария. При следующем обновлении такой маркер ищется глобальным поиском за секунду.
Проверка синтаксиса и отладка изменений
Проверка синтаксиса
В открытом модуле нажмите Ctrl+F7. Ошибки появятся в окне сообщений внизу с номером строки. Двойной щелчок по сообщению переносит на строку. Проверку всей конфигурации запускают через Конфигурация → Проверка конфигурации.
Синтаксическая проверка не ловит логические ошибки и опечатки в именах реквизитов, которые станут известны только при выполнении. Для этого нужен отладчик.
Запуск отладки
- Поставьте точку останова на строке: курсор на строку и
F9. Слева появится красная метка. - Запустите
Отладка → Начать отладкуи выберите клиент, либо нажмитеF5. Конфигуратор предложит обновить конфигурацию базы, если правки ещё не применены. - В пользовательском режиме выполните действие: нажмите кнопку, проведите документ.
- Выполнение остановится на точке. Дальше:
F10— шаг без захода в процедуры,F11— с заходом,Shift+F9— вычислить выражение и посмотреть значение переменной.
Для клиент-серверной базы точки останова на сервере сработают, только если на сервере 1С разрешена отладка: служба агента запускается с ключом -debug. Добавление ключа требует перезапуска службы 1С, а это обрывает сеансы всех пользователей — делайте вне рабочего времени и только на тестовом сервере.
Уже запущенный сеанс 1С:Предприятия можно подключить к отладчику через Отладка → Подключение.
Сохранение правок и обновление базы данных
В Конфигураторе две конфигурации: основная (та, что вы редактируете) и конфигурация базы данных (та, с которой работают пользователи). Правка в модуле меняет только основную.
Конфигурация → Сохранить конфигурацию(Ctrl+S) — сохраняет изменения основной конфигурации. Пользователи их ещё не видят.Конфигурация → Обновить конфигурацию базы данных(F7) — переносит изменения в рабочую часть.
Если изменён только текст модуля, без новых реквизитов и таблиц, монопольный доступ обычно не нужен: платформа предложит динамическое обновление. Работающие пользователи увидят новый код после перезапуска 1С. Если вы добавили реквизит или изменили структуру, потребуется монопольный режим — все пользователи должны выйти.
Динамическое обновление на загруженной базе может вызвать ошибки у тех, кто прямо сейчас проводит документы. Безопаснее применять изменения, когда в базе никого нет.
С расширением порядок тот же: сохраните расширение и обновите конфигурацию базы данных. Если база ведётся в хранилище конфигурации, перед правкой объект нужно захватить в хранилище, а после — поместить изменения обратно.
Если правка не работает: частые ошибки
Если правка оказалась неудачной и база ведёт себя странно, откатитесь: Конфигурация → Загрузить конфигурацию из файла и выберите сохранённый .cf, затем обновите базу. Для расширения достаточно отключить его в списке расширений. Полный откат данных — загрузка .dt, но она заменит всё, что пользователи успели ввести после выгрузки.
Частые вопросы
Можно ли отредактировать модуль без Конфигуратора, прямо в пользовательском режиме?
Слетят ли мои правки при обновлении типовой конфигурации?
Как узнать, что изменено в типовой конфигурации по сравнению с поставкой?
Конфигурация → Сравнить конфигурации: сравните основную конфигурацию с конфигурацией поставщика. Отчёт покажет изменённые объекты и модули построчно.