Быстрая реализация подбора на управляемых формах 1С 8.2/8.3 - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

Быстрая реализация подбора на управляемых формах 1С 8.2/8.3

Данные > Статьи и инструкции > Программирование
 
 
Задача:

 В нетиповой складской конфигурации (управляемые формы) необходимо реализовать следующий функционал по подбору материалов (запасных частей) из документа «Заявка». Подбор должен осуществляться из справочника материалов с отображением графы «Остаток на складе» в количественном выражении.

 
Примечание:

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

 
Реализация:

 
1.       В командах формы создадим процедуру «ПодборЗапчастей».


 

2.       Перенесём её в элементы форм. Сформируется кнопка «Подбор запчастей».


 

3.       Добавим новую обработку «ПодборЗЧ» с табличной частью «ПодобранныеМатериалы».



 




 
4.       В форме обработки «ПодборЗЧ» добавляем параметры (не ключевые). Те, которые мы передали процедурой в документе «Заявка»:
 

&НаКлиенте
Процедура ПодборЗапчастей(Команда)

    ПараметрыПодбора = Новый Структура;

    ПараметрыПодбора.Вставить("ПоказыватьТолькоОстатки", Ложь);
    ПараметрыПодбора.Вставить("ДатаДокумента", Объект.Дата);
    ПараметрыПодбора.Вставить("СкладРемзона", Объект.СкладРемзона);
    ПараметрыПодбора.Вставить("МаркаАвтомобиля", Объект.МаркаАвтомобиля);
    ПараметрыПодбора.Вставить("ИмяТаблицы", "ТабличнаяЧастьЗаявки");

    ОткрытьФорму("Обработка.ПодборЗЧ.Форма.Форма", ПараметрыПодбора, ЭтаФорма, УникальныйИдентификатор);

КонецПроцедуры

Некоторыми из них заполним таблицу:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
УправлениеТаблицей();

КонецПроцедуры

&НаСервере
Процедура УправлениеТаблицей()

   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("МаркаАвтомобиля"       , Параметры.МаркаАвтомобиля);
   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("СкладРемзона"      , Параметры.СкладРемзона);
   
СписокСвойств = "ПоказыватьТолькоОстатки, МаркаАвтомобиля, ДатаДокумента,СкладРемзона";
   
ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, СписокСвойств);//

КонецПроцедуры



5.       Создадим динамический список «Таблица Материалов» с признаком «ПроизвольныйЗапрос».




Откроем настройку списка и с помощью конструктора запроса (или вручную) создадим запрос: выборку материалов(зап.частей) из справочника и нашего регистра накопления. Если есть необходимость -на вкладке динамического списка "Настройка" - настроим поля.

ВЫБРАТЬ
    МатериалыЗапЧасти.Ссылка КАК Материал,
    ЕСТЬNULL(СкладОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    МатериалыЗапЧасти.ОсновнаяМаркаМашины КАК ОсновнаяМаркаМашины
ИЗ
    Справочник.МатериалыЗапЧасти КАК МатериалыЗапЧасти
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Склад.Остатки(&ДатаДокумента, ) КАК СкладОстатки
        ПО (СкладОстатки.КоличествоОстаток > 0)
            И (СкладОстатки.МатериалЗЧ = МатериалыЗапЧасти.Ссылка)
ГДЕ
    (СкладОстатки.МаркаАвтомобиля В (&МаркаАвтомобиля)
            ИЛИ &МаркаАвтомобиля = ЗНАЧЕНИЕ(Справочник.МаркиАвтомобилей.ПустаяСсылка))
    И СкладОстатки.СкладРемзона = &СкладРемзона
    И НЕ МатериалыЗапЧасти.ЭтоГруппа
    И ВЫБОР
            КОГДА &ПоказыватьТолькоОстатки
                ТОГДА ЕСТЬNULL(СкладОстатки.КоличествоОстаток, 0) > 0
            ИНАЧЕ ИСТИНА
        КОНЕЦ

7. Элементы, рекизиты, параметры и код формы подборы обрели следующий вид:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
УправлениеТаблицей();

КонецПроцедуры

&НаСервере
Процедура УправлениеТаблицей()

   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("МаркаАвтомобиля", Параметры.МаркаАвтомобиля);
   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("СкладРемзона", Параметры.СкладРемзона);
   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("ДатаДокумента", Параметры.ДатаДокумента);
   
ПоказыватьТолькоОстаткиПриИзмененииНаСервере();//то же самое //ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("ПоказыватьТолькоОстатки", Параметры.ПоказыватьТолькоОстатки);

   
СписокСвойств = "ПоказыватьТолькоОстатки, МаркаАвтомобиля, ДатаДокумента,СкладРемзона";
   
ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, СписокСвойств);//

КонецПроцедуры


&НаКлиенте
Процедура ПеренестиВДокумент(Команда)

   
ПеренестиВДокумент = Истина;
   
Закрыть(КодВозвратаДиалога.OK);

КонецПроцедуры

&НаСервере
Функция ПоместитьПодобранныеМатериалыВХранилище()

   
ТаблицаМатериалов2 = Объект.ПодобранныеМатериалы.Выгрузить();
   
АдресПодобранныхМатериаловВХранилище = ПоместитьВоВременноеХранилище(ТаблицаМатериалов2, УникальныйИдентификатор);//
   
Возврат АдресПодобранныхМатериаловВХранилище;

КонецФункции

&НаСервере
Функция ПриЗакрытииНаСервере()

   
СтруктураВозврата = Новый Структура();

    Если
ПеренестиВДокумент Тогда
       
АдресПодобранныхМатериаловВХранилище = ПоместитьПодобранныеМатериалыВХранилище();
       
СтруктураВозврата.Вставить("АдресПодобранныхМатериаловВХранилище", АдресПодобранныхМатериаловВХранилище);
    КонецЕсли;

    Возврат
СтруктураВозврата;

КонецФункции

&НаКлиенте
Процедура ПриЗакрытии()

   
СтруктураВозврата = ПриЗакрытииНаСервере();

    Если
ПеренестиВДокумент Тогда
       
ОповеститьОВыборе(СтруктураВозврата);
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

    Если Не
ПеренестиВДокумент И Объект.ПодобранныеМатериалы.Количество() > 0 Тогда

       
ОтветНаВопрос = Вопрос(НСтр("ru = 'Подобранные материалы не перенесены в документ.
        |
        |Перенести?'"
), РежимДиалогаВопрос.ДаНетОтмена);

        Если
ОтветНаВопрос = КодВозвратаДиалога.Отмена Тогда
           
Отказ = Истина;
        ИначеЕсли
ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
           
ПеренестиВДокумент = Истина;
        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВыбранныйМатериал(ПараметрыМатериала, Количество)

   
ПараметрыФормы = Новый Структура;
   
ПараметрыФормы.Вставить("Материал"  , ПараметрыМатериала.Материал);
   
ПараметрыФормы.Вставить("Количество"    , 1);
   
ПараметрыФормы.Вставить("ИмяТаблицы"    , "ТабличнаяЧастьЗаявки");
   
ПараметрыПоиска =    Новый Структура("Материал", ПараметрыМатериала.Материал);

   
ВозвращенноеЗначение = ОткрытьФормуМодально("Обработка.ПодборЗЧ.Форма.ФормаВводаКоличество", ПараметрыФормы, ЭтаФорма);
    Если
ВозвращенноеЗначение <> Неопределено Тогда
       
Количество = ВозвращенноеЗначение.Количество;
    Иначе
        Возврат;
    КонецЕсли;

   
РезультатПоиска = Объект.ПодобранныеМатериалы.НайтиСтроки(ПараметрыПоиска);
    Если
РезультатПоиска.Количество() = 0 Тогда
       
ТекущаяСтрока = Объект.ПодобранныеМатериалы.Добавить();
       
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ПараметрыМатериала);
    Иначе
       
ТекущаяСтрока = РезультатПоиска[0];
    КонецЕсли;

   
ТекущаяСтрока.Количество = Количество + ТекущаяСтрока.Количество;
   
Элементы.ПодобранныеМатериалы.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаМатериаловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

   
СтандартнаяОбработка = Ложь;
    Если
Элемент.ТекущиеДанные <> Неопределено Тогда

       
СтруктураПараметрыМатериала = Новый Структура;
       
СтруктураПараметрыМатериала.Вставить("Материал", Элемент.ТекущиеДанные.Материал);
       
ДобавитьВыбранныйМатериал(СтруктураПараметрыМатериала, 1);

    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПодобранныеМатериалыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
   
Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьТолькоОстаткиПриИзменении(Элемент)
   
ПоказыватьТолькоОстаткиПриИзмененииНаСервере();

КонецПроцедуры

&НаСервере
Процедура ПоказыватьТолькоОстаткиПриИзмененииНаСервере()

   
ТаблицаМатериалов.Параметры.УстановитьЗначениеПараметра("ПоказыватьТолькоОстатки", ПоказыватьТолькоОстатки);

КонецПроцедуры
8. Для того, чтобы из обработки подбора перенести результат в наш документ - выполним обработку подбора.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

   
ОбработкаВыбораНаСервере(ВыбранноеЗначение, "ТабличнаяЧастьЗаявки");//ИсточникВыбора.ИмяТаблицы

КонецПроцедуры

&НаСервере
Процедура ОбработкаВыбораНаСервере(ВыбранноеЗначение, ИмяТаблицы)

   
ВремТаблМатериалов = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресПодобранныхМатериаловВХранилище);

    Для Каждого
СтрокаМатериала Из ВремТаблМатериалов Цикл

       
СтрокаТабличнойЧасти = Объект[ИмяТаблицы].Добавить();
       
ЗаполнитьЗначенияСвойств(СтрокаТабличнойЧасти, СтрокаМатериала);

    КонецЦикла;

КонецПроцедуры

Данный метод не притендует на "лучшее решение", но является вполне рабочим вариантом. По аналогии может быть использован в решении прочих задач по автоматизации подбора различных элементов справочников и документов с обработкой результата на платформе 1С Предприятие 8.2/8.3 (УФ).
Если Вы хотите заказать абонентское обслуживание или прочие услуги Вашей 1С. Пожалуйста, ознакомьтесь с прайс-листом и оформите заявку через контактную форму.
1
комментарий
Роман
20 авг 2020
Все хорошо расписано, но вот это...
ВозвращенноеЗначение = ОткрытьФормуМодально("Обработка.ПодборЗЧ.Форма.ФормаВводаКоличество", ПараметрыФормы, ЭтаФорма);

Ни слова, не полная статья
____________________
Copyright©, «Программист 1С в г.Минске», 18.06.2015
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому