пятница, 8 ноября 2019 г.

Получение документа из видов документов по типу



#Область ПолучениеТоваровИзДокументаДляЗаполненияОбработки


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


&НаКлиенте
Процедура ПолучитьДокументДляОтбора(Команда) 
 ТипыДокументовДляВыбора = Новый СписокЗначений;
 ИменаТаблицИсточников   = Новый СписокЗначений;
 ИменаТаблицИсточников.Добавить("Товары");
 ИменаТаблицИсточников.Добавить("Продукция");
  ЗаполнитьТипыДокументовДляВыбора(ТипыДокументовДляВыбора, ИменаТаблицИсточников);
  ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьИзДокументаЗавершение", ЭтотОбъект);
  ТипыДокументовДляВыбора.ПоказатьВыборЭлемента(ОписаниеОповещения, НСтр("ru='Выбор типа данных'"));
КонецПроцедуры


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

 //Делаем оповещения выбираем процедуру "ДобавитьДокументЗавершение" (оповещение необходимо для получения ссылки на документ из формы выбора)
 ОткрытьФорму("Документ."+ВыбранноеЗначение.Значение+".ФормаВыбора", СтруктураПараметров, ЭтаФорма,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры


&НаКлиенте
Процедура ДобавитьДокументЗавершение_Стар(СсылкаНаПолученныйДокумент, Параметры) Экспорт
       Если СсылкаНаПолученныйДокумент = Неопределено Тогда
             Возврат;
       КонецЕсли;  
    // Произвести заполениеие табличной части !!!!
    ПроизводимЗаполнениеТЧ(СсылкаНаПолученныйДокумент);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьДокументЗавершение(ПолученныйДокумент, Параметры) Экспорт
 //ПолученныйДокумент это массив
 Если ПолученныйДокумент = Неопределено Тогда
  Возврат;
 КонецЕсли;  
 //получаем значение по индексу из массива
 Если ПолученныйДокумент.Количество() <> 0 Тогда
  Для Индекс = 0 По ПолученныйДокумент.Количество() - 1 Цикл
   СсылкаНаПолученныйДокумент = ПолученныйДокумент[Индекс];
  КонецЦикла;
 Иначе
  Возврат;
 КонецЕсли;

  // Произвести заполениеие табличной части !!!!
    ПроизводимЗаполнениеТЧ(СсылкаНаПолученныйДокумент);
КонецПроцедуры
// Данные процедуры взяты из типовой конфигурации БП 3.0 


&НаСервереБезКонтекста
Процедура ЗаполнитьТипыДокументовДляВыбора(СписокНужныхТипов, ИменаТаблицИсточников)
 // В случае добавления из документа должны выбираться только документы с таб. частью "Товары",
 // в которой есть реквизиты "Номенклатура", "Количество" доступные по функциональным опциям.

 СписокНужныхТипов.Очистить();

 Для Каждого Документ Из Метаданные.Документы Цикл

  Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(Документ) Тогда
   Продолжить;
  КонецЕсли;

  Если Не ПравоДоступа("Просмотр", Документ) Тогда
   Продолжить;
  КонецЕсли;

  Для Каждого ИмяТаблицы Из ИменаТаблицИсточников Цикл

   Если Документ.ТабличныеЧасти.Найти(ИмяТаблицы) = Неопределено Тогда
    Продолжить;
   КонецЕсли;

   Если ОбщегоНазначенияБПЕстьРеквизитТабЧастиДокумента("Номенклатура", Документ, ИмяТаблицы)
    И ОбщегоНазначенияБПЕстьРеквизитТабЧастиДокумента("Количество",  Документ, ИмяТаблицы) Тогда
 
    СписокНужныхТипов.Добавить(Документ.Имя, Документ.Представление());
    Прервать;
 
   КонецЕсли;

  КонецЦикла;

 КонецЦикла;

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




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




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


&НаСервере
Процедура ПроизводимЗаполнениеТЧ(СсылкаНаПолученныйДокумент)
  Объект.Товары.Очистить();
  ПолученныйДокумент = СсылкаНаПолученныйДокумент.ПолучитьОбъект(); 
   //Получаем список товаров из документа
   Если  ПолученныйДокумент.Товары.Количество() <> 0 Тогда
    Для Каждого СтрокаТабЧасти Из ПолученныйДокумент.Товары Цикл
      ТЧТовары      = Объект.Товары.Добавить();
      ТЧТовары.Номенклатура  = СтрокаТабЧасти.Номенклатура;
      ТЧТовары.Штрихкод   = ПолучитьНомерШтрихКода(СтрокаТабЧасти.Номенклатура);
      ТЧТовары.Цена    = ПолучитьЦену(СтрокаТабЧасти.Номенклатура);
      ТЧТовары.ОптоваяЦена  = ПолучитьОптовуюЦену(СтрокаТабЧасти.Номенклатура);
      ТЧТовары.ОстатокНаСкладе = ПолучитьКоличествоОстатокНаСкладе(СтрокаТабЧасти.Номенклатура);
      ТЧТовары.ШаблонЦенника   = Справочники.ШаблоныЭтикетокИЦенников.НайтиПоНаименованию("Бирка 30х42");
      ТЧТовары.КоличествоЦенников = 1;
    КонецЦикла;
   КонецЕсли;
КонецПроцедуры


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


&НаСервере
Функция  ПолучитьМенеджера()
 Возврат Справочники.Пользователи.НайтиПоНаименованию("Фамилия Имя Отчество");
КонецФункции
#КонецОбласти

Комментариев нет:

Отправить комментарий