Добавляем свой код в конфигурацию 1С 8.3

· 9 мин

Содержание

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

Второй момент, о который спотыкаются новички: если конфигурация типовая (БП 3.0, ЗУП 3.1, УТ 11), просто так дописать в неё код не дают — она стоит на поддержке. Либо снимаете её с поддержки, либо, что правильнее, выносите свой код в расширение конфигурации . Ниже — как войти в конфигуратор, в какой модуль писать, как подключить код к кнопке или событию и как его потом проверить.

Любая правка конфигурации — это изменение рабочей базы. Перед первыми экспериментами сделайте резервную копию информационной базы или потренируйтесь на копии.

С чего начать: вход в конфигуратор и доступ к коду

Код редактируют в конфигураторе. В окне запуска 1С выберите нужную базу и нажмите кнопку Конфигуратор, а не 1С:Предприятие. Для этого у вашего пользователя должны быть административные права.

Когда конфигуратор открылся, выведите на экран дерево конфигурации: меню Конфигурация → Открыть конфигурацию. Слева появится дерево со всеми объектами — справочниками, документами, отчётами, общими модулями.

Если база типовая и стоит на поддержке, строки кода в её модулях будут заблокированы для редактирования (замочек). Есть два пути:

  • 🔓 Снять конфигурацию с поддержки. Конфигурация → Поддержка → Настройка поддержки, затем кнопка включения возможности изменения. Минус — усложняются будущие обновления: придётся сравнивать и объединять свои правки с новой версией вендора.
  • 🧩 Сделать расширение конфигурации. Свой код лежит отдельным файлом, основная конфигурация остаётся нетронутой и обновляется как обычно. Для большинства доработок это предпочтительный вариант — о нём отдельный раздел ниже.
Что проверить перед тем, как писать код
Выполнено: 0 / 5

Куда писать код: виды модулей в 1С

Код в 1С не висит в воздухе — он лежит в модулях. Выбор модуля определяет, где и когда код выполнится. Основные модули, с которыми работают чаще всего:

МодульГде находитсяДля чего
Модуль объектау справочника, документа, обработкисобытия самого объекта: запись, проведение, заполнение
Модуль формыу конкретной формы объекта или спискареакция на действия пользователя в форме
Модуль менеджерау объекта метаданныхпроцедуры, общие для всех экземпляров объекта
Общий модульветка «Общие модули» в деревефункции, нужные в разных местах конфигурации
Модуль приложениякорень конфигурациикод при старте и завершении сеанса

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

В управляемом приложении код ещё делится по месту выполнения директивами компиляции в строке перед процедурой:

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

Код в модуле объекта: процедуры и функции документа

Самый частый случай — добавить логику конкретному документу или справочнику. Откройте нужный объект в дереве, в его окне редактирования нажмите ссылку Открыть модуль объекта.

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

Функция СуммаПрописью(Сумма) Экспорт
    Возврат ЧислоПрописью(Сумма, "Л=ru_RU", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2");
КонецФункции

Ключевое слово Экспорт делает процедуру или функцию доступной снаружи модуля. Без него она видна только внутри своего модуля.

Чтобы код срабатывал сам при определённых событиях документа, его размещают в стандартных обработчиках модуля объекта. Самые ходовые:

  1. ОбработкаЗаполнения — срабатывает при создании нового документа, удобно подставлять значения по умолчанию.
  2. ПередЗаписью — выполняется перед сохранением, здесь делают проверки и не дают записать неверные данные.
  3. ОбработкаПроведения — формирует движения по регистрам при проведении документа.

Код в модуле объекта выполняется на сервере. Нельзя из него напрямую открыть окно или задать пользователю вопрос — для этого есть модуль формы с клиентскими процедурами.

Сразу приучайте себя оставлять комментарии. Строка после // не выполняется и служит пояснением:

// Ставка НДС по умолчанию для нового документа
Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

Через полгода вы сами не вспомните, зачем писали ту или иную строку, а в чужой базе по комментариям быстрее разобраться в логике. Давайте процедурам говорящие имена на русском (ЗаполнитьРеквизитыПоКонтрагенту), а не Процедура1 — встроенный язык 1С это допускает и поощряет.

Общие модули: функции, доступные из всей конфигурации

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

У общего модуля в палитре свойств (F4) есть галочки, которые решают, где он работает:

  • Клиент (управляемое приложение) — функции доступны на клиенте;
  • Сервер — функции доступны на сервере;
  • Вызов сервера — клиент может вызывать серверные экспортные функции модуля;
  • Глобальный — экспортные функции вызываются без указания имени модуля, просто по имени.

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

&НаКлиентеНаСервере
Функция ПолноеИмя(Фамилия, Имя, Отчество) Экспорт
    Возврат СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
КонецФункции

Если модуль не глобальный, вызывают с именем модуля: РаботаСДокументами.ПолноеИмя(...). Если глобальный — просто ПолноеИмя(...) из любого места.

Не делайте все модули глобальными. Глобальные функции дольше компилируются при старте и легко конфликтуют именами. Глобальный модуль оставьте для действительно универсальных мелочей.

Подключение кода к событиям формы и кнопкам

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

Нажатие на лупу создаёт пустую процедуру-обработчик в модуле формы и сразу переносит вас в неё. Остаётся вписать логику. Например, пересчёт суммы строки при изменении количества:

&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецПроцедуры

Чтобы добавить на форму свою кнопку:

  1. В дереве формы встаньте на корень в ветке Команда и добавьте новую команду.
  2. Перетащите команду в командную панель формы — появится кнопка.
  3. У команды в палитре свойств через лупу создайте обработчик действия и впишите код.

Клиентский код (&НаКлиенте) не имеет прямого доступа к базе. Когда с кнопки нужно что-то посчитать или прочитать из базы, вызывают серверную процедуру формы с директивой &НаСервере, а результат возвращают на клиент. Типовая связка из двух процедур выглядит так:

&НаКлиенте
Процедура ЗаполнитьОстаток(Команда)
    ПолучитьОстатокНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПолучитьОстатокНаСервере()
    Объект.Остаток = РегистрыНакопления.ТоварыНаСкладах.Остаток();
КонецПроцедуры

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

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

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

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

Как создать расширение :

  1. Меню Конфигурация → Расширения конфигурации.
  2. Кнопка добавления — задайте имя, префикс и назначение (обычно «Дополнение»).
  3. Откройте расширение как отдельную конфигурацию. В него добавляют заимствованные объекты основной конфигурации и свои модули.

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

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

Расширение отключается одной галочкой и не ломает основную конфигурацию — это его главный плюс перед правкой «в теле» базы.

Проверка и отладка добавленного кода

Прежде чем запускать, проверьте синтаксис. В открытом модуле нажмите Ctrl+F7 (синтаксический контроль) — платформа подсветит опечатки, незакрытые скобки и неизвестные имена. Это быстрее, чем ловить ошибку уже при запуске.

Пока пишете, пользуйтесь контекстной подсказкой: Ctrl+Пробел показывает доступные свойства и методы. Полное описание любого метода — в синтакс-помощнике (Справка → Синтакс-помощник).

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

  • F9 на строке — поставить точку останова (красный кружок), на ней выполнение замрёт.
  • F5 — запустить 1С:Предприятие в режиме отладки.
  • F11 — выполнить строку с заходом внутрь вызываемой процедуры, F10 — выполнить строку, не заходя внутрь.
  • Окно Табло — посмотреть текущие значения переменных прямо во время остановки.
  • Навести курсор на переменную при остановке — платформа покажет её значение во всплывающей подсказке, не открывая табло.

Если код остановился на точке и дальше идёт не так, как задумано, прогоните его по строкам клавишей F11 и смотрите, на каком шаге значение переменной становится неожиданным. Это и есть самый быстрый способ найти логическую ошибку, которую синтаксический контроль не ловит.

Чтобы изменения в коде попали в базу, после правки выполните Обновить конфигурацию базы данных (F7). Если менялся только код (без новых реквизитов и таблиц), монопольный доступ обычно не нужен — база обновится без выгона пользователей. Структурные изменения потребуют монопольного режима.

Частые ошибки при добавлении кода

Разберём то, что чаще всего мешает коду заработать.

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

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

Можно ли добавить код, не снимая конфигурацию с поддержки?
Да. Для этого и придумано расширение конфигурации: ваш код лежит отдельно, основная конфигурация остаётся на поддержке и обновляется штатно.
В чём разница между процедурой и функцией?
Процедура выполняет действия и ничего не возвращает. Функция возвращает значение через оператор Возврат и используется, когда результат нужен для дальнейших вычислений или присваивания.
Зачем нужны директивы `&НаКлиенте` и `&НаСервере`?
Они указывают, где выполнится код. Клиентский работает на компьютере пользователя и управляет формой, серверный имеет доступ к базе данных. Путать их нельзя: из клиента напрямую к базе не обратиться.
Как быстро найти нужный метод встроенного языка?
Нажмите Ctrl+Пробел для контекстной подсказки прямо в коде или откройте синтакс-помощник через меню Справка. Там описание и примеры по каждому методу.
Почему мой код не выполняется после сохранения?
Сохранение в конфигураторе и применение к базе — разные действия. Выполните Обновить конфигурацию базы данных клавишей F7, иначе изменения не попадут в рабочую базу.