Крючков Владимир | Начальник сектора разработки | ООО "Группа Полипластик"

«Как мы разрабатываем в EDT»

1. Ответим на вопрос как мы переходили на разработку в EDT. Где было больно и что стало лучше? Где светлое будущее? 2. Расскажем про использование процессов разработки для коммерческих продуктов и open source. Что такое «Git Flow», «Git Lab Flow» и «Git Hub Flow» в чем их отличие и в чем сила? 3. Командная разработка в новых реалиях: Где и как нам помогает SCRUM? Как и где используем KANBAN? Нужно ли следовать за белым кроликом? 4. Про системы баг трекинга: Интеграция с системами баг трекинга для коммерческих решений на примере JIRA. Достаточно ли возможностей «Git Hub Issue» для open source? 5. Про репозитарии: Какой репозитарий выбрать? Что такое «bitbucket», «github» и что они умеют? Как все это увязать с EDT и баг трекингом? Когда использовать приватные, а когда публичные хранилища? 6. Используем новые волшебные возможности: автосборка релиза, code review, pull request, ветвление (bruches) и др. Как именовать ветки и что писать в коммитах чтобы получить профит. 7. Немного про качество продукта: Как мы запускаем тесты при разработке в EDT? Как используем open source Фреймворк «Тестирование 3.0»?

1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений, Таблицы и Отчетов до СКД без объекта-отчета

Программирование - Практика программирования

Самый важный аспект 1С - это быстро получить данные из базы. Например, по результату набранного в КонсолиЗапросов запроса вывести этот результат на экран. А еще лучше, когда мы вызываем выборку данных из конкретного документа и, конечно, желаем, чтобы параметры по этому документу тоже были переданы в выборку. Здесь мы будем выводить данные на экран по нажатию кнопки в документе, обязательно с получением в параметрах значений из документа. Рассмотрим 8 вариантов вывода подобной информации на экран: 1.Вывод результатов запроса командой Сообщить() из ТаблицыЗначений; 2.Вывод результатов запроса - просто в табличный документ; 3.Вывод результатов запроса с помощью ДвумерногоМассива; 4.Вывод результатов запроса с помощью МассиваСтруктур (с двумя вариантами); 5.Вывод обычным объект-Отчетом без СКД; 6.Вывод объект-Отчетом-СКД+УстановкаПараметров; 7.Вывод объект-Отчетом-СКД+ВнешняяВременнаяТаблица; 8.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица.

В ссылке лежит база-черновик, созданная на платформе 1С8.3 управляемые формы. У меня настроен безМодальный режим, его всегда можно изменить на модальный:правой клавишей мыши на саму конфигурацию Черновик-Свойства-вкладка Совместимость-режимы модальности(2 поля) см.рис1

В базе-Черновике создан пример Документа и необходимых для него справочников,все данные выдуманные. Эта база создавалась больше как напоминалка - как быстенько сделать тот или иной отчет (или др.способом вывести данные на экран). В реальной жизни - параметры,передающиеся из документа могут быть в разы сложнее,но разобравшись с азами вывода данных,-потом любой сложности отчет не составит труда сделать.

Начнем.

1.Вывод результатов запроса командой Сообщить() из ТаблицыЗначений

Допустим, у нас есть задача: выбрать данные из пары справочников (справочники организованы с табличной частью),но не все данные этих справочников нам нужны,а только те,которые соответствуют открытому на данный момент документу.

Для этого - мы на форму документа вывели кнопку "КонтактыКлиентов", в модуле формы данного документа - у нас есть исполняющая клиентская процедура КонтактыКлиента(Команда), вот здесь и начнем писать первый код.

Код уже в базе написан,просто ставьте/снимайте ремарки с нужного варианта нашего вывода данных на экран:

В данном варианте  мы создаем Структуру,записываем в нее данные по Контрагентам и Партнерам из текущего открытого документа.А далее передаем управление в серверную процедуру КонтактыКлиентаНаСервере(Структура,ТабДок). Эта серверная процедура вызывает расчетную экспортную функцию сервера из ОбщегоМодуля.

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

вот код подобного запроса, в параметрах которого внешняя временная таблица:

ВЫБРАТЬ
	ВнешниеДанные.Контрагенты,
	ВнешниеДанные.Партнеры
ПОМЕСТИТЬ ВнешниеДанные
ИЗ
	&ВнешниеДанные КАК ВнешниеДанные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	КонтрагентыКонтактнаяИнформация.Представление,
	КонтрагентыКонтактнаяИнформация.Вид.Наименование
ИЗ
	ВнешниеДанные КАК ВнешниеДанные
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
		ПО ВнешниеДанные.Контрагенты = КонтрагентыКонтактнаяИнформация.Ссылка

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ПартнерыКонтактнаяИнформация.Представление,
	ПартнерыКонтактнаяИнформация.Вид.Наименование
ИЗ
	ВнешниеДанные КАК ВнешниеДанные
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
		ПО ВнешниеДанные.Партнеры = ПартнерыКонтактнаяИнформация.Ссылка

Логика понятна - как мы с помощью запроса с параметром "ВнешниеДанные" получаем необходимую нам выбоку, теперь вновь возвращаемся в наш документ.

Итак,расчетная серверная функция просто решает тот запрос,который мы только что составили в КонсолиЗапросов.

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

Здесь вы можете видеть, что в конце расчетной функции заремарен код вывода данных в виде сообщений. Поэкспериментируйте - разремарьте этот кусочек кода:

		ТаблицаЗапр=РезультатЗапроса.Выгрузить();
		Для каждого Стр Из ТаблицаЗапр Цикл				
			   Сообщить("ВидКонтактов="+Стр.ВидКонтактов+" Контакты="+Стр.Контакты);
		КонецЦикла; 		

В документе в процедуре КонтактыКлиента -можете поставить ремарку на

//ТабДок.Показать();

Все,запускайте пользовательский режим 1С,открывайте любой документ, жмите кнопку "КонтактыКлиента",у вас получится вот такой вывод данных выборки в виде Сообщений:

2.Вывод результатов запроса - просто в табличный документ

Востановите ремарки в расчетной серверной процедуре из ОбщегоМодуля, снимите ремарку в модуле формы документа ТабДок.Показать();

Запускайте вновь пользовательский режим 1С, после нажатия на кнопку "КонтактыКлиентов" - мы получаем вывод нашей выборки в обычный ТабличныйДокумент:

3.Вывод результатов запроса с помощью ДвумерногоМассива

Заремарьте в модуле формы в проц.КонтактыКлиента(Команда) код с 1-2 вариантов вывода данных на экран.

Разремарьте тут же 3-й вариант

//3.Рабочий вариант с Двумерным массивом
        Структура=Новый Структура("Партнеры,Контрагенты",Объект.Партнер,Объект.Контрагент);
    	ДвумерныйМассив=ОбщийМодульКонтакты.КонтактыКлиентаНаСервереМодульОбщийМассив(Структура);	
    	 н=0;
    	 Для каждого СтрокаМассива Из ДвумерныйМассив  Цикл
    	 	 Сообщить("" + ДвумерныйМассив[н][0]+ДвумерныйМассив[н][1]);
    	     н=н+1;
    	 КонецЦикла; 

Здесь и в 4-м варианте реализована прежде всего суть всех страданий 1.8.3: их работой в клиент-серверном режиме)).

Так как нельзя между клиентом и сервером перегонять таблицу значений, а нам,допустим, ну очень нужно итоговые данные из расчетной процедуры видеть на клиенте, то варианта два - передавать между клиентом и сервером Структуру или Массив!

В этом примере - мы так же с помощью нашего сложного запроса считаем все данные в серверной процедуре в ОбщемМодуле, результаты запроса по этим расчетам - выгружаем в двумерный Массив и отправляем его на клиента,где пока все просто выводится сообщениями.

4.Вывод результатов запроса с помощью МассиваСтруктур (с двумя вариантами)

точно такой же подход,как в примере выше,только мы не просто загоняем данные из результата запроса в определенного размера Массив, а загружаем их в МассивСтруктур - очень интересный способ, его мне подсказал Алексей (Alexey_)  (в этой теме https://forum.infostart.ru/forum9/topic184275/).Спасибо.

5.Вывод обычным объект-Отчетом без СКД

Это все тот же запрос, просто в данном варианте - он находится в модуле формы объекта-Отчета.Все так же считает. Результат выводится через табличный документ в МакетОтчета, который сама как придумала,так и нарисовала:

п.с.Это самый стандартный способ вывода данных - через обычный объект-Отчет с обычным Макетом, без всяких СКД....и запрос для него очень быстро набрать в КонсолиЗапросов можно...Не знаю, мне больше всего нравится именно этот вариант, но как говорят -каждому на свой вкус и цвет...

6.Вывод объект-Отчетом-СКД+УстановкаПараметров

Начинается СКД - Схема Компановки Данных...

Сам отчет получился очень простой - в нем нет практически кода, всю работу выполняет СКД!

Но вот с составлением запросов в данном СКД - пришлось повозиться...Здесь нет никакой внешней временной таблицы - связь идет через Параметр документа &Ссылка. А вот как передать ее в СКД - я голову поломала немножко)) Потом просто пришлось использовать дополнительный реквизит на форме - в него загружать Параметр ссылки при процедуре ПриСозданииНаСервере,а потом из процедуры ПриКомпоновкеРезультата - выхватывать этот параметр с реквизита формы и устанавливать его стандартными настройками установки параметров для объекта-Отчета.

На идею - попробывать создать сложные запросы без внешней временной таблицы натолкнул Sergey Andreev (starik-2005).Спасибо.

Вот такая красота в итоге:

7.Вывод объект-Отчетом-СКД+ВнешняяВременнаяТаблица

В этом варианте у нас как и раньше (кроме п.6) фильтр по отбираемым данным справочникам идет с помощью внешней временной таблицы, в которую мы загружаем данные из документа.

Только здесь так же пришлось переработать запросы в СКД, а так же изменить структуру самой временной таблицы Параметров. Чтобы связать временную таблицу в СКД с выборкой из справочника - данную таблицу пришлось превратить в однуколоночную, но с составным типом данных! ссылки на сайты,где я нашла как сделать составной тип данных есть вот в этой теме https://forum.infostart.ru/forum9/topic184320/#message1911641

	ВнешниеДанные=Новый ТаблицаЗначений;

	СписокТипов = Новый Массив;
    СписокТипов.Добавить("СправочникСсылка.Партнеры");
    СписокТипов.Добавить("СправочникСсылка.Контрагенты");
    ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
	
	ВнешниеДанные.Колонки.Добавить("Ссылка",ОписаниеСоставногоТипа);

вот такой вид имеет этот вариант:

8.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица

А теперь представим, что нам срочно нужно вывести какие-нибудь расчеты, но по непонятным причинам - мы не можем воспользоваться объектом-Отчет))

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

Оставила в этом варианте прикрепленный еще один МакетСКД - возможно кто-то сможет с помощью него пойти по пути передачи параметра,н-р, &Ссылки (у меня в этом вареанте решено через внешнюю врем.таб) - я сколько не пыталась подгрузить в Параметры СКД при режиме отсутствия объекта-Отчета - у меня не пошло...

Но так как рабочим механизмом здесь является программно вызываемый СКД, то в нашей табличке мы можем установить шаблонМакетов - все же красивее смотрится!))

Вот и все!!! Теперь не только начинающие программисты смогут быстренько что-то вывести на экран, а и опытные пользователи смогут разобраться в приведенных примерах и вуа-ля! самой большой сложности отчет готов!!!

С ув.

Скачать файлы

Наименование Файл Версия Размер
1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений,Таблицы и Отчетов до СКД без объекта-отчета:
.dt 111,54Kb
14.01.18
0
.dt 111,54Kb Скачать

См. также

Комментарии
Сортировка: Древо
1. starik-2005 1384 14.01.18 22:54 Сейчас в теме
Для вывода отчета в СКД достаточно вызвать ОткрытьФорму("Отчеты.КонтактыКонтрагентаПартнера", Новый Структура("Отбор, СформироватьПриОткрытии", Новый Структура("Контрагент", Контрагент), Истина), ..., ) - должно отработать, если в отчете есть поле "Контрагент". Фактически в СКД достаточно засунуть простой отчет типа "ВЫБРАТЬ Ссылка КАК Контрагент, Вид, Представление ИЗ Справочник.Контрагенты.КонтактнаяИнформация", ну и соединить это с контактной информацией партнера (в партнере есть контрагент, так что запрос будет такой "ВЫБРАТЬ Ссылка.Контрагент КАК Контрагент, Вид, Представление ИЗ Справочник.Партнеры.КонтактнаяИнформация" - вот это можно просто либо объединением в один запрос засунуть, либо два запроса объединить компоновкой. И СКД при открытии формы сам Вам все отберет и покажет...

https://infostart.ru/public/565658/
jan-pechka; +1 Ответить
2. starik-2005 1384 14.01.18 23:16 Сейчас в теме
Вообще, вот как это надо делать:
Команда в справочнике "Контрагенты":
&НаКлиенте
Процедура Контакты(Команда)
	ОткрытьФорму("Отчет.Контакты.ФормаОбъекта", Новый Структура("КлючВарианта, Отбор, СформироватьПриОткрытии", "Основной", Новый Структура("Ссылка", Объект.Ссылка), Истина));
КонецПроцедуры

Отчет прикреплен.
Прикрепленные файлы:
Контакты.erf
jan-pechka; +1 Ответить
3. jan-pechka 131 15.01.18 18:32 Сейчас в теме
(2)
Отчет прикреплен.


Немножко не совсем то что я решала по задачке, но сам смысл-
добавлять в справочник свой вариант отбора-интересен!

п.с.Не знаю пока чего идет ошибка:"Невозможно применить фиксированные настройки. Пересекаются элементы отбора." ...Из Вашей статьи нашла ответ:"Но если Вам нужно отбрать по реквизиту табличной части, то такой метод не подходит"

п.с.2 нужно будет разобраться с Вашим вариантом отбора...что-то в нем есть

Спасибо огромное,Сергей
Прикрепленные файлы:
4. starik-2005 1384 15.01.18 19:04 Сейчас в теме
(3)
Не знаю пока чего идет ошибка:"Невозможно применить фиксированные настройки. Пересекаются элементы отбора."
Удалите отбор из варианта отчета. Из параметра "Отбор" при открытии формы формируется пакет фиксированных настроек, и если она пересекаются с настройками пользователя, то возникает такая вот ошибка.

Как вариант - скопируйте вариант отчета и назовите его, например, "ОтдельныйОтчет", и его уже поместите параметр в "КлючВарианта".
jan-pechka; +1 Ответить
5. jan-pechka 131 15.01.18 19:52 Сейчас в теме
(4)
Удалите отбор из варианта отчета


Работает! Красиво. и быстро! Спасибо!!!

п.с.жаль только что можно передавать отбор по вызвавшему эту Команду объекту-справочнику(и его реквизитам)...
Проще вызвать стандартный КонструкторПечати в справочниках и Доках...

Но вот если такую ссылку на отбор и печать объекта вставить в сложный ПВХ или регистрСведений,например, то очень становится интересно!!!
Прикрепленные файлы:
Оставьте свое сообщение