12 января 2016 г.

1С УФ Передача ТЗ между формами внешней обработки



Имеем:
Внешнюю обработку с двумя формами:
  1. Форма
  2. ФормаОтчета
На форме "Форма" есть ТЗ (НоменклатураДляЗагрузки), которую нужно передать на форму ФормаОтчета для подстановки в Запрос. ТЗ не типизированна.


Решение:
Форма "ФормаОтчета" должна открывать по нажатию кнопки. Поэтому создаем кнопку на форме "Форма", привязываем ее к команде (ОтчетОбОстатках), создаем процедуру НаКлиенте в модуле формы:

&НаКлиенте
Процедура ОтчетОбОстатках(Команда)
//Получаем форму
 ФормаОтчета=ПолучитьФорму("ВнешняяОбработка.TabletPOSЗагрузка.Форма.ФормаОтчета",,ЭтотОбъект);
//Передаем в реквизит формы адрес хранилища
 ФормаОтчета.АдресХран=ЗагрузитьТЗвХран();
//Заполняем дополнительные реквизиты формы
 ФормаОтчета.НоменклатураПрефикс=ЭтаФорма.НоменклатураПрефикс;
 ФормаОтчета.НоменклатураРодитель=ПолучитьРодителяНоменклатуры();
//Открываем форму
 ФормаОтчета.Открыть();
КонецПроцедуры

//Помещаем ТЗ во ВременноеХранилище с сервера
&НаСервере
Функция ЗагрузитьТЗвХран()
//Второй параметр функции ОБЯЗАТЕЛЕН!!!
 АдресХран=ПоместитьВоВременноеХранилище(НоменклатураДляЗагрузки.Выгрузить(,"Кодтовара,Количество"),Новый УникальныйИдентификатор);
 Возврат(АдресХран);
КонецФункции



В модуле формы "ФормаОтчета" создаем процедуру (мне нужно было при открытии):

&НаКлиенте
Процедура ПриОткрытии(Отказ)
 ПриОткрытииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере()
//Проверяем на пустоту реквизит с адресом
 Если НЕ АдресХран="" Тогда
//Создаем массивы типов для типизации колонок ТЗ
  МассивТиповСтрокаТабл=Новый Массив;
  МассивТиповСтрокаТабл.Добавить(Тип("Строка"));
  МассивТиповЧислоТабл=Новый Массив;
  МассивТиповЧислоТабл.Добавить(Тип("Число"));
  КвалСтрок=Новый КвалификаторыСтроки(25);
  МассивТиповНомССылкаТабл=Новый Массив;
  МассивТиповНомССылкаТабл.Добавить(Тип("СправочникСсылка.Номенклатура"));
//Создаем ТЗ, Добавляем колонки с ОписаниемТипов  
   ТаблицаСФормы=Новый ТаблицаЗначений;
  ТаблицаСФормы.Очистить();
  ТаблицаСФормы.Колонки.Добавить("Кодтовара",Новый ОписаниеТипов(МассивТиповСтрокаТабл,,,,КвалСтрок));
  ТаблицаСФормы.Колонки.Добавить("КоличествоИзPOS",Новый ОписаниеТипов(МассивТиповЧислоТабл));
  ТаблицаСФормы.Колонки.Добавить("НоменклатураИзPOS",Новый ОписаниеТипов(МассивТиповНомССылкаТабл));   
  ТаблицаСФормы.Колонки.Добавить("НаименованиеТовараИзPOS",Новый ОписаниеТипов(МассивТиповСтрокаТабл,,,,Новый КвалификаторыСтроки(250)));

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

 КонецЕсли;
//В принципе все
//Передали ТЗ и типизировали ее, теперь можно подставить в запрос и радоваться жизни
//
ТекстЗапроса=Новый Запрос;
 ТекстЗапроса.Текст="ВЫБРАТЬ
      | ТаблицаСФормы.КодТовара КАК Артикул,
      | ТаблицаСФормы.КоличествоИзPOS КАК КоличествоИзPOS,
      | ЕСТЬNULL(ТаблицаСФормы.НоменклатураИзPOS, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК НоменклатураИзPOS,
      | ТаблицаСФормы.НаименованиеТовараИзPOS КАК НаименованиеТовараИзPOS
      |ПОМЕСТИТЬ ВремТаблицаСФормы
      |ИЗ
      | &ВнешТаблицаСФормы КАК ТаблицаСФормы
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      | ХозрасчетныйОстатки_КонОст.Счет КАК Счет,
      | ЕСТЬNULL(ХозрасчетныйОстатки_КонОст.Субконто1, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
      | ПРЕДСТАВЛЕНИЕ(ХозрасчетныйОстатки_КонОст.Субконто1) КАК ПредставлениеНоменклатура,
      | ХозрасчетныйОстатки_КонОст.СуммаОстаток КАК Сумма,
      | ХозрасчетныйОстатки_КонОст.КоличествоОстаток КАК Количество,
      | ЕСТЬNULL(ХозрасчетныйОстатки_КонОст.Субконто2, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Склад,
      | ХозрасчетныйОстатки_КонОст.Субконто2.Наименование КАК НаименованиеСклад,
      | ХозрасчетныйОстатки_КонОст.Организация КАК Организация,
      | ХозрасчетныйОстатки_КонОст.Подразделение КАК Подразделение
      |ПОМЕСТИТЬ ВремОстаткиПо1С
      |{ВЫБРАТЬ
      | Счет.*,
      | Номенклатура.*,
      | Сумма,
      | Количество,
      | Склад.*,
      | Организация.*,
      | Подразделение.*}
      |ИЗ
      | РегистрБухгалтерии.Хозрасчетный.Остатки(&КонецПериода, Счет В (&СчетаУчетаСкладИНоменклатура) {(Счет).*}, &СубконтоНоменклатураИСклад, {(Организация).* КАК Организация, (Субконто1).* КАК Номенклатура, (Субконто2).* КАК Склад, (Подразделение).* КАК Подразделение}) КАК ХозрасчетныйОстатки_КонОст
      |ГДЕ
      | (&СкладИзТаблицы <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
      |    И ХозрасчетныйОстатки_КонОст.Субконто2 = &СкладИзТаблицы
      |   ИЛИ &СкладИзТаблицы = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
      |    И (&РодительИзТаблицы <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |      И ХозрасчетныйОстатки_КонОст.Субконто1.Родитель = &РодительИзТаблицы
      |     ИЛИ &РодительИзТаблицы = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)))
      |{ГДЕ
      | ХозрасчетныйОстатки_КонОст.СуммаОстаток КАК Сумма,
      | ХозрасчетныйОстатки_КонОст.КоличествоОстаток КАК Количество}
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      | ВремОстаткиПо1С.Счет,
      | ВЫБОР
      |  КОГДА ВремОстаткиПо1С.Номенклатура ЕСТЬ NULL 
      |    И ВремТаблицаСФормы.НоменклатураИзPOS = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |    И ВремТаблицаСФормы.Артикул <> """"
      |   ТОГДА ВремТаблицаСФормы.НаименованиеТовараИзPOS
      |  КОГДА ВремОстаткиПо1С.Номенклатура ЕСТЬ NULL 
      |    И ВремТаблицаСФормы.НоменклатураИзPOS <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |    И ВремТаблицаСФормы.Артикул <> """"
      |   ТОГДА ВремТаблицаСФормы.НоменклатураИзPOS.Наименование
      |  КОГДА ВремОстаткиПо1С.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |    И ВремТаблицаСФормы.НоменклатураИзPOS ЕСТЬ NULL 
      |    И ВремТаблицаСФормы.Артикул ЕСТЬ NULL 
      |   ТОГДА ""Пустая ссылка в оборотах""
      |  ИНАЧЕ ВремОстаткиПо1С.ПредставлениеНоменклатура
      | КОНЕЦ КАК ПредставлениеНоменклатура,
      | ВЫБОР
      |  КОГДА ВремОстаткиПо1С.Номенклатура ЕСТЬ NULL 
      |     И ВремТаблицаСФормы.НоменклатураИзPOS = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |     И ВремТаблицаСФормы.Артикул <> """"
      |    ИЛИ ВремОстаткиПо1С.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |     И ВремТаблицаСФормы.НоменклатураИзPOS ЕСТЬ NULL 
      |     И ВремТаблицаСФормы.Артикул ЕСТЬ NULL 
      |   ТОГДА ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |  КОГДА ВремОстаткиПо1С.Номенклатура ЕСТЬ NULL 
      |    И ВремТаблицаСФормы.НоменклатураИзPOS <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |    И ВремТаблицаСФормы.Артикул <> """"
      |   ТОГДА ВремТаблицаСФормы.НоменклатураИзPOS
      |  ИНАЧЕ ВремОстаткиПо1С.Номенклатура
      | КОНЕЦ КАК Номенклатура,
      | ВЫБОР
      |  КОГДА ВремТаблицаСФормы.Артикул ЕСТЬ NULL 
      |   ТОГДА ВремОстаткиПо1С.Номенклатура.Артикул
      |  ИНАЧЕ ЕСТЬNULL(ВремТаблицаСФормы.Артикул, """")
      | КОНЕЦ КАК Артикул,
      | ВремОстаткиПо1С.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
      | ВремОстаткиПо1С.Сумма,
      | ВремОстаткиПо1С.Количество,
      | ВЫБОР
      |  КОГДА ВремОстаткиПо1С.Номенклатура ЕСТЬ NULL 
      |    И ВремТаблицаСФормы.Артикул <> """"
      |   ТОГДА ""Без склада (серый - нет оборотов; оранжевый - нет в базе 1С)""
      |  ИНАЧЕ ВремОстаткиПо1С.НаименованиеСклад
      | КОНЕЦ КАК НаименованиеСклад,
      | ВремОстаткиПо1С.Организация,
      | ВремОстаткиПо1С.Подразделение,
      | ВремТаблицаСФормы.КоличествоИзPOS,
      | ВремОстаткиПо1С.Склад КАК Склад
      |ИЗ
      | ВремОстаткиПо1С КАК ВремОстаткиПо1С
      |  ПОЛНОЕ СОЕДИНЕНИЕ ВремТаблицаСФормы КАК ВремТаблицаСФормы
      |  ПО ВремОстаткиПо1С.Номенклатура.Артикул = ВремТаблицаСФормы.Артикул
      |
      |УПОРЯДОЧИТЬ ПО
      | Склад,
      | ВремОстаткиПо1С.Номенклатура
      |ИТОГИ ПО
      | НаименованиеСклад
      |АВТОУПОРЯДОЧИВАНИЕ" ;
//Заполняем параметры запроса 
 ТекстЗапроса.Параметры.Вставить("КонецПериода",ЭтаФорма.КонецПериода);
 ТекстЗапроса.Параметры.Вставить("СчетаУчетаСкладИНоменклатура",ПредопределенноеЗначение("ПланСчетов.Хозрасчетный.ТоварыНаСкладах"));
 СубконтоНоменклатураИСклад=Новый СписокЗначений;
 СубконтоНоменклатураИСклад.Добавить(ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура"));
 СубконтоНоменклатураИСклад.Добавить(ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады"));
 ТекстЗапроса.Параметры.Вставить("СубконтоНоменклатураИСклад",СубконтоНоменклатураИСклад);
 ТекстЗапроса.Параметры.Вставить("ВнешТаблицаСФормы",ТаблицаСФормы);       
 ТекстЗапроса.Параметры.Вставить("РодительИзТаблицы",ЭтаФорма.НоменклатураРодитель);    
 ТекстЗапроса.Параметры.Вставить("СкладИзТаблицы",ЭтаФорма.НоменклатураСклад);
 ТекстЗапроса.Параметры.Вставить("СубконтоНоменклатура",ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура"));

//Выполняем запрос, выгребать будем с группировками
 ВыполнитьЗапрос=ТекстЗапроса.Выполнить();
 ВыводЗапросаГруппа=ВыполнитьЗапрос.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"НаименованиеСклад");

//Начинаем работу  с макетом
 НомРодитель=?(ЭтаФорма.НоменклатураРодитель=Справочники.Номенклатура.ПустаяСсылка()," без группы",ЭтаФорма.НоменклатураРодитель.Наименование);
 НомСклад=?(ЭтаФорма.НоменклатураСклад=Справочники.Склады.ПустаяСсылка()," все склады",ЭтаФорма.НоменклатураСклад.Наименование);
 Макет=РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
 Область=Макет.ПолучитьОбласть("ШапкаТаблицы");
 Область.Параметры.НазваниеОрганизации=ЭтаФорма.ОрганизацияСсылка;
 Область.Параметры.Склад=Строка("Склад: "+НомСклад);
 Область.параметры.НоменклатураРодитель=Строка("Группа: "+НомРодитель);
 Область.Параметры.НаДату=Строка("Остатки товаров на "+Формат(ЭтаФорма.КонецПериода, "ДЛФ=ДД"));
 ОтчетОбОстатках.Вывести(Область);
 ОтчетОбОстатках.ФиксацияСверху=7;
 
//Заполняем макет
 Пока ВыводЗапросаГруппа.Следующий() Цикл
   Область=Макет.ПолучитьОбласть("Склад");
   Область.параметры.склад=ВыводЗапросаГруппа.НаименованиеСклад;
   Область.Параметры.КоличествоПоСкладу=ВыводЗапросаГруппа.Количество;
   ОтчетОбОстатках.Вывести(Область);
   ВыводЗапросаЭлементы=ВыводЗапросаГруппа.Выбрать(ОбходРезультатаЗапроса.Прямой);
   ОтчетОбОстатках.НачатьГруппуСтрок();
   Пока ВыводЗапросаЭлементы.Следующий() Цикл
    Область=Макет.ПолучитьОбласть("Номенклатура");
    Область.Параметры.Артикул=ВыводЗапросаЭлементы.Артикул;
    Область.Параметры.Номенклатура=ВыводЗапросаЭлементы.ПредставлениеНоменклатура;
    Область.Параметры.НоменклатураСсылка=ВыводЗапросаЭлементы.ПредставлениеНоменклатура;
    Область.Параметры.КоличествоОстаток=ВыводЗапросаЭлементы.Количество;
    Область.Параметры.КоличествоОстатокPOS=ВыводЗапросаЭлементы.КоличествоИзPOS;
    Область.Параметры.ЕдИзм=ВыводЗапросаЭлементы.ЕдиницаИзмерения;
    ОтчетОбОстатках.Вывести(Область);
    //Красим минуса
    Если ТипЗнч(ВыводЗапросаЭлементы.Количество)=Тип("Число") И ВыводЗапросаЭлементы.Количество<0 Тогда
     ОтчетОбОстатках.Область("КоличествоОстаток").ЦветТекста= WebЦвета.Красный;
    КонецЕсли;
    Если ТипЗнч(ВыводЗапросаЭлементы.КоличествоИзPOS)=Тип("Число") И ВыводЗапросаЭлементы.КоличествоИзPOS<0 Тогда
     ОтчетОбОстатках.Область("КоличествоИзPOS").ЦветТекста= WebЦвета.Красный;
    КонецЕсли;
    //Красим несовпадения
    Если ТипЗнч(ВыводЗапросаЭлементы.Количество)=Тип("Число") И ТипЗнч(ВыводЗапросаЭлементы.КоличествоИзPOS)=Тип("Число") И ВыводЗапросаЭлементы.Количество<>ВыводЗапросаЭлементы.КоличествоИзPOS Тогда
     ОтчетОбОстатках.Область("НомСтрока").ЦветФона=WebЦвета.ЛососьСветлый;
    КонецЕсли;
    Если ВыводЗапросаЭлементы.Номенклатура=Справочники.Номенклатура.ПустаяСсылка() 
       И ВыводЗапросаЭлементы.Артикул <>"" 
       И ВыводЗапросаЭлементы.Склад=NULL 
     Тогда ОтчетОбОстатках.Область("НоменклатураСсылка").ЦветТекста=WebЦвета.Коралловый;
    ИначеЕсли ВыводЗапросаЭлементы.Номенклатура<>Справочники.Номенклатура.ПустаяСсылка() 
       И ВыводЗапросаЭлементы.Артикул <>"" 
       И ВыводЗапросаЭлементы.Склад=NULL
     Тогда ОтчетОбОстатках.Область("НоменклатураСсылка").ЦветТекста=WebЦвета.Серый;
    КонецЕсли;
   КонецЦикла;
      ОтчетОбОстатках.ЗакончитьГруппуСтрок();
  КонецЦикла;



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


Вот и все :-)

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

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