Добрый форумчане! Кто подскажет как можно открыть форму документа в общем модуле, чтоб затем запускать регламентным заданием?
Есть работающая процедура в модуле формы документа, которую могу запускать командой из модуля списка документов, так, команда:

```1c
    &НаКлиенте
    Процедура РучноеСнятиеСРезерва(Команда)
    Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");
    Форма.Открыть();
    Форма.РучноеСнятиеСРезерваНаСервере(); // в форме должна быть объявлена как экспортная
    Форма.Закрыть();
    КонецПроцедуры
```

Все работает.
Но тоже самое пытаюсь сделать через общий модуль создал.

Содал регламентное задание.

Если в общем модуле ставлю клиент, код проходит, но при выполнении задания ошибка:
Метод задания не найден: АвтоСнятиеСРезерваВЗаказеКлиента:АвтоматическоеСнятиеСРезерваВЗаказеКлиентаПриПросрочке

Если ставлю сервер, то ошибка уже при сохранении:
{ОбщийМодуль.АвтоСнятиеСРезерваВЗаказеКлиента.Модуль(4,11)}: Процедура или функция с указанным именем не определена (ПолучитьФорму)
 Форма = <<?>>ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта"); (Проверка: Сервер)

Пробовал так: ФормаДока = Документы.ЗаказКлиента.ПолучитьФорму("ФормаСпискаДокументов"); тоже не прошло
Ошибка: {ОбщийМодуль.АвтоСнятиеСРезерваВЗаказеКлиента.Модуль(4,14)}: Переменная не определена (Документы)
 ФормаДока = <<?>>Документы.ЗаказКлиента.ПолучитьФорму("ФормаСпискаДокументов"); (Проверка: Тонкий клиент)
Как-то можно форму открыть так, или может команду модуля формы списка запустить?

Не судите строго начинающий я понимаю что сыро, но как смог и объемное очень:

```1c
    &НаСервере
    Процедура РучноеСнятиеСРезерваНаСервере() Экспорт

    //отбор заказов

    ЗапросДокументЗаказ = Новый Запрос;
    ЗапросДокументЗаказ.Текст =
    "ВЫБРАТЬ
    | ЗаказКлиента.Ссылка КАК Ссылка,
    | ЗаказКлиента.Контрагент КАК Контрагент,
    | ЗаказКлиента.Товары.(
    | Номенклатура КАК Номенклатура,
    | Количество КАК Количество,
    | ВариантОбеспечения КАК ВариантОбеспечения
    | ) КАК Товары,
    | СостоянияЗаказовКлиентов.Заказ КАК Заказ,
    | СостоянияЗаказовКлиентов.Состояние КАК Состояние,
    | СостоянияЗаказовКлиентов.ПроцентОплаты КАК ПроцентОплаты,
    | СостоянияЗаказовКлиентов.ПроцентОтгрузки КАК ПроцентОтгрузки
    |ИЗ
    | РегистрСведений.СостоянияЗаказовКлиентов КАК СостоянияЗаказовКлиентов
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
    | ПО СостоянияЗаказовКлиентов.Заказ = ЗаказКлиента.Ссылка
    |ГДЕ
    | СостоянияЗаказовКлиентов.Состояние <> &Состояние
    | И СостоянияЗаказовКлиентов.Состояние <> &Состояние1
    | И ЗаказКлиента.Дата МЕЖДУ &Дата1 И &Дата2";

    ЗапросДокументЗаказ.УстановитьПараметр("Состояние", Перечисления.СостоянияЗаказовКлиентов.Закрыт);
    ЗапросДокументЗаказ.УстановитьПараметр("Состояние1", Перечисления.СостоянияЗаказовКлиентов.ГотовКЗакрытию);
    ЗапросДокументЗаказ.УстановитьПараметр("Дата1", '20210430');
    ЗапросДокументЗаказ.УстановитьПараметр("Дата2", '20210627');

    ВыборкаЗаказы = ЗапросДокументЗаказ.Выполнить().Выбрать();

    //обход заказов

    Пока ВыборкаЗаказы.Следующий() Цикл //обходим доки
    ДокОбъект = ВыборкаЗаказы.Ссылка.ПолучитьОбъект();
    ДатаИзДокумента = ДокОбъект.Дата; //Дата документа
    Индивидуальный = ДокОбъект.ИндивидуальныйСрокОплатыДляСнятияСРезерва; //Число прибавления к дате по кал

    // календарный график

    Если НЕ ЗначениеЗаполнено(Индивидуальный) Тогда //индив пустой тогда из константы
    Индивидуальный = Константы.ОбщийСрокОплатыДляСнятияСРезерва.Получить();
    КонецЕсли;
    ЗапросКалендарь = Новый Запрос;
    ЗапросКалендарь.Текст =
    "ВЫБРАТЬ
    | КалендарныеГрафики.Календарь.Ссылка КАК КалендарьСсылка,
    | КалендарныеГрафики.Год КАК Год,
    | КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика,
    | КалендарныеГрафики.ДеньВключенВГрафик КАК ДеньВключенВГрафик,
    | КалендарныеГрафики.Календарь.Наименование КАК КалендарьНаименование
    |ИЗ
    | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
    |ГДЕ
    | КалендарныеГрафики.Календарь.Наименование = &Наименование
    | И КалендарныеГрафики.ДатаГрафика > &ДатаДокумента";

    ЗапросКалендарь.УстановитьПараметр("Наименование", "Производственный календарь");
    ЗапросКалендарь.УстановитьПараметр("ДатаДокумента", ДатаИзДокумента);

    РезультатКалендарь = ЗапросКалендарь.Выполнить();
    ТЗКалендарь = РезультатКалендарь.Выгрузить();

    // проверяем на просрочку

    Индекс = 1;

    Для Каждого Элемент Из ТЗКалендарь Цикл
    Если Индекс <= Индивидуальный Тогда //если мен 10
    Если Элемент.ДеньВключенВГрафик = Истина Тогда //если рабочий
    Индекс = Индекс + 1;
    Иначе //если не рабочий

    КонецЕсли;
    Иначе
    Прервать;
    КонецЕсли;
    КонецЦикла;
    ДатаНачалаПросрочки = Элемент.ДатаГрафика;

    //если есть просрочка снимаем резерв

    Если ДатаНачалаПросрочки <> Неопределено Тогда //если проср не пустая есть
    Если ТекущаяДата() > ДатаНачалаПросрочки Тогда //если просрочен, резерв снимаем
    Если ВыборкаЗаказы.ПроцентОплаты <> 100 Тогда //не оплачен снимаем //нет оплаты
    Если ВыборкаЗаказы.ПроцентОтгрузки <> 100 Тогда //не отнружен снимаем

    //данные из регистра по отгрузкам

    Запрос = Новый Запрос; //получаем остаток отгрузки
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТоварыКОтгрузкеОстатки.ДокументОтгрузки.Ссылка КАК ДокументОтгрузкиСсылка,
    | ТоварыКОтгрузкеОстатки.ВРезервеОстаток КАК ВРезервеОстаток,
    | ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток,
    | ТоварыКОтгрузкеОстатки.КОформлениюОстаток КАК КОформлениюОстаток,
    | ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура
    |ИЗ
    | РегистрНакопления.ТоварыКОтгрузке.Остатки КАК ТоварыКОтгрузкеОстатки
    |ГДЕ
    | ТоварыКОтгрузкеОстатки.ДокументОтгрузки.Ссылка = &Ссылка";

    Запрос.УстановитьПараметр("Ссылка", Документы.ЗаказКлиента.НайтиПоНомеру("ТДУТ-000004", '20210626')); //для примера упрощения отладки
    Результат = Запрос.Выполнить().Выгрузить();

    //тч заказа

    Индекс = 1;
    ОстатокОтгрузкиДляДругойСтроки = 0;
    Для каждого ЭлементНовый Из ДокОбъект.Товары Цикл //обход тч заказа

    Ном = ЭлементНовый.Номенклатура;
    СтрРез = Результат.Найти(Ном, "Номенклатура");
    Если ЭлементНовый.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить Тогда //если отгрузить !!!др статусы продумать
    РазницаДляПереноса = СтрРез.КОформлениюОстаток - СтрРез.КОтгрузкеОстаток; //5-1=4
    Если ОстатокОтгрузкиДляДругойСтроки = 0 Тогда // //не отгружено по доку
    ОстатокОтгрузкиДляДругойСтроки = ЭлементНовый.КоличествоУпаковок - РазницаДляПереноса; // =1 к переносу для др строки
    Если ОстатокОтгрузкиДляДругойСтроки < 0 Тогда //отгружено больше чем в стоке -
    ОстатокОтгрузкиДляДругойСтроки = Сред(Строка(ОстатокОтгрузкиДляДругойСтроки), 2); //убрали минус
    Продолжить;
    КонецЕсли;
    КонецЕсли;
    Если Число(ОстатокОтгрузкиДляДругойСтроки) > ЭлементНовый.КоличествоУпаковок Тогда //ЭлементНовый.КоличествоУпаковок Тогда //в строке меньше чем отгружено
    Продолжить;
    Иначе
    //изменяемая 2-я отгрузка

    Если Индекс = 1 Тогда
    Разница = ЭлементНовый.КоличествоУпаковок - СтрРез.КОтгрузкеОстаток; //между кол и остатком отгрузки
    НоваяСтрока = ДокОбъект.Товары.Добавить(); //+строка
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементНовый); //копируем
    ЭлементНовый.КоличествоУпаковок = ЭлементНовый.КоличествоУпаковок - СтрРез.КОтгрузкеОстаток;
    Индекс = Индекс + 1;
    Иначе
    ЭлементНовый.КоличествоУпаковок = СтрРез.КОтгрузкеОстаток; //1 не обеспечивать не отгруженное
    ЭлементНовый.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
    КонецЕсли;
    Если ЭлементНовый.ВариантОбеспечения <> Перечисления.ВариантыОбеспечения.Отгрузить Тогда
    ЭлементНовый.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется; //снимаем просроч резерв
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    Если ЭлементНовый.ВариантОбеспечения <> Перечисления.ВариантыОбеспечения.Отгрузить И
    ЭлементНовый.ВариантОбеспечения <> Перечисления.ВариантыОбеспечения.НеТребуется Тогда
    ЭлементНовый.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
    КонецЕсли;
    КонецЦикла;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

Кнопкой в форме списка запускаю

```1c
    &НаКлиенте
    Процедура РучноеСнятиеСРезерва(Команда)
    Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");
    Форма.Открыть();
    Форма.РучноеСнятиеСРезерваНаСервере();
    Форма.Закрыть();
    КонецПроцедуры
```
---
Регламентные задания не предполагают работу с формой, по идее форма только для интерактивной работы. Надо переделать механизм, например, перенести процедуру в модуль менеджера/объекта документа, сделать её экспортной...
---
это не верный подход
---
Значит переделать надо, интерактивную часть оставить в форме (смотря что вообще делает процедура). расчеты всякие перенести в модуль документа. Опять же, гадать, что делает процедура "снятия с резерва", может там только набор регистра меняется и форма дока тут вообще не нужна.
---
может содержимое этой процедуры сюда под спойлер выложить, посмотреть что там
---
запрос в выборке другого запроса это страшная вещь, конечно, но на сколько я вижу её целиком можно перенести из формы..вместо "объекта" использовать ЭтотОбъект
---
да
---
Регламентные задания не предполагают работу с формой, по идее форма только для интерактивной работы. Надо переделать механизм, например, перенести процедуру в модуль менеджера/объекта документа, сделать её экспортной...
---
Так К регламетному заданию я подвязал созданный общий модуль от куда уже пытыюсь добраться до формы
---
это не верный подход
---
То есть из общего модуля открыть модуль формы не возможно, просто есть готовая процедура 3 дня писал в модуле формы, то хотели кнопкой, сделал, теперь хотят ренламентным, переписывать в общи модуль получается
---
Значит переделать надо, интерактивную часть оставить в форме (смотря что вообще делает процедура). расчеты всякие перенести в модуль документа. Опять же, гадать, что делает процедура "снятия с резерва", может там только набор регистра меняется и форма дока тут вообще не нужна.
---
Спасибо, понял, с моим опытом еще на пару дней. но что делать, еще раз спасибо.
---
может содержимое этой процедуры сюда под спойлер выложить, посмотреть что там
---
Выложил в низу в самой теме, она объемная)
---
запрос в выборке другого запроса это страшная вещь, конечно, но на сколько я вижу её целиком можно перенести из формы..вместо "объекта" использовать ЭтотОбъект
---
Это да понимаю, что плохо, но ни чего другого не смог родить
---
Из формы в модуль объекта?
---
да
---
Все расчеты перенести в модуль. Все что нужно тыкать мышкой в формы, и подумать, возможно всё или почти всё можно сделать без пользователя, а в нужных случаях - записывать в журнал работы модуля, где можно посмотреть что происходит и какие ошибки - таким образом от использования форм можно отказаться.