Выбрать несколько справочников в реквизите в 1с

Как выбрать в элементе формы несколько элементов справочника?

Я
   worker-good

26.02.14 — 15:00

Как в реквизите, а потом и на форме можно было выбрать несколько элементов справочника «договоры контрагента» в одно поле? В реквизите поставил «СправочникСписок.ДоговорыКонтрагентов», а в поле формы поставил галочку «РежимВыбораИзСписка» — не получается!

  

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

   Рэйв

1 — 26.02.14 — 15:00

делай таб часть и не мучай мозг велосипедами

   Naumov

2 — 26.02.14 — 15:01

что значит в одно поле?

   Maxus43

3 — 26.02.14 — 15:01

только ТЧ, всё остальное будет неправильно

   Рэйв

4 — 26.02.14 — 15:02

(2)Типа

РеквизитСтрока=ЗначениеВСтрокуВнутр(СписокДоговоров)

:-)

   Fram

5 — 26.02.14 — 15:02

(0) СписокЗначений

   Maxus43

6 — 26.02.14 — 15:06

(5) как ты его в реквизите хранить то будешь?

   worker-good

7 — 26.02.14 — 15:06

(5) А как запрограммировать чтобы можно было выбирать в списке значений несколько элементов справочника?

   worker-good

8 — 26.02.14 — 15:08

(3) В реквизите указать таблица значений, а дальше как сделать выбор нескольких элементов справочника?

   Fram

9 — 26.02.14 — 15:08

(6) А тут речь за хранить вообще не было вроде

   worker-good

10 — 26.02.14 — 15:08

(6) Мне список хранить не нужно это для внешней печатной формы

   Fram

11 — 26.02.14 — 15:09

(7) а в этом смысл самого объекта

   Maxus43

12 — 26.02.14 — 15:10

(8) ТЧ = Табличная часть, а не таб значений…

(10) ну раз хранить не нужно… хм, а причем тут внешняя печ форма? у неё нет формы. Куда вводить то?

   worker-good

13 — 26.02.14 — 15:11

(12) Есть внешняя печатная форма, на ней нужно выбрать несколько элементов справочника, как это сделать?

   Fram

14 — 26.02.14 — 15:13

(13) (5)

   worker-good

15 — 26.02.14 — 15:14

(12) Нужно выбрать несколько элементов одного справочника на экранной форме, как это сделать?

   Maxus43

16 — 26.02.14 — 15:14

реквизит ФОРМЫ с типом (5), а не реквизит обработки

   Strogg

17 — 26.02.14 — 15:14

(14) + режим выбора из списка убрать

   kosts

18 — 26.02.14 — 15:17

(15) МножественныйВыбор

   worker-good

19 — 26.02.14 — 15:17

(17) А как в список значений засунуть элементы определенного справочника?

   Fram

20 — 26.02.14 — 15:20

(19) http://gyazo.com/70beea5953f9573a88cd0ec6df275bbd.png

  

worker-good

21 — 26.02.14 — 16:42

Всем спасибо, все как надо получилось))

TurboConf — расширение возможностей Конфигуратора 1С

множественный выбор из Справочника обычная форма

Автор katod, 18 июл 2017, 08:18

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте!
есть на форме поле ввода Специфика с типом СправочникСсылка.Спец2
надо, чтобы при выборе нескольких значений из этого справочника, они записывались в этом поле ввода через знак препинания
делаю так:


Процедура ПолеВводаСпецификаНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаПодбора  = Справочники.Спец2.ПолучитьФормуВыбора();
ФормаПодбора.РежимВыбора = Истина;
ФормаПодбора.ЗакрыватьПриВыборе = Истина;
ФормаПодбора.МножественныйВыбор = Истина;
ФормаПодбора.ВладелецФормы = Элемент;
ФормаПодбора.Открыть();
КонецПроцедуры

Процедура ПолеВводаСпецификаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
МассивВыбранныхЭлементов = Новый Массив;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Спец2") Тогда
МассивВыбранныхЭлементов.Добавить(ВыбранноеЗначение);
ОповеститьОВыборе(ВыбранноеЗначение);
ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
МассивВыбранныхЭлементов = ВыбранноеЗначение;
КонецЕсли;

