Всем привет. Несколько часов уже бьюсь, но движение медленное и малоэффективное...
Есть ДО, прописана в Справочник.ДополнительныеОтчетыИОбработки...
Получаю оттуда и из табличной части все, что можно, но...
Как ее запустить программно???
Копаюсь в коде основной формы ДО с кнопочкой "Выполнить", но чтобы его использовать не могу понять, что откуда берется и в каком виде складывается.
ДО - без формы, она там ни к чему.
Спасибо всем. Для исполнения команды доп.обработки без формы (фактически вызова с ожиданием процедуры "ВыполнитьКоманду" модуля доп.обработки) накропал вот такое:
&НаКлиенте
Процедура ВыполнитьСинхронизацию(Команда)
// готовим структуру команды
вКоманда = Новый Структура;
ЗаполнитьСтруктуруВыполняемойКоманды(вКоманда,"Моя доп.обработка");
Если ЗначениеЗаполнено(вКоманда) Тогда
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" подготовлена к исполнению.'"),вКоманда.Представление);
// оповещаем себя о том, что команда подготовлена и передается на исполнение
//ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
Сообщить(ЗаголовокСостояния);
// вызываем процедуру исполнения команды в фоне на сервере
ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(вКоманда, УникальныйИдентификатор);
// подготавливаем данные и выводим "ожидающее" оповещение
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" выполняется.'"),вКоманда.Представление);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
// не будем оповещать себя после завершения штатным образом
ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
// а вот окно "ожидания" просим показать
ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
// непосредственно "ожидаем"
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполнения", ЭтотОбъект, вКоманда);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияВыполнения(Задание, ВыполняемаяКоманда) Экспорт
// процедура, которая указана ранее для вызова после завершения исполнения
Если Задание.Статус = "Ошибка" Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось выполнить команду по причине:
|%1.'"), Задание.КраткоеПредставлениеОшибки);
Иначе
// Оповещаем все открытые формы и динамические списки об изменениях (обязательно)
Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы");
Если ОповеститьФормы <> Неопределено Тогда
СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
КонецЕсли;
// Оповещаем себя, поскольку ранее в ПараметрыОжидания записали Ложь
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" выполнена.'"),ВыполняемаяКоманда.Представление);
Сообщить(ЗаголовокСостояния);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,НаименованиеОбработки)
// заполняем структуру команды запрошенной обработки
ДопОбработкаСсылка=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
Если ЗначениеЗаполнено(ДопОбработкаСсылка) Тогда
ВыполняемаяКоманда = Новый Структура;
ВыполняемаяКоманда.Вставить("Ссылка",ДопОбработкаСсылка);
ВыполняемаяКоманда.Вставить("Представление",ДопОбработкаСсылка.Команды[0].Представление);
ВыполняемаяКоманда.Вставить("Идентификатор",ДопОбработкаСсылка.Команды[0].Идентификатор);
ВыполняемаяКоманда.Вставить("ВариантЗапуска",ДопОбработкаСсылка.Команды[0].ВариантЗапуска);
ВыполняемаяКоманда.Вставить("ПоказыватьОповещение",ДопОбработкаСсылка.Команды[0].ПоказыватьОповещение);
ВыполняемаяКоманда.Вставить("Модификатор",ДопОбработкаСсылка.Команды[0].Модификатор);
ВыполняемаяКоманда.Вставить("ОбъектыНазначения",Неопределено);
ВыполняемаяКоманда.Вставить("Вид",ДопОбработкаСсылка.Вид);
ВыполняемаяКоманда.Вставить("ЭтоОтчет",Ложь);
Иначе
ВыполняемаяКоманда = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыПроцедуры.ОбъектыНазначения = ВыполняемаяКоманда.ОбъектыНазначения;
НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции
(4) У меня есть внешняя обработка, а в ней прежде чем что-то делать - нужно запустить эту доп.обработку - это синхронизация данных. Она должна быть регламентным заданием. У меня файловая БД УТ11. Пока не знаю как это сделать. Еще не разбирался, но прочитал, что трудности есть.
Может подскажете как? Или ссылку, где почитать.
(6) Да это все хорошо... особенно небесплатные примеры... Вопрос в другом...
Сформировал я эту доп.обработку, даже назначил ей расписание (сразу увидел, что появился GUID регламентного задания), но...
Как это регламентное задание сможет запускаться, если у меня 1С 8.3 УТ11 не клиент-сервер, а файловая БД???
(8) регламентные задания выполняются когда им назначен пользователь и он сидит в базе.
Есть лайфхаки, которые запускают обработки через расписание, но ПК должен быть включен. Так что проще 1С не закрывать и все!
(9) Т.е. нужно постоянно иметь включенный комп с коннектом к "облачной 1С-ке" и еще и войти в эту базу под пользователем, обозначенным в настройках доп.обработки?
(11) Ну Вы загнули связку... После пол-литра такую логику не построишь... Файловая база - набор файлов и не более того. А вот когда стартуешь 1С на компе и открываешь базу - вот тогда и запускается на этом компе нечто очень отдаленно напоминающее сервер. Посмотрите диспетчер задач во время работы с 1С.
Спасибо всем. Для исполнения команды доп.обработки без формы (фактически вызова с ожиданием процедуры "ВыполнитьКоманду" модуля доп.обработки) накропал вот такое:
&НаКлиенте
Процедура ВыполнитьСинхронизацию(Команда)
// готовим структуру команды
вКоманда = Новый Структура;
ЗаполнитьСтруктуруВыполняемойКоманды(вКоманда,"Моя доп.обработка");
Если ЗначениеЗаполнено(вКоманда) Тогда
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" подготовлена к исполнению.'"),вКоманда.Представление);
// оповещаем себя о том, что команда подготовлена и передается на исполнение
//ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
Сообщить(ЗаголовокСостояния);
// вызываем процедуру исполнения команды в фоне на сервере
ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(вКоманда, УникальныйИдентификатор);
// подготавливаем данные и выводим "ожидающее" оповещение
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" выполняется.'"),вКоманда.Представление);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
// не будем оповещать себя после завершения штатным образом
ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
// а вот окно "ожидания" просим показать
ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
// непосредственно "ожидаем"
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполнения", ЭтотОбъект, вКоманда);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияВыполнения(Задание, ВыполняемаяКоманда) Экспорт
// процедура, которая указана ранее для вызова после завершения исполнения
Если Задание.Статус = "Ошибка" Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось выполнить команду по причине:
|%1.'"), Задание.КраткоеПредставлениеОшибки);
Иначе
// Оповещаем все открытые формы и динамические списки об изменениях (обязательно)
Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы");
Если ОповеститьФормы <> Неопределено Тогда
СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
КонецЕсли;
// Оповещаем себя, поскольку ранее в ПараметрыОжидания записали Ложь
ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" выполнена.'"),ВыполняемаяКоманда.Представление);
Сообщить(ЗаголовокСостояния);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,НаименованиеОбработки)
// заполняем структуру команды запрошенной обработки
ДопОбработкаСсылка=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
Если ЗначениеЗаполнено(ДопОбработкаСсылка) Тогда
ВыполняемаяКоманда = Новый Структура;
ВыполняемаяКоманда.Вставить("Ссылка",ДопОбработкаСсылка);
ВыполняемаяКоманда.Вставить("Представление",ДопОбработкаСсылка.Команды[0].Представление);
ВыполняемаяКоманда.Вставить("Идентификатор",ДопОбработкаСсылка.Команды[0].Идентификатор);
ВыполняемаяКоманда.Вставить("ВариантЗапуска",ДопОбработкаСсылка.Команды[0].ВариантЗапуска);
ВыполняемаяКоманда.Вставить("ПоказыватьОповещение",ДопОбработкаСсылка.Команды[0].ПоказыватьОповещение);
ВыполняемаяКоманда.Вставить("Модификатор",ДопОбработкаСсылка.Команды[0].Модификатор);
ВыполняемаяКоманда.Вставить("ОбъектыНазначения",Неопределено);
ВыполняемаяКоманда.Вставить("Вид",ДопОбработкаСсылка.Вид);
ВыполняемаяКоманда.Вставить("ЭтоОтчет",Ложь);
Иначе
ВыполняемаяКоманда = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыПроцедуры.ОбъектыНазначения = ВыполняемаяКоманда.ОбъектыНазначения;
НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции