Имя: Пароль:
1C
1С v8
Процедура или функция с указанным именем не определена
,
0 Mikhail Volkov
 
05.03.17
06:22
Во внешней обработке процедуры СохранитьНастройки() и ВосстановитьНастройки() из формы перенес в модуль, приписал им Экспорт, чтобы запускать обработку по расписанию. Реквизиты формы, которые сохраняю, переделал в реквизиты обработки.
Ошибку пишет: {ВнешняяОбработка.ЗакрытиеПросроченныхЗаказовКлиентов.Форма.Форма.Форма(6,2)}: Процедура или функция с указанным именем не определена (ВосстановитьНастройки)!?
1 h-sp
 
05.03.17
06:42
(0) формы обычные хоть?
2 rphosts
 
05.03.17
07:03
Если уф, что там с контекстом, Чарли?
3 Mikhail Volkov
 
05.03.17
08:39
(2) Да, УФ. Что дописать?
4 Мимохожий Однако
 
05.03.17
08:43
Код в студию.
5 Mikhail Volkov
 
05.03.17
08:48
(4) То, что из формы в модуль перенис:

Процедура ВосстановитьНастройки() Экспорт

    ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ЗакрытиеПросроченныхЗаказовКлиентов", УстановитьКлючНастроек());
    Если ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда
        ПериодВыборкиДокументов.ДатаНачала            = ЗначениеНастроек.Получить("ДатаНачала");
        Отсрочка                                    = ЗначениеНастроек.Получить("Отсрочка");
        ВключаяНеСогласованныеЗаказы                = ЗначениеНастроек.Получить("ВключаяНеСогласованныеЗаказы");
        НеЗакрыватьЗаказыКлиентовБезПолнойОплаты    = ЗначениеНастроек.Получить("НеЗакрыватьЗаказыКлиентовБезПолнойОплаты");
        НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки    = ЗначениеНастроек.Получить("НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки");
    Иначе
        ВключаяНеСогласованныеЗаказы                = Ложь;
        НеЗакрыватьЗаказыКлиентовБезПолнойОплаты    = ПолучитьФункциональнуюОпцию("НеЗакрыватьЗаказыКлиентовБезПолнойОплаты");
        НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки    = ПолучитьФункциональнуюОпцию("НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки");
    КонецЕсли;
    
    УстановитьЗначенияПоУмолчанию();

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

Процедура СохранитьНастройки() Экспорт

    Настройки = Новый Соответствие;
    Настройки.Вставить("ДатаНачала",                                 ПериодВыборкиДокументов.ДатаНачала);
    Настройки.Вставить("Отсрочка",                                     Отсрочка);
    Настройки.Вставить("ВключаяНеСогласованныеЗаказы",                 ВключаяНеСогласованныеЗаказы);
    Настройки.Вставить("НеЗакрыватьЗаказыКлиентовБезПолнойОплаты",     НеЗакрыватьЗаказыКлиентовБезПолнойОплаты);
    Настройки.Вставить("НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки", НеЗакрыватьЗаказыКлиентовБезПолнойОтгрузки);

    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Обработка.ЗакрытиеПросроченныхЗаказовКлиентов", УстановитьКлючНастроек(), Настройки);

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

Процедура УстановитьЗначенияПоУмолчанию()

    Если Отсрочка = 0 Тогда

        Отсрочка = 10;

    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(ПериодВыборкиДокументов.ДатаНачала) Тогда

        ПериодВыборкиДокументов.ДатаНачала = НачалоМесяца(ТекущаяДата() - Отсрочка * 24*60*60);

    КонецЕсли;
    ПериодВыборкиДокументов.ДатаОкончания = ТекущаяДата();

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

Функция УстановитьКлючНастроек()

//    КлючНастроек = "ЗакрытиеПросроченныхЗаказовКлиентов" + "_" + Пользователи.ТекущийПользователь().УникальныйИдентификатор();
    КлючНастроек = "ЗакрытиеПросроченныхЗаказовКлиентовАвто";    // пусть будут общими для всех

    Возврат КлючНастроек;

КонецФункции
6 Мимохожий Однако
 
05.03.17
08:51
(5) Ты не показал код команды из формы, в которой вызываешь сохранение настроек.
7 rphosts
 
05.03.17
09:02
(5) галочки какие у общего модуля?
8 Cyberhawk
 
05.03.17
09:15
В УФ методы модуля объекта внешней обработки / отчета надо вызывать через объект типа "Внешняя обработка / отчет", полученный на сервере через метод "РеквизитФормыВЗначение"
9 Mikhail Volkov
 
05.03.17
09:36
(6) В форме оставил как было:

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ВосстановитьНастройки();

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

&НаКлиенте
Процедура ПриЗакрытии()

    СохранитьНастройки();

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

#КонецОбласти

(8) Все реквизиты формы переделал в реквизиты обработки. Форма должна открываться только при непосредственном открытии обработки для задания этих реквизитов, и их сохранении. А в фоновом режиме по расписанию обработка должна восстанавливать их, и выполняться по ним.
10 h-sp
 
05.03.17
09:43
(9) уже сто раз бвло

ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); //или что у вас вместо объекта

ОбработкаОбъект.ВосстановитьНастройки();
11 Mikhail Volkov
 
05.03.17
09:59
(10) Можно так, но я уже реквизиты формы переделал в реквизиты обработки. Правильнее наверное использовать справочник ВариантыОтчетов...
Но почему ошибка: Процедура или функция с указанным именем не определена (ВосстановитьНастройки)!?
12 Мимохожий Однако
 
