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

· 10 мин

Содержание

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

Порядок одинаков для всех конфигураций на платформе 8.3: БП 3.0, ЗУП 3.1, УТ 11 и самописных. Разница только в том, где лежит нужный код и закрыт ли он поставщиком.

Какие бывают модули и где какой код живёт

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

МодульГде находитсяЧто в нём пишут
Модуль объектаУ документа, справочника, обработки, отчётаОбработчики ПередЗаписью, ОбработкаПроведения, ОбработкаЗаполнения
Модуль менеджераТам же, рядом с модулем объектаФункции, которые не требуют конкретного экземпляра: печать, выборки, служебные методы
Модуль формыУ каждой формы объектаРеакция на кнопки, изменение полей, открытие формы
Общий модульВетка Общие → Общие модулиПроцедуры, которые вызываются из разных мест
Модуль набора записейУ регистровОбработчики записи движений
Модуль командыУ команды объекта или общей командыДействие при нажатии команды в интерфейсе
Модуль сеансаКорень конфигурацииУстановка параметров сеанса
Модуль управляемого приложенияКорень конфигурацииСобытия при запуске и завершении клиента
Модуль внешнего соединенияКорень конфигурацииСобытия при подключении через COM

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

У общих модулей есть флажки в свойствах: Клиент, Сервер, Вызов сервера, Глобальный, Привилегированный. Они определяют, откуда процедуру модуля можно вызвать. Если вы перенесли функцию в общий модуль без флажка Вызов сервера, клиентский код её просто не увидит.

Подготовка: права, резервная копия и вход в Конфигуратор

Без трёх вещей начинать правку нельзя.

  1. Права. Пользователь должен иметь право администрирования. В типовых конфигурациях это роль «Полные права» (в БП 3.0 и ЗУП 3.1 обычно вместе с ролью «Администратор системы»). Без этого права платформа не пустит пользователя в Конфигуратор и сообщит о нарушении прав доступа.
  2. Резервная копия. В Конфигураторе: Администрирование → Выгрузить информационную базу — получите файл .dt. Отдельно сохраните исходную конфигурацию: Конфигурация → Сохранить конфигурацию в файл — файл .cf. Его удобно сравнивать с изменённой версией.
  3. Копия базы для экспериментов. Загрузите .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. Включить возможность изменения.

  1. Конфигурация → Поддержка → Настройка поддержки.
  2. Кнопка Включить возможность изменения, подтвердите.
  3. Для нужного объекта выберите правило «Объект поставщика редактируется с сохранением поддержки».

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

Вариант 2. Расширение конфигурации . Механизм появился в платформе 8.3.6, и для доработок типовых баз он основной.

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

Пример перехвата процедуры модуля объекта документа:

&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	Если Не ЗначениеЗаполнено(Комментарий) Тогда
		Комментарий = "Создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	КонецЕсли;
КонецПроцедуры

Аннотация &ИзменениеИКонтроль позволяет вставить строки внутрь типовой процедуры, отмечая добавленное директивами #Вставка и #КонецВставки. Если при обновлении поставщик изменит эту процедуру, платформа сообщит о расхождении, а не тихо сломает логику. Эта аннотация доступна в платформе 8.3.16 и новее.

СпособКогда подходитРиски
Правка самописной конфигурацииОбъект не на поддержкеМинимальные, нужна только резервная копия
Снятие замка с объектаГлубокая переделка, которую не сделать расширениемТрудоёмкие обновления, конфликты при объединении
РасширениеДоработка типовой БП, ЗУП, УТНужно проверять расширение после каждого обновления

Правила написания кода в модуле

Встроенный язык 1С прощает многое, но несколько правил нарушать нельзя.

  • 📌 Директивы компиляции в модуле формы. Каждая процедура формы помечается: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Без директивы процедура формы считается серверной.
  • 📌 Клиент не видит базу. Запрос к данным, обращение к объекту справочника или регистру — только в серверной процедуре. Из клиентской процедуры вызывайте серверную.
  • 📌 Каждая инструкция заканчивается точкой с запятой. Пропуск даёт синтаксическую ошибку на следующей строке, а не на той, где забыли символ.
  • 📌 Числа к строке приводите явно. "Сумма: " + Формат(Сумма, "ЧДЦ=2"), а не голое сложение.
  • 📌 Области. Группируйте код через #Область ИмяОбласти … #КонецОбласти — так устроены типовые модули, и в них проще ориентироваться.

Пример клиентской кнопки, которая вызывает серверную функцию:

&НаКлиенте
Процедура ПроверитьДолг(Команда)
	Долг = ПолучитьДолгНаСервере(Объект.Контрагент);
	Сообщить("Долг контрагента: " + Формат(Долг, "ЧДЦ=2; ЧН=0"));
КонецПроцедуры

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

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

Комментируйте свои правки в типовом модуле одной узнаваемой строкой, например // ДоработкаИвановой: проверка комментария. При следующем обновлении такой маркер ищется глобальным поиском за секунду.

Проверка синтаксиса и отладка изменений

Проверка синтаксиса

В открытом модуле нажмите Ctrl+F7. Ошибки появятся в окне сообщений внизу с номером строки. Двойной щелчок по сообщению переносит на строку. Проверку всей конфигурации запускают через Конфигурация → Проверка конфигурации.

Синтаксическая проверка не ловит логические ошибки и опечатки в именах реквизитов, которые станут известны только при выполнении. Для этого нужен отладчик.

Запуск отладки

  1. Поставьте точку останова на строке: курсор на строку и F9. Слева появится красная метка.
  2. Запустите Отладка → Начать отладку и выберите клиент, либо нажмите F5. Конфигуратор предложит обновить конфигурацию базы, если правки ещё не применены.
  3. В пользовательском режиме выполните действие: нажмите кнопку, проведите документ.
  4. Выполнение остановится на точке. Дальше: F10 — шаг без захода в процедуры, F11 — с заходом, Shift+F9 — вычислить выражение и посмотреть значение переменной.

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

Уже запущенный сеанс 1С:Предприятия можно подключить к отладчику через Отладка → Подключение.

Сохранение правок и обновление базы данных

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

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

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

Динамическое обновление на загруженной базе может вызвать ошибки у тех, кто прямо сейчас проводит документы. Безопаснее применять изменения, когда в базе никого нет.

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

Если правка не работает: частые ошибки

Диагностика: выберите симптом

Если правка оказалась неудачной и база ведёт себя странно, откатитесь: Конфигурация → Загрузить конфигурацию из файла и выберите сохранённый .cf, затем обновите базу. Для расширения достаточно отключить его в списке расширений. Полный откат данных — загрузка .dt, но она заменит всё, что пользователи успели ввести после выгрузки.

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

Можно ли отредактировать модуль без Конфигуратора, прямо в пользовательском режиме?
Нет. Код модулей меняется только в Конфигураторе или в среде разработки EDT. В пользовательском режиме можно подключить готовое расширение или внешнюю обработку, но не править их текст.
Слетят ли мои правки при обновлении типовой конфигурации?
Правки в модулях со снятым замком при обновлении придётся сливать с новой версией вручную. Код в расширении остаётся отдельно и не перезаписывается, но после обновления его стоит проверить на работоспособность.
Как узнать, что изменено в типовой конфигурации по сравнению с поставкой?
Через Конфигурация → Сравнить конфигурации: сравните основную конфигурацию с конфигурацией поставщика. Отчёт покажет изменённые объекты и модули построчно.
Можно ли править модуль, пока пользователи работают в базе?
Редактировать и сохранять основную конфигурацию — да, это не мешает пользователям. Применять изменения лучше без людей в базе: структурные правки требуют монопольного режима, а динамическое обновление может вызвать ошибки у работающих.
Чем &НаСервере отличается от &НаСервереБезКонтекста?
Процедура с &НаСервере получает данные формы: реквизит Объект и элементы доступны, но всё это передаётся на сервер и обратно. Процедура без контекста формы не видит, зато вызов легче. Если нужны только параметры, выбирайте второй вариант.