Добавляем свой код в конфигурацию 1С 8.3
Содержание
Код в 1С пишут не в самой программе «1С:Предприятие», а в отдельном режиме — конфигураторе. Код живёт в модулях: у каждого документа, справочника и формы есть свой модуль, плюс есть общие модули на всю конфигурацию. Вставить строку «куда-нибудь» нельзя — сначала надо выбрать правильный модуль.
Второй момент, о который спотыкаются новички: если конфигурация типовая (БП 3.0, ЗУП 3.1, УТ 11), просто так дописать в неё код не дают — она стоит на поддержке. Либо снимаете её с поддержки, либо, что правильнее, выносите свой код в расширение конфигурации . Ниже — как войти в конфигуратор, в какой модуль писать, как подключить код к кнопке или событию и как его потом проверить.
Любая правка конфигурации — это изменение рабочей базы. Перед первыми экспериментами сделайте резервную копию информационной базы или потренируйтесь на копии.
С чего начать: вход в конфигуратор и доступ к коду
Код редактируют в конфигураторе. В окне запуска 1С выберите нужную базу и нажмите кнопку Конфигуратор, а не 1С:Предприятие. Для этого у вашего пользователя должны быть административные права.
Когда конфигуратор открылся, выведите на экран дерево конфигурации: меню Конфигурация → Открыть конфигурацию. Слева появится дерево со всеми объектами — справочниками, документами, отчётами, общими модулями.
Если база типовая и стоит на поддержке, строки кода в её модулях будут заблокированы для редактирования (замочек). Есть два пути:
- 🔓 Снять конфигурацию с поддержки.
Конфигурация → Поддержка → Настройка поддержки, затем кнопка включения возможности изменения. Минус — усложняются будущие обновления: придётся сравнивать и объединять свои правки с новой версией вендора. - 🧩 Сделать расширение конфигурации. Свой код лежит отдельным файлом, основная конфигурация остаётся нетронутой и обновляется как обычно. Для большинства доработок это предпочтительный вариант — о нём отдельный раздел ниже.
Куда писать код: виды модулей в 1С
Код в 1С не висит в воздухе — он лежит в модулях. Выбор модуля определяет, где и когда код выполнится. Основные модули, с которыми работают чаще всего:
| Модуль | Где находится | Для чего |
|---|---|---|
| Модуль объекта | у справочника, документа, обработки | события самого объекта: запись, проведение, заполнение |
| Модуль формы | у конкретной формы объекта или списка | реакция на действия пользователя в форме |
| Модуль менеджера | у объекта метаданных | процедуры, общие для всех экземпляров объекта |
| Общий модуль | ветка «Общие модули» в дереве | функции, нужные в разных местах конфигурации |
| Модуль приложения | корень конфигурации | код при старте и завершении сеанса |
Правило простое: разовая логика одного документа — в модуль объекта или его формы; то, что пригодится в нескольких местах, — в общий модуль.
В управляемом приложении код ещё делится по месту выполнения директивами компиляции в строке перед процедурой:
&НаКлиенте— выполняется на компьютере пользователя (работа с формой, вопросы, открытие других форм);&НаСервере— выполняется на сервере, есть доступ к базе данных;&НаСервереБезКонтекста— серверный код без передачи данных формы, работает быстрее;&НаКлиентеНаСервереБезКонтекста— доступен и там, и там.
Код в модуле объекта: процедуры и функции документа
Самый частый случай — добавить логику конкретному документу или справочнику. Откройте нужный объект в дереве, в его окне редактирования нажмите ссылку Открыть модуль объекта.
Код пишут процедурами и функциями. Процедура выполняет действие, функция возвращает значение через оператор Возврат. Простой пример функции, которую можно вызвать из любого места объекта:
Функция СуммаПрописью(Сумма) Экспорт
Возврат ЧислоПрописью(Сумма, "Л=ru_RU", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2");
КонецФункции
Ключевое слово Экспорт делает процедуру или функцию доступной снаружи модуля. Без него она видна только внутри своего модуля.
Чтобы код срабатывал сам при определённых событиях документа, его размещают в стандартных обработчиках модуля объекта. Самые ходовые:
ОбработкаЗаполнения— срабатывает при создании нового документа, удобно подставлять значения по умолчанию.ПередЗаписью— выполняется перед сохранением, здесь делают проверки и не дают записать неверные данные.ОбработкаПроведения— формирует движения по регистрам при проведении документа.
Код в модуле объекта выполняется на сервере. Нельзя из него напрямую открыть окно или задать пользователю вопрос — для этого есть модуль формы с клиентскими процедурами.
Сразу приучайте себя оставлять комментарии. Строка после // не выполняется и служит пояснением:
// Ставка НДС по умолчанию для нового документа
Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
Через полгода вы сами не вспомните, зачем писали ту или иную строку, а в чужой базе по комментариям быстрее разобраться в логике. Давайте процедурам говорящие имена на русском (ЗаполнитьРеквизитыПоКонтрагенту), а не Процедура1 — встроенный язык 1С это допускает и поощряет.
Общие модули: функции, доступные из всей конфигурации
Когда одна и та же функция нужна в нескольких документах, её выносят в общий модуль, чтобы не копировать код. Создание: в дереве правой кнопкой на ветке Общие модули → Добавить, задайте имя латиницей без пробелов (например, РаботаСДокументами).
У общего модуля в палитре свойств (F4) есть галочки, которые решают, где он работает:
- Клиент (управляемое приложение) — функции доступны на клиенте;
- Сервер — функции доступны на сервере;
- Вызов сервера — клиент может вызывать серверные экспортные функции модуля;
- Глобальный — экспортные функции вызываются без указания имени модуля, просто по имени.
Пример экспортной функции в общем модуле, помеченном как клиентский и серверный:
&НаКлиентеНаСервере
Функция ПолноеИмя(Фамилия, Имя, Отчество) Экспорт
Возврат СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
КонецФункции
Если модуль не глобальный, вызывают с именем модуля: РаботаСДокументами.ПолноеИмя(...). Если глобальный — просто ПолноеИмя(...) из любого места.
Не делайте все модули глобальными. Глобальные функции дольше компилируются при старте и легко конфликтуют именами. Глобальный модуль оставьте для действительно универсальных мелочей.
Подключение кода к событиям формы и кнопкам
Чтобы код реагировал на действия пользователя, его цепляют к событиям формы. Откройте форму объекта, выделите нужный реквизит или элемент. В палитре свойств найдите раздел событий — у каждого события справа есть кнопка с лупой.
Нажатие на лупу создаёт пустую процедуру-обработчик в модуле формы и сразу переносит вас в неё. Остаётся вписать логику. Например, пересчёт суммы строки при изменении количества:
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецПроцедуры
Чтобы добавить на форму свою кнопку:
- В дереве формы встаньте на корень в ветке
Командаи добавьте новую команду. - Перетащите команду в командную панель формы — появится кнопка.
- У команды в палитре свойств через лупу создайте обработчик действия и впишите код.
Клиентский код (&НаКлиенте) не имеет прямого доступа к базе. Когда с кнопки нужно что-то посчитать или прочитать из базы, вызывают серверную процедуру формы с директивой &НаСервере, а результат возвращают на клиент. Типовая связка из двух процедур выглядит так:
&НаКлиенте
Процедура ЗаполнитьОстаток(Команда)
ПолучитьОстатокНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьОстатокНаСервере()
Объект.Остаток = РегистрыНакопления.ТоварыНаСкладах.Остаток();
КонецПроцедуры
Клиентская процедура привязана к кнопке, а всю работу с базой выполняет серверная — это обязательное разделение в управляемом приложении.
Имя обработчика лучше не переименовывать вручную в коде: платформа связывает процедуру с событием по имени, записанному в палитре свойств. Поменяете имя в тексте — связь потеряется, и обработчик перестанет срабатывать.
Расширение конфигурации — код без снятия с поддержки
Если база типовая, правильнее не снимать её с поддержки, а добавить код через расширение конфигурации. Этот механизм появился в платформе 8.3.6 и давно стал стандартом для доработок, которые не должны мешать обновлениям.
Как создать расширение :
- Меню
Конфигурация → Расширения конфигурации. - Кнопка добавления — задайте имя, префикс и назначение (обычно «Дополнение»).
- Откройте расширение как отдельную конфигурацию. В него добавляют заимствованные объекты основной конфигурации и свои модули.
Чтобы дописать код в типовой документ через расширение, объект сначала заимствуют (добавляют в расширение командой добавления из основной конфигурации), а затем правят его модуль. При этом основная конфигурация остаётся на поддержке и обновляется штатно.
Загрузка готового файла расширения .cfe и команда Обновить конфигурацию базы данных — два разных шага. После загрузки файла расширение ещё нужно применить к базе.
Расширение отключается одной галочкой и не ломает основную конфигурацию — это его главный плюс перед правкой «в теле» базы.
Проверка и отладка добавленного кода
Прежде чем запускать, проверьте синтаксис. В открытом модуле нажмите Ctrl+F7 (синтаксический контроль) — платформа подсветит опечатки, незакрытые скобки и неизвестные имена. Это быстрее, чем ловить ошибку уже при запуске.
Пока пишете, пользуйтесь контекстной подсказкой: Ctrl+Пробел показывает доступные свойства и методы. Полное описание любого метода — в синтакс-помощнике (Справка → Синтакс-помощник).
Чтобы пошагово посмотреть, как работает код, нужна отладка. Включите разрешение отладки в настройках запуска (Сервис → Параметры, вкладка запуска 1С:Предприятия). Дальше:
F9на строке — поставить точку останова (красный кружок), на ней выполнение замрёт.F5— запустить 1С:Предприятие в режиме отладки.F11— выполнить строку с заходом внутрь вызываемой процедуры,F10— выполнить строку, не заходя внутрь.- Окно
Табло— посмотреть текущие значения переменных прямо во время остановки. - Навести курсор на переменную при остановке — платформа покажет её значение во всплывающей подсказке, не открывая табло.
Если код остановился на точке и дальше идёт не так, как задумано, прогоните его по строкам клавишей F11 и смотрите, на каком шаге значение переменной становится неожиданным. Это и есть самый быстрый способ найти логическую ошибку, которую синтаксический контроль не ловит.
Чтобы изменения в коде попали в базу, после правки выполните Обновить конфигурацию базы данных (F7). Если менялся только код (без новых реквизитов и таблиц), монопольный доступ обычно не нужен — база обновится без выгона пользователей. Структурные изменения потребуют монопольного режима.
Частые ошибки при добавлении кода
Разберём то, что чаще всего мешает коду заработать.
Экспорт у вызываемой функции, либо вызываете из клиента серверную функцию без галочки «Вызов сервера» у общего модуля.Обновить конфигурацию базы данных (F7) — правки остались только в конфигураторе.Частые вопросы
Можно ли добавить код, не снимая конфигурацию с поддержки?
В чём разница между процедурой и функцией?
Возврат и используется, когда результат нужен для дальнейших вычислений или присваивания.Зачем нужны директивы `&НаКлиенте` и `&НаСервере`?
Как быстро найти нужный метод встроенного языка?
Ctrl+Пробел для контекстной подсказки прямо в коде или откройте синтакс-помощник через меню Справка. Там описание и примеры по каждому методу.Почему мой код не выполняется после сохранения?
Обновить конфигурацию базы данных клавишей F7, иначе изменения не попадут в рабочую базу.