текст = "";
Для каждого Элемент Из МассивВыбранныхЭлементов Цикл
текст = текст + "," + элемент;
КонецЦикла;
текст1 = Сред(текст, 2, СтрДлина(текст));
сообщить(текст1);
КонецПроцедуры


теперь через контрол могу выбрать несколько значений, но они не записываются в это самое поле ввода!
может не так что-то делаю? помогите разобраться.
мне надо чтобы в одном справочнике в поле ввода выбиралИСЬ несколько значений из др справочника и записывались через запятую (через знак препинания) в это самое поле ввода.
вариант для поля ввода Список Значений не предлагать!) — т.к. мне надо чтобы оно было из реквизита. т.е. я потом в регистре накопления буду учитывать данные из этого поля



А если тип значения реквизита данных поля ввода поменять на СписокЗначений, а тип списка на СправочникСсылка.Спец2?

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


вообще есть вариант, не уверен все ли поймут его

1.делаем реквизит (ЭлементыСпец2)в котором планируется хранить список каких-то элементов, тип реквизита Строка длина=0 (неогр) возможны варианты,
2.получаем массив каких-то значений, ссылок, перечислений и т.д.
3.превращаем его в строку и присваиваем реквизиту: ЭлементыСпец2 = ЗначениеВСтрокуВнутр(МассивВыбранныхЭлементов);
4.при любом обращении, их этого реквизита легко получаем обратно массив: МассивЭлементов = ЗначениеИзСтрокиВнутр(ЭлементыСпец2);

если помогло нажмите: Спасибо!


1 / 1 / 0

Регистрация: 28.01.2014

Сообщений: 226

1

Несколько ссылок в одном поле

13.02.2021, 23:20. Показов 2616. Ответов 5


Доброго времени суток

Есть справочник Номенклатура, у которого есть реквизит Товар (ссылка на справочник Товары)

Несколько ссылок в одном поле

Возможно ли в 1С, при выборе товаров, зажав CTRL, выбрать сразу несколько товаров на форме выбора справочника товары и добавить их в реквизит?



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

13.02.2021, 23:36

2

Alex7421, именно так нет

Добавлено через 53 секунды
но подключив фантазию можно реализовать все что угодно



0



1 / 1 / 0

Регистрация: 28.01.2014

Сообщений: 226

13.02.2021, 23:38

 [ТС]

3

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

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

согласен))

а есть какие-нибудь идеи?

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



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

13.02.2021, 23:47

4

что нужно, что бы решить эту задачу?

1. Как хранить в базе
2. Как отобразить на форме
3. Как реализовать выбор/удаление

Добавлено через 1 минуту
взять в учет возможные сценарии:
1. Номенклатуру удалят из базы (должна ли работать ссылочная целостность системы)
2. Потребуется ли вывести это поле в отчет

Добавлено через 4 минуты
дело в том, как отображается на форме и как храниться в базе, это разные совершенно вещи.
Не нужно связывать одно с другим

Добавлено через 1 минуту
Можно добавить табличную часть и добавлять ссылки туда, а на форме сделать список значений который будет отображать ссылки из табличной части.
Это как пример одного из решений



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,396

17.02.2021, 00:27

5

Цитата
Сообщение от Alex7421
Посмотреть сообщение

а есть какие-нибудь идеи?

1. Сделать Номенклатура не полем ввода, а табличной частью (раз уж необходимо привязать несколько номенклатур, ТЧ гораздо нагляднее)
2. Сделать форму подбора как в типовых и выбирай хоть сотню номенклатур и грузи в ТЧ



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

17.02.2021, 00:39

6

polax,



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

17.02.2021, 00:39

6

Доброго времени суток, уважаемые читатели! В этой заметке мы будем говорить о реализации механизма подборов в системе 1С:Предприятие. Подборы в основном используются в документах, но могут быть использованы в справочниках и любых других объектах. В чем заключается работа этого механизма? Давайте посмотрим.

  1. Предназначение механизма
  2. Простой вариант подбора
  3. Подборы с множественным выбором
  4. Реализация формы подбора
  5. Передача результата в вызывающую форму
  6. Передача данных табличной части в вызываемую форму

Предназначение механизма

Как обычно пользователь вводит данные в документы? Например, пользователь создает документ Реализация. Затем, чтобы добавить строку в табличную часть документа, нажимает на кнопку «Добавить». В строке табличной части выбирает элемент из справочника, либо пользуется функцией ввода по строке, вводит название и выбирает соответствующую позицию.

Такой ввод является относительно удобным, но если в документе требуется ввести сто и больше строк, то такой метод одиночного выбора является достаточно долгим. Более эффективно было бы сделать следующим образом: открыть форму справочника, затем нажать на соответствующий элемент, который автоматически добавляется в табличную часть, но форма не закрывается. В этом случае можно ввести документ с большим количеством строк. Это и называется механизмом подбора. По умолчанию в платформе его нет. Его надо будет реализовывать самостоятельно программными средствами. Но ничего сложного в этом нет.

Хочется отметить отличия в подборе версии платформы 8.2 от 8.1. В подборе версии 8.1 открывалось специальное окно, которое обычно являлось прикрепляемым, оно прикреплялось к правой части экрана главного окна приложения. Пользователь мог одновременно видеть, и документ, и подбор, и мог между ними произвольным образом переключаться.

В платформе 8.2 подобная реализация невозможна из-за изменения принципа оконного интерфейса. Здесь нет одного главного окна, в которое входят все подчиненные окна. Реализация является независимой и отображается как отдельный элемент панели задач.

Здесь применяется принцип под названием «Блокировать окно владельца». Когда будет открываться форма подбора, система не должна позволять переключаться на другие элементы. Если открыть форму справочника, то невозможно переключиться в документ, окно будет заблокировано. Но в приложение можно спокойно переключиться. Такой принцип позволяет избежать ошибочного клика на документ, который сделает окно подбора неактивным. Если такое произойдет, то в этом случае можно легко запутаться. Реализуем подобный механизм, чтобы окно владельца блокировалось.

Простой вариант подбора

Начинаем реализацию подборов и начнем от простого к сложному. Для начала реализуем простейший вариант подбора. Этот вариант будет такой. Первое, нужно, чтобы форма выбора не закрывалась. Для этого можно использовать специальный параметр управляемой формы, который называется «ЗакрыватьПриВыборе». Обратимся к Синтаксис-помощнику и найдем этот параметр управляемой формы.

Интерфейс (управляемый) -> Управляемая форма -> Параметры формы -> ЗакрыватьПриВыборе
Параметр управляемой формы ЗакрыватьПриВыборе
Описание параметра управляемой формы ЗакрыватьПриВыборе в Синтаксис-помощнике

Итак, в параметрах указывается флаг «ЗакрыватьПриВыборе, то есть мы можем при открытии формы выбора передать значение этого параметра равную ЛОЖЬ. В этом случае, в момент двойного клика, либо при нажатии ENTER система не будет закрывать форму выбора. Именно такое поведение нам нужно.

Дальше мы открываем форму с передачей этого параметра и обязательно указываем, что эта форма подчинена определенному владельцу. Она должна открыватся в таком режиме. Для чего нужен владелец? Дело в том, что нужно поймать событие двойного клика или нажатие на ENTER в исходной форме владельца и в этой форме реализовать обработчик, который называется «ОбработкаВыбора».  Давайте посмотрим, как это работает и всё станет понятно.

Итак, в форме документа создадим команду Подбор. Отразим эту команду на форме в командной панели. Здесь важно расположить кнопку в командной панели таблицы формы.

Кнопка Подбор на панели задач
Размещение команды Подбор на панели задач табличной части

Итак, в обработчике действия открываем форму и передаем в неё параметр. Конечно, можно создать структуру с названием «Параметры», но это было бы критической ошибкой. «Параметры» – это название свойства текущей управляемой формы, поэтому название изменим на «ПараметрыПодбора».

&НаКлиенте
Процедура Подбор(Команда)
	ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе", Ложь);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыПодбора, Элементы.Товары);	
КонецПроцедуры

Для того, чтобы открыть форму используем метод глобального контекста «ОткрытьФорму», где в первом параметре указано, что конкретно мы хоти открыть.

Функция глобального контекста ОткрытьФорму
Описание функции ОткрытьФорму в Синтаксис-помощники

Если нужно указать конкретную форму, то следует написать так:

