1с передать с клиента на сервер реквизит формы

Передача значения реквизита формы документа с клиента на сервер

Я
   neetro

29.05.14 — 19:01

В двух словах может кто описать. Есть тестовая конфигурация с нуля. Там документ Инвентаризация. В нем реквизит Склад. Хочу заполнить табличную часть остатками по складу. Создал кнопку Заполнить на форме. Повесил действие. На Клиенте вызываю процедуру с сервера, На сервере запросом пытаюсь получить остатки с фильтром по складу, не могу понять как передать значение реквизита в процедуру на сервере. Что передать в вызове процедуры сервера с клиента…

  

Партнерская программа EFSOL Oblako

   Crush

1 — 29.05.14 — 19:14

Это очень сложный и топовый вопрос. Его задают здесь каждый день вместо того что бы пользоваться поиском.

РеквизитФормыВЗначение

   neetro

2 — 29.05.14 — 19:28

(1) ну я это использую. Код

&НаКлиенте

Процедура Заполнить(Команда)

    
    ЗаполнитьНаСервере();

    
КонецПроцедуры

&НаСервере

Процедура ЗаполнитьНаСервере()

    
    
    Документ = РеквизитФормыВЗначение(«Объект»);

    ТорговаяТочка = Документ.ТорговаяТочка;

    //ЗначениеВРеквизитФормы(Документ, «Объект»);

    
    Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    ОстаткиОстатки.Номенклатура,

        |    ОстаткиОстатки.ТорговаяТочка,

        |    ОстаткиОстатки.КоличествоОстаток КАК Количество

        |ИЗ

        //|    РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки»;

        |    РегистрНакопления.Остатки.Остатки(ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

        //|    РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

    //Запрос.УстановитьПараметр(«МоментВремени», МоментВремени);

    Запрос.УстановитьПараметр(«ТорговаяТочка», ТорговаяТочка);

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

        Сообщить(ВыборкаДетальныеЗаписи.Номенклатура);

    КонецЦикла;

    
КонецПроцедуры

   Лефмихалыч

3 — 29.05.14 — 19:29

(2) заставь себя написать в конце ЗначениеВРеквизитФормыБлеать()

   rendez-vous

4 — 29.05.14 — 19:31

Вместо:

Документ = РеквизитФормыВЗначение(«Объект»);

можно написать

Документ = Объект

   neetro

5 — 29.05.14 — 19:33

(3) даже боюсь спрашивать — ты такой злой ) где в конце то? у меня ошибка в  Запрос.УстановитьПараметр(«ТорговаяТочка», ТорговаяТочка);

   neetro

6 — 29.05.14 — 19:34

(4) что это изменит? Мне так сам конеткст докумнта не нужен, мне тупо реквизит нужен для фильтра в запросе….

   neetro

7 — 29.05.14 — 19:35

Я так понимаю я в переменную ТорговаяТочка херню какую то пишу, хотя там СправочникСсылка

   Лефмихалыч

8 — 29.05.14 — 19:36

(4) можно, но результат будет совсем другим

(5) текст ошибки ты предлагаешь угадать?

   neetro

9 — 29.05.14 — 19:37

(8)

{Документ.Пересменок.Форма.ФормаДокумента.Форма(34)}: Ошибка при вызове метода контекста (Выполнить)

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

по причине:

{(6, 50)}: Неверные параметры «РегистрНакопления.Остатки.Остатки, 0»

РегистрНакопления.Остатки.Остатки(ТорговаяТочка <<?>>= &ТорговаяТочка) КАК ОстаткиОстатки

   Crush

10 — 29.05.14 — 19:38

Отладчик предлагали?

   neetro

11 — 29.05.14 — 19:40

(10) в отладчике значение есть

ТорговаяТочка    Точка1     СправочникСсылка.ТорговыеТочки

   Лефмихалыч

12 — 29.05.14 — 19:40

(9) измерения такого нет у регистра, параметр тут ни при чем

   neetro

13 — 29.05.14 — 19:40

Это после этой строчки

