Загрузка массива значений в стандартную форму "Редактирование списка значений" из табличного документа



Обработка позволяет подбирать большое количество элементов справочника или документов в Список значений по коду или наименованию для справочников и по дате и номеру, дате и периоду, по представлению для документов. Может пригодиться при заполнении отборов в отчетах, табличных частях, списках документов или справочников
Иногда бывает необходимо построить совершенно разные отчеты с отбором по некоторому перечню, например, продажи по некоторому списку контрагентов или номенклатуры, дебиторку по некоторому списку реализаций, или же запустить Групповую обработку справочников и документов по некоторому заранее составленному списку. 
Думаю, нет смысла обсуждать выгоду от автоматического подбора в отбор длинных списков — это очевидно.
 
Данная задача не решается без модификации конфигурации.
 
Варианты решения:
1) модифицировать код форм каждого из отчетов, внедряя несколько строк, которые заменяют для каждого из элементов на форме стандартную обработку редактирования списка на свою (как это сделано у e.kogan)
2) модифицировать формы выбора объектов, внедряя несколько строк, которые добавляют на форму кнопку, позволяющую «оповещать о выборе» стандартную обработку редактирования списка (как это сделано здесь).
 
Мне больше нравится второй подход, т.к. своих отчетов может быть наделано много, и еще есть стандартные отчеты (остатки товаров на складах, оборотно-сальдовая), в которые не очень хочется лезть. Зато с объектами, которые нужно подбирать, всё несколько проще — 3-5 документов и 3-5 справочников. Вдобавок форму выбора в типовых редко меняют и при обновлении сильно не мешает.
Но, при желании, подходы можно комбинировать. Например, в Универсальной обработке справочников и документов я также и первый подход реализовал.
 
Если сравнивать сами обработки по функционалу, то вышеупомянутая обработка более универсальная. В текущей обработке зато есть загрузка по дате и периоду и по представлению, что на практике встречается часто. Также из плюшек — для каждого документа или справочника запоминается последний выбранный режим.
 
Хитрости
Одна из проблем, которую удалось решить для универсальности модификаций форм выбора: найти основной реквизит формы выбора и определить его тип. Тема поднималась на ИнфоСтарте, но решалась она довольно злобным кодом, поэтому решил, не мудрствуя лукаво, использовать то, что в формах выбора справочников (документов) в 99% случаев основной реквизит называется «СправочникСписок» («ДокументСписок»), т.к. так его именует конструктор.
 
А уже тип (имя типа) определяется через отбор по ссылке
ФормаВыбора[«СправочникСписок»].ТекСписок.Отбор.Ссылка.Значение.Метаданные().Имя
или так (если в отборе уже был список)
ФормаВыбора[«СправочникСписок»].ТекСписок.Отбор.Ссылка.Значение[0].Метаданные().Имя
 
Стандартную форму «Редактирование списка значений» заполняем оповещением:

Для каждого СтрокаПодбора Из ТаблицаПодбора Цикл
    ФормаВыбора.ОповеститьОВыборе(СтрокаПодбора.Ссылка);
КонецЦикла;

 
И еще на последок: как-то понадобилось отобрать в форме списка документов по произвольному отбору. Решение нашлось такое: включаем доступность отбора по ссылке в форме списка:
 
Процедура ПриОткрытии()
   ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Истина;
КонецПроцедуры
 
и пользуемся этой обработкой.
 
Внедрение
Внедрение описано в макете README.
 
Если вкратце, то необходимо в процедуру «ПриОткрытии» формы выбора добавить код, который рисует кнопку на командной панели:
 
     ЭлементыФормы.ДействияФормы.Кнопки.Добавить(«ПодобратьСписком», ТипКнопкиКоманднойПанели.Действие, «Подобрать списком», Новый Действие(«ДействияФормыПодобратьСписком»));
 
А также в модуль формы добавить саму процедуру-обработчик нажатия кнопки.
Процедура ДействияФормыПодобратьСписком(Кнопка)
     
     МнПодбор = Обработки.МножественныйПодбор.Создать();
     Если МнПодбор.Инициализировать(ЭтаФорма) Тогда
          //успех
          МнПодбор.Подобрать(ЭтаФорма)
     КонецЕсли;
     
КонецПроцедуры
 
  
Замечания и отзывы приветствуются!
 
Обновления
05.12.2013 — добавлен подбор по документам (в том числе — по представлениям); добавлена версия для 8.1; обновлена статья

13 Comments

  1. cool.vlad4

    щас придет yashazz или e.kogan (не поню у кого из них точно была подобная публикация) и скажут уже было, не удивил.

    Reply ↓
  2. Yasen

    Я не знаю, было ли, но плюс поставил

    Михаил, если я правильно понял изначальную задачу — надо формировать отчеты с отбором по данным табличной части документа.

    Посмотрите мою давнюю разработку УПП: вызов универсального отчета из любого документа

    Я вызывал «Универсальный отчет» и заполнял его теми настройками которыми удавалось заполнить. Было удобно для контроля движений документа не в форме списка регистра, а непосредственно в отчете.

    Если удастся скрестить эти два механизма — мой вызов из документа и Ваш подбор значений в список — честь Вам и хвала )

    Reply ↓
  3. mikhailv

    (1) cool.vlad4, я согласен, это похоже на разработку e-kogan-а, однако у моей есть одно преимущество: обработка работает с ЛЮБЫМИ отчетами, при этом сами отчеты НЕ НУЖНО модифицировать, как у него. Вместо этого, модифицировать нужно формы выбора, что, на мой взгляд, немного проще, чем залезать в каждый отчет (обычно, справочники, которые нужно так подбирать, исчисляются единицами, а отчеты — десятками). Тем более, в типовые отчеты… Однако, это конечно, же, не панацея для не снятых с поддержки конфигураций.

    (2) Yasen, нет, цель была в том, чтобы отфильтровать в отчете по некоторому большому списку. Напр., имеется произвольный список номенклатуры, которая понравилась директору, и по ней хочется построить отчет. ИЛИ, хотим проставить некоторое свойство/категорию у объекта по некоторому опять же списку: берём групповую обработку справочников и документов, отбор «ссылка в списке» и загружаем список.

    А чего, собственно, не хватает в Вашей обработке? Вроде бы она самодостаточна?

    Reply ↓
  4. cool.vlad4

    (3) понятно….только поправка — у неё

    Reply ↓
  5. Yasen
    Miffka пишет:

    А чего, собственно, не хватает в Вашей обработке?

    Она работает только с универсальным отчетом. Не с СКД.

    Reply ↓
  6. mikhailv

    (5) Yasen, на самом деле тут два аспекта.

    Первый: если требуется заполнять универсальный отчет/скд для контроля движений по документу, ИМХО по ТЧ фильтровать нет большого смысла. Если, конечно, пользователь (чисто гипотетически) захочет посмотреть продажи по номенклатуре, которая у него есть в документе.

    И второй — программное заполнение отбора по списку, в т.ч. в СКД, — это немного другая задача, достаточно лёгкая при этом: создаём список значений и в отборы его. Если загвоздка в том, как создать отбор в СКД — могу озвучить.

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

    Reply ↓
  7. Yasen
    Miffka пишет:

    ИМХО по ТЧ фильтровать нет большого смысла

    Бывает нужно. К примеру, моя обработка родилась в результате многочисленных выверок себестоимости в УПП.

    То есть возник вопрос по какому-то из производственных документов. И тогда очень удобно открыть отчет с уже заполненными заказами, номенклатурными группами и характеристиками, а дальше уже с помощью отчета анализировать — что же там случилось.

    Но судя по количеству скачиваний данной обработки, эта моя идея не очень востребована 🙂

    Reply ↓
  8. rumik007

    Спасибо за обработку!!! Тока вот написано под 8.1, а лежит под 8.2, пришло переделать на 8.1

    Reply ↓
  9. mikhailv

    (8) rumik007, спасибо и вам.

    Ставя галочку 8.1, честно говоря, думал о «не-управляемой» форме обработки:) Когда залью более свежую версию — галочку сниму, наверное, т.к. в планах нет поддержки 8.1: все базы на 8.2 или в режиме совместимости.

    Reply ↓
  10. rumik007

    (9)

    Я под 8.1 немного чуть-чуть времени потратил и перекинул, и все пошло на ура!!! Так ято еще раз спасибо за идею. Как раз понадобилось отбора по сто и более позиций выбирать.

    Reply ↓
  11. user199589

    Очень удобно. Когда подкоплю денег, скачаю)

    Reply ↓
  12. tdrinkam1

    А если нужно более узкое и часто встречающееся применение — заполнить поле списка номенклатуры через форму «Редактирования списка значений» по товарам и услугам, содержащимся в товарном документе (Счета, Заказы покупателя, поставщика, Реализации, Поступления товаров)? чтобы список грузился по содержимому указанного документа(ов)? Сможете такое реализовать?

    Reply ↓
  13. mikhailv

    (12) Марат, добрый день! Если не переписывать обработку, Ваша задача решается так:

    1) в документе делаете отображение кода

    2) делаете «Вывести список», выбираете только колонку «Код»

    3) копируете выведенный табличный документ

    4) доходите до загрузки списка и вставляете скопированный табличный документ, выбираете загрузку по коду

    Если этот путь слишком длинный для Вас, то смогу реализовать сразу кнопку «Заполнить из ТЧ документа». Пишите в ЛС, если требуется. Готов обсудить.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *