При разработке конфигураций или внешних обработок на платформе 1С:Предприятие 8 часто возникает задача автоматического завершения работы системы. Например, когда обработка должна выполнить загрузку данных и сразу после этого закрыть программу, чтобы освободить лицензию или завершить регламентный цикл. Однако начинающие разработчики часто сталкиваются с ошибкой «Процедура или функция с указанным именем не определена (ЗавершитьРаботуСистемы)». В этой статье мы подробно разберем, почему это происходит, как правильно вызывать методы закрытия и какие альтернативы существуют.
Первым делом проанализируем ситуацию, описанную автором темы. Попытка вызвать метод ЗавершитьРаботуСистемы() внутри серверного кода или общего модуля, предназначенного для работы на сервере, всегда будет приводить к ошибке компиляции. Это связано с архитектурой 1С: клиент-серверное взаимодействие четко разграничивает области видимости функций.
Методы управления интерфейсом и состоянием приложения (такие как закрытие окон или завершение сеанса) доступны исключительно на стороне клиента. Проанализируем список доступности для метода ЗавершитьРаботуСистемы():
Если вы пытаетесь вызвать эту функцию в процедуре с директивой &НаСервере или в общем модуле, у которого установлен флаг «Сервер», система «не видит» эту процедуру, так как на сервере физически нет «рабочего стола» или «приложения», которое можно закрыть — там исполняется только программный код сеанса. Для автоматического поиска подобных контекстных ошибок в модулях и обработках можно использовать инструмент для анализа конфигураций и обработок на наличие ошибок.
Разберем по шагам, как организовать выполнение серверной логики с последующим выходом из программы. Основное правило: управление всегда должно возвращаться на клиента. Рассмотрим пример кода в управляемой форме:
&НаКлиенте
Процедура ВыполнитьИЗакрыть(Команда)
// 1. Вызываем тяжелую операцию на сервере
ВыполнитьЗагрузкуНаСервере();
// 2. Информируем пользователя (опционально)
Сообщить("Загрузка успешно завершена. Программа будет закрыта.");
// 3. Завершаем работу системы
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере()
// Здесь располагается логика обработки данных
// Например, создание документов или загрузка из файла
КонецПроцедуры
В данном примере мы используем параметр Ложь в методе ЗавершитьРаботуСистемы(). Это критически важно для автоматизации, так как данный параметр отвечает за «Запрос подтверждения». Если передать Истина, программа выдаст диалоговое окно «Завершить работу с программой?», что остановит выполнение, если за компьютером нет человека.
Мало кто знает, но в 1С существует два способа программно выйти из системы. Разберем подробнее каждый из них, чтобы вы могли выбрать подходящий для вашей задачи.
1. Метод ЗавершитьРаботуСистемы()
Это «интеллигентный» способ. При его вызове система инициирует стандартный процесс закрытия:
ПередЗавершениемРаботыСистемы и ПриЗавершенииРаботыСистемы в модуле управляемого приложения.Отказ присвоено значение Истина, то программа не закроется.ЗавершитьРаботуСистемы(ЗапрашиватьПодтверждение, ПерезапускатьПриЗавершении).2. Метод ПрекратитьРаботуСистемы()
Это более жесткий метод. Он немедленно прекращает работу текущего сеанса без вызова обработчиков событий закрытия и без каких-либо вопросов пользователю. Это полезно в критических ситуациях или когда вы абсолютно уверены, что никакие дополнительные проверки не должны помешать выходу.
Синтаксис: ПрекратитьРаботуСистемы(ПерезапускатьПриЗавершении).
В сообщении №7 автор пытался использовать ПодключитьОбработчикОжидания(). Это частое решение, когда нужно дать системе «продышаться» перед закрытием. Однако возникла ошибка «Недопустимое значение параметра 1». Разберем, почему это происходит.
Функция ПодключитьОбработчикОжидания(ИмяПроцедуры, Интервал, Истина) ожидает в первом параметре строку с именем экспортной процедуры, которая находится в этой же форме или в глобальном модуле, и обязательно имеет директиву &НаКлиенте.
Типичная ошибка: попытка указать серверную процедуру. Программа 1С не может вызвать серверный код напрямую по таймеру клиента без клиентской «прослойки».
Если ваша «самописная программа» предназначена для автоматического запуска (например, через планировщик задач Windows), то лучшим подходом будет совместное использование внешней обработки и параметров запуска.
Вы можете запустить 1С с ключом /Execute <ПутьКФайлу>. Внутри самой обработки в модуле формы в событии ПриОткрытии (или через обработчик ожидания, если нужно дождаться инициализации интерфейса) прописывается логика и в конце — ЗавершитьРаботуСистемы(Ложь).
Пример надежного завершения во внешней обработке:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Запускаем алгоритм через 1 секунду после открытия формы,
// чтобы форма успела полностью прорисоваться
ПодключитьОбработчикОжидания("ВыполнитьДействиеИВыйти", 1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействиеИВыйти() Экспорт
// Выполняем действия на сервере
Результат = ОбработкаДанныхНаСервере();
// Принудительно закрываем программу
ПрекратитьРаботуСистемы(Ложь);
КонецПроцедуры
Чтобы успешно программно закрыть 1С и не наткнуться на ошибки, придерживайтесь следующих правил:
ЗавершитьРаботуСистемы().ЗавершитьРаботуСистемы(Ложь), для гарантированного выхода без проверок — ПрекратитьРаботуСистемы().Соблюдение этих принципов позволит вам создавать стабильные и предсказуемые автоматизированные решения на базе 1С:Предприятие.