Белозеров Дмитрий | Системный архитектор | LMSoft

«Кодогенерация и метагенерация в 1С»

Примерно год назад жизнь заставила меня задуматься над таким вопросом - а не разработать ли язык (точнее псевдоязык), с помощью которого можно было бы программно работать с метаданными 1С, писать скрипты, которые выполняют те же действия, которые выполняет разработчик в конфигураторе... В этом докладе хочу рассказать о том как мы разрабатывали такой инструмент, с какими сложностями и нюансами столкнулись, и что получилось в итоге. Мы рассмотрим реальные кейсы использования автоматической генерации метаданных 1С, в которых использование такого подхода дает серьёзные преимущества и сильно облегчает жизнь разработчика (иногда настолько облегчает что можно обойтись вообще без него :), увидим как инструмент генерации можно вписать в общий контур continuous integration. А ещё обсудим перспективы использования подобных практик (генерация конфигурации на основе формализованных функциональных моделей, реализация библиотечного подхода к разработке прикладных решений).

[СКД] Данные нижеприведенного запроса по контактной информации контрагентов выводятся с помощью СКД в табличный документ.

1. allgorhythm 23.12.16 15:20 Сейчас в теме
1. Как отобразить колонку АДРЕС в группировках?

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


При группировке данных по контрагентам отчет выводится в виде




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




2. Следующий запрос выводит в отчет, построенный на основе СКД, список авансовых отчетов..

ВЫБРАТЬ
	АвансовыйОтчет.Номер,
	АвансовыйОтчет.Дата,
	АвансовыйОтчет.СуммаДокумента
ИЗ
	Документ.АвансовыйОтчет КАК АвансовыйОтчет


Получается отчет виде


Дата Номер Сумма документа
09.06.09 00000000002 2 400,00
19.06.09 00000000003 401 000,00
13.11.09 00000000004 1 200,00


Каким образом сделать так, чтобы номер выводился в отчет без лидирующих нулей?


Дата Номер Сумма документа
09.06.09 2 2 400,00
19.06.09 3 401 000,00
13.11.09 4 1 200,00
Ответы
Сортировка: Древо
2. allgorhythm 23.12.16 22:53 Сейчас в теме
Второй пункт я сделал сам,
в принципе это - не сложно,
делаем форму отчета,
в ней сами прописываем команду Сформировать и
в ней пишем код ниже:

&НаКлиенте
Процедура Сформировать(Команда)
	Для Ном=1 По Результат.ВысотаТаблицы Цикл
		Область = Результат.Область("R"+Ном+"C2");
		Пока Найти(Область.Текст, "0") Цикл
			Область.Текст = СтрЗаменить(Область.Текст, 0, "");
		КонецЦикла
	КонецЦикла;	
	          
КонецПроцедуры
Показать
3. Denis_CFO 9 24.12.16 05:58 Сейчас в теме
(2) боюсь при таком подходе у вас будут выводится номера не верные... Вы же все нули заменяете... У вас из 101 номера 11 получится....
4. Denis_CFO 9 24.12.16 06:11 Сейчас в теме
(2)
&НаКлиенте
Процедура Сформировать(Команда)
    Для Ном=1 По Результат.ВысотаТаблицы Цикл
        Область = Результат.Область("R"+Ном+"C2");
        Пока Лев(Область.Текст, 1) = "0" Цикл
                 Область.Текст = Сред(Область.Текст, 2);
        КонецЦикла
    КонецЦикла;    
КонецПроцедуры
Показать
5. allgorhythm 25.12.16 17:41 Сейчас в теме
(4) Да. Нолики не теряются,
выкладываю нормальный код по этому вопросу.


&НаКлиенте
Процедура Сформировать(Команда)
	СформироватьСРВ();	
	Для Ном=1 По Результат.ВысотаТаблицы Цикл
	    Область = Результат.Область("R"+Ном+"C2");
	    Пока Лев(Область.Текст, 1) = "0" Цикл
	             Область.Текст = Сред(Область.Текст, 2);
		КонецЦикла
	КонецЦикла;	
	          
КонецПроцедуры

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


В модуле объекта
Функция ПолучитьСКД() Экспорт
 возврат ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КонецФункции // ПолучитьМакет() Экспорт()
Оставьте свое сообщение
Все разделы

Вакансии

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 120 000 руб. до 160 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата до 160 000 руб.
Полный день

Удаленный бизнес-аналитик 1С
Санкт-Петербург
Временный (на проект)