ТорговаяТочка = Документ.ТорговаяТочка; (на сервере)

   neetro

14 — 29.05.14 — 19:41

(12) Есть. Это первое что я перепроверил. Запрос конструктором делал

   Crush

15 — 29.05.14 — 19:42

А может сначала период нужно задать?

   neetro

16 — 29.05.14 — 19:44

(15) да мне тупо остатки нужны какие есть. До периода я еще не дошел ) К слову без фильтра по ТТ запрос работатет.

   Crush

17 — 29.05.14 — 19:44

Точнее можно и не задавать. попробуй магический знак припинания вызвать

   neetro

18 — 29.05.14 — 19:45

(17) Что? ))

   Crush

19 — 29.05.14 — 19:46

И вообще юзай конструктор запроса. Он оградит тебя от незнания пунктуации при описании параметров виртуальных таблиц

   neetro

20 — 29.05.14 — 19:47

(19) я в 14 сообщении и написал что делал констуруктором!

   Crush

21 — 29.05.14 — 19:47

Есть игра такая «Найди 2 отличия»

|    РегистрНакопления.Остатки.Остатки(ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

|    РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

   Crush

22 — 29.05.14 — 19:49

(20) Гагага! Харошь заливать. Каким конструтором? Лего что ль?

1Совский конструктор запросов комментарии не оставляет

   neetro

23 — 29.05.14 — 19:50

Все я понял. Спасибо

   neetro

24 — 29.05.14 — 19:50

пустой парамерт забыл передать

Я слелал констурктором, потом корректировал его руками

   neetro

25 — 29.05.14 — 19:52

Кстати МоментВремени() тоже отказался работать

РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

Запрос.УстановитьПараметр(«МоментВремени», МоментВремени);

   neetro

26 — 29.05.14 — 19:52

Ладно, не усмотрел. теперь буду думать как вернуть данные в таблицу формы…..

   neetro

27 — 29.05.14 — 19:54

вот это

    Документ = РеквизитФормыВЗначение(«Объект»);

    ТорговаяТочка = Документ.ТорговаяТочка;

вообще по сути нормально? Перадавать весь объект чтобы полуить значение одного реквизита для фильтра… Может есть способ лучше?

   Crush

28 — 29.05.14 — 20:46

(27) Попробуй

ТорговаяТочка = РеквизитФормыВЗначение(«Объект.ТорговаяТочка»);

Потом напиши что получилось

А момент времени передавать не обязательно. Можно так:

РегистрНакопления.Остатки.Остатки(, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

   Crush

29 — 29.05.14 — 20:46

А может так?

ТорговаяТочка = РеквизитФормыВЗначение(«ТорговаяТочка»);

   Лефмихалыч

30 — 29.05.14 — 21:30

(14) заставь себя и условие тоже конструктором задатьблеать

   hhhh

31 — 29.05.14 — 22:34

(29) харе прикалываться. Тип СправочникСсылка существует и не объекте и на сервере. Не нужно здесь  РеквизитФормыВЗначение.

   hhhh

32 — 29.05.14 — 22:35

Запрос.УстановитьПараметр(«ТорговаяТочка», Объект.ТорговаяТочка);

   Crush

33 — 29.05.14 — 23:19

(31) Без приколов. Я УФ еще не знаю. А тут пишу что бы поддерживать диалог и чего то цеплять для себя.

   Лефмихалыч

34 — 29.05.14 — 23:27

(31) пля, да при чем тут?..

проблема в (2) и (9) от того, что у виртуальной таблицы два параметра и в первом конструкция «что-то = что-то еще» недопустима.

   hhhh

35 — 29.05.14 — 23:54

(34) ну это понятно, уже ведь объяснили автору

   ProProg

36 — 30.05.14 — 00:06

Вот двоешники емае.

   ProProg

37 — 30.05.14 — 00:06

Если все происходит в модуле формы.

То нифига передавать ничего и не нужно.

В серверной процедуре тупо используешь Объект.Реквизит траляляляля

   ProProg

38 — 30.05.14 — 00:07

А вот если в модуле объекта тогда да — нужно все передавать через структуру параметров.

   ProProg

39 — 30.05.14 — 00:08

РеквизитФормыВЗначение использовать нужно только если в модуле объекта какие то действия.

В модуле формы между клиентом и сервером нифига передавать не нужно. никакие формы в реквизиты и прочее.

   ProProg

40 — 30.05.14 — 00:10

(9) Что ты врешь. Ты не могу конструктором это делать, либо ты дятел.

РегистрНакопления.Остатки.Остатки(ТорговаяТочка <<?>>= &ТорговаяТочка)

Первый параметр у Остатки — это дата.

   neetro

41 — 30.05.14 — 11:57

(37) речь про модуль формы ага

Такая конструкция прекрасно работает. Спасибо!

    Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    ОстаткиОстатки.Номенклатура,

        |    ОстаткиОстатки.ТорговаяТочка,

        |    ОстаткиОстатки.КоличествоОстаток КАК Количество

        |ИЗ

        |    РегистрНакопления.Остатки.Остатки(, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;

    Запрос.УстановитьПараметр(«ТорговаяТочка», Объект.ТорговаяТочка);

   neetro

42 — 30.05.14 — 12:05

Лефмихалыч, ты как Йода )) не понимаю что ты говоришь. Какое условие? В конструкторе я на виртуальную таблицу наложил условие по торговой точке и по периоду. Это видно по закомментированным строкам в листинге. С ТТ разобрались, а моментвремени() из модуля формы пока хз как вызвать (ну типа актуальные остатки нужны)

Сейчас пытаюсь вникнуть как теперь вернуть номенклатуруколичество в форму ))) После 7.7 туго все идет. Это клиент серверное взаимодействие

  

