Реализация подбора на основе управляемых форм 1С 8.2

Программирование - Практика программирования

В статье излагается практический опыт реализации формы подбора для заполнения табличной части документа на основе управляемых форм. Реализован произвольный динамический запрос и поддержка механизмов Drag&Drop. Это просто опыт для обсуждения, а не инструкция делай так.

Реализация подбор на основе управляемых форм 1С 8.2

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

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

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

Склад - тип СправочникиСсылка.Склады

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

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

Настраиваем запрос для реквизита Товары. Здесь по идее все просто с помощью конструктора берем два справочника и виртуальную таблицу Остатков регистра Остатки товара. Если нужно видеть весь товар, то используем левое соединение Товаров с остальными источниками, если только с остатками, то полное соединение с регистром:

ВЫБРАТЬ
               Товары.Ссылка КАК Товар,
               Серии.Ссылка КАК Серия,
               Серии.СрокГодности,
               ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК Количество
ИЗ
               Справочник.Товары КАК Товары
                               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Серии КАК Серии
                               ПО (Серии.Владелец.Ссылка = Товары.Ссылка)
                               ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(, Склад = &Склад) КАК ТоварыНаСкладеОстатки
                               ПО (ТоварыНаСкладеОстатки.Товар = Товары.Ссылка)
УПОРЯДОЧИТЬ ПО
               Товар,
               СрокГодности

 

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

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

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

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

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

 

Соответственно в форме подбора при создании заполняем параметр запроса склад из параметров формы:

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

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

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

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

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

Так же необходимо создать обработчик события Перетаскивание для элемента формы ВыбранныеТовары.

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

 

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

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

 

Для завершения подбора создана команда формы, с обработчиком, выполняющим оповещение о выборе:

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

Соответственно, в форме документа реализован обработчик события ОбработкаВыбора:

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

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

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

 

 

 

 

 

 

Скачать файлы

Наименование Файл Версия Размер
Конфигурация
.dt 39,35Kb
10.09.10
288
.dt 39,35Kb 288 Скачать

См. также

Комментарии
1. Игорь Исхаков (Ish_2) 976 10.09.10 09:15 Сейчас в теме
По-моему , отличный "первый блин" !
2. Алексей Константинов (alexk-is) 6134 10.09.10 10:04 Сейчас в теме
(0) Программный код в публикации можно раскрасить получше
3. Андрей Д. (detec) 128 10.09.10 11:58 Сейчас в теме
Неплохо. А если усложнить задачу?

Допустим, я хочу вводить кол-во продаваемого товара прямо в форме подбора, да так чтобы при окончании ввода проверялось, есть ли данное кол-во на остатке не в форме, а на складе (в конторе несколько менеджеров независимо выбивают документы для разных клиентов)?

А ещё хорошо бы показать цены согласно договора клиента, а не просто ТЗ с количеством.

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

Автор возьмётся за разработку такой (хотя бы примерно такой) демобазы?

Боюсь, что в управляемом приложении интенсивная работа нескольких операторов возможна лишь в пределах локальной сети ((
4. Юрий Комиссаров (User67) 38 10.09.10 18:57 Сейчас в теме
(2) Спасибо, постараюсь учесть.
5. Юрий Комиссаров (User67) 38 10.09.10 19:03 Сейчас в теме
(3) Все реально, цены подцепляются запросом. Причем можно сделать так, чтобы при выборе менеджером какого то товара, он сразу бы резервировался (не в момент проведения документа) и только после этого добавлялся в выбранное. На счет разработки - почему бы нет. Укажите как лучше организовать взаимодействие и может поможем друг другу.
6. Андрей Д. (detec) 128 10.09.10 20:45 Сейчас в теме
(5) ;) У меня пока подобной реальной задачи на управляемых формах нет, это я пытаюсь смотивировать вас на углубление функционала. У меня есть опыт реализации подобной задачи для нетленки на 8.1. Правда, в промэксплуатацию функционал так и не пошёл, но примерно судить о трудности каждой фичи я могу.

Наиболее сложный момент, по-нормальному не поддерживаемый платформой - это ввод значений в списке. Работал я как пользователь на дельфийном клиенте, с каким-то компонентом. Там поиск и фильтрация осуществлялись не только по строковому представлению поля, но и по числовым выражениям для полей соответствующего типа. Плюс ввод в определённых ячейках делал апдейты по базе. Мне это очень запомнилось, и я таки реализовал подобное в динамически заполняемом колонками табличном поле. Интересно было бы посмотреть, сможет ли кто-то сделать красивое решение на управляемых формах, чтобы с этим можно было бы работать нормально по wi-fi, для начала.
7. Юрий Комиссаров (User67) 38 10.09.10 22:05 Сейчас в теме
(6) Если не сложно более подробно распишите требуемый функционал (мини ТЗ :) ). Можно на почту User67 dog myrambler.ru. Попробую реализовать
8. Сергей (seermak) 657 19.09.10 09:25 Сейчас в теме
вот как у меня организовано рабочее место продавца - 1 форму подбора удобнее организовать в справочнике Товаров а не в документе. 2 При перемещении товара в таблицу отбора - проверяется на остаток товара - более не внесешь.3 Возможность подбора товара по штрихкоду или по полнотекстовому поиску 4.Переносить в таблицу отбора можно и перетаскиванием товара и щелчком мыши.
Прикрепленные файлы:
User67; alex_4x; +2 Ответить
9. Павел Павел (PavelGP) 19.09.10 11:49 Сейчас в теме
Для seermak! Очень интересный подход к подбору, подобное хочу организовать у себя может поделитесь наработкой.
10. Allexey (alex_4x) 72 22.09.10 12:06 Сейчас в теме
Seermak - Здоровский интерфейс. Очень удобно я думаю.
11. Дмитрий (D) 12.07.11 04:06 Сейчас в теме
Огромное спасибо. Очень помогло, бился 5-ть часов с этим подбором. А тут все как на ладони.
12. Василий Ветров (404vrn) 05.12.11 09:06 Сейчас в теме
Было бы неплохо, если бы еще и характеристики товара с остатками по складам показывались из подбора. А так все норм работает, спасибо за пример!
13. Александр Котов (TrueGadich) 28.03.13 12:49 Сейчас в теме
Присоединяюсь к 404vrn с отображением остатков по складам.
Оставьте свое сообщение