Пример использования СКД и данных расшифровки на мобильной платформе

12.03.19

Разработка - СКД

СКД в мобильном приложении и меню действий на основе данных расшифровки (отчет, совместимый с мобильной платформой 8.3.13.45).

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
пример использования СКД и данных расшифровки на мобильной платформе:
.epf 12,53Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

Большинство уже знает около 400 сравнительно честных способов использования СКД на мобильной платформе 1С и столько же методов обработки данных расшифровки. Здесь я просто собрал в один рабочий модуль некоторые из них и, возможно, это поможет кому-то, пока мобильная платформа не начнёт поддерживать метаданные типа "Отчет".

А пока она их не поддерживает, создадим Обработку (у меня она внешняя по понятным причинам) и добавим Макет типа СхемаКомпоновкиДанных. Я использовал набор данных Объект, поэтому поля пришлось добавлять вручную. Кроме того созданы два варианта настроек, которые будут выбираться на форме отчёта (обработки).

 

 

Добавим форму вот с такими реквизитами, которые затем перетащим элементами на форму (кроме Адреса данных расшифровки):

 

Поле Периодичность - это выбор 0 или 1 из списка значений "0-Месяц,1-Квартал". Кнопки Просмотр и Печать используют соответствующие команды Табличного документа, а кнопку Сформировать и команду для неё в Обработке придётся сделать самостоятельно. У меня это одноимённая команда "Сформировать", которая запускает на клиенте процедуру "Сформировать"и так далее, до процедуры СформироватьНаСервере

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

	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
	// выбор варианта настроек по значению реквизита Периодичность на форме
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Получить(Периодичность).Настройки);
	Настройки = КомпоновщикНастроек.Настройки;
	    
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных , ДанныеРасшифровки);

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	// после Вывода помещаем Данные расшифровки во временное хранилище
	// и записываем адрес в реквизит АдресДанныхРасшифровки
	// лишнее из хранилища удаляем
	АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки,УникальныйИдентификатор);
	УдалитьИзВременногоХранилища(АдресСхемы);	
	
	// далее некоторые манипуляции с оформлением отчета
	ШрифтЗаголовка = Новый Шрифт(,12,Истина);
	ЦветЗаголовка = Новый Цвет(100,100,100);
	НайденЗаголовок = ДокументРезультат.НайтиТекст("Продажи номенклатуры со складов по периодам");
	Если НайденЗаголовок <> Неопределено Тогда
		НайденЗаголовок.Шрифт = ШрифтЗаголовка;
		НайденЗаголовок.ЦветТекста = ЦветЗаголовка;
	КонецЕсли;
	
	ШрифтФильтра = Новый Шрифт(,9,Ложь);
	ЦветФильтра = Новый Цвет(100,100,100);
	ОбластьФильтра = ДокументРезультат.Область("R3C1");
	ОбластьФильтра.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	ОбластьФильтра.Объединить();
	ОбластьФильтра.Шрифт = ШрифтФильтра;
	ОбластьФильтра.ЦветТекста = ЦветФильтра;
	ОбластьФильтра.Текст = "Номенклатура: " + ?(ЗначениеЗаполнено(Номенклатура),СокрЛП(Номенклатура),"Все")+ "; " +
							"Склад: " + ?(ЗначениеЗаполнено(Склад),СокрЛП(Склад),"Все");
	
	ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1);
	ДокументРезультат.АвтоМасштаб = Истина;
	
КонецПроцедуры

 

Отчёт уже работает, но вместо расшифровки показывает окошки с цифрами, потому что данные расшифровки на Клиент не передаются. Стандартную обработку расшифровки необходимо переписывать. В поле табличного документа на форме ищем событие Обработка расшифровки и цепляем к нему свою процедуру:

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

 

Здесь я сначала получаю на сервере МенюРасшифровки, которая вызвала событие:

&НаСервере
Функция ПолучитьРасшифровкуНаСервере(Расшифровка)
	
	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
	Поля = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля();
	
	МенюРасшифровки = Новый СписокЗначений;	
	
	РасшифровкаНоменклатура = Поля.Найти("Номенклатура");
	Если РасшифровкаНоменклатура <> Неопределено Тогда
		Если ЗначениеЗаполнено(РасшифровкаНоменклатура.Значение.Родитель) Тогда
			МенюРасшифровки.Добавить(РасшифровкаНоменклатура.Значение.Родитель,"Отбор по группе "+Строка(РасшифровкаНоменклатура.Значение.Родитель));
		КонецЕсли;
		МенюРасшифровки.Добавить(РасшифровкаНоменклатура.Значение,"Отбор по "+Строка(РасшифровкаНоменклатура.Значение));
	КонецЕсли;
	
	РасшифровкаСклад = Поля.Найти("Склад");
	Если РасшифровкаСклад <> Неопределено Тогда
		Если ЗначениеЗаполнено(РасшифровкаСклад.Значение.Родитель) Тогда
			МенюРасшифровки.Добавить(РасшифровкаСклад.Значение.Родитель,"Отбор по группе "+Строка(РасшифровкаСклад.Значение.Родитель));
		КонецЕсли;
		МенюРасшифровки.Добавить(РасшифровкаСклад.Значение,"Отбор по "+Строка(РасшифровкаСклад.Значение));
	КонецЕсли;
	
	МенюРасшифровки.Добавить(0," + Свернуть все");
	МенюРасшифровки.Добавить(1," - Развернуть все");
	МенюРасшифровки.Добавить(2,"Снять отбор");
	
	Возврат МенюРасшифровки;
	
КонецФункции

 

А после того, как пользователь выбрал из меню какой-то пункт, этот выбор обрабатывается в процедуре ВыборРасшифровкиПродаж

 

&НаКлиенте
Процедура ВыборРасшифровкиПродаж(Результат,Параметры) Экспорт
	
	Если ТипЗнч(Результат) = Тип("ЭлементСпискаЗначений") Тогда
		СтруктураПараметров = Новый Структура;
		// отбор по номенклатуре
		Если ТипЗнч(Результат.Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
			СтруктураПараметров.Вставить("Номенклатура",Результат.Значение);
			СформироватьНаСервере(СтруктураПараметров);
		// отбор по складам
		ИначеЕсли ТипЗнч(Результат.Значение) = Тип("СправочникСсылка.Склады") Тогда
			СтруктураПараметров.Вставить("Склад",Результат.Значение);
			СформироватьНаСервере(СтруктураПараметров);
		// снять отбор
		ИначеЕсли ТипЗнч(Результат.Значение) = Тип("Число") Тогда
			Если Результат.Значение = 2 Тогда
				СтруктураПараметров.Вставить("Номенклатура", ПолучитьПустуюНоменклатуру());
				СтруктураПараметров.Вставить("Склад",ПолучитьПустойСклад());
				СформироватьНаСервере(СтруктураПараметров);
			// свернуть / развернуть
			Иначе
				ДокументРезультат.ПоказатьУровеньГруппировокСтрок(Результат.Значение);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

 

Вот и всё. Посмотреть как это работает, можно на конфигурации УТ 11 или любой другой, где есть Справочники "Номенклатура, Склады", регистр ТоварыНаСкладах и Документ РасходныйОрдерНаТовары. Ну или адаптировать запрос. 

 

 

В мобильном приложении это будет выглядеть примерно так (конфигурация другая, но методы в отчёте аналогичные):

 

 

мобильная платформа СКД расшифровка обработка отчет

См. также

SALE! %

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 10000 руб.

02.09.2020    163127    900    401    

880

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    9396    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    7385    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3231    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    11101    24    John_d    25    

125

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    8421    PROSTO-1C    15    

68
Оставьте свое сообщение