neetro

43 — 30.05.14 — 12:15

(40) ты бы вник сначала в (9) там блеать видно что закомментирована строка сгенерированная конструктором из-за проблемы с периодом, скопировал ее и убрал момент времени. Запятую не подумал оставить (точнее не подумал что параметр дата по любому идет первым). Ты там сидишь за компом, самоутвержаешься, а в реале за такие необоснованные слова тебе бы уже е.бальник разбили. Глазки в пол и побежал. М.удила )

 +1 

   

Распечатать

Фунции отвечающие за обмен данных с формой на сервере.

РеквизитФормыВЗначение— Преобразует указанный реквизит формы в объект прикладного типа.

Код 1C v 8.2 УП

 &НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

ДокументОбъект = РеквизитФормыВЗначение("Объект");
ПеречитатьДанныеПоСертификатам(ДокументОбъект);

КонецПроцедуры

ЗначениеВРеквизитФормы – Преобразует объект прикладного типа в реквизит управляемой формы

Код 1C v 8.2 УП

 // При изменении реквизитов
&НаСервере
Процедура ПриИзмененииПартнераСервер()

СправочникОбъект = РеквизитФормыВЗначение("Объект");
СправочникОбъект.ЗаполнитьУсловияПродажПоУмолчанию();
ЗначениеВРеквизитФормы(СправочникОбъект, "Объект");

УстановитьВидимостьЭлементовПоРегулярностиСервер();
КонецПроцедуры

ДанныеФормыВЗначение – Преобразует данные формы в объект прикладного типа.

Код 1C v 8.2 УП

 &НаСервере
Функция НовыйЭлементСправочника()

СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Номенклатура"));
СправочникОбъект.Записать();
............................

ЗначениеВДанныеФормы – Преобразует объект прикладного типа в универсальный объект данных.

Код 1C v 8.2 УП

 &НаСервере
Процедура НовыйЧекНаСервере()

НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Партнер = Справочники.Партнеры.РозничныйПокупатель;
НовыйЧек.ОбработкаЗаполнения(Новый Структура("КассаККМ", Объект.КассаККМ), Истина);

ЗначениеВДанныеФормы(НовыйЧек, Объект);

Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик. Необходимо получить ИНН этого поставщика:


Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.

Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.

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

&НаКлиенте
Процедура ПолучитьИННПоставщика(Команда)
   ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
КонецПроцедуры 

А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:

&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
   Возврат СсылкаНаПоставщика.ИНН;
КонецФункции   

Таким образом на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки и возвращаем его на клиента.

Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, — это слишком расточительно.

Подскажите,пожалуйста, как  передать реквизит (Таблица Значений) формы на сервер? я недавно занимаюсь управляемыми формами, проконсультируйте пожалуйста.

ПоместитьВоВременноеХранилище

так ему же на сервер и все дела

мне нобходимо потом эту таблицу значений в запрос отправить,а я не могу перебрать даже строки её

а в чём проблема-то? код в студию

в серверной процедуре формы выгружаешь реквизит в ТЗ и передаёшь что тут сложного-то

не получается код, потому пыталась и выгрузить реквизит в таблицу значений, и сразу передавать реквизит формы…. вот пример: {Документ.ут_РегистрацияРеестровНП.Форма.ФормаДокумента.Форма}: Ошибка при вызове метода контекста (Выгрузить)     тз_данные=ВТ_РеестрыИзФайла.Выгрузить; по причине: Метод недоступен на клиенте

ну дк раз недоступна на клиенте, из клиента вызывай серверную процедуру

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

>>Метод недоступен на клиенте ни фига не вызываешь

либо через РеквизитФормыВЗначение ТЗ = РеквизитФормыВЗначение(«Реквизит1»);

ввобще отказаться от таблицы значений, т.к. в тонком все равно не прокатит

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

naklienteКазалось-бы, простая задача – в строке документа есть несколько реквизитов: Артикул, Вес, Размер, при изменении которых они должны сохраняться в реквизитах справочника, элемент которого выбран в этой-же строке. Т.е. получается, что пользователь не редактирует элемент справочника, а система это делает за него. Всё было-бы просто, если бы речь не шла об 1С версии 8.2, и вот почему – в 8.2 операции записи элементов могут выполняться только на сервере и не могут выполняться в форме, открытой на клиенте.

Вызов сервера я разделил на два этапа: сначала вызывается серверная процедура, описанная непосредственно в модуле формы, затем в ней вызывается процедура общего модуля для которого установлен признак исполнения на сервере. При передаче управления в модуль на сервере данные формы нельзя просто вставить в переменную и отправить в процедуру, если речь идет про объект, т.е. к примеру контекст текущего документа. Напомню, что сама форма исполняется не в контексте документа, его реквизиты доступны через реквизит формы “Объект”, теперь, если этот контекст нужно передать на сервер его нужно сделать прикладным объектом с помощью функции РеквизитФормыВЗначение(). После обработки этого объекта на сервере его можно вернуть с помощью функции ЗначениеВРеквизитФормы(). Всё это выглядит примерно так:

zapolnitsvoistvatovara

Это текст процедуры в модуле формы документа, ФормированиеТоваров – имя общего модуля с установленным признаком “Сервер”. В процедуре СформироватьТоварВПриходе() производятся изменения и запись в элемент справочника Товары, измененный элемент помещается в строку документа.

Для закоренелого “семерочника” выглядит дико, но такая система заставляет понять распределение ролей клиента и сервера. Если вдуматься, то во всех “причудах” новой платформы просматривается логика такой организации работы, когда клиенты становятся всё тоньше и, в конечном итоге, работают через веб, отправляя всю ответственную работу по обработке данных на сервер.

Добрый вечер.

в модуле формы есть команда , она выполняется при нажатии на кнопку . вот она :


&НаКлиенте
Процедура РасчетЛистов(Команда)
    //сначала уберем все листы
        Для Каждого ДеталиНаЛисте Из Объект.ДеталиНаЛисте Цикл
        Если ДеталиНаЛисте.ИДДетали=ВыбраннаяДетальВФормеРасчетаЛистов тогда
            Для Каждого Лист Из Объект.Листы Цикл
                Если Лист.ИД=ДеталиНаЛисте.ИДЛиста тогда
                    Объект.Листы.Удалить(Лист);
                КонецЕсли;
            КонецЦикла;           
            Объект.ДеталиНаЛисте.Удалить(ДеталиНаЛисте);
        КонецЕсли;   
    КонецЦикла;
Об = Объект;
Тест =  БЗ_ОбщийМодуль_Расчеты.ПроцедураРасчетЛистов(Об, ВыбраннаяДетальВФормеРасчетаЛистов);
КонецПроцедуры

ПроцедураРасчетЛистов это серверная функция , оформленная в общем модуле его код привожу :


&НаСервере
функция ПроцедураРасчетЛистов(Объект,ИДДетали)   экспорт

    Объем = ОпределитьЗначениеРеквизита(Объект,511, ИДДетали);
    Доля = ОпределитьЗначениеРеквизита(Объект,550, ИДДетали );
    Формат = ОпределитьЗначениеРеквизита(Объект,110,  );
    Скрепление = ОпределитьЗначениеРеквизита(Объект,127,  );

Возврат Объем*Доля;

КонецФункции

&НаСервере
Функция ОпределитьЗначениеРеквизита(Объект, КодРеквизита, ИДОбъекта)  экспорт

    //определить пренадлежность реквизита з - заказ, л - лист, д - деталь
        Реквизиты = Новый Запрос(
        "Выбрать СВР.Пренадлежность    из
         | Справочник.БЗ_СвойстваРеквизитов СВР
         | где СВР.код=&код ");
    Реквизиты.УстановитьПараметр("код",         КодРеквизита);
    РезультатЗапроса = Реквизиты.Выполнить();
              Выборка = РезультатЗапроса.Выбрать();             
    Выборка.Следующий();       
    Пренадлежность = Выборка.Пренадлежность;

        Если Пренадлежность="д" Тогда //если имеем дело с реквизитом детали
    Для Каждого РеквизитыДетали Из Объект.РеквизитыДетали Цикл
        Если РеквизитыДетали.Код = КодРеквизита и РеквизитыДетали.НомерДетали=ИДОбъекта тогда
            Результат = РеквизитыДетали.Значение;
            Прервать;
        КонецЕсли;

    КонецЦикла;
КонецЕсли;

Если Пренадлежность="з" Тогда //если имеем дело с реквизитом заказа
    Для Каждого РеквизитыЗаказа Из Объект.РеквизитыЗаказа Цикл
        Если РеквизитыЗаказа.Код = КодРеквизита тогда
            Результат = РеквизитыЗаказа.Значение;
            Прервать;
        КонецЕсли;

    КонецЦикла;
КонецЕсли;

Возврат Результат;
КонецФункции

Работает, но всё ли верно делаю ?
Один представитель клуба советовал все вычисления делать на серваке . самое интересное , что был совет использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в данном случае  наверно в серверной «ОпределитьЗначениеРеквизита». Подозреваю, что это правильно !
Но могу ли я использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в модуле ?
ругается

Цитировать
{ОбщийМодуль.БЗ_ОбщийМодуль_Расчеты.Модуль(3,6)}: Процедура или функция с указанным именем не определена (РеквизитФормыВЗначение)
Об = <<?>>РеквизитФормыВЗначение(Объект); (Проверка: Сервер)

наверно потому что в описании функции стоит «УправляемаяФорма» .
Как быть?

Пусть у нас есть есть документ ПриходнаяНакладная с табличной частью Состав. Для этого документа необходимо реализовать подбор номенклатур в табличную часть. Должна быть возможность переносить в документ несколько номенклатур за раз. То есть сначала пользователь подбирает номенклатуры в определенную таблицу, а затем по команде «Перенести в документ» данные из этой таблицы переносятся в табличную часть документа. При переносе в табличную часть, если номенклатура уже была добавлена ранее, нужно увеличить количество в этой строке на значение, указанное в подборе.

Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.

Без обращения к серверу

Создадим форму списка у справочника Номенклатура не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры (тип ТаблицаЗначений) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа и Ссылка установим флаг ИспользоватьВсегда. Чуть позже станет понятно, для чего.

Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Проверка на наличие выбранной строки в динамическом списке
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;       
    // Для групп номенклатуры подбор не производится. Именно для обращения
    // к свойству «ЭтоГруппа» был установлен флаг «Использовать всегда», иначе
    // при отсутствии колонки «Это группа» в списке вылетала бы ошибка
    // «Поле объекта не найдено»
    Если ТекущиеДанные.ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    // Отключаем стандартную обработку
    СтандартнаяОбработка = Ложь;
    // Ищем товар в таблице ПодобранныеНоменклатуры. Если нет — добавляем
    // строку, иначе увеличиваем количество
    РезультатПоиска = ПодобранныеНоменклатуры.НайтиСтроки(
        Новый Структура("Наименование", ТекущиеДанные.Ссылка)
    );
    Если РезультатПоиска.Количество() = 0 Тогда
        Строка = ПодобранныеНоменклатуры.Добавить();
        Строка.Наименование = ТекущиеДанные.Ссылка;
    Иначе
        Строка = РезультатПоиска[0];
    КонецЕсли;
    Строка.Количество = Строка.Количество + 1;
КонецПроцедуры

Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная по команде Подбор:

&НаКлиенте
Процедура Подбор(Команда)
    // Первый параметр — полное имя формы, третий параметр — элемент формы,
    // в который осуществляется подбор (владелец). Последним параметром
    // передается уникальный идентификатор формы.
    ОткрытьФорму(
        "Справочник.Номенклатура.Форма.ФормаПодбораИзДокумента",
        ,
        Элементы.Состав,
        УникальныйИдентификатор
    );
КонецПроцедуры

Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент:

&НаКлиенте
Процедура ПеренестиКлиент(Команда)
    // Передаем данные выбора владельцу формы, т.е. документу ПриходнаяНакладная
    ОповеститьОВыборе(ПодобранныеНоменклатуры); 
КонецПроцедуры

Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора элемента формы документа:

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ВыбранноеЗначение Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;
КонецПроцедуры

С обращением к серверу

Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:

&НаКлиенте
Процедура ПеренестиСервер(Команда)
    // Помещаем подобранные номенклатуры во временное хранилище на
    // сервере  и получаем соответствующий адрес в нем
    Адрес = ПодготовитьДанныеПодбора();
    // Передаем владельцу формы данные выбора 
    ОповеститьОВыборе(Адрес); 
КонецПроцедуры

&НаСервере
Функция ПодготовитьДанныеПодбора()
    // Выгружаем таблицу формы в таблицу значений для корректной
    // работы с данными на сервере
    ТаблицаПодобранныхНоменклатур = ПодобранныеНоменклатуры.Выгрузить();
    // Помещаем во временное хранилище и возвращаем адрес. Вторым параметром
    // передаем уникальный идентификатор формы. После закрытия формы данные
    // во временном хранилище будут очищены.
    Адрес = ПоместитьВоВременноеХранилище(
        ТаблицаПодобранныхНоменклатур,
        УникальныйИдентификатор
    );
    Возврат Адрес;
КонецФункции

Обработчик события ОбработкаВыбора элемента формы документа:

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

&НаСервере
Процедура ОбработатьВыбранноеЗначение(ВыбранноеЗначение)
    // Получаем таблицу подобранных номенклатур из хранилища
    ТаблицаПодобранныхНоменклатур = ПолучитьИзВременногоХранилища(ВыбранноеЗначение);
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ТаблицаПодобранныхНоменклатур Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;    
КонецПроцедуры

Поиск:
1С:Предприятие • Документ • Обработка выбора • Открыть форму • Список • Справочник • Управляемая форма

Понравилась статья? Поделить с друзьями:
  • 1с получить значение реквизита формы документа
  • 1с получить список всех реквизитов справочника
  • 1с предприятие как проверить что есть реквизит
  • 1с предыдущее значение реквизита при изменении
  • 1с проверить существование реквизита в запросе