|
Процедура или функция с указанным именем не определена | ☑ | ||
---|---|---|---|---|
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
|
Серверные процедуры рекомендуется по максимуму закинуть в модуль обработки
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |