Загрузка данных
ПРАКТИЧЕСКАЯ РАБОТА №7
Форма подбора товаров в табличную часть документа
Ввод данных в табличные части документов может занимать достаточно много времени. Например, для оформления документа реализации пользователю нужно выбрать из справочника номенклатуру, проверить при помощи отчета, что эта позиция есть в остатках на складе, ввести количество и цену. Также может потребоваться заполнить другие сведения в зависимости от специфики используемой конфигурации. Ввод всех данных вручную может сильно замедлить процесс внесения документов в систему.
Поэтому часто перед разработчиками стоит задача упростить и ускорить ввод информации в систему. Можно предложить несколько вариантов решения поставленной задачи:
Необходимо обеспечить возможность множественного подбора номенклатурных позиций в документ продажи. Подбор должен осуществляться в отдельной форме.
В форме подбора нужно выводить список номенклатурных позиций. Пользователь должен видеть остатки товаров на складах и уже подобранные товары.
Перенос подобранных товаров в документ реализации осуществляется при нажатии на кнопку «Перенести в документ».
Рассмотрим подробнее, как решить поставленную задачу.
Прежде всего спроектируем, как будет открываться подбор из документа реализации и как будет организована форма подбора.
Для формирования документа реализации пользователь заполняет шапку документа: указывает покупателя, склад, с которого отгружаются товары. Затем пользователь переходит к заполнению табличной части. Чтобы избежать ручной работы с каждой строкой табличной части, пользователь открывает специальную форму подбора. Эта форма открывается при нажатии специальной кнопки «Открыть подбор».
В конфигурации создайте команду ОткрытьПодбор формы документа продажи и разместите на форме специальную кнопку:
Рисунок 1 – Создание команды для открытия формы подбора
Форма подбора выглядит следующим образом:
Рисунок 2 – Логика работы формы подбора
Форма подбора состоит из двух таблиц:
Список товаров, содержащий информацию об остатках на складах в нужных разрезах (верхняя таблица)
Корзина подобранных товаров (нижняя таблица).
Пользователь анализирует остатки товаров на складах и выбирает нужную позицию двойным кликом мыши по строке в верхней таблице. Выбранная номенклатурная позиция попадает в корзину – отдельную таблицу в нижней части формы подбора. Если такой номенклатуры в корзине еще нет, то считаем, что в корзину добавили 1 штуку товара. Если выбранная номенклатура уже находится в корзине, то подобранное количество увеличивается на 1.
После нажатия на специальную кнопку «Перенести в документ» подобранные товары добавляются в табличную часть СписокНоменклатуры документа продажи. После чего форма подбора закрывается.
Создадим форму подбора для документа продажи. Поскольку это вспомогательная форма, на ней не будет производиться редактирование самого документа реализации, не требуются стандартные кнопки Провести и закрыть, записать и т.д.
Поэтому в конструкторе необходимо выбрать тип создаваемой формы – Произвольная форма. Определим имя формы – ФормаПодбора:
Рисунок 3 – Начало создания формы подбора
На форме подбора необходимо вывести перечень номенклатуры с остатками на складах.
С точки зрения производительности использование динамического списка для решения задачи более предпочтительно.
Динамический список специально был разработан для отображения объемных списков, больших массивов данных. Отличительной особенностью динамического списка является возможность считывать данные небольшими порциями – то есть только те данные, которые в данный момент требуется вывести на экран. Когда пользователь прокручивает список, система получает из базы данных очередную порцию информации и выводит ее на экран. Это намного быстрее и удобнее.
Поэтому для решения поставленной задачи используем динамический список.
Создадим реквизит формы подбора с типом динамический список. В списке будет отображаться перечень номенклатуры с остатками на складе:
Рисунок 4 – Создание реквизита формы подбора
Рисунок 5 – Свойства созданного реквизита формы подбора
Для хранения данных об остатках товаров в конфигурации предусмотрен регистр накопления ОстаткиНоменклатуры.
Однако данных только регистра накопления ОстаткиНоменклатуры недостаточно. Например, если товар заведен в справочнике «Номенклатура», но никогда не поступал на склад, то в регистре накопления не будет записей по этой позиции. Но в форму подбора необходимо выводить абсолютно все товары. Поэтому для получения данных необходимо использовать две таблицы: справочник Номенклатура и виртуальную таблицу Остатки регистра накопления ОстаткиНоменклатуры.
Чтобы в тексте запроса динамического списка можно было использовать несколько таблиц, в настройках динамического списка необходимо установить галочку Произвольный запрос:
Рисунок 6 – Свойства списка ПроизвольныйЗапрос
Перейдем к настройке динамического списка при помощи ссылки Открыть:
Рисунок 7 – Переход к дальнейшим настройкам динамического списка
Откроется окно настройки динамического списка с возможностью использования конструктора запроса:
Рисунок 8 – Окно настройки динамического списка
Необходимо составить текст запроса. Для получения правильного результата принципиально важно выбрать подходящий тип соединения таблиц.
Требуется выводить все номенклатурные позиции. При этом остатки выводить только для тех товаров, которые есть в наличии на складах. Поэтому в конструкторе запроса используем левое внешнее соединение. При этом левая таблица – справочник Номенклатура, правая таблица – виртуальная таблица Остатки регистра накопления ОстаткиНоменклатуры:
Рисунок 9 – Использование левого соединения в запросе
Важно разделить остатки на складах. Требуется отдельно отображать следующие остатки:
В итоге получится следующий запрос динамического списка:
ВЫБРАТЬ
Рисунок 12 – Текст запроса динамического списка
Для каждой номенклатуры в результате запроса должна выводиться только одна строка, в которой должны отображаться все остатки на складах отдельными колонками. Однако левое соединение в запросе может приводить к тому, что по одному товару может получиться несколько строк в результате запроса. Чтобы избежать дублирования номенклатуры, в тексте запроса нужно использовать группировку (ключевое слово СГРУППИРОВАТЬ).
Перенесем динамический список на форму, при этом оставим только необходимые колонки.
Выбранные пользователем товары должны отображаться на форме подбора. Для хранения этих данных создадим реквизит формы Корзина, являющийся таблицей значений. В таблицу значений добавим две колонки:
Номенклатура (тип – СправочникСсылка.Номенклатура)
Количество (тип – Число, 10).
Рисунок 14 – Создание реквизита формы подбора Корзина
Перенесем созданную таблицу значений на форму и расположим ее под списком товаров:
Рисунок 15 – Размещение на форме таблицы значений
Таким образом, внешний вид формы подбора настроен.
При проектировании решения задачи было определено, что форма подбора должна открываться из формы документа продажи. Ранее с этой целью в каркасной конфигурации была создана команда формы с названием ОткрытьПодбор, и на форме документа была размещена специальная кнопка:
Рисунок 16 – Размещение кнопки «Открыть подбор» на форме документа «Расходная накладная»
Для созданной ранее команды ОткрытьПодбор (формы документа РасходнаяНакладная) создадим клиентский обработчик. В обработчике в форму подбора будем передавать склад, на котором нужно получить остатки, после чего открывать форму подбора:
В третьем параметре метода ОткрытьФорму указывается владелец открываемой формы. Владельцем формы подбора назначаем элемент управления – таблицу СписокНоменклатуры на форме. В дальнейшем именно владельцу формы будет отправлено оповещение о выполнении подбора. Значит, именно для владельца формы (таблицы СписокНоменклатуры) в дальнейшем необходимо будет создать обработчик, в котором и выполнить заполнение табличной части подобранными товарами.
Далее в форме подбора нужно реализовать перенос выбранного товара в корзину. Для этого создадим обработчик события Выбор, которое возникает при двойном щелчке мышью по динамическому списку, содержащему перечень номенклатуры с остатками:
Первым делом отключаем стандартную обработку события, чтобы при двойном щелчке мышью по списку номенклатуры не открывалась форма элемента справочника, а выполнялось только добавление номенклатуры в корзину.
В приведенном коде ВыбраннаяСтрока – это и есть элемент справочника Номенклатура, по которому был совершен двойной щелчок мышью. Проверяем, есть ли указанная номенклатура уже в корзине. Если такой номенклатуры в корзине нет, то добавляем в корзину новую строку, количество указываем равным 1. Если же такая номенклатура уже находится в корзине, то увеличиваем подобранное количество на 1.
Проверим работоспособность формы подбора в пользовательском режиме. Если в списке товаров дважды выбрать одну и ту же позицию, то в корзине будут отображаться 2 штуки этого товара:
Рисунок 18 – Заполнение корзины в форме подбора
Когда пользователь подобрал в корзину все необходимые товары, необходимо перенести их в табличную часть документа реализации.
Для этого создадим команду формы подбора Перенести в документ, на форме подбора разместим соответствующую кнопку:
Рисунок 19 – Создание команды формы подбора «Перенести в документ»
Рисунок 20 – Размещение команды на форме
Рассмотрим два варианта передачи информации из формы подбора в форму документа.
Первый вариант – непосредственная передача. В форме документа можно создать таблицу значений, где будут размещаться данные о подобранных товарах. Форма подбора будет помещать данные в таблицу значений на форме документа:
Рисунок 21 – Схема работы формы подбора
Однако при этом осуществляется избыточное хранение данных. К тому же при передаче управления с Клиента на Сервер придется передавать эти дополнительные данные.
Оптимальнее было бы создать некое общее хранилище информации, куда форма подбора поместит данные, а форма документа сможет получить к ним доступ. В таком случае уменьшится объем передаваемых данных.
В платформе «1С:Предприятие» существует механизм временных хранилищ – специальных объектов, куда можно поместить данные при клиент-серверном взаимодействии.
Взаимодействие будет производиться следующим образом. Форма подбора будет помещать информацию о выбранных пользователем товарах во временное хранилище. В форму документа будет передан только адрес во временном хранилище, а не весь объем данных. При обращении по этому адресу форма документа сможет получить доступ к данным о подобранных товарах и выполнить обработку этих данных:
Рисунок 22 – Использование временного хранилища
Поэтому при решении задачи будем использовать временное хранилище.
При нажатии на кнопку Перенести в документ в форме подбора отобранные товары из корзины будут помещены во временное хранилище. Адрес во временном хранилище передадим в исходную форму документа реализации, из которой открывали форму подбора. После этого в табличную часть документа можно загрузить отобранные товары.
Код обработчика для команды ПеренестиВДокумент:
В приведенном коде на Сервере помещаем данные из корзины во временное хранилище. В результате выполнения функции ПоместитьВоВременноеХранилище получаем адрес во временном хранилище, где расположена выгруженная таблица значений.
Затем при помощи метода ОповеститьОВыборе из формы подбора посылаем оповещение владельцу формы о завершении подбора и передаем владельцу формы адрес во временном хранилище, где размещается созданная таблица значений. После этого форма подбора будет закрыта.
Владельцем формы подбора является таблица СписокНоменклатуры на форме документа РасходнаяНакладная. Именно этому элементу управления отправляется оповещение о выполнении подбора. Значит, именно для него требуется создать обработчик события ОбработкаВыбора, в котором выполнить заполнение табличной части подобранными товарами. Код процедуры СписокНоменклатурыОбработкаВыбора:
В процедуру СписокНоменклатурыОбработкаВыбора в качестве параметра ВыбранноеЗначение передается адрес во временном хранилище, где располагается таблица подобранных товаров. Эту таблицу значений затем загружаем в табличную часть документа реализации.
Проверим работу программного кода в пользовательском режиме. Создадим новый документ РасходнаяНакладная. Заполним шапку документа, укажем, с какого склада будет выполняться отгрузка. Откроем форму подбора. В ней отображаются товары, для которых указывается остаток на выбранном складе. Наберем в корзину требуемый товар:
Рисунок 23 – Форма подбора с заполненной корзиной
При нажатии на кнопку «Перенести в документ» выбранные позиции загружаются в документ РасходнаяНакладная:
Рисунок 24 – Подобранные товары в табличной части документа «Расходная накладная»