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