Вход | Регистрация


1С:Предприятие ::

Метки: 

Данные были изменены или удалены другим пользователем

Я
   falselight
 
24.03.18 - 17:56
Встроил обработку заполнения табличной части
в документ ЗаказКлиента. Но вот стало выходить такое сообщение
как в заголовке. Блокирующее окно всез действий.
Говорят обработка написана не правильно.
В чем может быть дело что нужно исправить?
 
 
   RomanYS
 
1 - 24.03.18 - 18:00
Правильно говорят. Надо править объект контекста, а не создавать его копию из базы да ещё его записывать. А если пользователь передумает?
   falselight
 
2 - 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
Но в самой же конфиге есть обработки. Это в какой конфиге?
   falselight
 
4 - 24.03.18 - 18:20
(3) УТ 11.1
дали обработку, для примера, что в ней все есть

но я не пойму в чем ошибка ((( не пойму что именно нужно править....
   falselight
 
5 - 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) В обработке для примера - она же внешняя? Там экземпляра объекта уже открытого нет. Поэтому, что нормально во внешней обработке не совсем подходит в той, что будет встроена в форму самого документа.
   falselight
 
9 - 24.03.18 - 19:29
(8) Внешняя да, для заполнения тч документа
но глючит как в заголовке темы
как это обойти и устранить пока не знаю
   RomanYS
 
10 - 24.03.18 - 21:23
(9)(8) Поднять демоБСП и смотреть примеры. Там есть разные варианты вызова, в том числе передачей контекста формы исходного объекта.
 
 Рекламное место пустует
   falselight
 
11 - 25.03.18 - 04:13
Странно что в примерах, по которым я делал и тоже для управляемого приложения, об этом ничего не было.
   falselight
 
12 - 25.03.18 - 06:16
Там везде наверное все по разному.
Хотелось бы какой либо однозначной последовательности действий.
Как например модуль подключения внешней обработки.
   falselight
 
13 - 25.03.18 - 07:23
Сделал вот так, подскажите правильно ли?
И идет ошибка, -

{ВнешняяОбработка.ЗаполнениеТчЗаказаКлиента.Форма.Форма.Форма(12)}: Значение не является значением объектного типа (ИмяФормы)
        Сообщить(Строка(СодержимоеОкна.ИмяФормы));

Как её устранить?

//

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

    Окна = ПолучитьОкна();
    Сообщить(Строка(Окна));
    Для каждого ТекущееОкно Из Окна Цикл 
        СодержимоеОкна = ТекущееОкно.ПолучитьСодержимое(); 
        Сообщить(Строка(СодержимоеОкна));
        Сообщить(Строка(СодержимоеОкна.ИмяФормы));
        Если СодержимоеОкна <> Неопределено И СодержимоеОкна.ИмяФормы = "Документ.ЗаказКлиента.Форма.ФормаДокументаОбщая" Тогда 
            СодержимоеОкна.Прочитать();     
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
//
   МимохожийОднако
 
14 - 25.03.18 - 07:24
Закомментируй
   falselight
 
15 - 25.03.18 - 07:26
(14) Что именно закоментировать?
Нужно обновить форму после заполнения.
Я пробую этим кодом. Так как его не посомтреть отладчиком, не пойму на что ругается.
   МимохожийОднако
 
16 - 25.03.18 - 07:29
(15) Комментируй строку 12.
"Так как его не посомтреть отладчиком". Это я не понял.
Точку останова помести в процедуру Печать и шаг за шагом, шаг за шагом..
   falselight
 
17 - 25.03.18 - 07:32
(16) Процедуры Печать нет.

Не посмотреть потому что ВыполнитьКоманду выполняется
уже когда обработка встроена во внешние обработки и подключена к документу.

Строка 12 э то какая именно? Там вроде весь  код нужный, но ругается на ИмяФормы
   МимохожийОднако
 
18 - 25.03.18 - 07:36
(17) Ты даже не пытаешься найти процедуру печати. Она на форме документа. С неё и пляши. Даже если твоя обработка подключена, она лежит в явном виде в темповых папках и туда отладчик доходит. В файловой базе точно доходит.
...
Строка 12 в форме твоей обработки."орма.Форма.Форма(12)}:"
   falselight
 
19 - 25.03.18 - 07:58
(18) не совсем понял что за строка. Какая это?
   falselight
 
20 - 25.03.18 - 08:00
(18) То есть я могу открыть эту обработку поставить точку останова
и при вызове с формы заполнить табличную часть
отслеживать её выполнение отладчиком?
   falselight
 
21 - 25.03.18 - 08:02
(18) Думаю сам не найду этот темповый каталог
   falselight
 
22 - 25.03.18 - 08:03
Почему то на .ИмяФормы ругается
   Фрэнки
 
23 - 25.03.18 - 09:26
(22) мда... грустно как-то :)

коллега, извини за фамильярность, но тыжпрограммист!

твоя внешняя обработка, запиленная на вызовы из Дополнительных, ее придется переделать немного, под вызовы из обработки "из внешнего файла", а уже затем пользоваться отладчиком. Т.е. смотришь, пробуешь открыть ее в Предприятие непосредственно "открыть файл", если ошибок не выдает при открытии - все нормально, можно отладкой пользоваться.
   DDwe
 
24 - 25.03.18 - 09:41
(23) Он не программист, он местный клоун-тролль
   falselight
 
25 - 25.03.18 - 09:48
(23)

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

    ЗаполнитьОбъект(ЗаказКлиентаСсылка);
    //

    //Зададим ключ поиска документа, из которого вызвана данная обработка,

    //чтобы получить ссылку на редактирумый документ в удобном виде для

    //функции ОткрытьФорму()

    КлючПоиска = Новый Структура("Ключ", ЗаказКлиентаСсылка);
    //

    Окна       = ПолучитьОкна();
    //Сообщить(Строка(Окна));

    Для каждого ТекущееОкно Из Окна Цикл 
        //

        //Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому

        //сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна

        //изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться

        //Наименование, номер и дата нужного документа - будем изменять

        Если НЕ ТекущееОкно.Основное И Найти(ТекущееОкно.Заголовок, ЗаказКлиентаСсылка) Тогда
            //Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне

            //в функцию ОткрытьФорму()

            //Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного

            Форма       = ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", КлючПоиска, , , ТекущееОкно);
            //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную

            //В объекте содержатся все реквизиты (элементы) формы

            НовыйОбъект = Форма.Объект;
            //Мы помещаем объект формы в переменную,

            //так как должны передать её в процедуру на сервере,

            //где нельзя изменять объект формы, зато можно править переменную содержащую его

            ЗаполнитьОбъект(НовыйОбъект);
            //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,

            //которую необходимо передать в уже полученную нами форму

            КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
        КонецЕсли;
        //

    КонецЦикла;
КонецПроцедуры
//
   falselight
 
26 - 25.03.18 - 09:49
(23) Она доработана на вызовы из внешнего файла.
Тут вопрос был в том что просмотреть нужно именно код который выполняется когда она вызывается из документа уже встроенная. И этот код можно отследить именно в тот момент.
   DDwe
 
27 - 25.03.18 - 10:21
(26) Какая каша у тебя в голове



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует