Где и чем выполнить свой код в 1С 8.3: от обработки до фонового задания
Содержание
Чтобы запустить процедуру в 1С, её нужно вызвать по имени из кода, который уже выполняется: из обработчика команды формы, из другой процедуры или через фоновое задание. Самый быстрый способ без правки конфигурации — внешняя обработка (.epf) с кнопкой на форме или консоль кода. Если процедура лежит в общем модуле и помечена словом Экспорт, её можно вызвать из любого места: ИмяМодуля.ИмяПроцедуры(Параметры).
Сам по себе текст процедуры ничего не делает. Его не «запускают» двойным щелчком, как скрипт: платформа выполняет код только в ответ на событие — нажатие кнопки, открытие формы, запись объекта, срабатывание расписания. Поэтому вопрос «как запустить процедуру» на деле означает «какое событие к ней привязать». Ниже способы для 1С:Предприятия 8.3 с управляемыми формами, от простого к продвинутому.
Процедура и функция: в чём разница при вызове
Процедура и функция в языке 1С устроены одинаково, кроме одного: функция возвращает значение через Возврат Значение, а процедура — нет. Отсюда разница в синтаксисе вызова.
// Процедура — вызывается отдельным оператором
ПересчитатьИтоги(Документ, Истина);
// Функция — её результат присваивают или используют в выражении
Сумма = ПолучитьСуммуДокумента(Документ);
Если ПолучитьСуммуДокумента(Документ) > 0 Тогда
Сообщить("Документ не пустой");
КонецЕсли;
Функцию тоже можно вызвать как процедуру, отбросив результат: ПолучитьСуммуДокумента(Документ);. Обратное не работает
: попытка написать Х = ПересчитатьИтоги(Документ) закончится ошибкой при выполнении.
Что ещё влияет на запуск:
- 🔹
Экспорт— без этого слова процедура видна только внутри своего модуля. Для вызова из другого модуля, из фонового задания или черезОписаниеОповещенияв чужом модуле слово обязательно. - 🔹 Директивы компиляции в модулях форм:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста. Они определяют, где будет выполнен код и что ему доступно. - 🔹 Параметры передаются по ссылке. Чтобы процедура не меняла переданную переменную, перед параметром ставят
Знач.
Если процедуре нужно вернуть несколько значений, удобнее сделать её функцией, которая возвращает Структура, чем менять параметры по ссылке. Такой код проще читать и отлаживать.
Как запустить процедуру через внешнюю обработку
Внешняя обработка — это файл .epf, который работает с базой, но не входит в конфигурацию. Это стандартный способ выполнить разовый код: исправить данные, выгрузить список, проверить гипотезу.
Создание обработки в Конфигураторе
- Откройте Конфигуратор и выберите
Файл → Новый… → Внешняя обработка. - Задайте имя, например
ЗапускПроцедуры. - На вкладке «Формы» создайте основную форму обработки.
- В редакторе формы добавьте команду, перетащите её на форму — получится кнопка.
- Назначьте команде действие: платформа создаст обработчик в модуле формы.
- Сохраните файл через
Файл → Сохранить как.
Код в модуле формы выглядит так:
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
ПоказатьПредупреждение(, "Готово");
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 Контрагенты.Наименование
|ИЗ Справочник.Контрагенты КАК Контрагенты";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
КонецПроцедуры
Запрос к базе выполняется только на сервере, поэтому клиентская процедура-обработчик кнопки передаёт работу серверной.
Открытие обработки в режиме Предприятия
В интерфейсе «Такси» откройте главное меню (кнопка с тремя полосками в левом верхнем углу) → Файл → Открыть и укажите файл .epf. Появится форма, нажмите кнопку — процедура выполнится.
Для открытия внешних файлов у пользователя должно быть право «Интерактивное открытие внешних обработок». В типовых конфигурациях на БСП при открытии ещё появляется предупреждение безопасности. Если обработки нужны регулярно, их подключают в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Внешняя обработка работает с живыми данными. Перед массовым изменением объектов сделайте резервную копию базы и прогоните код на копии.
Консоль кода: выполнить процедуру без файла обработки
Консоль кода — это та же внешняя обработка, только универсальная: в форме есть поле, куда вставляют текст на языке 1С, и кнопка «Выполнить». Внутри она вызывает оператор Выполнить() платформы. Свои версии консоли распространяют сообщества разработчиков, а в составе дистрибутивов ИТС есть стандартные инструменты разработчика.
Как запустить процедуру через консоль:
- Откройте файл консоли так же, как любую внешнюю обработку .
- Выберите контекст выполнения — на клиенте или на сервере, если консоль это позволяет.
- Вставьте код. Свою процедуру можно описать прямо в тексте не всегда: многие консоли выполняют код как набор операторов. Надёжнее вызвать уже существующую экспортную процедуру общего модуля.
- Нажмите «Выполнить» и посмотрите сообщения внизу формы.
// Пример текста для консоли на сервере
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если ЗначениеЗаполнено(Контрагент) Тогда
ОбщегоНазначения.СообщитьПользователю("Найден: " + Контрагент.ИНН);
КонецЕсли;
Как это работает изнутри, полезно знать и для своих обработок:
| Оператор | Что делает | Когда применять |
|---|---|---|
Выполнить(Строка) | Выполняет строку как набор операторов | Разовый код, вызов процедуры по имени из переменной |
Вычислить(Строка) | Вычисляет выражение и возвращает результат | Получить значение функции по имени |
Вызов процедуры по имени, которое хранится в переменной:
ИмяМетода = "МойОбщийМодуль.ОбновитьКэш";
Выполнить(ИмяМетода + "()");
Никогда не передавайте в Выполнить() строку, которую ввёл пользователь или пришла извне без проверки. Это прямой путь к выполнению чужого кода на сервере. Для внешних данных включайте безопасный режим УстановитьБезопасныйРежим(Истина) перед вызовом.
Вызов процедуры из модуля формы, объекта и общего модуля
Внутри конфигурации процедура вызывается напрямую по имени, если вы в том же модуле, и через точку — если в другом.
Из модуля формы
Процедуры одного модуля формы вызывают друг друга по имени. Ограничение одно: клиентская процедура может вызвать серверную, а серверная клиентскую — нет.
| Откуда вызываем | &НаКлиенте | &НаСервере | &НаСервереБезКонтекста |
|---|---|---|---|
&НаКлиенте | ✅ | ✅ | ✅ |
&НаСервере | ❌ | ✅ | ✅ |
&НаСервереБезКонтекста | ❌ | ❌ | ✅ |
&НаСервереБезКонтекста не видит реквизиты формы, зато быстрее: на сервер не передаются данные формы. Если процедуре нужен только переданный параметр, выбирайте её.
Из модуля объекта
Процедура в модуле объекта (документа, справочника, обработки) с пометкой Экспорт вызывается через сам объект:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ЗаполнитьТабличнуюЧасть();
ДокументОбъект.Записать();
Из формы обработки к модулю объекта обращаются через преобразование реквизита формы:
&НаСервере
Процедура ВыполнитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ОсновнаяПроцедура();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
Из общего модуля
Общий модуль — главное место для процедур, которые нужны в разных местах. Вызов: ИмяМодуля.ИмяПроцедуры(). Где модуль доступен, задают флажки в его свойствах:
- 🖥️ Сервер — вызывается из серверного кода;
- 💻 Клиент (управляемое приложение) — из клиентского кода;
- 🔁 Вызов сервера — серверный модуль, который можно вызвать прямо с клиента;
- 🔐 Привилегированный — код выполняется без проверки прав пользователя.
Если клиентская процедура формы вызывает серверный общий модуль без флажка «Вызов сервера», конфигурация не пройдёт проверку: модуль с клиента не виден.
Запуск процедуры в фоне и по расписанию
Долгие операции — пересчёт остатков, загрузку файлов, массовую рассылку — выносят в фоновое задание. Пользователь не ждёт с «зависшей» формой, а сеанс не обрывается по таймауту.
Фоновое задание из кода
Метод ФоновыеЗадания.Выполнить() запускает экспортную процедуру неглобального общего модуля, доступного на сервере:
&НаСервереБезКонтекста
Процедура ЗапуститьПересчет(Организация)
Параметры = Новый Массив;
Параметры.Добавить(Организация);
ФоновыеЗадания.Выполнить("Пересчеты.ПересчитатьОстатки", Параметры,
"Пересчет_" + Строка(Организация.УникальныйИдентификатор()),
"Пересчет остатков");
КонецПроцедуры
Параметры по порядку: имя метода строкой, массив параметров, ключ и наименование. Ключ не даёт запустить второе такое же задание, пока первое активно.
Что учесть:
- 📦 параметры фонового задания должны сериализоваться: ссылки, строки, числа, структуры подходят, объекты формы — нет;
- 🚫 интерактивные методы вроде
Вопрос()иОткрытьФорму()в фоне недоступны, сообщения пользователю копятся в задании; - 🧰 в типовых конфигурациях на БСП для этого есть общий модуль
ДлительныеОперации: он запускает задание, следит за ним и возвращает результат на клиент.
Регламентное задание
Если процедура должна выполняться сама по расписанию, создайте в Конфигураторе объект «Регламентное задание», укажите в поле «Имя метода» экспортную процедуру общего модуля и задайте расписание. В типовых конфигурациях управлять расписанием из режима Предприятия можно в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там же видно, когда задание запускалось и с какой ошибкой завершилось.
В клиент-серверной базе регламентные задания выполняет кластер серверов 1С. В файловой базе их выполняет один из сеансов с открытым клиентом, поэтому без запущенной 1С расписание не сработает.
Асинхронный вызов процедуры на клиенте
Клиентский код в 8.3 не блокирует интерфейс модальными окнами. Поэтому процедуру, которая должна выполниться после ответа пользователя или через паузу, запускают отложенно.
Через описание оповещения. Процедура вызывается, когда пользователь закроет окно вопроса:
&НаКлиенте
Процедура Удалить(Команда)
Оповещение = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Удалить строки?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьНаСервере();
КонецЕсли;
КонецПроцедуры
Процедура-обработчик оповещения должна быть экспортной, иначе платформа её не найдёт.
Через Асинх и Ждать. В новых версиях платформы (номер не ниже 8.3.18) тот же сценарий пишется линейно: процедуру помечают словом Асинх, а вызов ВопросАсинх() предваряют Ждать.
Через обработчик ожидания. ПодключитьОбработчикОжидания("ОбновитьСтатус", 5, Истина) вызовет клиентскую процедуру формы ОбновитьСтатус через 5 секунд один раз. Без третьего параметра — каждые 5 секунд, пока не вызовете ОтключитьОбработчикОжидания. Этим приёмом проверяют, завершилось ли фоновое задание.
Запуск процедуры из командной строки
Процедуру можно выполнить сразу при старте 1С, без ручного открытия обработки. Для этого у 1cv8.exe есть параметр /Execute — он открывает указанную внешнюю обработку при запуске:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Администратор" /P"пароль" /Execute"D:\Scripts\Ночная.epf"
Номер платформы в пути подставьте свой. В обработке код размещают в обработчике ПриОткрытии формы или вызывают оттуда нужную процедуру. В конце работы можно вызвать ЗавершитьРаботуСистемы(Ложь), чтобы окно закрылось само.
Через параметр /C передают строку, которую код прочитает из глобальной переменной ПараметрЗапуска. Так одна обработка выполняет разные процедуры в зависимости от аргумента. Этот приём используют в планировщике Windows для ночных выгрузок в файловых базах.
Пароль в командной строке виден в настройках задачи планировщика. Заведите для таких запусков отдельного пользователя 1С с минимальными правами.
Отладка и ошибки при запуске процедуры
Если процедура не делает того, что ждали, остановите её на нужной строке отладчиком.
Пошаговая отладка
- В Конфигураторе откройте модуль и поставьте точку останова клавишей
F9. - Запустите отладку:
Отладка → Начать отладку → 1С:ПредприятиеилиF5. - Выполните действие, которое вызывает процедуру. Выполнение остановится на точке.
- Шагайте:
F11— зайти внутрь вызываемой процедуры,F10— выполнить строку целиком. - Значения переменных смотрите в окне вычисления выражений (
Shift+F9) или в табло.
Внешнюю обработку отлаживают так же: откройте её .epf в Конфигураторе через Файл → Открыть, поставьте точки останова и откройте этот же файл в Предприятии, запущенном из отладчика. Для серверного кода в клиент-серверной базе на сервере 1С должна быть включена отладка, иначе точки на &НаСервере не сработают.
Сообщения об ошибках и что они значат
Чтобы ошибка внутри процедуры не обрывала весь сценарий, оборачивайте вызов в Попытка … Исключение:
Попытка
Пересчеты.ПересчитатьОстатки(Организация);
Исключение
ЗаписьЖурналаРегистрации("Пересчет остатков", УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение без параметров передаёт ошибку дальше: вы её записали, но не скрыли. Глушить исключение пустым блоком нельзя — потом не понять, почему данные не изменились. Журнал регистрации смотрят в Администрирование → Обслуживание → Журнал регистрации.
Частые вопросы
Можно ли запустить процедуру без Конфигуратора?
Файл → Открыть. Нужно право на открытие внешних обработок.