1с подбор в табличную часть управляемой формы

Форма выбора (подбор) в управляемых формах

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

Пример 1.

Простой вызов формы выбора с одним возвращаемым результатом:

Пример 2.

Выбор нескольких значений (документов или справочников) :

В первых 2-х примерах мы использовали обработчик (Событие) формы «ОбработкаВыбора».

Теперь рассмотрим пример с использованием «Обработки оповещения», на мой взгляд более удобно )

Пример 3.

Думаю многие не знают про фишку Оповещением «на Сервере». То есть результат можно вернуть сразу на сервер без дополнительных условий. Работает до 8.3.13.1644, с 8.3.16.1063 этот метод недоступен.

Пример 4.

Мы видим что открывается форма выбора (из списка документов «Реализация товаров и услуг»), но иногда необходимо добавить некий отбор, чтобы при открытии формы не выводить все документы в целом.

Пример 5.

Есть моменты когда не всегда можно обойтись простым отбором, например необходимо открыть форму выбора со списком за определенный период.

Пример 6.

Пример 7.

Как открыть форму выбора с Позиционированием ранее выбранного значения:

Тестировалось на 1С:Предприятие 8.3 (8.3.16.1063) и 1С:Предприятие 8.3 (8.3.13.1644), Спасибо за внимание, возможно, кому-то поможет)

Источник

Решение задач по управляемым формам – тема № 10:
Форма подбора товаров в табличную часть документа

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

Поэтому часто перед разработчиками стоит задача упростить и ускорить ввод информации в систему. Можно предложить несколько вариантов решения поставленной задачи:

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

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

Задача на экзамене может быть сформулирована следующим образом:

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

В форме подбора нужно выводить список номенклатурных позиций. Пользователь должен видеть остатки товаров на складах и уже подобранные товары. В отдельных колонках необходимо отображать следующие остатки:

Перенос подобранных товаров в документ реализации осуществляется при нажатии на кнопку «Перенести в документ».

Рассмотрим подробнее, как решить поставленную задачу.

Как пользователь будет выполнять подбор товаров

Прежде всего спроектируем, как будет открываться подбор из документа реализации и как будет организована форма подбора.

Для формирования документа реализации пользователь заполняет шапку документа: указывает покупателя, склад, с которого отгружаются товары. Затем пользователь переходит к заполнению табличной части. Чтобы избежать ручной работы с каждой строкой табличной части, пользователь открывает специальную форму подбора. Эта форма открывается при нажатии специальной кнопки «Открыть подбор».

В каркасной конфигурации для документа РасходнаяНакладная определим реквизит Склад (тип – СправочникСсылка.Склады).

Также в каркасной конфигурации создадим команду ОткрытьПодбор формы документа РасходнаяНакладная и разместим на форме специальную кнопку:

dev att forms 10 01 min

Рисунок 1 – Создание команды для открытия формы подбора

Форма подбора выглядит следующим образом:

dev att forms 10 02 min

Рисунок 2 – Логика работы формы подбора

Форма подбора состоит из двух таблиц:

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

После нажатия на специальную кнопку «Перенести в документ» подобранные товары добавляются в табличную часть СписокНоменклатуры документа РасходнаяНакладная. После чего форма подбора закрывается.

Этапы решения задачи

Разделим задачу на отдельные этапы, которые и будем последовательно реализовывать:

Что нужно учитывать при создании формы подбора

Создадим форму подбора для документа РасходнаяНакладная. Поскольку это вспомогательная форма, на ней не будет производиться редактирование самого документа реализации, не требуются стандартные кнопки Провести и закрыть, Записать и т.д.

Поэтому в конструкторе необходимо выбрать тип создаваемой формы – Произвольная форма. Определим имя формы – ФормаПодбора:

dev att forms 10 03 min

Рисунок 3 – Начало создания формы подбора

Как оптимальным способом отобразить на форме список товаров с остатками

На форме подбора необходимо вывести перечень номенклатуры с остатками на складах. Для отображения остатков на форме можно использовать несколько вариантов:

С точки зрения производительности использование динамического списка для решения задачи более предпочтительно.

При работе с таблицей значений необходимо получить все данные из базы и загрузить их в таблицу значений. Справочник «Номенклатура» может быть очень большим и составлять десятки тысяч позиций. Всю эту информацию необходимо считать из базы и вывести на форму. Это может занять достаточно много времени. Пользователь в этот момент может посчитать, что программа зависла.

Динамический список специально был разработан для отображения объемных списков, больших массивов данных. Отличительной особенностью динамического списка является возможность считывать данные небольшими порциями – то есть только те данные, которые в данный момент требуется вывести на экран. Когда пользователь прокручивает список, система получает из базы данных очередную порцию информации и выводит ее на экран. Это намного быстрее и удобнее.

Поэтому для решения поставленной задачи используем динамический список.

Как правильно составить текст запроса динамического списка

Создадим реквизит формы подбора с типом динамический список. В списке будет отображаться перечень номенклатуры с остатками на складе:

dev att forms 10 04 min

Рисунок 4 – Создание реквизита формы подбора

dev att forms 10 05 min

Рисунок 5 – Свойства созданного реквизита формы подбора

Для хранения данных об остатках товаров в каркасной конфигурации предусмотрен регистр накопления ОстаткиНоменклатуры.

Создадим в каркасной конфигурации справочник Склады и добавим в регистр накопления ОстаткиНоменклатуры измерение Склад (тип – СправочникСсылка.Склады). Таким образом, структура регистра будет иметь следующий вид:

dev att forms 10 06 min

Рисунок 6 – Структура регистра ОстаткиНоменклатуры

Однако данных только регистра накопления ОстаткиНоменклатуры недостаточно. Например, если товар заведен в справочнике «Номенклатура», но никогда не поступал на склад, то в регистре накопления не будет записей по этой позиции. Но в форму подбора необходимо выводить абсолютно все товары. Поэтому для получения данных необходимо использовать две таблицы: справочник Номенклатура и виртуальную таблицу Остатки регистра накопления ОстаткиНоменклатуры.

Чтобы в тексте запроса динамического списка можно было использовать несколько таблиц, в настройках динамического списка необходимо установить галочку Произвольный запрос:

dev att forms 10 07 min

Рисунок 7 – Свойства списка ПроизвольныйЗапрос

Перейдем к настройке динамического списка при помощи ссылки Открыть:

dev att forms 10 08 min

Рисунок 8 – Переход к дальнейшим настройкам динамического списка

Откроется окно настройки динамического списка с возможностью использования конструктора запроса:

dev att forms 10 09 min

Рисунок 9 – Окно настройки динамического списка

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

Требуется выводить все номенклатурные позиции. При этом остатки выводить только для тех товаров, которые есть в наличии на складах. Поэтому в конструкторе запроса используем левое внешнее соединение. При этом левая таблица – справочник Номенклатура, правая таблица – виртуальная таблица Остатки регистра накопления ОстаткиНоменклатуры:

dev att forms 10 10 min

Рисунок 10 – Использование левого соединения в запросе

Важно разделить остатки на складах. Требуется отдельно отображать следующие остатки:

Чтобы среди элементов справочника Склады можно было выделить «Главный склад», создадим в конфигураторе предопределенный элемент справочника:

dev att forms 10 11 min

Рисунок 11 – Создание предопределенного элемента справочника «Склады»

Для разделения остатков на складах в тексте запроса используем конструкцию языка запросов ВЫБОР. В итоге получится следующий запрос динамического списка:

dev att forms 10 12 min

Рисунок 12 – Текст запроса динамического списка

Для каждой номенклатуры в результате запроса должна выводиться только одна строка, в которой должны отображаться все остатки на складах отдельными колонками. Однако левое соединение в запросе может приводить к тому, что по одному товару может получиться несколько строк в результате запроса. Чтобы избежать дублирования номенклатуры, в тексте запроса нужно использовать группировку (ключевое слово СГРУППИРОВАТЬ).

Для идентификации складов в тексте запроса используется два параметра – Склад (это склад, указанный в документе реализации) и ГлавныйСклад. Устанавливать значение этих параметров необходимо при открытии формы подбора.

В следующем блоке материалов будет подробно рассмотрено: какой обработчик следует использовать и какой программный код для этого нужно реализовать.

Перенесем динамический список на форму, при этом оставим только необходимые колонки:

dev att forms 10 13 min

Рисунок 13 – Размещение динамического списка на форме

Как создать на форме корзину выбранных товаров

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

dev att forms 10 14 min

Рисунок 14 – Создание реквизита формы подбора Корзина

Перенесем созданную таблицу значений на форму и расположим ее под списком товаров:

dev att forms 10 15 min

Рисунок 15 – Размещение на форме таблицы значений

Таким образом, внешний вид формы подбора настроен.

Как из формы документа открыть подбор

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

dev att forms 10 16 min

Рисунок 16 – Размещение кнопки «Открыть подбор» на форме документа «Расходная накладная»

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

В третьем параметре метода ОткрытьФорму указывается владелец открываемой формы. Владельцем формы подбора назначаем элемент управления – таблицу СписокНоменклатуры на форме. В дальнейшем именно владельцу формы будет отправлено оповещение о выполнении подбора. Значит, именно для владельца формы (таблицы СписокНоменклатуры) в дальнейшем необходимо будет создать обработчик, в котором и выполнить заполнение табличной части подобранными товарами.

Теперь в форме подбора нужно обработать переданный параметр и установить значения параметров динамического списка.

Склад, который указан в документе реализации, в форме подбора можно получить через параметр Склад, т.к. параметр с таким именем устанавливался при открытии этой формы. Для получения главного склада обращаемся к предопределенному элементу справочника Склады.

Установка параметра динамического списка может выполняться только на сервере, поэтому создаем обработчик события ПриСозданииНаСервере:

Для проверки работоспособности кода в каркасной конфигурации в справочнике «Склады» в пользовательском режиме добавим несколько элементов. Обеспечим проведение документа ПриходнаяНакладная по регистру накопления ОстаткиНоменклатуры и оприходуем несколько товаров на разные склады. Предварительно в документе ПриходнаяНакладная необходимо добавить реквизит Склад (тип – СправочникСсылка.Склады):

dev att forms 10 17 min

Рисунок 17 – Форма подбора

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

Как реализовать работу с корзиной

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

Первым делом отключаем стандартную обработку события, чтобы при двойном щелчке мышью по списку номенклатуры не открывалась форма элемента справочника, а выполнялось только добавление номенклатуры в корзину.

В приведенном коде ВыбраннаяСтрока – это и есть элемент справочника Номенклатура, по которому был совершен двойной щелчок мышью. Проверяем, есть ли указанная номенклатура уже в корзине. Если такой номенклатуры в корзине нет, то добавляем в корзину новую строку, количество указываем равным 1. Если же такая номенклатура уже находится в корзине, то увеличиваем подобранное количество на 1.

Проверим работоспособность формы подбора в пользовательском режиме. Если в списке товаров дважды выбрать одну и ту же позицию, то в корзине будут отображаться 2 штуки этого товара:

dev att forms 10 18 min

Рисунок 18 – Заполнение корзины в форме подбора

Как перенести выбранные товары из корзины в документ

Когда пользователь подобрал в корзину все необходимые товары, необходимо перенести их в табличную часть документа реализации.

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

dev att forms 10 19 min

Рисунок 19 – Создание команды формы подбора «Перенести в документ»

dev att forms 10 20 min

Рисунок 20 – Размещение команды на форме

Рассмотрим два варианта передачи информации из формы подбора в форму документа.

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

dev att forms 10 21 min

Рисунок 21 – Схема работы формы подбора

Однако при этом осуществляется избыточное хранение данных. К тому же при передаче управления с Клиента на Сервер придется передавать эти дополнительные данные.

Оптимальнее было бы создать некое общее хранилище информации, куда форма подбора поместит данные, а форма документа сможет получить к ним доступ. В таком случае уменьшится объем передаваемых данных.

В платформе «1С:Предприятие» существует механизм временных хранилищ – специальных объектов, куда можно поместить данные при клиент-серверном взаимодействии.

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

dev att forms 10 22 min

Рисунок 22 – Использование временного хранилища

Поэтому при решении задачи будем использовать временное хранилище.

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

Код обработчика для команды ПеренестиВДокумент:

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

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

Владельцем формы подбора является таблица СписокНоменклатуры на форме документа РасходнаяНакладная. Именно этому элементу управления отправляется оповещение о выполнении подбора. Значит, именно для него требуется создать обработчик события ОбработкаВыбора, в котором выполнить заполнение табличной части подобранными товарами. Код процедуры СписокНоменклатурыОбработкаВыбора:

В процедуру СписокНоменклатурыОбработкаВыбора в качестве параметра ВыбранноеЗначение передается адрес во временном хранилище, где располагается таблица подобранных товаров. Эту таблицу значений затем загружаем в табличную часть документа реализации.

Проверим работу программного кода в пользовательском режиме. Создадим новый документ РасходнаяНакладная. Заполним шапку документа, укажем, с какого склада будет выполняться отгрузка. Откроем форму подбора. В ней отображаются товары, для которых указывается остаток на выбранном складе. Наберем в корзину требуемый товар:

dev att forms 10 23 min

Рисунок 23 – Форма подбора с заполненной корзиной

При нажатии на кнопку «Перенести в документ» выбранные позиции загружаются в документ РасходнаяНакладная:

dev att forms 10 24 min

Рисунок 24 – Подобранные товары в табличной части документа «Расходная накладная»

Источник

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

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

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

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

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

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

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

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

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

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

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с подбор в табличную часть обычные формы
  • 1с по документу ведомость в банк уже зарегистрированы выплаты