В системе 1С:Предприятие 8.3 обработки - это прикладные объекты конфигурации, предназначенные для выполнения различных действий над информацией.Формы в программе 1С:Предприятие предназначены для отображения и редактирования информации, содержащейся в базе данных. Формы могут принадлежать конкретным объектам конфигурации или существовать отдельно от них и использоваться всем прикладным решением в целом.
Так как разработанная форма достаточно громоздкая рассмотрим её основные составные части.
Первая область формы представлена динамическим списком перечня номенклатуры.Динамический список - это интерфейсный объект встроенного языка, который используется для отображения различных списков объектов базы данных или необъектных данных - записей регистров. Отличительная особенность динамических списков в том, что система автоматически выполняет считывание данных запроса порциями, по мере навигации пользователя по списку. Это позволяет получать данные быстрее.
Список отображает номенклатурные позиции, данные о производителе, цене, остатке и остатке с учетом резерва. Доступен отбор номенклатуры по производителю и вывод позиций, имеющихся в наличии. Присутствует поиск товаров по артикулу и по наименованию (рис. 1).Рис. 1: Динамический список на форме подбора
Для продолжения, сперва необходимо выбрать партнера, для которого будет формироваться заказ. Поля контрагент и соглашения заполнятся по умолчанию для выбранного партнера. Согласно выбранному соглашению у номенклатурных позиций поменяются виды цен. Щелкнув на интересующий товар в списке мы можем увидеть его распределение его остатка по складам во второй области формы, представленной деревом (рис. 2).Рис. 2. Дерево с остатком
Щелкнув дважды по строке со складом открывается диалоговое окно добавления товара в корзину (рис. 3).
Рис. 3. Диалоговое окно
При нажатии «ОК» выбранная номенклатура добавляется в самую нижнюю область, называемую корзиной подбора (рис. 4).
Рис. 4. Корзина подбора
При нажатии на кнопку «Заказать» (рис. 1) происходит формирование заказов, по одному на каждый склад, указанный в корзине.
Обычно, формы подбора вызываются из форм документов, из которых они и получают данные для формирования. В нашем случае всё наоборот: форма подбора формирует документы. Для открытия этой формы в справочник Номенклатура добавлена команда «НоменклатураСОстатками».&НаКлиентеПроцедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)ПараметрЗаголовок = НСтр("ru = 'Номенклатура'");ПараметрыОткрытияФормыСписка = ПолучитьДанные();ПараметрыФормы = Новый Структура;ПараметрыФормы.Вставить("Соглашение",ПараметрыОткрытияФормыСписка.Соглашение);ПараметрыФормы.Вставить("ЦенаВключаетНДС", Истина);ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Истина);ПараметрыФормы.Вставить("ИспользоватьДатыОтгрузки", Истина);ПараметрыФормы.Вставить("СкрыватьПодакцизныеТовары", Ложь);ПараметрыФормы.Вставить("ОтображатьФлагСкрыватьПодакцизныеТовары", ПараметрыФормы.Вставить("Склад", ПараметрыОткрытияФормыСписка.Склад);ПараметрыФормы.Вставить("Валюта", ПараметрыОткрытияФормыСписка.Валюта);ПараметрыФормы.Вставить("Заголовок", ПараметрЗаголовок);ПараметрыФормы.Вставить("Дата", ТекущаяДата());ПараметрыФормы.Вставить("Документ", Неопределено);ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма.Форма1", ПараметрыФормы);КонецПроцедуры&НаСервереФункция ПолучитьДанные()СтруктураДанных = Новый Структура();СтруктураДанных.Вставить("Склад", Неопределено);СтруктураДанных.Вставить("Валюта",Константы.ВалютаУправленческогоУчета.Получить());Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1|СоглашенияСКлиентами.Ссылка|ИЗ|Справочник.СоглашенияСКлиентами КАК СоглашенияСКлиентами|ГДЕ|СоглашенияСКлиентами.ВидЦен = &ВидЦен";Запрос.УстановитьПараметр("ВидЦен",ПараметрыСеанса.ГБ_ВидЦенДляСпискаНоменклатуры);РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();Если ВыборкаДетальныеЗаписи.Следующий() ТогдаСоглашение = ВыборкаДетальныеЗаписи.Ссылка;Соглашение = Справочники.СоглашенияСКлиентами.ПустаяСсылка();СтруктураДанных.Вставить("Соглашение", Соглаш);Возврат СтруктураДанныхКонецФункцииТакже формы подбора не предполагают динамического изменения соглашений. Но именно от соглашения зависит вид цены и цена номенклатуры. Для корректного отображения цен для события элемента формы «Соглашение» добавлена серверная процедура ПриИзмененииСоглашенияСервер().&НаСервереПроцедура ПриИзмененииСоглашенияСервер()Если ЗначениеЗаполнено(СоглашениеПартнера) ТогдаВидыЦен.Очистить();ВидыЦен.Добавить(СоглашениеПартнера.ВидЦен);Если СоглашениеПартнера.ЦеновыеГруппы.Количество()>0 ТогдаДля каждого строка из СоглашениеПартнера.ЦеновыеГруппы ЦиклВидыЦен.Добавить(строка.ВидЦен);КонецЦикла;КонецЕсли;Соглашение = СоглашениеПартнера;ПодборТоваровКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура, "Соглашение", СоглашениеПартнера);Параметры.Соглашение=СоглашениеПартнера;ИначеВидыЦен.Очистить();ВидыЦен.Добавить(БылаЦена);Соглашение = БылоСоглашение;ПодборТоваровКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура, "Соглашение", Соглашение);КонецЕсли;Объект.Корзина.Очистить();ПодборТоваровКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура, "ВидыЦен", ВидыЦен);ПодборТоваровСервер.УстановитьСвойстваСписковФормыПодбора(ЭтаФорма);ПодборТоваровКлиентСервер.УстановитьТекущиеСтраницыПоВариантуПоиска(ЭтаФорма);КонецПроцедуры
Наконец, типовая форма подбора не предполагает создание документов на её основе. Потому на форму добавлена команда «Заказать», вызывающая выполнение процедур СоздатьЗаказ() и СоздатьЗаказНаСервере().&НаКлиентеПроцедура СоздатьЗаказ(Команда)//Выбираем уникальные склады из корзиныМассив = ПолучитьМассивСкладов();Для каждого стр из Массив ЦиклСтруктура=СоздатьЗаказНаСервере(стр);СтруктураВнешнегоКлиента = Новый Структура;Структура.ВСтавить("ИзПодбора",Истина);СтруктураВнешнегоКлиента.Вставить("СтруктураВнешнегоКлиента",Структура);Форма=ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",СтруктураВнешнегоКлиента);КонецЦикла;Объект.Корзина.Очистить();Если не ВнешнийКлиент ТогдаСоглашениеПартнера = Неопределено;Партнер = Неопределено;ПриИзмененииСоглашенияСервер();КонецЕсли;Элементы.СписокРасширенныйПоискНоменклатура.Обновить();КонецПроцедуры&НаСервереФункция СоздатьЗаказНаСервере(Склад)//АдресТоваровВХранилище = ПоместитьТоварыВХранилище();//АдресТоваровВХранилище = АдресТоваровВХранилище();Товары = Объект.Корзина.Выгрузить();Товары.Колонки.Добавить("ВариантОбеспечения");Для Каждого СтрокаТовары из Товары ЦиклДоступно=СтрокаТовары.Доступно;Если Доступно>=СтрокаТовары.Количество ТогдаСтрокаТовары.ВариантОбеспечения=Перечисления.ВариантыОбеспечения.Отгрузить;ИначеСтрокаТовары.ВариантОбеспечения=Перечисления.ВариантыОбеспечения.Обособленно;КонецЕсли;КонецЦикла;ТЗ=Товары.Скопировать(Товары.НайтиСтроки(Новыйструктура("Склад",Склад)));АдресТоваровВХранилище = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификатор);Если Не ЗначениеЗаполнено(Склад) ТогдаСкладДок = получитьСкладПользователя(ЛОЖЬ);ИначеСкладДок = Склад;КонецЕсли;Если АдресТоваровВХранилище <> Неопределено ТогдаЕсли ВнешнийКлиент ТогдаЕсли РольДоступна("ВнешнийМенеджер") ТогдаСтруктура= Новый Структура("АдресТоваровВХранилище,Склад,Партнер, Соглашение, Контрагент", АдресТоваровВХранилище, СкладДок, Партнер, Соглашение, Контрагент);ИначеСтруктура=Новый Структура("АдресТоваровВХранилище,