Заметки внедренца

ДИНАМИЧЕСКОЕ ОБНОВЛЕНИЕ ДАННЫХ О ЦЕНАХ И БЫСТРОЕ СОЗДАНИЕ НЕСКОЛЬКИХ ЗАКАЗОВ С РАЗНЫХ СКЛАДОВ


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

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

Сам механизм реализован на основе формы типовой обработки «ПодборТоваровВДокументПродажи».

В системе 1С:Предприятие 8.3 обработки - это прикладные объекты конфигурации, предназначенные для выполнения различных действий над информацией.

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

Так как разработанная форма достаточно громоздкая рассмотрим её основные составные части.

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

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

Список отображает номенклатурные позиции, данные о производителе, цене, остатке и остатке с учетом резерва. Доступен отбор номенклатуры по производителю и вывод позиций, имеющихся в наличии. Присутствует поиск товаров по артикулу и по наименованию (рис. 1).

Рис. 1: Динамический список на форме подбора



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


Рис. 2. Дерево с остатком



Щелкнув дважды по строке со складом открывается диалоговое окно добавления товара в корзину (рис. 3).



Рис. 3. Диалоговое окно


При нажатии «ОК» выбранная номенклатура добавляется в самую нижнюю область, называемую корзиной подбора (рис. 4).



Рис. 4. Корзина подбора


При нажатии на кнопку «Заказать» (рис. 1) происходит формирование заказов, по одному на каждый склад, указанный в корзине.

Обычно, формы подбора вызываются из форм документов, из которых они и получают данные для формирования. В нашем случае всё наоборот: форма подбора формирует документы. Для открытия этой формы в справочник Номенклатура добавлена команда «НоменклатураСОстатками».

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрЗаголовок = НСтр("ru = 'Номенклатура'");
ПараметрыОткрытияФормыСписка = ПолучитьДанные();
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Соглашение",ПараметрыОткрытияФормыСписка.Соглашение);
ПараметрыФормы.Вставить("ЦенаВключаетНДС", Истина);
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Истина);
ПараметрыФормы.Вставить("ИспользоватьДатыОтгрузки", Истина);
ПараметрыФормы.Вставить("СкрыватьПодакцизныеТовары", Ложь);
ПараметрыФормы.Вставить("ОтображатьФлагСкрыватьПодакцизныеТовары", ПараметрыФормы.Вставить("Склад", ПараметрыОткрытияФормыСписка.Склад);
ПараметрыФормы.Вставить("Валюта", ПараметрыОткрытияФормыСписка.Валюта);
ПараметрыФормы.Вставить("Заголовок", ПараметрЗаголовок);
ПараметрыФормы.Вставить("Дата", ТекущаяДата());
ПараметрыФормы.Вставить("Документ", Неопределено);
ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма.Форма1", ПараметрыФормы);
КонецПроцедуры

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

Наконец, типовая форма подбора не предполагает создание документов на её основе. Потому на форму добавлена команда «Заказать», вызывающая выполнение процедур СоздатьЗаказ() и СоздатьЗаказНаСервере().

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

&НаСервере
Функция СоздатьЗаказНаСервере(Склад)
//АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
//АдресТоваровВХранилище = АдресТоваровВХранилище();
Товары = Объект.Корзина.Выгрузить();
Товары.Колонки.Добавить("ВариантОбеспечения");
Для Каждого СтрокаТовары из Товары Цикл
Доступно=СтрокаТовары.Доступно;
Если Доступно>=СтрокаТовары.Количество Тогда
СтрокаТовары.ВариантОбеспечения=
Перечисления.ВариантыОбеспечения.Отгрузить;
Иначе
СтрокаТовары.ВариантОбеспечения=
Перечисления.ВариантыОбеспечения.Обособленно;
КонецЕсли;
КонецЦикла;
ТЗ=Товары.Скопировать(Товары.НайтиСтроки(Новыйструктура("Склад",Склад)));
АдресТоваровВХранилище = ПоместитьВоВременноеХранилище(ТЗ,
УникальныйИдентификатор);
Если Не ЗначениеЗаполнено(Склад) Тогда
СкладДок = получитьСкладПользователя(ЛОЖЬ);
Иначе
СкладДок = Склад;
КонецЕсли;   
Если АдресТоваровВХранилище <> Неопределено Тогда
Если ВнешнийКлиент Тогда
Если РольДоступна("ВнешнийМенеджер") Тогда
Структура= Новый Структура("АдресТоваровВХранилище,
Склад,Партнер, Соглашение, Контрагент", АдресТоваровВХранилище, СкладДок, Партнер, Соглашение, Контрагент);
Иначе
Структура=Новый Структура("АдресТоваровВХранилище,
Склад, Партнер, Соглашение, Контрагент", АдресТоваровВХранилище,
СкладДок, Соглашение.Партнер, Соглашение, Соглашение.Контрагент);
КонецЕсли;
Структура=Новый Структура("АдресТоваровВХранилище,
Склад, Партнер, Соглашение, Контрагент", АдресТоваровВХранилище,
СкладДок, Партнер, СоглашениеПартнера, Контрагент);
КонецЕсли;
КонецЕсли;
Возврат Структура;
КонецФункции

Далее, при открытии форм документов заказов покупателя происходит получение данных из хранилища и заполнение табличных частей документов, как и для типовой формы подбора.
Made on
Tilda