Имя: Пароль:
1C
 
Данные были изменены или удалены другим пользователем
,
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) Какая каша у тебя в голове
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн