Имя: Пароль:
1C
1С v8
Отображение изменений на управляемой форме
0 rosveta
 
16.10.14
15:11
Добрый день. Я пишу внешнюю обработку по заполнению табличной части в документе Заказ клиента в УТ 11. Она зарегистрирована, на форме документа отображается и в общем-то код отрабатывает. Но мои изменения не отображаются на форме этого документа. Привожу код.

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

&НаСервере
Процедура ЗаполнитьСкладыНаСервере(ОбъектыНазначенияМассив)
    
    // Получение массива складов, входящих в иерархию параметра "ГруппаСкладов"
    Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    Склады.Ссылка КАК Ссылка,
    |    Склады.ПометкаУдаления КАК ПометкаУдаления
    |ИЗ
    |    Справочник.Склады КАК Склады
    |ГДЕ
    |    Склады.Ссылка В ИЕРАРХИИ(&ГруппаСкладов)
    |    И Склады.ЭтоГруппа = ЛОЖЬ
    |    И ВЫБОР
    |            КОГДА &ВыборВЗаказ = ИСТИНА
    |                ТОГДА Склады.ВыборГруппы <> ЗНАЧЕНИЕ(Перечисление.ВыборГруппыСкладов.Запретить)
    |            ИНАЧЕ Склады.ВыборГруппы = ЗНАЧЕНИЕ(Перечисление.ВыборГруппыСкладов.РазрешитьВЗаказахИНакладных)
    |        КОНЕЦ");
    
    Запрос.УстановитьПараметр("ВыборВЗаказ", Истина);
    Запрос.УстановитьПараметр("ГруппаСкладов", ОбъектыНазначенияМассив[0].Склад);
    
    ТаблицаСкладов = Запрос.Выполнить().Выгрузить();
    МассивСкладов = ТаблицаСкладов.ВыгрузитьКолонку("Ссылка");
    
    //Получение структуры остатков
    ОстаткиПоСкладам = Новый ТаблицаЗначений;
    ОстаткиПоСкладам.Колонки.Добавить("Склад");
    ОстаткиПоСкладам.Колонки.Добавить("Остаток");
    ОбъектЗаказ = ОбъектыНазначенияМассив[0].ПолучитьОбъект();
    
    Для каждого СтрокаТовары Из ОбъектЗаказ.Товары Цикл
        
        СтруктураОстатков = ПодборТоваровСервер.ОстаткиНоменклатуры(СтрокаТовары.Номенклатура, СтрокаТовары.Характеристика, МассивСкладов);
        
        Для каждого СтрокаОстатков Из СтруктураОстатков.ТекущиеОстатки Цикл
            Если СтрокаОстатков.Свободно > 0 Тогда
                СтрокаОстаткиПоСкладам = ОстаткиПоСкладам.Добавить();
                СтрокаОстаткиПоСкладам.Склад = СтрокаОстатков.Склад;
                СтрокаОстаткиПоСкладам.Остаток = СтрокаОстатков.Свободно;
            КонецЕсли;    
        КонецЦикла;
        
        Для каждого СтрокаСформированныОстатки Из ОстаткиПоСкладам Цикл
            
            Если Найти(Строка(СтрокаСформированныОстатки.Склад), "возврат") > 0 И СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            ИначеЕсли Найти(Строка(СтрокаСформированныОстатки.Склад), "склад №3 (ПМ)") > 0 И СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            ИначеЕсли СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            КонецЕсли;
            
        КонецЦикла;
        ОстаткиПоСкладам.Очистить();
    КонецЦикла;
    
    Попытка
        ОбъектЗаказ.Записать(РежимЗаписиДокумента.Запись);//Для отладки.
        //ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект");
        //ЗначениеВРеквизитФормы(ОбъектЗаказ, "Объект");

    Исключение
        Сообщить("Не удалось записать документ");
    КонецПопытки;
    
    
    
КонецПроцедуры



ОбъектыНазначенияМассив[0] - Это и есть документ Заказ Клиента
1 PR
 
16.10.14
15:13
(0) У вас вторая сережка с уха в декольте уехала :))
2 PR
 
16.10.14
15:15
А по сабжу. Не нужно на сервере менять объект, который потом не перечитывается в форму на сервере.
3 rosveta
 
16.10.14
15:22
PR, Я правильно Вас понимаю, что на стороне сервера я только должна выполнить запрос и получить необходимые мне данные, потом на клиент передать массив, содержащий данные и там их уже и обработать?
4 PR
 
16.10.14
15:23
(3) Да
5 rosveta
 
16.10.14
15:23
Спасибо. Сейчас попробую
6 PR
 
16.10.14
15:24
+(4) Потому что на клиенте уже получен в форму объект, возможно даже отредактирован и менять нужно именно его, а не получать из базы еще раз объект и его менять.
7 rosveta
 
17.10.14
11:37
В итоге пришлось делать так. Такие варианты находила и в других темах, но думала, что ка-кто можно избежать поиска по окнам.
&НаКлиенте
Процедура ВыполнитьКоманду(ЗаполнитьСклады, ОбъектыНазначенияМассив) Экспорт
    
    Для каждого Элемент из ОбъектыНазначенияМассив Цикл
        КлючПоиска = Новый Структура("Ключ", Элемент);
        Окна = ПолучитьОкна();
        Для каждого Окно из Окна Цикл
            Если НЕ Окно.Основное
                И Найти(Окно.Заголовок, Элемент) Тогда
                Форма = ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",КлючПоиска,,,Окно);    
                НовыйОбъект = Форма.Объект;
                ЗаполнитьСкладыНаСервере(НовыйОбъект);
                КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
            КонецЕсли;    
        КонецЦикла;                 
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Процедура  ЗаполнитьСкладыНаСервере(ОбъектыНазначенияМассив)
    
    // Получение массива складов, входящих в иерархию параметра "ГруппаСкладов"
    Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    Склады.Ссылка КАК Ссылка,
    |    Склады.ПометкаУдаления КАК ПометкаУдаления
    |ИЗ
    |    Справочник.Склады КАК Склады
    |ГДЕ
    |    Склады.Ссылка В ИЕРАРХИИ(&ГруппаСкладов)
    |    И Склады.ЭтоГруппа = ЛОЖЬ
    |    И ВЫБОР
    |            КОГДА &ВыборВЗаказ = ИСТИНА
    |                ТОГДА Склады.ВыборГруппы <> ЗНАЧЕНИЕ(Перечисление.ВыборГруппыСкладов.Запретить)
    |            ИНАЧЕ Склады.ВыборГруппы = ЗНАЧЕНИЕ(Перечисление.ВыборГруппыСкладов.РазрешитьВЗаказахИНакладных)
    |        КОНЕЦ");
    
    Запрос.УстановитьПараметр("ВыборВЗаказ", Истина);
        Запрос.УстановитьПараметр("ГруппаСкладов", ОбъектыНазначенияМассив.Склад);
    
    ТаблицаСкладов = Запрос.Выполнить().Выгрузить();
    МассивСкладов = ТаблицаСкладов.ВыгрузитьКолонку("Ссылка");
    
    //Получение структуры остатков
    ОстаткиПоСкладам = Новый ТаблицаЗначений;
    ОстаткиПоСкладам.Колонки.Добавить("Склад");
    ОстаткиПоСкладам.Колонки.Добавить("Остаток");
    ОбъектЗаказ = ОбъектыНазначенияМассив.Товары.Выгрузить();
    
    Для каждого СтрокаТовары Из ОбъектыНазначенияМассив.Товары Цикл
        
        СтруктураОстатков = ПодборТоваровСервер.ОстаткиНоменклатуры(СтрокаТовары.Номенклатура, СтрокаТовары.Характеристика, МассивСкладов);
        
        Для каждого СтрокаОстатков Из СтруктураОстатков.ТекущиеОстатки Цикл
            Если СтрокаОстатков.Свободно > 0 Тогда
                СтрокаОстаткиПоСкладам = ОстаткиПоСкладам.Добавить();
                СтрокаОстаткиПоСкладам.Склад = СтрокаОстатков.Склад;
                СтрокаОстаткиПоСкладам.Остаток = СтрокаОстатков.Свободно;
            КонецЕсли;    
        КонецЦикла;
        
        Для каждого СтрокаСформированныОстатки Из ОстаткиПоСкладам Цикл
            
            Если Найти(Строка(СтрокаСформированныОстатки.Склад), "возврат") > 0 И СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            ИначеЕсли Найти(Строка(СтрокаСформированныОстатки.Склад), "склад №3 (ПМ)") > 0 И СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            ИначеЕсли СтрокаСформированныОстатки.Остаток >= СтрокаТовары.Количество Тогда
                СтрокаТовары.Склад = СтрокаСформированныОстатки.Склад;
                Прервать;
            КонецЕсли;
            
        КонецЦикла;
        ОстаткиПоСкладам.Очистить();
    КонецЦикла;
    

КонецПроцедуры
8 Simod
 
17.10.14
18:17
9 rosveta
 
20.10.14
16:47
(8), у меня заполнение происходит из формы обработки заполнения табличного документа. А реквизиты не отображаются в заполняемой форме, поэтому  я не совсем понимаю, каким образом я могу использовать  то, что вы прислали.
10 rosveta
 
21.10.14
14:02
Возможно, что я не очень понимаю принцип данных функций.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.