Имя: Пароль:
1C
1С v8
УФ Как правильно написать код , чтобы работал на сервер без контекста?
0 Ivan_495
 
23.09.14
15:11
УФ Как правильно написать код , чтобы работал на сервер без контекста?
&НаКлиенте
Процедура ЗаполнитьПоСпецификациям(Команда)
Объект.Материалы.Очистить();

    ЗаполнитьПоСпецификациямСервер(Объект.Ссылка,Объект.Материалы);
    
КонецПроцедуры


&НаСервереБезКонтекста
Процедура ЗаполнитьПоСпецификациямСервер(Ссылка,Коллекция)

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СпецификацииСрезПоследних.Сырье,
        |    СУММА(СпецификацииСрезПоследних.Количество) КАК КоличествоСЫрьяЗаЕд,
        |    СУММА(ОтчетПроизводстваЗаСменуПродукция.Количество) КАК КоличествоПродукцииКг,
        |    СУММА(ОтчетПроизводстваЗаСменуПродукция.Количество * СпецификацииСрезПоследних.Количество) КАК КолСырьяНавсюПродукцию,
        |    СпецификацииСрезПоследних.Сырье.ЕдиницаИзмерения КАК ЕдИзм
        |ИЗ
        |    Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Спецификации.СрезПоследних КАК СпецификацииСрезПоследних
        |        ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииСрезПоследних.Номенклатура
        |ГДЕ
        |    ОтчетПроизводстваЗаСменуПродукция.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    СпецификацииСрезПоследних.Сырье,
        |    СпецификацииСрезПоследних.Сырье.ЕдиницаИзмерения";

    Запрос.УстановитьПараметр("Ссылка",Ссылка);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        тек=Коллекция.Добавить();
        тек.Номенклатура=ВыборкаДетальныеЗаписи.Сырье;
        тек.Количество=ВыборкаДетальныеЗаписи.КолСырьяНавсюПродукцию;
        тек.ЕдИзм=ВыборкаДетальныеЗаписи.ЕдИзм;
    КонецЦикла;

        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    
КонецПроцедуры
1 KSN
 
23.09.14
15:12
Откуда у тебя на клиенте объект??
2 Ivan_495
 
23.09.14
15:14
+0  ошибка
Документ.ОтчетПроизводстваЗаСмену.Форма.ФормаДокумента.Форма(118)}: Ошибка при установке значения атрибута контекста (Материалы)
    ЗаполнитьПоСпецификациямСервер(Объект.Ссылка,Объект.Материалы);
по причине:
Нельзя изменять поле, содержащее объект данных формы
3 lodger
 
23.09.14
15:14
с тч на клиенте не работай.
отправь его на сервер со всем контекстом, там уже делай бесконтекстный к данным базы.
с клиента на сервер без контекста имеет смысл идти если тебе ограниченный набор данных ннада.
4 lodger
 
23.09.14
15:15
(3) + или сделать там пакость через процедуру.
5 Ivan_495
 
23.09.14
15:19
(4) ты предлагаешь так?
&НаКлиенте
Процедура ЗаполнитьПоСпецификациям(Команда)
   ЗаполнитьПоСпецификациямСервер(Объект);
    
КонецПроцедуры


&НаСервереБезКонтекста
Процедура ЗаполнитьПоСпецификациямСервер(Объект)
6 kosts
 
23.09.14
15:22
(5) Перейди на сервер с контекстом. И там заполни документ.
7 H A D G E H O G s
 
23.09.14
15:24
ппц
8 lodger
 
23.09.14
15:24
(5)
&НаКлиенте
Процедура ЗаполнитьПоСпецификациям(Команда)
   ЗаполнитьПоСпецификациямСервер();
    
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция СпецификацииССервера(Ссылка)
...
твой запрос
...
возврат запрос.выполнить().выгрузить();
КонецФункции

ну или около того )

КонецФункции
9 H A D G E H O G s
 
23.09.14
15:25
Процедура ЗаполнитьПоСпецификациямСервер(Ссылка,Коллекция)
заменить на

Процедура ЗаполнитьПоСпецификациямСервер(ЗНАЧ Ссылка,Коллекция)
10 H A D G E H O G s
 
23.09.14
15:25
Ааа, там еще материалы.
11 H A D G E H O G s
 
23.09.14
15:29
Тут только 2 пути:
1) Контекстно заполнить ТЧ.
2) Безконтекстно вернуть массив структур и заполнить ТЧ на клиенте.
12 kosts
 
23.09.14
15:29
(0) Если делать так как в (0), то можно вернуть с сервера структуру с данными (Структура структур). Как-то так делал, вполне работало. Может так плохо делать, но работало.


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

    Стру = ЗаполнитьПоСпецификациямСервер(Объект.Ссылка);

    Объект.Материалы.Очистить();
    
    Для каждого КЗ из Стру Цикл
        Строка = Объект.Материалы.Добавить();
        Строка.Номенклатура = КЗ.Значение.Номенклатура;
        Строка.Количество= КЗ.Значение.Количество;
        Строка.ЕдИзм= КЗ.Значение.ЕдИзм;
    КонецЦикла;

КонецПроцедуры
13 Defender aka LINN
 
23.09.14
15:31
Всяческие заполнения лучше сразу размещать в модуле менеджера и довольно насвистывать, когда ВНЕЗАПНО потребуется заполнить документ не из формы.
14 H A D G E H O G s
 
23.09.14
15:33
(13) Потом впилят копию этого кода.
Потом, если будут правки и они достатчно заип---ся синхронно править, а лучше у них будет несколько решений - унифицируют.

Как будто не плавали...
15 Euguln
 
23.09.14
15:34
(11) Есть еще РеквизитФормыВЗначение
16 Drac0
 
23.09.14
15:35
(15) На клиенте-то?
17 Euguln
 
23.09.14
15:36
(16) Нет, с клиента на сервер, с сервера на сервер без контекста
18 Ivan_495
 
23.09.14
15:39
(13) и как выглядит код с использование модуля менеджера?
19 Defender aka LINN
 
23.09.14
15:46
(18) Отлично выглядит.
20 H A D G E H O G s
 
23.09.14
15:46
(18) Ну он такой... кодистый... Красно-синий, в основном.
21 Ivan_495
 
23.09.14
15:49
(13(и зачем модуль менеджера, если кроме как из формы я заполнять табличную часть не собираюсь?
22 H A D G E H O G s
 
23.09.14
15:51
(21) Ну ты же не знаешь будущего. Ты - не собираешься, твой собрат-потомок-наследник конфы - собереться и вспомнит тебя добрыми словами, когда увидит его в Модуле менеджера.
23 Ivan_495
 
23.09.14
15:55
получается массив структур
24 Ivan_495
 
23.09.14
16:00
а если процедуру заполнения разметить в модуле объекта?
25 Defender aka LINN
 
23.09.14
16:12
(24) За такое тебя твой собрат-потомок-наследник конфы проклянет до седьмого колена и будет прав.
Пихай в модуль менеджера, говорят тебе.
26 Drac0
 
23.09.14
16:42
(17) Какой хитрый план.
27 Ivan_495
 
23.09.14
16:43
(25) создать не долго, как к ней обратиться не умею
28 Drac0
 
23.09.14
16:44
(27) Документы.ТвойДокумент.ТвояФункция()
29 Drac0
 
23.09.14
16:45
+(28) не забудь Экспорт указать для функции.
30 Ivan_495
 
23.09.14
16:48
(28)Документы.ОтчетПроизводстваЗаСмену.ЗаполнитьПоСпецификациямСервер(
ругается документы переменая не определена
31 Fish
 
23.09.14
16:50
И почему люди думают, что пару-тройку лет побыдлокодив на 8.1 они влёгкую разберутся в УФ "методом тыка" не читая никаких материалов?
32 MrStomak
 
23.09.14
16:51
(0) Вообще, чисто технически,у  тебя на клиенте может не быть всех значений коллекции и он неявно сделает контекстный серверный вызов, получить все недостающие элементы коллекции, а потом уже будет выполнять твой безконтекстный серверный вызов. Зачем это нужно, если просто можно сразу вызвать сервер с контекстом?
33 Ivan_495
 
23.09.14
16:55
(32) да наслушался тут лекций , что безконтекстный работает быстрее, вот думаю
контекстный все уже работает.
34 MrStomak
 
23.09.14
16:57
(33) Ну в твоём случае ты меняешь как раз контекст. Безконтекстные вызовы нужны для других целей.
35 Ivan_495
 
23.09.14
16:59
(34) логично, а зачем тогда эти советы про модуль менеджера?
36 Drac0
 
23.09.14
17:01
(30) Документы не доступны на Клиенте. Делай безконтекстный вызов в качестве прослойки.
37 MrStomak
 
23.09.14
17:03
(35) Делаешь контекстный серверный вызов, из него вызываешь процедуру в модуле менеджера, которая заполнить что тебе надо. Потом использовать эту процедуру в модуле менеджера можно из других мест будет - например, из других форм объекта.
38 Defender aka LINN
 
23.09.14
17:05
(35) Это в продолжение темы. Чтобы потом ВНЕЗАПНО не выяснилось, что весь функционал документа, включая проведение, находится в форме.
39 Ivan_495
 
23.09.14
17:15
модуль формы
&НаКлиенте
Процедура ЗаполнитьПоСпецификациям(Команда)
//    
      ЗаполнитьПоСпецификациямС();
КонецПроцедуры

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

модуль менеджера
Процедура ЗаполнитьПоСпецификациямСервер(ссылка,коллекция) ЭКСПОРТ

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СпецификацииСрезПоследних.Сырье,
        |    СУММА(СпецификацииСрезПоследних.Количество) КАК КоличествоСЫрьяЗаЕд,
        |    СУММА(ОтчетПроизводстваЗаСменуПродукция.Количество) КАК КоличествоПродукцииКг,
        |    СУММА(ОтчетПроизводстваЗаСменуПродукция.Количество * СпецификацииСрезПоследних.Количество) КАК КолСырьяНавсюПродукцию,
        |    СпецификацииСрезПоследних.Сырье.ЕдиницаИзмерения КАК ЕдИзм
        |ИЗ
        |    Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Спецификации.СрезПоследних КАК СпецификацииСрезПоследних
        |        ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииСрезПоследних.Номенклатура
        |ГДЕ
        |    ОтчетПроизводстваЗаСменуПродукция.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    СпецификацииСрезПоследних.Сырье,
        |    СпецификацииСрезПоследних.Сырье.ЕдиницаИзмерения";

        
        Запрос.УстановитьПараметр("Ссылка",Ссылка);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    
    коллекция.Очистить();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        тек=коллекция.Добавить();
        тек.Номенклатура=ВыборкаДетальныеЗаписи.Сырье;
        тек.Количество=ВыборкаДетальныеЗаписи.КолСырьяНавсюПродукцию;
        тек.ЕдИзм=ВыборкаДетальныеЗаписи.ЕдИзм;
    КонецЦикла;

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    
КонецПроцедуры
40 Ivan_495
 
23.09.14
17:24
вообщем оптимизации кода не получилось
41 Ivan_495
 
23.09.14
17:37
(36) если безконтекстный в качестве прослойки, как передать объект.ссылка в модуль менеджера?
42 Defender aka LINN
 
23.09.14
17:47
(41) Сделай контекстным и не люби никому моск. И передавай целиком Объект.
43 Drac0
 
23.09.14
18:26
(41) Хм, параметром функции же.