При работе в крупных информационных базах на платформе 1С:Предприятие 8, в частности в конфигурации «Управление производственным предприятием» редакции 1.3 (УПП 1.3), пользователи часто сталкиваются с необходимостью проведения или перепроведения большого массива документов за длительный период. Выполнение этой задачи в интерактивном режиме на клиентском компьютере крайне неэффективно: процесс занимает много времени, сетевые сбои или случайное закрытие программы прерывают операцию, а необходимость держать компьютер включенным блокирует уход сотрудника домой.
Возникает задача: организовать проведение документов непосредственно на сервере в фоновом режиме так, чтобы пользователь мог запустить процесс, выключить свой рабочий компьютер и спокойно уйти. При этом важно учесть ограничения обычных форм (ОФ) и постараться обойтись без глобального изменения метаданных конфигурации. В этой статье мы подробно разберем четыре практических метода реализации данной задачи, проанализируем их плюсы, минусы и технические нюансы.
Это самый простой административный метод, который не требует написания сложного кода или изменения метаданных конфигурации 1С. Он отлично подходит для разовых или периодических тяжелых задач перепроведения. Для снижения нагрузки на систему при таком процессе можно использовать групповую обработку для перепроведения документов с интервалами.
Разберем алгоритм действий по шагам:
Критически важный нюанс настройки RDP:
По умолчанию во многих операционных системах Windows Server настроены групповые политики автоматического завершения отключенных сеансов через определенное время (например, через 15–30 минут). Если это так, то сервер принудительно закроет ваш сеанс, 1С аварийно завершится, транзакция откатится, и документы не проведутся.
Чтобы этого избежать, необходимо настроить политики таймаутов:
gpedit.msc).После этой настройки процесс проведения гарантированно завершится, даже если вы уйдете домой на все выходные.
В конфигурации 1С:УПП 1.3 встроен замечательный типовой механизм, который позволяет разгрузить систему в течение рабочего дня и выполнять наиболее сложные расчеты (например, проведение по партиям при партионном учете или расчеты себестоимости при РАУЗ) в ночное время на сервере.
Рассмотрим, как его задействовать:
Этот способ является абсолютно штатным, не требует доработок, однако он решает задачу только в рамках оперативного ежедневного учета. Для разового перепроведения исторических данных за прошлые периоды он не подходит.
Выясним, как автоматизировать запуск перепроведения с помощью внешней обработки (.epf), планировщика задач Windows (Task Scheduler) и параметров командной строки 1С. Этот метод позволяет полностью исключить интерактивное участие пользователя.
Разберем по шагам реализацию этого механизма:
RepostingDocs.epf).ПриОткрытии() пишем логику запуска проведения. Нам нужно считать параметры запуска (период проведения), которые мы передадим из планировщика.Посмотрим на пример кода инициализации процесса внутри внешней обработки:
Процедура ПриОткрытии()
// Получаем параметры запуска, переданные через ключ /C в командной строке
ПараметрыСтрокой = ПараметрЗапуска;
Если Не ЗначениеЗаполнено(ПараметрыСтрокой) Тогда
Возврат; // Если открыли интерактивно без параметров, ничего не делаем
КонецЕсли;
// Предполагаем формат параметров: "ДатаНачала;ДатаОкончания"
МассивПараметров = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ПараметрыСтрокой, ";");
Если МассивПараметров.Количество() < 2 Тогда
ЗаписатьВЛог("Неверные параметры запуска!");
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
ДатаНачала = Дата(МассивПараметров[0]);
ДатаОкончания = Дата(МассивПараметров[1]);
ВыполнитьПерепроведение(ДатаНачала, ДатаОкончания);
// Обязательно завершаем работу системы после выполнения
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Теперь проанализируем, как запустить этот процесс на сервере по расписанию или по кнопке. Создаем bat-файл или настраиваем задачу в Планировщике задач Windows со следующей строкой запуска:
"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" ENTERPRISE /S "ServerName\BaseName" /N "RobotReposting" /P "Password123" /Execute "C:\1C_Scripts\RepostingDocs.epf" /C "20231101000000;20231130235959"
Разберем ключи запуска подробнее:
ENTERPRISE — запуск системы в режиме «Предприятие»./S — путь к информационной базе на сервере 1С./N и /P — имя пользователя и пароль специально созданной учетной записи (робота) с административными правами./Execute — путь к файлу внешней обработки, которая должна выполниться при запуске./C — передача произвольного параметра запуска внутрь обработки (в нашем примере — даты начала и окончания периода перепроведения).Этот способ позволяет запускать процедуру полностью в фоновом для пользователя режиме. Сеанс запускается непосредственно на сервере в сессии операционной системы, выполняет код и закрывается.
Часто программисты путают понятия обычных/управляемых форм и клиент-серверного выполнения кода. Фоновые задания (объект метаданных ФоновыеЗадания) прекрасно работают и в обычных формах на платформе 1С:Предприятие 8.3.
Однако есть техническое ограничение: фоновым заданием можно запустить только экспортную процедуру общего серверного модуля. Напрямую запустить процедуру из модуля внешней обработки в фоне нельзя, так как контекст внешней обработки не существует на сервере вне клиентского сеанса.
Выясним причину и найдем обходной путь:
Если ваша конфигурация УПП 1.3 доработана (а абсолютно типовых УПП практически не осталось), или если в ней используется Библиотека Стандартных Подсистем (БСП), то в общих модулях наверняка присутствует процедура-прокси (например, ОбщегоНазначения.ВыполнитьПроцедуруВФоне или аналогичная в модуле ДлительныеОперации). Такие процедуры позволяют передать имя любой другой экспортной серверной процедуры и выполнить её асинхронно.
Если такого общего модуля нет, его можно легко добавить. Создадим общий модуль ФоновыеФункцииСервер со свойствами "Сервер", "Вызов сервера" и напишем там экспортную процедуру:
Процедура ВыполнитьПерепроведениеНаСервере(ПараметрыПроведения) Экспорт
// Логика выборки документов за период и их проведение
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ПараметрыПроведения.ДатаНачала, ПараметрыПроведения.ДатаОкончания);
Пока Выборка.Следующий() Цикл
Попытка
ДокументОбъект = Выборка.ПолучитьОбъект();
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокументов.Неоперативный);
КонецЕсли;
Исключение
// Запись ошибки
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Тогда из вашей внешней обработки на обычных формах вы сможете запустить этот процесс в фоне одной строкой:
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДатаНачала", ИнтервалНачало);
ПараметрыПроцедуры.Вставить("ДатаОкончания", ИнтервалКонец);
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(ПараметрыПроцедуры);
// Запуск фонового задания на сервере 1С
ФоновыеЗадания.Выполнить("ФоновыеФункцииСервер.ВыполнитьПерепроведениеНаСервере", ПараметрыВыполнения);
Предупреждение("Задание запущено в фоновом режиме на сервере. Вы можете закрыть 1С.");
Пользователь увидит сообщение о запуске, закроет клиентское приложение 1С и выключит компьютер. Сервер приложений 1С продолжит выполнять эту задачу в фоновом режиме внутри собственного рабочего процесса rphost.
При фоновом проведении критически важно знать, какие документы провелись успешно, а по каким возникли ошибки (например, не хватило остатков на складе, не заполнены обязательные реквизиты и т.д.). Для этого настроим логирование в текстовый файл и его отправку на e-mail.
Рассмотрим пример кода, реализующий ведение лога и отправку почты:
Процедура ВыполнитьПерепроведениеСЛогированием(ДатаНачала, ДатаОкончания, ПочтаПолучателя) Экспорт
// Инициализируем файл лога в системном временном каталоге сервера
ИмяФайлаЛога = ПолучитьИмяВременногоФайла("txt");
ТекстЛога = Новый ТекстовыйДокумент;
ТекстЛога.ДобавитьСтроку("Старт перепроведения: " + ТекущаяДата());
// Пример выборки документов (например, Отчет о розничных продажах)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ОтчетОРозничныхПродажах
|ГДЕ
| Дата МЕЖДУ &ДатаНачала И &ДатаОкончания И Проведен = ИСТИНА";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ВсегоДокументов = Выборка.Количество();
Успешно = 0;
Ошибок = 0;
Пока Выборка.Следующий() Цикл
ДокументСсылка = Выборка.Ссылка;
Попытка
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
// Проводим неоперативно
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокументов.Неоперативный);
Успешно = Успешно + 1;
ТекстЛога.ДобавитьСтроку("УСПЕШНО: " + Строка(ДокументСсылка));
Исключение
Ошибок = Ошибок + 1;
ТекстЛога.ДобавитьСтроку("ОШИБКА: " + Строка(ДокументСсылка) + ". Описание: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ТекстЛога.ДобавитьСтроку("Финиш перепроведения: " + ТекущаяДата());
ТекстЛога.ДобавитьСтроку("Всего обработано: " + ВсегоДокументов + ", Успешно: " + Успешно + ", Ошибок: " + Ошибок);
Попытка
ТекстЛога.Записать(ИмяФайлаЛога, КодировкаТекста.UTF8);
ОтправитьЛогНаПочту(ИмяФайлаЛога, ПочтаПолучателя);
Исключение
// Если не удалось отправить почту, запишем ошибку в журнал регистрации
ЗаписьЖурналаРегистрации("ФоновоеПерепроведение", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ОтправитьЛогНаПочту(ПутьКФайлуЛога, АдресПолучателя)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru"; // Укажите ваш SMTP сервер
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "robot_1c@mail.ru";
Профиль.ПарольSMTP = "ВашПарольПриложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель.Адрес = "robot_1c@mail.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Робот 1С:УПП";
Письмо.Получатели.Добавить(АдресПолучателя);
Письмо.Тема = "Отчет о фоновом проведении документов за период";
Письмо.Тела.Добавить("Во вложении находится текстовый файл лога проведения документов.", ТипТекстаПочтовогоСообщения.ПростойТекст);
// Прикрепляем созданный файл лога
Письмо.Вложения.Добавить(ПутьКФайлуЛога, "Log_Reposting.txt");
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
КонецПроцедуры
Используя данный программный блок, администраторы или ответственные пользователи всегда будут оперативно получать детальные отчеты прямо на свою электронную почту на следующее утро. Это делает процесс фонового проведения полностью контролируемым и прозрачным.