Имеем:
Внешнюю обработку с двумя формами:
- Форма
- ФормаОтчета
На форме "Форма" есть ТЗ (НоменклатураДляЗагрузки), которую нужно передать на форму ФормаОтчета для подстановки в Запрос. ТЗ не типизированна.
Решение:
Форма "ФормаОтчета" должна открывать по нажатию кнопки. Поэтому создаем кнопку на форме "Форма", привязываем ее к команде (ОтчетОбОстатках), создаем процедуру НаКлиенте в модуле формы:
&НаКлиенте
Процедура ОтчетОбОстатках(Команда)
//Получаем форму
ФормаОтчета=ПолучитьФорму("ВнешняяОбработка.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Цвета.Серый;
КонецЕсли;
КонецЦикла;
ОтчетОбОстатках.ЗакончитьГруппуСтрок();
КонецЦикла;
КонецПроцедуры
Вот и все :-)
Комментариев нет:
Отправить комментарий