gifts2017

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

Опубликовал Юрий Комиссаров (User67) в раздел Программирование - Практика программирования

В статье излагается практический опыт реализации формы подбора для заполнения табличной части документа на основе управляемых форм. Реализован произвольный динамический запрос и поддержка механизмов 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
277
.dt 39,35Kb 277 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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

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

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

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

Наиболее сложный момент, по-нормальному не поддерживаемый платформой - это ввод значений в списке. Работал я как пользователь на дельфийном клиенте, с каким-то компонентом. Там поиск и фильтрация осуществлялись не только по строковому представлению поля, но и по числовым выражениям для полей соответствующего типа. Плюс ввод в определённых ячейках делал апдейты по базе. Мне это очень запомнилось, и я таки реализовал подобное в динамически заполняемом колонками табличном поле. Интересно было бы посмотреть, сможет ли кто-то сделать красивое решение на управляемых формах, чтобы с этим можно было бы работать нормально по wi-fi, для начала.
7. Юрий Комиссаров (User67) 10.09.10 22:05
(6) Если не сложно более подробно распишите требуемый функционал (мини ТЗ :) ). Можно на почту User67 dog myrambler.ru. Попробую реализовать
8. Сергей (seermak) 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) 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 с отображением остатков по складам.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа