1С: Копирование данных из Динамического списка в Таблицу значений с помощью двойного клика или перетаскивания

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

К примеру имеем иерархический Справочник «Номенклатура» и периодический Регистр сведений «ЦеныНоменклатуры» и необходимо из Динамического списка, содержащий данные по номенклатуре с ценами, перенести в таблицу значений выбранную номенклатуру вместе с ценами.

Исходные данные для примера

  1. Иерархический справочник Номенклатура. Без дополнительных реквизитов.
  2. Регистр сведений ЦеныНоменклатуры.
    • Измерение: Номенклатура
    • Ресурс: Цена.
    • Разрешить итоги СрезПоследних = Истина (для ускорения получения данных по ценам).
    • Периодичность: День.
    • Независимый от регистратора, т.е. ввод данных вручную.
  3. Справочник и регистр заполняется первоначальными данными.

Решение задачи

Создаю обработку (её проще запускать из пустой конфигурации) и в ней основную форму. Добавляются реквизиты формы:

  1. Отобранная номенклатура с типом Таблица значений со следующими колонками реквизита:
    • Номенклатура со ссылкой на справочник Номенклатура
    • Цена — Тип Число
    • Количество — Тип Число
    • Сумма — Тип Число
  2. Номенклатура с типом Динамический список, где с помощью произвольного запроса будем получать данные

Далее необходимо выставить Основную таблицу и Динамическое считывание данных:

Что бы дальше лишний раз не обращаться к базе данных при переносе номенклатуры, раскрываем реквизит динамического списка и напротив ЭтоГруппа ставится галочка — Использовать всегда

Оба реквизита переносятся на форму и приступаем к написанию кода.

Первым делом делается перенос данных по двойному клику или по клавиши Enter. Для этого у Элемента формы Динамического списка создаём процедуру на клиенте для события Выбор.

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

И так как одна и та же процедура ДобавлениеОтобраннойНоменклатуры(ВыбранныеДанные) сначала вызывается с клиента, а дальше будет вызываться с сервера, то и сразу эту процедуру пишем с директивой &НаСервере

С копированием Номенклатуры по двойному клику разобрались, теперь делаем перетаскивание. Для этого у элемента формы Динамического списка ставим галочку «Разрешить начало перетаскивания» и снять галочку «Разрешить перетаскивание». А у элемента формы Таблицы значений делаем наоборот — снимаем галочку у «Разрешить начало перетаскивания» и ставим галочку «Разрешить перетаскивание».

Т.е. таким образом мы показываем, что является источником данных, а что является приёмником данных.

Далее для события Перетаскивание элемента формы Таблицы значений пишем следующую процедуру:

Делается запрос к Базе данных, исключая запросы в цикле.

И вот из-за того, что процедура ЗапросНоменклатуры должен выполняться на сервере, а с сервера вызвать клиент нельзя, процедура ДобавлениеОтобраннойНоменклатуры делается так же на сервере, о чем я выше писал.

Готово.

В ближайших публикациях разовью данную тему и сделаю перенос «Отобранной номенклатуры» в документ.