05.03.17
10:32
(11) Потому что из модуля формы просто так не увидишь процедуры модуля объекта.
13 Mikhail Volkov
 
05.03.17
10:41
(12) Странно...
14 h-sp
 
05.03.17
10:43
(13) это азы. Самое главное в УФ
15 Mikhail Volkov
 
05.03.17
14:05
(14) Да уж, пусть ВосстановитьНастройки() и форме и модуле будет...
16 Mikhail Volkov
 
06.03.17
10:24
Переделал, для сохранения настоек теперь использую справочник ВариантыОтчетов. В нем что угодно можно сохранять. Для ПериодВыборкиДокументов - СтандартныйПериод, он содержит: Вариант, ДатаНачала и ДатаОкончания. ДатаОкончания мне не нужна, поскольку в режиме по расписанию всегда ТекущаяДата(). ДатаНачала хотелось тоже сделать вычисляемой. Например, пользователь в настройка указал неделю, то завтра обработка запустилась с значением ДатаНачала на неделю назад от ТекущаяДата(). Какие значения имеет СтандартныйПериод.Вариант?
17 Мимохожий Однако
 
06.03.17
10:26
(16) Встань отладчиком и через точку посмотри
18 Mikhail Volkov
 
09.03.17
06:57
(17) Обычно "Произвольный период" (поскольку ДатаОкончания обычно ТекущаяДата()) - не подходит. Сохраняю еще Период в днях, по нему восстанавливаю ДатаНачала.
В общем обработка получилась такая https://yadi.sk/d/n2RUEdZ73FKFuv, в ней только функцию ПолучитьПричинуЗакрытия() пришлось продублировать в форме и модуле.
19 Мимохожий Однако
 
09.03.17
07:36
(18) Тебе в (10)прямым текстом подсказали. Ты пройдись отладчиком и посмотри, когда используется дубль функции в модуле формы и перепиши.
20 Mikhail Volkov
 
09.03.17
10:17
(19) Когда убираю дубль из формы или модуля (делаю ее Экспорт), то ошибка возникает: Процедура или функция с указанным именем не определена (ПолучитьПричинуЗакрытия)!? Это обработка УФ.
21 Мимохожий Однако
 
09.03.17
10:24
(20) В модуле обработки  сделай эту функция экспортной.
А в модуле формы замени на
&НаСервере
Функция ПолучитьПричинуЗакрытия()
    МояОбработка=РеквизитФормыВЗначение("Объект");
    
    Возврат МояОбработка.ПолучитьПричинуЗакрытия();
    
КонецФункции
22 Mikhail Volkov
 
09.03.17
10:46
(21) Хм, так сработало!
Жаль, что недоступен на клиенте метод:

ПричинаЗакрытия = РеквизитФормыВЗначение("Объект").ПолучитьПричинуЗакрытия();
23 Mikhail Volkov
 
09.03.17
10:57
Еще, смотрю обработку по заполнения табличной части документа, там в модуле ничего нет(кроме стандартных процедур регистрации). Форма пустая, кроме:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

Она какая-то предопределенная?
24 Мимохожий Однако
 
09.03.17
11:00
(22) Для этого в модуле формы используют директиву НаСервере (23) Да. РТФМ
25 Mikhail Volkov
 
09.03.17
12:30
(24) РТФМ - ? Тогда мне тоже ее можно перенести в форму, Тогда все вспомогательные функции будут только в форме, в модуле они будут не нужны? Никаких дублирующих!
26 Мимохожий Однако
 
09.03.17
12:38
(25) Тебе решать. Если нигде, кроме формы эта процедура не используется, то кидай в модуль формы. Если задумаешь сделать регламентное задания без открытия формы, то эта процедура должна быть в модуле обработки. Ты же спрашивал про ВыполнитьКоманду(). Подумай. При возможности надо закладывать наиболее универсаальный код.
27 Mikhail Volkov
 
09.03.17
13:12
Дык, без открытия формы сейчас (18) обработка выполняется через ВыполнитьКоманду(), ее перенесу в форму. Какие еще варианты есть выполнения обработки?
28 Mikhail Volkov
 
09.03.17
18:15
В обработке по заполнению табличной части документа нужно заполнить остатками:
- По складу
&НаСервере
Функция ЗаполнитьОбъектОстаткамиСклада(НовыйОбъект)
    
    НовыйОбъект.Товары.Очистить();
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Характеристика,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
    |ГДЕ
    |    ТоварыНаСкладахОстатки.Склад = &Склад
    |    И ТоварыНаСкладахОстатки.ВНаличииОстаток > 0
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Характеристика,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток";
    Запрос.УстановитьПараметр("Период", НовыйОбъект.Дата);
    Запрос.УстановитьПараметр("Склад", НовыйОбъект.СкладОтправитель);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = НовыйОбъект.Товары.Добавить();
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.Характеристика = Выборка.Характеристика;
        НоваяСтрока.Количество = Выборка.Количество;
        НоваяСтрока.КоличествоУпаковок = Выборка.Количество;
    КонецЦикла;
    
КонецФункции

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

- по организации и складу - не соображу как их лучше объединить?
29 mexanik_96
 
09.03.17
18:34
(28) дак да, в чем смысл 2 раза ходить на сервер, когда можно за один вызов сделать в пакете... и "объект" мне кажется не стоит гонять...
30 Mikhail Volkov
 
09.03.17
19:26
(29) Это уже другая обработка, нужны 3 варианта (с 3 вариантами ДобавитьКоманду)
31 Мимохожий Однако
 
09.03.17
22:15
Серверные процедуры рекомендуется по максимуму закинуть в модуль обработки
Ошибка? Это не ошибка, это системная функция.