Справочник.Номенклатура.Форма.ИмяФормы

Где «ИмяФормы» это название формы, которую нужно открыть. Если нужно открыть основную форму, то нужно указать имя основной формы так:

Справочник.Номенклатура.ФормаВыбора

И вторым параметром передаем параметры подбора. Третий параметр для этого метода – это Владелец, то есть какому владельцу будет подчинена данная форма.

При этом в качестве владельца может выступать форма либо какой-либо элемент формы. Разница в том, что события обработки выбора надо настраивать либо для элемента формы, либо для самой формы.

Обработчик события формы ОбработкаВыбора
Обработка выбора или подбора на форме

Этот обработчик, который называется «ОбработкаВыбора» срабатывает, когда пользователь делает двойной клик, нажимает ENTER или кнопку «Выбрать» в подчиненной форме. Более логично подчинить форму непосредственно таблице формы «Товары». Когда пользователь будет осуществлять выбор будет срабатывать обработчик.

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

Добавляем новую строку в табличную часть. Для этого обращаемся к объекту табличная часть «Товары», используя метод «Добавить». Можно заполнить и цену выбранного товара. Есть обработчик «ТоварыНоменклатураПриИзменении», который может это сделать и может возникнуть соблазн вызвать этот обработчик. Зачем что-то писать если всё уже написано, но это обернется проблемами.

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

Ошибка при попытке указать цену
{Документ.РеализацияТоваров.Форма.ФормаДокумента.Форма(54)}: Значение не является значением объектного типа (Цена)
ТД.Цена = ПолучитьЦену(ТД.Номенклатура, Объект.Дата);

Система не знает такого выражения как «Цена». Если сделать еще раз выбор и посмотреть в отладчике, что содержится в текущих данных, то можно увидеть, что значение еще не определено. То есть на самой форме нет еще ни одной строки. Мы добавили строку лишь в основной реквизит формы. Еще не произошла синхронизация, поэтому вызывать данное событие нельзя. Если нужно присвоить цену, то это нужно сделать без обработчика «ТоварыНоменклатураПриИзменении».

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

Подборы с множественным выбором

Сейчас немного усложним задачу. Ведь подбор работает только на одиночные выборы. То есть, если выделить несколько строк в форме подбора справочника и нажать на кнопку «Выбрать», то добавиться последняя выбранная строка. Каким образом можно реализовать множественный подбор? Если открыть форму выбора справочника и открыть в реквизитах свойства списка, то можно увидеть флаг «МножественныйВыбор». Именно это флаг нам и нужен.

Свойство таблицы МножественныйВыбор
Флаг для указания режима множественного выбора из списка

Здесь же, в свойствах списка есть еще такое свойство как «РежимВыделения». По умолчанию оно стоит взначении «Множественный» и пользователь может выделять много строк, но множественного выбора не происходит. Нужно установить флаг «МножественныйВыбор». Лучше это делать программно, обращаясь к элементу управления формы и к его флагу «МножественныйВыбор». Но есть одна проблема, которая связана с названием элемента управления формы. Это название нужно знать точно. Если элемент будет называться по-другому, то это вызовет ошибку. Этого можно избежать.

Если открыть Синтаксис-помощник, то можно увидеть параметры формы, если в качестве основного реквизита выбран динамический список.

Интерфейс (управляемый) -> Управляемая форма -> Расширение динамического списка -> Параметры формы

Как видно, здесь тоже есть параметр «МножественныйВыбор». Если выставить в основном реквизите данной формы этот параметр, то не нужно знать имя элемента управления формы. Поэтому при открытии формы нужно просто передать параметр «МножественныйВыбор».

&НаКлиенте
Процедура Подбор(Команда)
	ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор", Ложь, Истина);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыПодбора, Элементы.Товары);	
КонецПроцедуры

Теперь при выборе значения будет возвращаться несколько значений. Это будет тип значений «Массив». Изменим программный код в соответствии с этим пониманием:

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

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

&НаКлиенте
Процедура ДобавитьСтрокуТовары(Товар)
	Строка = Объект.Товары.Добавить();
	Строка.Номенклатура = Товар;
	Строка.Количество = 1;
	ВвестиЧисло(Строка.Количество, "Введите количество");
	Строка.Цена = ПолучитьЦену(Товар, Объект.Дата);
КонецПроцедуры

Теперь для каждой позиции будет запрашиваться количество. Вполне возможно, что это имеет смысл.

Реализация формы подбора

Был создан очень простой способ подбора, ведь в реальных прикладных решениях используется несколько иной механизм. Механизм должен решать следующие задачи:

  • Просмотр выбранных значений в текущем сеансе подбора, то есть ему нужно просмотреть что он уже сделал и произвести необходимые изменения. Может быть пользователь кликнул дважды случайно и хочет отказаться от сделанного выбора. То есть нужно предоставить возможность визуализации выбранных значений.
  • Корректировка выбранных значений, например, пользователь ввел одну строчку и потом решает, что вместо одной штуки товара нужно указать четыреста штук. У пользователя должна быть возможность корректировки строки, не закрывая подбор.

Как реализовать такой механизм подбора? Во-первых, нужно использовать специальную форму для документа. В этом случае удобно ориентироваться на месте расположения подбора. Кроме того, в этой форме мы будем размещать не только данные справочника, но еще и таблицу, которая будет отображать, сделанный пользователем выбор.

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

В таблицу добавим несколько колонок. Колонка «Номенклатура» тип данных справочник «Номенклатура». И колонка «Количество» тип данных число длина 15, точность 3.

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

После установки этого флага система будет наследовать соответствующие параметры от динамического списка для этой формы. К сожалению, после установки этого флага на форме появилось три командных панели. И две из них абсолютно одинаковые. Чтобы отключить лишние панели нужно убрать флаг «Автозаполнение» у элемента формы «Командная панель». Для номенклатуры оставим командную панель, а вот для «Таблицы» отключим, поскольку пользователи добавляет данные в таблицу двойным кликом по верхней таблицы формы.

Флаг Автозаполнение
Флаг Автозаполнение элемента формы «Командная панель»

Итак, форму настроили, теперь нужно реализовать правильное поведение формы. Для начала в списке свойств формы найдем свойство «РежимОткрытияОкна» и из выпадающего списка выберем значение «Блокировать окно владельца». Это необходимо, чтобы пользователь не потерял окно подбора, когда нечаянно кликнет за пределами формы. В этом режиме можно перейти в главное приложение, а окно владельца блокируется, то есть то окно, из которого происходил вызов. Если сравнить с модальным режимом, то в этом режиме блокируются все окна приложения.

Когда пользователь делает выбор на одном из строк таблицы «Товары», то происходит добавление этой строки в нижнюю таблицу. Посмотрим какие есть события для таблицы формы «Товары». Событие «Выбор» как раз подойдет для реализации наших планов. Оно срабатывает при двойном щелчке мыши или нажатии на ENTER. По умолчанию система при выполнении этого действия откроет элемент справочника на редактирование, но нашем случае нужно изменить стандартное поведение.

&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Строка = Таблица.Добавить();
	Строка.Номенклатура = ВыбраннаяСтрока;
	Строка.Количество = 1;
КонецПроцедуры

Чтобы проверить работу формы, нужно открыть ее из основной формы документа. Изменим немного код, который мы использовали ранее.

&НаКлиенте
Процедура Подбор(Команда)
	ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор", Ложь, Истина);
	ОткрытьФорму("Документ.РеализацияТоваров.Форма.ФормаПодбора", ПараметрыПодбора, Элементы.Товары);	
КонецПроцедуры

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

&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Для каждого Товар Из ВыбраннаяСтрока Цикл
		Строка = Таблица.Добавить();
		Строка.Номенклатура = Товар;
		Строка.Количество = 1;
	КонецЦикла;
КонецПроцедуры

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

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

Передача результата в вызывающую форму

Сейчас нужно сделать передачу выбранных значений пользователя в форму владельца. Для этого воспользуемся методом «ОповеститьОВыборе». Этот метод управляемой формы нужно вызывать в форме подбора. Нужно создать команду формы, назовём ее «Перенести» и разместим ее на форме в виде кнопке и установим флаг «КнопкаПоУмолчанию», чтобы при нажатии клавиш Ctrl+ENTER происходило нажатие на эту кнопку.

Форма подбора номенклатуры
Форма подбора с возможностью перенести данные в табличную часть документа

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

&НаКлиенте
Процедура Перенести(Команда)
	ОповеститьОВыборе(Таблица);
	Закрыть();
КонецПроцедуры

На уровне владельца нужно обработать сделанный выбор в обработчике событий «ТоварыОбработкаВыбора» и в процедуре «ДобавитьСтрокуТовары».

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

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

Передача данных табличной части в вызываемую форму

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

&НаКлиенте
Процедура Подбор(Команда)
	ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор, Таблица", Ложь, Истина, Объект.Товары);
	ОткрытьФорму("Документ.РеализацияТоваров.Форма.ФормаПодбора", ПараметрыПодбора, Элементы.Товары);	
КонецПроцедуры

Кроме того, в форме подбора напишем обработчик события «ПриСозданииНаСервере».

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Таблица.Загрузить(Параметры.Таблица.Выгрузить());
КонецПроцедуры

Еще чуточку изменим обработчик событий «ТоварыОбработкаВыбора» и процедуру «ДобавитьСтрокуТовары».

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

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

Теперь все корректно работает. Может вы увидите, что можно еще улучшить для себя в этом подборе. А результат можно посмотреть в коротком видео (33 секунды):

ПОДПИСКА

Выборка 1С – это специальный объект в 1С 8.3, который позволяет перебрать элементы справочников, документов и прочих объектов, имеющих такую возможность.

Для создания выборки справочника следует использовать методы менеджера справочника Выбрать и ВыбратьИерархически (только для справочников с иерархией), а для создания выборки документов – Выбрать.

Например, так:

Выборка = Документы.ПродажаТоваров.Выбрать();

Или, так:

Выборка = Справочники.Контрагенты.Выбрать();

Для простой выборки.

Выборка = Справочники.Регионы.ВыбратьИерархически();

Для иерархической выборки.

Поскольку выборка это объект, предназначенный для перебора элементов, то для выполнения перебора элементов следует делать обход выборки. Обход выборки осуществляется при помощи цикла.  Обход выборки осуществляется динамически, это значит, что при создании выборки не все элементы выбираются сразу из базы данных, а получение элементов происходит порциями, частями. Для обхода используется метод выборки Следующий. Этот метод возвращает Истина, когда следующий элемент выбран, и Ложь, когда достигнут конец выборки.

Обойти выборку документов можно так:

Выборка = Документы.ПродажаТоваров.Выбрать();

Пока Выборка.Следующий() Цикл 

КонецЦикла;

А справочников, соответственно так:

Выборка = Справочники.Контрагенты.Выбрать();

Пока Выборка.Следующий() Цикл 	

КонецЦикла;

В процессе обхода выборки, мы можем обращаться напрямую ко всем реквизитам того объекта, который выбран на текущей итерации.

Выборка = Справочники.Контрагенты.Выбрать();

Пока Выборка.Следующий() Цикл 

	 Сообщить("Наименование: " + Выборка.Наименование + 
			  ",ИНН: " + Выборка.ИНН +
	 		  ",КПП: " + Выборка.КПП);

КонецЦикла;	

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

Выборка 1С

Поскольку, Контрагенты иерархический справочник, то в выборке присутствуют и группы, и элементы.

Мы не можем получить выборку только элементов или групп, поэтому, чтобы вывелись только элементы, необходимо воспользоваться стандартным реквизитом справочника ЭтоГруппа, этот реквизит имеет значение Истина, когда элемент является группой, и Ложь – когда просто элемент.

Можно код выше исправить следующим образом:

Выборка = Справочники.Контрагенты.Выбрать();

Пока Выборка.Следующий() Цикл 

	Если Выборка.ЭтоГруппа Тогда 
		Продолжить;
	КонецЕсли;	

	Сообщить("Наименование: " + Выборка.Наименование + 
	",ИНН: " + Выборка.ИНН +
	",КПП: " + Выборка.КПП);

КонецЦикла;	

Тогда выведутся только элементы.   

Выборка 1С

У метода менеджера справочника Выбрать существует четыре необязательных параметра.

Выбрать(<Родитель>,<Владелец>,<Отбор>,<Порядок>)

Первый параметр позволяют формировать выборку элементов с указанным родителем, а второй с указанным владельцем. Третий параметр имеет тип Структура и позволяет отбирать элементы по определённому условию.

Например, у справочника Контрагенты имеется реквизит ТипКонтрагента, который имеет тип ссылка на перечисление ТипыКонтрагентов.

Выборка 1С

У этого перечисления два значения Покупатель и Поставщик. Если требуется, чтобы выборка выше выводила только покупателей, то следует создать структуру с единственным ключом, название которого должно совпадать с названием реквизит справочника, а в значение структуры указать нужное значение  перечисления.

Отбор = Новый Структура("ТипКонтрагента",Перечисления.ТипыКонтрагентов.Покупатель);	
	
Выборка = Справочники.Контрагенты.Выбрать(,,Отбор);

Пока Выборка.Следующий() Цикл 
	
	Сообщить("Наименование: " + Выборка.Наименование + 
	",ИНН: " + Выборка.ИНН +
	",КПП: " + Выборка.КПП);
	
КонецЦикла;	

В этом случае будут отобраны только контрагенты-покупатели.

Выборка 1С

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

Также, имейте в виду, что отбор можно производить только по стандартным реквизитам Наименование, Код, а также по тем реквизитам, у которых в  свойстве Индексировать установлено значение Индексировать или Индексировать с доп. Упорядочиванием.

Иерархическая выборка справочников 1С

По мимо обычной выборки справочников при помощи метода менеджера справочника Выбрать, можно производить иерархическую выборку при помощи метода ВыбратьИерархически. Чем отличается простая выборка справочника от иерархической? Разберем простой пример. Выведем в таблицу значений на форме элементы и группы справочника номенклатуры обычной выборкой, а потом иерархической.

Таблица значений 1С

Для обычной выборки будет следующий код:

Выборка = Справочники.Номенклатура.Выбрать();

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

И следующий результат:

Выборка 1С

Все элементы и группы вывелись как попало, при следующей структуре справочника:

Справочник 1С

А теперь посмотрим, как будут выведены группы и элементы при иерархической выборке.

Выборка = Справочники.Номенклатура.ВыбратьИерархически();

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

Получится следующий результат:

Выборка 1С

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

А если мы воспользуемся методом выборки справочников УровеньВВыборке, то сможем увидеть порядок вложенности.

Выборка = Справочники.Номенклатура.ВыбратьИерархически();

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

Будет следующий результат:

Выборка 1С

Где 0 – самый высший уровень (элемент или группа не входят ни в какие группы), 1 – следующий уровень (элемент или группа входят в группу высшего уровня) и т.д.

При иерархической выборке также можно сделать отбор, но будут выбраны только элементы верхнего уровня, поскольку группы отобраны не будут (у них этот реквизит не заполнен), а если группы не отобраны, то и элементы других уровней тоже не будут выбраны, даже если они подходят по условию.

Метод ПолучитьОбъект выборки

Выборка возвращает только ссылку на объект, сам объект мы изменять не можем. Мы можем обратиться к экземпляру объекта отобранной выборкой ссылкой, если воспользуемся методом ПолучитьОбъект().

Например, в этом коде пытаемся всем элементам справочника Номенклатура с видом Товары, обнулить этот вид, присвоив пустую ссылку перечисления.

Выборка = Справочники.Номенклатура.Выбрать(,,Отбор);

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

Для записи элемента использовалась попытка.

Читайте также по теме:

Объект в 1С

Ссылка в 1С

Метаданные 1С

Документы в 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301

Подписывайтесь на мой канал в телеграмме: https://t.me/Programming1CNizamutdinov

И вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Здравствуйте

Добавляю реквизит «базовые машины» в справочник. Тип реквизита — справочник Марки машин. Но к сожалению, в итоге пользователь может выбрать в этом поле только одно значение, пример: Базовые машины: УАЗ-1254.

Как сделать, чтобы пользователь мог выбрать несколько значений из справочника в одном поле. Пример:
Базовые машины: УАЗ-1254, ГАЗ-51


  • Вопрос задан

    более трёх лет назад

  • 4093 просмотра

Список транспорт с помощью реквизита справочника сделать нельзя. В реквизите может быть одно значение (вариант с хранилищем значений не рассматриваем, как не рекомендуемый методологами из 1С).

Вам нужно для вашего справочника сделать табличную часть «Базовые машины» с реквизитом «Машина» типа СправочникСсылка.МаркиМашин. Далее если вы хотите на форме видеть данные полем ввода, а не табличкой, то вам (как уже подсказывает Константин Нагибович ) нужно на форму элемента справочника добавить реквизит с типом СписокЗначений и значениями типа СправочникСсылка.МаркиМашин. Далее при создании/открытии формы с табличной части переносите в этот элемент. На сам элемент навешиваете обработчик ПриИзменении(), в котором устанавливаете флаг Модифицированность. А в обработчике формы ПередЗаписью() копируете содержимое из вашего списка в табличную часть.

P.S. Сделать это можно быстрее чем я тут печатал :)

Тип реквизита — список значений. Дальше сами.

Пригласить эксперта


  • Показать ещё
    Загружается…

24 мар. 2023, в 01:16

500 руб./за проект

24 мар. 2023, в 01:12

1000 руб./за проект

24 мар. 2023, в 00:28

2000 руб./за проект

Минуточку внимания

Стояла задача найти Конрагента в справочнике по ИНН и КПП (кто знает, что такое обособленное подразделение, поймет). Логика проста — найти по ИНН, сверить КПП, если нет добавить.

Найдено=Справочники.Контрагенты.НайтиПоРеквезиту(«ИНН»,ИскомыйИНН);
Если Найден=Справочники.Контрагенты.ПустаяСсылка() Тогда

//СОЗДАТЬ КОНТРАГЕНТА
Иначе
Если Найдено.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
Иначе
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
КонецЕсли;

И тут фэйл, мои дорогие, если в справочнике существует и филиал и ГО, то он кого-то по-любому не найдет. А все кроется в:

Возвращаемое
значение:

Тип: СправочникСсылка.
Ссылка на найденный элемент справочника. Если не существует ни одного
элемента с требуемым значением реквизита, то будет возвращена пустая ссылка.  

Если найдено более одного, функция вернет только первое вхождение…неприятно, однако…

Пошел искать другие пути и набрел на два варианта:
Выборка()

ПараметрПоискаИННОтбор=Новый Структура;ПараметрПоискаИННОтбор.Вставить(«ИНН»,ИскомыйИНН);
Выборка=справочники.контрагенты.Выбрать(,,ПараметрПоискаИННОтбор);
Пока Выборка.Следующий() Цикл
КППНайден=Ложь; 
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина; 
Прервать;
//Мне дальше не нужно    
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда   
 //СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
И второй
Новый Запрос
ЗапросПоискИНН=Новый Запрос(«ЗапросПоискИНН»);ЗапросПоискИНН.Текст=«ВЫБРАТЬ
        |Контрагенты.Ссылка
        |ИЗ
        |Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |Контрагенты.ИНН = &ИНН»;
ЗапросПоискИНН.Параметры.Вставить(«ИНН»,ИскомыйКПП);
Выборка=ЗапросПоискИНН.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл     
КППНайден=Ложь;    
Если Выборка.КПП=ИскомыйКПП Тогда     
Сообщить(«Найден филиал контрагента»);     
КППНайден=Истина;     
Прервать;
//Мне дальше не нужно    
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда   
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
В Запросе можно добавить еще один параметр, чего не сделаешь в Выборке.
Но, у обоих вариантов есть минус, а именно:
Если Выборка.Следующий()=Справочники.Контрагенты.ПустаяСсылка() Тогда
//ЧЕГО ТО ТАМ;
КонецЕсли;
А дальше цикл ПокаЦикл. Блок «если», в этом случае, съест первую итерацию, и потом может кого-то обломать.

Короче, вся эта фигня к тому, что не надо использовать Выборка.Следующий() как условие, можно проверить по Выборка.Количество() или Выборка.Пустой().

Понравилась статья? Поделить с друзьями:
  • Где находится трубная металлургическая компания
  • Вывоз мусора одинцовский район рузская компания
  • Где находятся все реквизиты соломона онлайн гта
  • Выгодно ли заниматься тепличным бизнесом в селе
  • Где находятся реквизиты в тинькофф в приложении