HelpF.pro

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

В данной статье рассматривается технология реализации подбора на платформе 1С 8.2. Статья не претендует на академизм, просто столкнувшись с рядом проблем и не нашедшим «правильной» методологии решения (возможно плохо искал), решил пройти этот путь самостоятельно, естественно пользуясь различными источниками. В основном я опираюсь на материалы мастер-групп Базового курса «Профессиональное программирование в 1С» Евгения Гилева и Насипова Фарита, участником которого я являюсь, а также соответствующей литературы (М.Г. Радченко, Е.Ю. Хрусталева Практическое пособие разработчика).

Итак, предметная область: компания занимается оптовой торговлей товарами имеющими срок годности, который относится к серии, а та в свою очередь принадлежит конкретному товару. Товары поступают на разные склады. Задача: реализовать удобное заполнение табличной части расходного документа. Решение: необходимо реализовать форму подбора, обеспечивающею просмотр остатков товара по срокам годности, возможность выбора соответствующих позиций и последующий перенос в табличную часть документа. Задачи такого плана встречаются в 5 части сборника задач к подготовке экзамена по Специалисту.

Реализация. Создаем форму произвольного типа для документа Продажа товаров. Можно конечно создать общую форму, но в данной ситуации выбираем то, что поближе. На форме создаем реквизиты:
Склад - тип СправочникиСсылка.Склады
Товары - Динамический список, в свойствах ставим галочку произвольный запрос.
Выбор - таблица значений (колонки Товар, Серия - тип ссылки на соответствующие справочники, срок годности, количество - дата, число).

Настраиваем запрос для реквизита Товары. Здесь по идее все просто с помощью конструктора берем два справочника и виртуальную таблицу Остатков регистра Остатки товара. Если нужно видеть весь товар, то используем левое соединение Товаров с остальными источниками, если только с остатками, то полное соединение с регистром:
Код 1C v 8.2 УП
 ВЫБРАТЬ

Товары.Ссылка КАК Товар,

Серии.Ссылка КАК Серия,

Серии.СрокГодности,

ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК Количество

ИЗ

Справочник.Товары КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Серии КАК Серии

ПО (Серии.Владелец.Ссылка = Товары.Ссылка)

ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(, Склад = &Склад) КАК ТоварыНаСкладеОстатки

ПО (ТоварыНаСкладеОстатки.Товар = Товары.Ссылка)

УПОРЯДОЧИТЬ ПО

Товар,

СрокГодности

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

И так, возвращаемся в нормальное русло решение задачи.

В разработанной форме я добавил параметр Склад с целью отбора остатков.

Для того чтобы открыть созданную форму подбора, в управляемой форме документы Продажа товара создаем команду подбор, размещаем на форме о генерируем обработчик, в котором нам необходимо открыть форму. Так как форма должна обеспечивать множественный выбор и отбор по складу, то создаем структуру параметров формы. И открываем форму соответствующей командой.
Код 1C v 8.2 УП
 
&НаКлиенте

Процедура Подбор(Команда)

ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор, Склад", Ложь, Истина, Объект.Склад);

ОткрытьФорму("Документ.ПродажаТоваров.Форма.ФормаПодбора", ПараметрыПодбора, Элементы.Товары);

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

Соответственно в форме подбора при создании заполняем параметр запроса склад из параметров формы:
Код 1C v 8.2 УП
 &НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Товары.Параметры.УстановитьЗначениеПараметра("Склад",Параметры.Склад);

Склад = Параметры.Склад;

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

Теперь необходимо реализовать функционал формы подбора. При выборе соответствующей строки она должна переносится в таблицу значений, так же должен работать механизм перетаскивания. Для решения первой задачи необходимо создать обработчик события Выбор нашего динамического списка.
Код 1C v 8.2 УП
 &НаКлиенте

Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Для каждого НомерСтроки Из ВыбраннаяСтрока Цикл

ТекСтрока = Элемент.ДанныеСтроки(НомерСтроки);

Поиск = Новый Структура("Товар, Серия",ТекСтрока.Товар,ТекСтрока.Серия);

МассивСтрок = ВыбранныеТовары.НайтиСтроки(Поиск);

Если МассивСтрок.Количество() = 0 Тогда

Строка = ВыбранныеТовары.Добавить();

Строка.Товар = ТекСтрока.Товар;

Строка.Серия = ТекСтрока.Серия;

Строка.СрокГодности = ТекСтрока.СрокГодности;

Строка.Количество = 1;

ВвестиЧисло(Строка.Количество, "Введите количество");

Пока Строка.Количество > ТекСтрока.Количество Цикл

ВвестиЧисло(Строка.Количество, "Введите верное количество!");

КонецЦикла;

КонецЕсли;

КонецЦикла;

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

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

Для реализации перетаскивания необходимо проверить настройку следующих параметров: Для таблицы Товары - РазрешитьНачалоПеретаскивания, для Выбранные товары - РазрешитьПеретаскивание.

Так же необходимо создать обработчик события Перетаскивание для элемента формы ВыбранныеТовары.
Код 1C v 8.2 УП
 &НаКлиенте

Процедура ВыбранныеТоварыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)

Для каждого НомерСтроки Из ПараметрыПеретаскивания.Значение Цикл

ТекСтрока = Элементы.Товары.ДанныеСтроки(НомерСтроки);

Поиск = Новый Структура("Товар, Серия",ТекСтрока.Товар,ТекСтрока.Серия);

МассивСтрок = ВыбранныеТовары.НайтиСтроки(Поиск);

Если МассивСтрок.Количество() = 0 Тогда

Строка = ВыбранныеТовары.Добавить();

Строка.Товар = ТекСтрока.Товар;

Строка.Серия = ТекСтрока.Серия;

Строка.СрокГодности = ТекСтрока.СрокГодности;

Строка.Количество = 1;

ВвестиЧисло(Строка.Количество, "Введите количество");

Пока Строка.Количество > ТекСтрока.Количество Цикл

ВвестиЧисло(Строка.Количество, "Введите верное количество!");

КонецЦикла;

КонецЕсли;

КонецЦикла;

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

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

На рисунке приведен внешний вид формы подбора:
title

Для завершения подбора создана команда формы, с обработчиком, выполняющим оповещение о выборе:
Код 1C v 8.2 УП
 &НаКлиенте

Процедура Перенести(Команда)

ОповеститьОВыборе(ВыбранныеТовары);

Закрыть();

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

Соответственно, в форме документа реализован обработчик события ОбработкаВыбора:
Код 1C v 8.2 УП
 &НаКлиенте

Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

Если ВыбранноеЗначение.Количество() > 0 И Объект.Товары.Количество() > 0 Тогда

Режим = РежимДиалогаВопрос.ДаНет;

Текст = "Очистить табличную часть?";

Ответ = Вопрос(Текст, Режим, 0);

Если Ответ = КодВозвратаДиалога.Да Тогда

Объект.Товары.Очистить();

КонецЕсли;

КонецЕсли;

Для каждого Подбор Из ВыбранноеЗначение Цикл

Строка = Объект.Товары.Добавить();

Строка.Товар = Подбор.Товар;

Строка.Серия = Подбор.Серия;

Строка.Количество = Подбор.Количество;

КонецЦикла;

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


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

В целом хочется еще раз подчеркнуть, что целью данной статьи не является проповедование истины, а просто поделится полученной информацией. Буду благодарен за конструктивные советы и рекомендации, так как тема управляемых форм достаточно новая, но похоже надолго, и ряд вопросов (особенности работы с произвольными запросами) требует дополнительной информации.
Автор: User67
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/870.html