|
Данные были изменены или удалены другим пользователем | ☑ | ||
---|---|---|---|---|
0
falselight
24.03.18
✎
17:56
|
Встроил обработку заполнения табличной части
в документ ЗаказКлиента. Но вот стало выходить такое сообщение как в заголовке. Блокирующее окно всез действий. Говорят обработка написана не правильно. В чем может быть дело что нужно исправить? |
|||
1
RomanYS
24.03.18
✎
18:00
|
Правильно говорят. Надо править объект контекста, а не создавать его копию из базы да ещё его записывать. А если пользователь передумает?
|
|||
2
falselight
24.03.18
✎
18:04
|
(1) А как поправить подскажите пожалуйста?
вот код модуля формы // &НаКлиенте Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт Сообщить(ОбъектыНазначенияМассив[0]); ЗаполнитьОбъект(ОбъектыНазначенияМассив[0]); КонецПроцедуры // &НаСервере Функция ЗаполнитьОбъект(ЗаказКлиентаСсылка) ЗаказКлиентаОбъект = ЗаказКлиентаСсылка.ПолучитьОбъект(); Если ТипЗнч(ЗаказКлиентаОбъект) = Тип("ДокументОбъект.ЗаказКлиента") Тогда Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | ЗаказКлиентаТовары.НомерСтроки, | ЗаказКлиентаТовары.Номенклатура, | ЗаказКлиентаТовары.Количество |ПОМЕСТИТЬ ВТ_ДокТч |ИЗ | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары |ГДЕ | ЗаказКлиентаТовары.Номенклатура.ИспользованиеХарактеристик <> ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать) | И ЗаказКлиентаТовары.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика, | СУММА(ТоварыНаСкладахОстатки.ВНаличииОстаток) КАК Количество, | ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК НоменклатураНаименование, | ТоварыНаСкладахОстатки.Характеристика.Наименование КАК ХарактеристикаНаименование |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | &Период, | Склад = &Склад | И Номенклатура В | (ВЫБРАТЬ | ВТ_ДокТч.Номенклатура | ИЗ | ВТ_ДокТч КАК ВТ_ДокТч) | И (ПОДСТРОКА(Характеристика.Наименование, 1, 1) = ""р"" | ИЛИ ПОДСТРОКА(Характеристика.Наименование, 1, 1) = ""Р"" | ИЛИ ПОДСТРОКА(Характеристика.Наименование, 1, 1) = ""p"" | ИЛИ ПОДСТРОКА(Характеристика.Наименование, 1, 1) = ""P"")) КАК ТоварыНаСкладахОстатки |ГДЕ | ТоварыНаСкладахОстатки.ВНаличииОстаток <> 0 | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Характеристика, | ТоварыНаСкладахОстатки.Номенклатура.Наименование, | ТоварыНаСкладахОстатки.Характеристика.Наименование | |УПОРЯДОЧИТЬ ПО | НоменклатураНаименование, | ХарактеристикаНаименование"; Запрос.УстановитьПараметр("Период", Новый Граница(ЗаказКлиентаОбъект.Дата, ВидГраницы.Включая)); Запрос.УстановитьПараметр("Склад", ЗаказКлиентаОбъект.Склад); ТзХР = Запрос.Выполнить().Выгрузить(); Если ТзХР.Количество() <> 0 Тогда Для каждого СтрТч Из ЗаказКлиентаОбъект.Товары Цикл //ТзХР.Свернуть("Номенклатура", СтрТч.Номенклатура); // КоличествоОт = СтрТч.Количество; КоличествоДо = СтрТч.Количество + 7; // Для каждого СтрТзХР из ТзХР Цикл Если СтрТч.Номенклатура = СтрТзХР.Номенклатура Тогда Если СтрТзХР.Количество >= КоличествоОт или СтрТзХР.Количество <= КоличествоДо Тогда СтрТч.Характеристика = СтрТзХР.Характеристика КонецЕсли; КонецЕсли; КонецЦикла; // КоличествоОт = СтрТч.Количество - 5; КоличествоДо = СтрТч.Количество; // Для каждого СтрТзХР из ТзХР Цикл Если СтрТч.Номенклатура = СтрТзХР.Номенклатура Тогда Если СтрТзХР.Количество >= КоличествоОт или СтрТзХР.Количество <= КоличествоДо Тогда СтрТч.Характеристика = СтрТзХР.Характеристика КонецЕсли; КонецЕсли; КонецЦикла; // КонецЦикла; КонецЕсли; ЗаказКлиентаОбъект.Записать(); КонецЕсли; КонецФункции &НаКлиенте Процедура Тестировать(Команда) ЗаполнитьОбъект(ЭтотОбъект.ДокументСсылка); КонецПроцедуры // |
|||
3
Фрэнки
24.03.18
✎
18:11
|
Но в самой же конфиге есть обработки. Это в какой конфиге?
|
|||
4
falselight
24.03.18
✎
18:20
|
(3) УТ 11.1
дали обработку, для примера, что в ней все есть но я не пойму в чем ошибка ((( не пойму что именно нужно править.... |
|||
5
falselight
24.03.18
✎
18:24
|
Тут можно как то своими словами объяснить что делать?
Говорят в обычном приложении бы все работало, но вот под управляемым нет. Все же в чем тут суть??????? Что именно править хоть. Реально плаваю. |
|||
6
Фрэнки
24.03.18
✎
18:28
|
(5) да. В обычном не пришлось бы передавать ссылку на Сервер и поднимать там в контексте Сервера еще один Экземпляр объекта.
Сейчас подумаю... Заказ поставщику - есть такой документ. И Поступление. Там в поступлении должна быть кнопка "Заполнить" и под ней вызов процедуры для заполнения текущего объекта. |
|||
7
Фрэнки
24.03.18
✎
18:30
|
Ну а так... может кто-то что-то еще подскажет.
Потому что в типовом решении все эти Заполнить могут быть довольно громоздкие - а у меня прямо сейчас под руками базы нет, подсмотреть негде. |
|||
8
Фрэнки
24.03.18
✎
18:32
|
(4) В обработке для примера - она же внешняя? Там экземпляра объекта уже открытого нет. Поэтому, что нормально во внешней обработке не совсем подходит в той, что будет встроена в форму самого документа.
|
|||
9
falselight
24.03.18
✎
19:29
|
(8) Внешняя да, для заполнения тч документа
но глючит как в заголовке темы как это обойти и устранить пока не знаю |
|||
10
RomanYS
24.03.18
✎
21:23
|
(9)(8) Поднять демоБСП и смотреть примеры. Там есть разные варианты вызова, в том числе передачей контекста формы исходного объекта.
|
|||
11
falselight
25.03.18
✎
04:13
|
Странно что в примерах, по которым я делал и тоже для управляемого приложения, об этом ничего не было.
|
|||
12
falselight
25.03.18
✎
06:16
|
Там везде наверное все по разному.
Хотелось бы какой либо однозначной последовательности действий. Как например модуль подключения внешней обработки. |
|||
13
falselight
25.03.18
✎
07:23
|
Сделал вот так, подскажите правильно ли?
И идет ошибка, - {ВнешняяОбработка.ЗаполнениеТчЗаказаКлиента.Форма.Форма.Форма(12)}: Значение не является значением объектного типа (ИмяФормы) Сообщить(Строка(СодержимоеОкна.ИмяФормы)); Как её устранить? // &НаКлиенте Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт Сообщить(ОбъектыНазначенияМассив[0]); ЗаполнитьОбъект(ОбъектыНазначенияМассив[0]); // Окна = ПолучитьОкна(); Сообщить(Строка(Окна)); Для каждого ТекущееОкно Из Окна Цикл СодержимоеОкна = ТекущееОкно.ПолучитьСодержимое(); Сообщить(Строка(СодержимоеОкна)); Сообщить(Строка(СодержимоеОкна.ИмяФормы)); Если СодержимоеОкна <> Неопределено И СодержимоеОкна.ИмяФормы = "Документ.ЗаказКлиента.Форма.ФормаДокументаОбщая" Тогда СодержимоеОкна.Прочитать(); КонецЕсли; КонецЦикла; КонецПроцедуры // |
|||
14
Мимохожий Однако
25.03.18
✎
07:24
|
Закомментируй
|
|||
15
falselight
25.03.18
✎
07:26
|
(14) Что именно закоментировать?
Нужно обновить форму после заполнения. Я пробую этим кодом. Так как его не посомтреть отладчиком, не пойму на что ругается. |
|||
16
Мимохожий Однако
25.03.18
✎
07:29
|
(15) Комментируй строку 12.
"Так как его не посомтреть отладчиком". Это я не понял. Точку останова помести в процедуру Печать и шаг за шагом, шаг за шагом.. |
|||
17
falselight
25.03.18
✎
07:32
|
(16) Процедуры Печать нет.
Не посмотреть потому что ВыполнитьКоманду выполняется уже когда обработка встроена во внешние обработки и подключена к документу. Строка 12 э то какая именно? Там вроде весь код нужный, но ругается на ИмяФормы |
|||
18
Мимохожий Однако
25.03.18
✎
07:36
|
(17) Ты даже не пытаешься найти процедуру печати. Она на форме документа. С неё и пляши. Даже если твоя обработка подключена, она лежит в явном виде в темповых папках и туда отладчик доходит. В файловой базе точно доходит.
... Строка 12 в форме твоей обработки."орма.Форма.Форма(12)}:" |
|||
19
falselight
25.03.18
✎
07:58
|
(18) не совсем понял что за строка. Какая это?
|
|||
20
falselight
25.03.18
✎
08:00
|
(18) То есть я могу открыть эту обработку поставить точку останова
и при вызове с формы заполнить табличную часть отслеживать её выполнение отладчиком? |
|||
21
falselight
25.03.18
✎
08:02
|
(18) Думаю сам не найду этот темповый каталог
|
|||
22
falselight
25.03.18
✎
08:03
|
Почему то на .ИмяФормы ругается
|
|||
23
Фрэнки
25.03.18
✎
09:26
|
(22) мда... грустно как-то :)
коллега, извини за фамильярность, но тыжпрограммист! твоя внешняя обработка, запиленная на вызовы из Дополнительных, ее придется переделать немного, под вызовы из обработки "из внешнего файла", а уже затем пользоваться отладчиком. Т.е. смотришь, пробуешь открыть ее в Предприятие непосредственно "открыть файл", если ошибок не выдает при открытии - все нормально, можно отладкой пользоваться. |
|||
24
DDwe
25.03.18
✎
09:41
|
(23) Он не программист, он местный клоун-тролль
|
|||
25
falselight
25.03.18
✎
09:48
|
(23)
// &НаКлиенте Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт ЗаказКлиентаСсылка = ОбъектыНазначенияМассив[0]; //Сообщить(ЗаказКлиентаСсылка); ЗаполнитьОбъект(ЗаказКлиентаСсылка); // //Зададим ключ поиска документа, из которого вызвана данная обработка, //чтобы получить ссылку на редактирумый документ в удобном виде для //функции ОткрытьФорму() КлючПоиска = Новый Структура("Ключ", ЗаказКлиентаСсылка); // Окна = ПолучитьОкна(); //Сообщить(Строка(Окна)); Для каждого ТекущееОкно Из Окна Цикл // //Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому //сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна //изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться //Наименование, номер и дата нужного документа - будем изменять Если НЕ ТекущееОкно.Основное И Найти(ТекущееОкно.Заголовок, ЗаказКлиентаСсылка) Тогда //Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне //в функцию ОткрытьФорму() //Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного Форма = ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", КлючПоиска, , , ТекущееОкно); //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную //В объекте содержатся все реквизиты (элементы) формы НовыйОбъект = Форма.Объект; //Мы помещаем объект формы в переменную, //так как должны передать её в процедуру на сервере, //где нельзя изменять объект формы, зато можно править переменную содержащую его ЗаполнитьОбъект(НовыйОбъект); //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект, //которую необходимо передать в уже полученную нами форму КопироватьДанныеФормы(НовыйОбъект, Форма.Объект); КонецЕсли; // КонецЦикла; КонецПроцедуры // |
|||
26
falselight
25.03.18
✎
09:49
|
(23) Она доработана на вызовы из внешнего файла.
Тут вопрос был в том что просмотреть нужно именно код который выполняется когда она вызывается из документа уже встроенная. И этот код можно отследить именно в тот момент. |
|||
27
DDwe
25.03.18
✎
10:21
|
(26) Какая каша у тебя в голове
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |