Передача значения реквизита формы документа с клиента на сервер |
Я |
29.05.14 — 19:01
В двух словах может кто описать. Есть тестовая конфигурация с нуля. Там документ Инвентаризация. В нем реквизит Склад. Хочу заполнить табличную часть остатками по складу. Создал кнопку Заполнить на форме. Повесил действие. На Клиенте вызываю процедуру с сервера, На сервере запросом пытаюсь получить остатки с фильтром по складу, не могу понять как передать значение реквизита в процедуру на сервере. Что передать в вызове процедуры сервера с клиента…
1 — 29.05.14 — 19:14
Это очень сложный и топовый вопрос. Его задают здесь каждый день вместо того что бы пользоваться поиском.
РеквизитФормыВЗначение
2 — 29.05.14 — 19:28
(1) ну я это использую. Код
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Документ = РеквизитФормыВЗначение(«Объект»);
ТорговаяТочка = Документ.ТорговаяТочка;
//ЗначениеВРеквизитФормы(Документ, «Объект»);
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ОстаткиОстатки.Номенклатура,
| ОстаткиОстатки.ТорговаяТочка,
| ОстаткиОстатки.КоличествоОстаток КАК Количество
|ИЗ
//| РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки»;
| РегистрНакопления.Остатки.Остатки(ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
//| РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
//Запрос.УстановитьПараметр(«МоментВремени», МоментВремени);
Запрос.УстановитьПараметр(«ТорговаяТочка», ТорговаяТочка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Номенклатура);
КонецЦикла;
КонецПроцедуры
3 — 29.05.14 — 19:29
(2) заставь себя написать в конце ЗначениеВРеквизитФормыБлеать()
4 — 29.05.14 — 19:31
Вместо:
Документ = РеквизитФормыВЗначение(«Объект»);
можно написать
Документ = Объект
5 — 29.05.14 — 19:33
(3) даже боюсь спрашивать — ты такой злой ) где в конце то? у меня ошибка в Запрос.УстановитьПараметр(«ТорговаяТочка», ТорговаяТочка);
6 — 29.05.14 — 19:34
(4) что это изменит? Мне так сам конеткст докумнта не нужен, мне тупо реквизит нужен для фильтра в запросе….
7 — 29.05.14 — 19:35
Я так понимаю я в переменную ТорговаяТочка херню какую то пишу, хотя там СправочникСсылка
8 — 29.05.14 — 19:36
(4) можно, но результат будет совсем другим
(5) текст ошибки ты предлагаешь угадать?
9 — 29.05.14 — 19:37
(8)
{Документ.Пересменок.Форма.ФормаДокумента.Форма(34)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(6, 50)}: Неверные параметры «РегистрНакопления.Остатки.Остатки, 0»
РегистрНакопления.Остатки.Остатки(ТорговаяТочка <<?>>= &ТорговаяТочка) КАК ОстаткиОстатки
10 — 29.05.14 — 19:38
Отладчик предлагали?
11 — 29.05.14 — 19:40
(10) в отладчике значение есть
ТорговаяТочка Точка1 СправочникСсылка.ТорговыеТочки
12 — 29.05.14 — 19:40
(9) измерения такого нет у регистра, параметр тут ни при чем
13 — 29.05.14 — 19:40
Это после этой строчки
ТорговаяТочка = Документ.ТорговаяТочка; (на сервере)
14 — 29.05.14 — 19:41
(12) Есть. Это первое что я перепроверил. Запрос конструктором делал
15 — 29.05.14 — 19:42
А может сначала период нужно задать?
16 — 29.05.14 — 19:44
(15) да мне тупо остатки нужны какие есть. До периода я еще не дошел ) К слову без фильтра по ТТ запрос работатет.
17 — 29.05.14 — 19:44
Точнее можно и не задавать. попробуй магический знак припинания вызвать
18 — 29.05.14 — 19:45
(17) Что? ))
19 — 29.05.14 — 19:46
И вообще юзай конструктор запроса. Он оградит тебя от незнания пунктуации при описании параметров виртуальных таблиц
20 — 29.05.14 — 19:47
(19) я в 14 сообщении и написал что делал констуруктором!
21 — 29.05.14 — 19:47
Есть игра такая «Найди 2 отличия»
| РегистрНакопления.Остатки.Остатки(ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
| РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
22 — 29.05.14 — 19:49
(20) Гагага! Харошь заливать. Каким конструтором? Лего что ль?
1Совский конструктор запросов комментарии не оставляет
23 — 29.05.14 — 19:50
Все я понял. Спасибо
24 — 29.05.14 — 19:50
пустой парамерт забыл передать
Я слелал констурктором, потом корректировал его руками
25 — 29.05.14 — 19:52
Кстати МоментВремени() тоже отказался работать
РегистрНакопления.Остатки.Остатки(&МоментВремени, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
Запрос.УстановитьПараметр(«МоментВремени», МоментВремени);
26 — 29.05.14 — 19:52
Ладно, не усмотрел. теперь буду думать как вернуть данные в таблицу формы…..
27 — 29.05.14 — 19:54
вот это
Документ = РеквизитФормыВЗначение(«Объект»);
ТорговаяТочка = Документ.ТорговаяТочка;
вообще по сути нормально? Перадавать весь объект чтобы полуить значение одного реквизита для фильтра… Может есть способ лучше?
28 — 29.05.14 — 20:46
(27) Попробуй
ТорговаяТочка = РеквизитФормыВЗначение(«Объект.ТорговаяТочка»);
Потом напиши что получилось
А момент времени передавать не обязательно. Можно так:
РегистрНакопления.Остатки.Остатки(, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
29 — 29.05.14 — 20:46
А может так?
ТорговаяТочка = РеквизитФормыВЗначение(«ТорговаяТочка»);
30 — 29.05.14 — 21:30
(14) заставь себя и условие тоже конструктором задатьблеать
31 — 29.05.14 — 22:34
(29) харе прикалываться. Тип СправочникСсылка существует и не объекте и на сервере. Не нужно здесь РеквизитФормыВЗначение.
32 — 29.05.14 — 22:35
Запрос.УстановитьПараметр(«ТорговаяТочка», Объект.ТорговаяТочка);
33 — 29.05.14 — 23:19
(31) Без приколов. Я УФ еще не знаю. А тут пишу что бы поддерживать диалог и чего то цеплять для себя.
34 — 29.05.14 — 23:27
(31) пля, да при чем тут?..
проблема в (2) и (9) от того, что у виртуальной таблицы два параметра и в первом конструкция «что-то = что-то еще» недопустима.
35 — 29.05.14 — 23:54
(34) ну это понятно, уже ведь объяснили автору
36 — 30.05.14 — 00:06
Вот двоешники емае.
37 — 30.05.14 — 00:06
Если все происходит в модуле формы.
То нифига передавать ничего и не нужно.
В серверной процедуре тупо используешь Объект.Реквизит траляляляля
38 — 30.05.14 — 00:07
А вот если в модуле объекта тогда да — нужно все передавать через структуру параметров.
39 — 30.05.14 — 00:08
РеквизитФормыВЗначение использовать нужно только если в модуле объекта какие то действия.
В модуле формы между клиентом и сервером нифига передавать не нужно. никакие формы в реквизиты и прочее.
40 — 30.05.14 — 00:10
(9) Что ты врешь. Ты не могу конструктором это делать, либо ты дятел.
РегистрНакопления.Остатки.Остатки(ТорговаяТочка <<?>>= &ТорговаяТочка)
Первый параметр у Остатки — это дата.
41 — 30.05.14 — 11:57
(37) речь про модуль формы ага
Такая конструкция прекрасно работает. Спасибо!
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ОстаткиОстатки.Номенклатура,
| ОстаткиОстатки.ТорговаяТочка,
| ОстаткиОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.Остатки.Остатки(, ТорговаяТочка = &ТорговаяТочка) КАК ОстаткиОстатки»;
Запрос.УстановитьПараметр(«ТорговаяТочка», Объект.ТорговаяТочка);
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
Комментарии доступны только авторизированным пользователям
Казалось-бы, простая задача – в строке документа есть несколько реквизитов: Артикул, Вес, Размер, при изменении которых они должны сохраняться в реквизитах справочника, элемент которого выбран в этой-же строке. Т.е. получается, что пользователь не редактирует элемент справочника, а система это делает за него. Всё было-бы просто, если бы речь не шла об 1С версии 8.2, и вот почему – в 8.2 операции записи элементов могут выполняться только на сервере и не могут выполняться в форме, открытой на клиенте.
Вызов сервера я разделил на два этапа: сначала вызывается серверная процедура, описанная непосредственно в модуле формы, затем в ней вызывается процедура общего модуля для которого установлен признак исполнения на сервере. При передаче управления в модуль на сервере данные формы нельзя просто вставить в переменную и отправить в процедуру, если речь идет про объект, т.е. к примеру контекст текущего документа. Напомню, что сама форма исполняется не в контексте документа, его реквизиты доступны через реквизит формы “Объект”, теперь, если этот контекст нужно передать на сервер его нужно сделать прикладным объектом с помощью функции РеквизитФормыВЗначение(). После обработки этого объекта на сервере его можно вернуть с помощью функции ЗначениеВРеквизитФормы(). Всё это выглядит примерно так:
Это текст процедуры в модуле формы документа, ФормированиеТоваров – имя общего модуля с установленным признаком “Сервер”. В процедуре СформироватьТоварВПриходе() производятся изменения и запись в элемент справочника Товары, измененный элемент помещается в строку документа.
Для закоренелого “семерочника” выглядит дико, но такая система заставляет понять распределение ролей клиента и сервера. Если вдуматься, то во всех “причудах” новой платформы просматривается логика такой организации работы, когда клиенты становятся всё тоньше и, в конечном итоге, работают через веб, отправляя всю ответственную работу по обработке данных на сервер.
Добрый вечер.
в модуле формы есть команда , она выполняется при нажатии на кнопку . вот она :
&НаКлиенте
Процедура РасчетЛистов(Команда)
//сначала уберем все листы
Для Каждого ДеталиНаЛисте Из Объект.ДеталиНаЛисте Цикл
Если ДеталиНаЛисте.ИДДетали=ВыбраннаяДетальВФормеРасчетаЛистов тогда
Для Каждого Лист Из Объект.Листы Цикл
Если Лист.ИД=ДеталиНаЛисте.ИДЛиста тогда
Объект.Листы.Удалить(Лист);
КонецЕсли;
КонецЦикла;
Объект.ДеталиНаЛисте.Удалить(ДеталиНаЛисте);
КонецЕсли;
КонецЦикла;
Об = Объект;
Тест = БЗ_ОбщийМодуль_Расчеты.ПроцедураРасчетЛистов(Об, ВыбраннаяДетальВФормеРасчетаЛистов);
КонецПроцедуры
ПроцедураРасчетЛистов это серверная функция , оформленная в общем модуле его код привожу :
&НаСервере
функция ПроцедураРасчетЛистов(Объект,ИДДетали) экспорт
Объем = ОпределитьЗначениеРеквизита(Объект,511, ИДДетали);
Доля = ОпределитьЗначениеРеквизита(Объект,550, ИДДетали );
Формат = ОпределитьЗначениеРеквизита(Объект,110, );
Скрепление = ОпределитьЗначениеРеквизита(Объект,127, );
Возврат Объем*Доля;
КонецФункции
&НаСервере
Функция ОпределитьЗначениеРеквизита(Объект, КодРеквизита, ИДОбъекта) экспорт
//определить пренадлежность реквизита з - заказ, л - лист, д - деталь
Реквизиты = Новый Запрос(
"Выбрать СВР.Пренадлежность из
| Справочник.БЗ_СвойстваРеквизитов СВР
| где СВР.код=&код ");
Реквизиты.УстановитьПараметр("код", КодРеквизита);
РезультатЗапроса = Реквизиты.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Пренадлежность = Выборка.Пренадлежность;
Если Пренадлежность="д" Тогда //если имеем дело с реквизитом детали
Для Каждого РеквизитыДетали Из Объект.РеквизитыДетали Цикл
Если РеквизитыДетали.Код = КодРеквизита и РеквизитыДетали.НомерДетали=ИДОбъекта тогда
Результат = РеквизитыДетали.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Пренадлежность="з" Тогда //если имеем дело с реквизитом заказа
Для Каждого РеквизитыЗаказа Из Объект.РеквизитыЗаказа Цикл
Если РеквизитыЗаказа.Код = КодРеквизита тогда
Результат = РеквизитыЗаказа.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Работает, но всё ли верно делаю ?
Один представитель клуба советовал все вычисления делать на серваке . самое интересное , что был совет использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в данном случае наверно в серверной «ОпределитьЗначениеРеквизита». Подозреваю, что это правильно !
Но могу ли я использовать РеквизитФормыВЗначение и ЗначениеВРеквизитФОормы в модуле ?
ругается
Цитировать
{ОбщийМодуль.БЗ_ОбщийМодуль_Расчеты.Модуль(3,6)}: Процедура или функция с указанным именем не определена (РеквизитФормыВЗначение)
Об = <<?>>РеквизитФормыВЗначение(Объект); (Проверка: Сервер)
наверно потому что в описании функции стоит «УправляемаяФорма» .
Как быть?
Пусть у нас есть есть документ ПриходнаяНакладная
с табличной частью Состав
. Для этого документа необходимо реализовать подбор номенклатур в табличную часть. Должна быть возможность переносить в документ несколько номенклатур за раз. То есть сначала пользователь подбирает номенклатуры в определенную таблицу, а затем по команде «Перенести в документ» данные из этой таблицы переносятся в табличную часть документа. При переносе в табличную часть, если номенклатура уже была добавлена ранее, нужно увеличить количество в этой строке на значение, указанное в подборе.
Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.
Без обращения к серверу
Создадим форму списка у справочника Номенклатура
не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры
(тип ТаблицаЗначений
) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа
и Ссылка
установим флаг ИспользоватьВсегда
. Чуть позже станет понятно, для чего.
Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры
элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:
&НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) // Проверка на наличие выбранной строки в динамическом списке ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; // Для групп номенклатуры подбор не производится. Именно для обращения // к свойству «ЭтоГруппа» был установлен флаг «Использовать всегда», иначе // при отсутствии колонки «Это группа» в списке вылетала бы ошибка // «Поле объекта не найдено» Если ТекущиеДанные.ЭтоГруппа Тогда Возврат; КонецЕсли; // Отключаем стандартную обработку СтандартнаяОбработка = Ложь; // Ищем товар в таблице ПодобранныеНоменклатуры. Если нет — добавляем // строку, иначе увеличиваем количество РезультатПоиска = ПодобранныеНоменклатуры.НайтиСтроки( Новый Структура("Наименование", ТекущиеДанные.Ссылка) ); Если РезультатПоиска.Количество() = 0 Тогда Строка = ПодобранныеНоменклатуры.Добавить(); Строка.Наименование = ТекущиеДанные.Ссылка; Иначе Строка = РезультатПоиска[0]; КонецЕсли; Строка.Количество = Строка.Количество + 1; КонецПроцедуры
Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная
по команде Подбор
:
&НаКлиенте Процедура Подбор(Команда) // Первый параметр — полное имя формы, третий параметр — элемент формы, // в который осуществляется подбор (владелец). Последним параметром // передается уникальный идентификатор формы. ОткрытьФорму( "Справочник.Номенклатура.Форма.ФормаПодбораИзДокумента", , Элементы.Состав, УникальныйИдентификатор ); КонецПроцедуры
Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент
:
&НаКлиенте Процедура ПеренестиКлиент(Команда) // Передаем данные выбора владельцу формы, т.е. документу ПриходнаяНакладная ОповеститьОВыборе(ПодобранныеНоменклатуры); КонецПроцедуры
Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора
элемента формы документа:
&НаКлиенте Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Заполняем таблицу документа подобранными номенклатурами Для Каждого Строка Из ВыбранноеЗначение Цикл РезультатПоиска = Объект.Состав.НайтиСтроки( Новый Структура("Номенклатура", Строка.Наименование) ); Если РезультатПоиска.Количество() = 0 Тогда НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока.Номенклатура = Строка.Наименование; Иначе НоваяСтрока = РезультатПоиска[0]; КонецЕсли; НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество; КонецЦикла; КонецПроцедуры
С обращением к серверу
Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:
&НаКлиенте Процедура ПеренестиСервер(Команда) // Помещаем подобранные номенклатуры во временное хранилище на // сервере и получаем соответствующий адрес в нем Адрес = ПодготовитьДанныеПодбора(); // Передаем владельцу формы данные выбора ОповеститьОВыборе(Адрес); КонецПроцедуры &НаСервере Функция ПодготовитьДанныеПодбора() // Выгружаем таблицу формы в таблицу значений для корректной // работы с данными на сервере ТаблицаПодобранныхНоменклатур = ПодобранныеНоменклатуры.Выгрузить(); // Помещаем во временное хранилище и возвращаем адрес. Вторым параметром // передаем уникальный идентификатор формы. После закрытия формы данные // во временном хранилище будут очищены. Адрес = ПоместитьВоВременноеХранилище( ТаблицаПодобранныхНоменклатур, УникальныйИдентификатор ); Возврат Адрес; КонецФункции
Обработчик события ОбработкаВыбора
элемента формы документа:
&НаКлиенте Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Обрабатываем выбранные номенклатуры на сервере ОбработатьВыбранноеЗначение(ВыбранноеЗначение); КонецПроцедуры &НаСервере Процедура ОбработатьВыбранноеЗначение(ВыбранноеЗначение) // Получаем таблицу подобранных номенклатур из хранилища ТаблицаПодобранныхНоменклатур = ПолучитьИзВременногоХранилища(ВыбранноеЗначение); // Заполняем таблицу документа подобранными номенклатурами Для Каждого Строка Из ТаблицаПодобранныхНоменклатур Цикл РезультатПоиска = Объект.Состав.НайтиСтроки( Новый Структура("Номенклатура", Строка.Наименование) ); Если РезультатПоиска.Количество() = 0 Тогда НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока.Номенклатура = Строка.Наименование; Иначе НоваяСтрока = РезультатПоиска[0]; КонецЕсли; НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество; КонецЦикла; КонецПроцедуры
Поиск:
1С:Предприятие • Документ • Обработка выбора • Открыть форму • Список • Справочник • Управляемая форма