"Меньше копипаста!", или как Вася универсальную процедуру писал

Публикация № 1082944

Разработка - Практика программирования

практика программирование СКД пример шаблон

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

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

 

1. Постановка цели

 

У программиста Васи простая задача - вывести программно СКД. Что делает среднестатистический разработчик? Копипастит в код заготовленный шаблон программного вывода. Когда нужно сделать таких выводов несколько штук с разными условиями? Делает несколько кусков однотипного кода, где меняется буквально пара параметров.


Но Вася не такой. Он ещё юн и свеж и полон решимости улучшать всё вокруг.

"Я делаю это, потому что копипасты - Зло!"

И для начала он копипастит пишет этот самый стандартный кусок кода.

//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

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

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

"Ну всё" - думает Вася. 

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

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

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

Этот код достаточно распространён и ещё не раз потребуется в разработке.

Однако, Вася идёт дальше... 

 

 

2. Варианты применения

 

"А что, если потребуется вывести результат в таблицу значений?"

Для этого используется немного другой кусок кода.

Вася нашёл его в гугле памяти и выделил для себя те участки, которые отличаются от предыдущего.

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

Отличия минимальные и юный разработчик берётся за доработку своего метода.

"Я делаю это, потому что нужен умный метод!"

Для этого Вася сначала решает, как метод будет определять необходимость вывода в табличный документ или в коллекцию.

Можно, конечно, сделать просто - добавить параметр в процедуру. Однако, Васин метод должен быть максимально "умным"!

Решено. Будем смотреть на тип параметра "Результат".

//Определяем тип генератора
Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда
    ВыводВКоллекциюЗначений = Истина;
    ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
Иначе
    ВыводВКоллекциюЗначений = Ложь;
    ТипГенератораВывода	    = Тип("ГенераторМакетаКомпоновкиДанных");
КонецЕсли;

А далее, в зависимости от значения переменной ВыводВКоллекциюЗначений, используем тот или иной код. Вася оглядывает получившийся метод:

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

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

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

 

3. Распространенные параметры


Что мы делаем, когда нужно выполнить СКД с внешним набором данных? Формируем программно точно так же, но с передачей ещё одного параметра:

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

Вот и Василий вспомнил об этом. И решил доработать свою процедуру.

"Я делаю это, потому что никто другой делать не захочет"

Он просто так не сдастся! Тем более, что тут всего лишь пара штрихов.

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

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

Красота! Всё, этот метод уже покроет большую часть необходимых программных выводов СКД.

Но почему-то Василий недоволен. Ему кажется, что что-то можно улучшить. Но что?

 

4. Дополнительные параметры


Какая-то неведанная сила толкнула юного разработчика открыть Синтаксис-Помощник...

Взгляните сами

<МакетОформления> (необязательный)

Тип: МакетОформленияКомпоновкиДанных. 
Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных. Если не указан, будет использоваться макет оформления по умолчанию.

<ПроверятьДоступностьПолей> (необязательный)

Тип: Булево. 
Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
Значение по умолчанию: Истина.

<ПараметрыФункциональныхОпций> (необязательный)

Тип: Структура. 
Содержит параметры функциональных опций, используемые при исполнении отчета.

<ВозможностьИспользованияВнешнихФункций> (необязательный)

Тип: Булево. 
Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
Значение по умолчанию: Ложь.

<ОграничиватьПолучениеПолейПоСсылкамПоПравуПросмотр> (необязательный)

Тип: Булево. 
Если значение параметра равно Истина, то при отображении результата запроса учитывается право пользователя "Просмотр" на таблицы и поля, участвующие в запросе. Если в отчете или динамическом списке присутствует значение поля недоступного по праву "Просмотр", то выводится пустая ячейка.
Если значение параметра равно Ложь и параметр ПроверятьДоступностьПолей установлен в Истина, то значение выводится, даже если у пользователя нет права "Просмотр".
Значение по умолчанию: Истина.
 

 

Василий узнал много нового. И теперь он жаждет открыть это для других. 

"Я это делаю, чтобы нести знания!".

Для начала он вставил все найденные параметры в методы.

//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, 
ДанныеРасшифровки, МакетОформления, ТипГенератораВывода, ПроверятьДоступностьПолей, ПараметрыФункциональныхОпций);

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

На входе в процедуру он решил выделить для всех новых параметров одну структуру "ДополнительныеПараметры".

Процедура СкомпоноватьРезультатОтчета(Результат, СхемаКомпоновкиДанных, НастройкиКомпоновки, 
	ДанныеРасшифровки = Неопределено, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
    

Василий вообще любит структуры. Он сделал отдельную "ПараметрыВывода", где прописал все используемые дополнительные параметры с их стандартными значениями. А потом просто дозаполняет эту структуру.

//Инициализируем дополнительные параметры вывода
ПараметрыВывода    = Новый Структура;
ПараметрыВывода.Вставить("МакетОформления"                        , Неопределено);
ПараметрыВывода.Вставить("ПроверятьДоступностьПолей"              , Истина);
ПараметрыВывода.Вставить("ПараметрыФункциональныхОпций"           , Новый Структура);
ПараметрыВывода.Вставить("ВозможностьИспользованияВнешнихФункций" , Ложь);

Если НЕ ДополнительныеПараметры = Неопределено Тогда
    ЗаполнитьЗначенияСвойств(ПараметрыВывода, ДополнительныеПараметры);
КонецЕсли;

Вася доволен тем, что получилось:

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

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

Метод, который полностью повторяет возможности платформенных, но при этом удобно обёрнут в универсальную процедуру.

"Ну теперь точно всё!".

И решил добавить ещё хотелочку...

 

5. Прихоть в мелочах

 

Метод готов. Но Васе хочется, чтобы он был ещё чуть по-умнее.

"Я делаю это, потому что хочу!"

И юный разработчик добавляет в начало процедуры обработку параметра с настройками.

//Инициализируем настройки
Если ТипЗнч(НастройкиКомпоновки) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
    ВыполняемыеНастройки    = НастройкиКомпоновки.ПолучитьНастройки();
ИначеЕсли ТипЗнч(НастройкиКомпоновки) = Тип("Строка") И ЭтоАдресВременногоХранилища(НастройкиКомпоновки) Тогда
    ВыполняемыеНастройки    = ПолучитьИзВременногоХранилища(НастройкиКомпоновки);
Иначе
    ВыполняемыеНастройки    = НастройкиКомпоновки;
КонецЕсли;

Если НЕ ТипЗнч(ВыполняемыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
    Возврат;
КонецЕсли;

Это позволит в метод передавать не только сами настройки, но и, к примеру, компоновщик настроек. Или же адрес хранилища, где настройки хранятся. Дополнительный штрих, который добавляет небольшую возможность.

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

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

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

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

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

 

6. Документирование

 

Василий добавляет описание к своему методу. Старается соблюдать "шаблоны" и рекомендации. Чтобы контекстная подсказка отображалась красиво и подхватывала и типы и описания.

// Выполняет компоновку СКД по переданным настройкам
//
// Параметры:
//  Результат               - ТабличныйДокумент,ТаблицаЗначений,ДеревоЗначений                      - результат выполнения
//  СхемаКомпоновкиДанных   - СхемаКомпоновкиДанных                                                 - выполняемая СКД
//  НастройкиКомпоновки     - НастройкиКомпоновкиДанных,КомпоновщикНастроекКомпоновкиДанных,Строка  - выполняемые настройки или адрес временного хранилища или компоновщик с настройками
//  ДанныеРасшифровки       - ДанныеРасшифровкиКомпоновкиДанных, Неопределено                       - данные расшифровки
//  ВнешниеНаборыДанных     - Структура, Неопределено                                               - коллекция внешних наборов данных
//  ДополнительныеПараметры - Структура, Неопределено                                               - коллекция внешних наборов данных
//       * МакетОформления              - МакетОформленияКомпоновкиДанных   - Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных.
//       * ПроверятьДоступностьПолей    - Булево - Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
//       * ПараметрыФункциональныхОпций - Булево - Содержит параметры функциональных опций, используемые при исполнении отчета.
//       * ВозможностьИспользованияВнешнихФункций - Булево - Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
//

Приходит время опробовать метод на практике.

 

7. Примеры использования

 

"Нужно сделать банальный програмный вывод СКД? Нате!"

//Стандартный программный вывод
СкомпоноватьРезультатОтчета(ДокументРезультат, СхемаКомпоновкиДанных, КомпоновщикНастроек, ДанныеРасшифровки);

Или же вывести результат в таблицу значений?

//Вывод в коллекцию значений
ДанныеРезультата = Новый ТаблицаЗначений;
СкомпоноватьРезультатОтчета(ДанныеРезультата, СхемаКомпоновкиДанных, КомпоновщикНастроек);

А может наоборот вывести СКД, используя содержимое таблицы значений?

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

Можно сделать стандартный вывод, но с возможностью использования "внешних функций"

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

Или, например, со своим макетом оформления

//Вывод с использованием своего макета оформления
ПараметрыВывода    = Новый Структура("МакетОформления", ПолучитьМакет("МакетОформления"));
СкомпоноватьРезультатОтчета(ДокументРезультат, СхемаКомпоновкиДанных, КомпоновщикНастроек, ДанныеРасшифровки,, ПараметрыВывода);

Васе нравится метод. Возможно, он не идеален. Возможно, эту процедуру никто и не заметит в закоулках модулей этой покрытой костылями и багами конфигурации. Но Вася всё равно доволен своей работой. Ведь на самом деле:

"Я делаю это, потому что мне просто нравится"

Вася похвалил себя, почесал ЧСВ и пошёл дальше заниматься своей работой. Ещё столько всего нужно скопипастить... 

 

Понравилась статья?

 

Не стойте в стороне! Не будьте равнодушными. Каждый поставленный вами "лайк" (а в случае с IS, "звёздочка") подскажут автору, что он не зря пропустил возможность пропустить по стаканчику, когда писал эту статью. И переходите к другим работам:

Сортируем ДанныеФормыДерево на клиенте

Не провоцируйте СКД, или пример "как не надо"

Менеджер открытых форм

 

P.S.: И вот вдогонку под спойлером окончательный вариант процедуры. Авось, кому пригодится.

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

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

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

 

Специальные предложения

Лучшие комментарии
8. SeiOkami 1579 04.07.19 11:04 Сейчас в теме
Кстати, забыл добавить.
Программист Вася - это кот.
Не спрашивайте почему. Просто так вышло.
user986734; brr; v_den_v; an35@mail.ru; zakiap; Jimbo; Tangram; PRESTRus; shaportoval; chebser; DoctorRoza; waol; Andreeei; user1067792; dock; torbeev; MikeI; nicxxx; denmax; О.Ж; wowik; Nelli_A86; botokash; Teut_Vlad; acanta; +25 1 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. leosoft 147 04.07.19 10:10 Сейчас в теме
2. Поручик 4428 04.07.19 10:12 Сейчас в теме
У меня есть что-то подобное. Я тоже люблю универсальные методы, выношу их в отдельные модули, стараюсь улучшать всё вокруг в разумных пределах.. Что в этом плохого?
brr; YPermitin; acanta; pavlov_dv; DenisCh; +5 Ответить
3. SeiOkami 1579 04.07.19 10:14 Сейчас в теме
Что в этом плохого?

(2) ничего плохого, сам их люблю и практикую. В принципе, об этом и статья )
Jimbo; YPermitin; acanta; +3 Ответить
41. Crazy_Max 63 05.07.19 13:11 Сейчас в теме
(2)Возможно, в этом и заключается смысл жизни, между прочим.
Причём, не только человеческой жизни, а и вообще феномена под названием "жизнь"...
4. SlavaKron 04.07.19 10:33 Сейчас в теме
Иногда, при использовании таблицы значений в качестве внешних наборов данных, требуется формировать ее с учетом отборов из НастройкиКомпоновки. Как бы Вася решил эту задачу?
romankoav; +1 Ответить
5. DoctorRoza 04.07.19 10:35 Сейчас в теме
Подобных участков кода можно много привести. И, как вариант, добавлять их в свой шаблон и вызывать по комбинации клавиш. Хорошая статья
6. genayo 04.07.19 10:55 Сейчас в теме
Хороший пример. Поделитесь с общественностью всей своей библиотекой полезностей :))
romankoav; RFP; json; CyberCerber; +4 Ответить
7. acanta 04.07.19 11:02 Сейчас в теме
Вариант с Леней Голубковым как то привычнее.
8. SeiOkami 1579 04.07.19 11:04 Сейчас в теме
Кстати, забыл добавить.
Программист Вася - это кот.
Не спрашивайте почему. Просто так вышло.
user986734; brr; v_den_v; an35@mail.ru; zakiap; Jimbo; Tangram; PRESTRus; shaportoval; chebser; DoctorRoza; waol; Andreeei; user1067792; dock; torbeev; MikeI; nicxxx; denmax; О.Ж; wowik; Nelli_A86; botokash; Teut_Vlad; acanta; +25 1 Ответить
10. Teut_Vlad 04.07.19 11:19 Сейчас в теме
(8)
klaus38; Maxx2008; IVVoronov; donkey; Crazy_Max; DoctorRoza; bulpi; dock; CnupT; SirAlexIT; AlenaR; Marliiin; t.v.s.; wowik; CyberCerber; nporrep; +16 Ответить
9. herfis 372 04.07.19 11:14 Сейчас в теме
А потом приходит Петя. Ему нужно доработать отчет.
Он открывает его и видит вызов нескольких универсальных процедур с тонной возможных параметров. Он начинает погружаться в дебри реализации, пытаясь понять, сможет ли он красиво вклиниться в эту чудесную, красивую и стройную архитектуру, подкупающую своей универсальностью.
Через час он понимает, что из всех предусмотренных этим чудесным швейцарским ножом на тысячи строк кода возможностей, в этом конкретном отчете используется от силы процента три. И они бы уложились в двадцать строк простого, понятного но шаблонного кода, куда бы он без труда смог бы начать добавлять требуемую функциональность уже через секунду после открытия незнакомого ему отчета.
Увы, в итоге он осознает что несколько нужных ему опций в прекрасной подсистеме не предусмотрено. Что же делать? Петя "правильный" программист, и старается выбирать "правильные" пути, а не "простые". Спустя еще час напряженной работы мозга, Петю озаряет как правильно нужно доработать подсистему, чтобы она красиво покрыла его кейсы (а заодно и десяток смежных!). Он добавляет новые опции в подсистему, расширяя ее функциональность и тщательно их документирует. Петя счастлив - он всегда выступал против "велосипедов" и всегда готов поддержать единомышленников. Ведь всем известно, что копипаст - это зло.
Теперь Антон, которому предстоит дорабатывать этот отчет, сможет сделать свою работу еще быстрее и качественнее.
Возможно, в процессе он даже напишет удобный DSL, который выведет универсальность подсистемы на невиданный ранее уровень.
Irwin; Merkalov; memb3r; logarifm; rmIvanT; krukoleg@mail.ru; maldinitaly; fvadim; user774630; astrallight; it_tungus; link_l; estima-1c; bulpi; dock; boln; SirAlexIT; sansys; ids79; Jeka44; qwinter; Xatori111; PowerBoy; lmnlmn; wowik; acanta; CyberCerber; AntonSm; +28 Ответить
21. genayo 04.07.19 12:23 Сейчас в теме
(9) Тут ведь главное - вовремя остановиться :))
23. herfis 372 04.07.19 12:35 Сейчас в теме
(21) Не совсем так. Иногда не стоит и начинать. Когда берется простой, понятный код небольшого размера и "универсализируется" за счет покрытия большого количества кейсов его использования - это как раз тот случай, когда вреда больше чем пользы. ИМХО, конечно.
memb3r; krukoleg@mail.ru; Бубузяка; it_tungus; bulpi; boln; FreeArcher; Krio2; RFP; ids79; qwinter; json; ZOMI; acanta; +14 Ответить
25. acanta 04.07.19 12:39 Сейчас в теме
(23) точно. Пишите на ассемблере. Он для каждого производителя компьютеров и для каждой модели свой.
Нафих кто-то си придумал..
И тем самым прекратил появление новых производителей компьютеров во всем мире и закрытие производства и ликвидацию разработок в бывшем СССР в том числе?
krukoleg@mail.ru; SeiOkami; +2 1 Ответить
26. herfis 372 04.07.19 13:05 Сейчас в теме
(25) Не очень понял комментарий. Типа я против добавления новых абстракций, облегчающих разработку? Вовсе нет. Я хотел сказать, что хорошая абстракция должна быть "глубокая", а не "широкая". Чем абстракция "уже" и "глубже" - тем сильнее она помогает и тем легче с ней работать. Польза "широкой" и "неглубокой" абстракции - минимальна. Вплоть до вреда. Да, экономим несколько строчек кода. Но за счет чего? Не за счет того, что мы инкапсулировали сложную реализацию. А за счет того, что мы засунули несколько вариантов реализации в один пакет и прилепили сверху выбор "программы". Завтра список "программ" захочется расширить еще больше, а послезавтра этим никто не захочет пользоваться, потому что быстрее написать эти несчастные несколько строчек, чем оживлять в мозгу эту неудобную абстракцию.
Irwin; Bazil; memb3r; bulpi; dock; user701287_darkowntheworld; Krio2; RFP; +8 Ответить
27. acanta 04.07.19 13:07 Сейчас в теме
(26) вооо́оо́т. Между завтра и послезавтра вполне может пройти несколько десятков лет.
И на что Вася будет жить все это время?
33. qwinter 624 04.07.19 15:59 Сейчас в теме
(25) А при чем тут ассемблер?
28. genayo 04.07.19 13:20 Сейчас в теме
(23) Ну в этом конкретном случае вроде как раз вовремя :) Хотя как по мне, я бы эту процедуру разбил на более мелкие, но это уже вкусовщина в общем :))
32. palsergeich 04.07.19 14:46 Сейчас в теме
(9) В итоге получается БСП на обслуживание которой через пару лет придется выделить отдел, потому что в 1с что то поменяли и все сломалось
Chai Nic; Lazy_Stranger; krukoleg@mail.ru; boln; the1; +5 Ответить
37. boln 1024 05.07.19 08:09 Сейчас в теме
(9) Ну да. Принцип программиста: LOW COUPLING, HIGH COHESION. А принцип (идеал) одинэсника: одна процедура для всего-всего-всего.
:)))
11. user705698_bursev 04.07.19 11:33 Сейчас в теме
Мне кажется, или в пятом пункте ошибка?

Если мы в качестве параметра НастройкиКомпоновки будем передавать сами настройки компоновки, то переменная ВыполняемыеНастройки будет Неопределено, и соответственно возврат. Думаю, нужно учесть тип данных НастройкиКомпоновкиДанных.
14. SeiOkami 1579 04.07.19 11:36 Сейчас в теме
(11)
в качестве параметра НастройкиКомпоновки будем передавать сами настройки компоновки, то переменная ВыполняемыеНастройки будет Неопределено, и соответственно возврат. Думаю, нужно учесть тип данных НастройкиКомпоновкиДанных.

Большое спасибо, глаз замылился и не заметил косяка. Изначально хотел добавить в статью пункт про "Тестирование", в котором Вася нашёл свой косяк. А потом убрал его, а поправить процедуру забыл) Поправим-с
40. boln 1024 05.07.19 10:57 Сейчас в теме
(11)
Мне кажется, или в пятом пункте ошибка?
Только прожившие полжизни в СССР способны оценить смысл этой фразы :)))
krukoleg@mail.ru; +1 Ответить
12. Synoecium 699 04.07.19 11:34 Сейчас в теме
пока читал, почему-то думал, что Вася в конце сравнит вызов своей процедуры и типовую обвязку для СКД и поймет, что это примерно одно и тоже, только теперь новому программисту ещё придется разбираться с мыслями автора, чтобы вызвать Васину процедуру.
Я не против универсальных процедур, просто всегда стоит задавать вопрос, надо ли городить огород в конкретном случае.
krukoleg@mail.ru; CyberCerber; +2 Ответить
13. shalimski 6 04.07.19 11:34 Сейчас в теме
Параметр НастройкиКомпоновки не поддерживает передачу типа НастройкиКомпоновкиДанных - баг.
krukoleg@mail.ru; +1 Ответить
18. SeiOkami 1579 04.07.19 11:47 Сейчас в теме
15. CyberCerber 621 04.07.19 11:43 Сейчас в теме
Все ждал в конце подвоха, что в конце будет разоблачение Васи, к каким печальным последствиям это привело, но нет... :-)
Еще писали такие универсальные методы?
krukoleg@mail.ru; AllexSoft; boln; +3 Ответить
16. CyberCerber 621 04.07.19 11:44 Сейчас в теме
Получилось решить вопрос с версиями платформы, когда параметры методов зависят от конкретной версии?
19. SeiOkami 1579 04.07.19 11:49 Сейчас в теме
(16) изучаю тему. Думаю собрать все возможные варианты и описать в статье. И сравнить с тем, как это делают в других языках.
17. CyberCerber 621 04.07.19 11:46 Сейчас в теме
И если уж соблюдать все стандартны и правила разработки, то в получившемся методе слишком много параметров. Кажется, максимум 5 допускается. Иначе нужно объединять в структуры. Я сам для себя еще не решил, было бы мне это удобнее, но стандарт говорит так.
20. YPermitin 9690 04.07.19 11:59 Сейчас в теме
22. acanta 04.07.19 12:32 Сейчас в теме
Это похоже на холивар по поводу использования БСП и функций общих модулей в доработках.
И по поводу замков на объектах метаданных типовых конфигураций.
29. herfis 372 04.07.19 13:24 Сейчас в теме
Да, забыл добавить. Я не против непосредственно авторской процедуры. Она вполне себе нормальная. Хоть я ее использовать и не буду. Но это вкусовщина уже. У меня есть что-то подобное, выполняющее простую компоновку в табличный документ, но для специальных задач. В простых отчетах я ничего такого не использую.
Если бы я увидел эту процедуру как готовую в качестве просто "вот такие инструменты я использую" - ну, норм, чо...
Меня зацепил именно не очень удачный выбор ее в качестве иллюстрации к процессу создания новых абстракций, потому что описанный путь может очень легко увести несколько не туда :) "ДополнительныеПараметры" в этой процедуре еще в рамках, но уже на грани. И имеют большой потенциал, методика реализации которого излагается в статье :)
30. denmax 239 04.07.19 13:41 Сейчас в теме
У вас в коде копипаста? Значит у вас есть проблема! Для решения проблемы добавили универсальный метод? Теперь у вас две проблемы!
Merkalov; memb3r; krukoleg@mail.ru; bulpi; boln; acanta; +6 Ответить
31. cuztam 04.07.19 13:49 Сейчас в теме
Отлично, жду новых похождений кота Василия по миру 1С
SeiOkami; acanta; +2 Ответить
34. qwinter 624 04.07.19 17:12 Сейчас в теме
Неправильные аксиомы = неправильные решения = неправильные события.
krukoleg@mail.ru; boln; +2 Ответить
35. riposte 303 04.07.19 18:32 Сейчас в теме
Существует 15 шаблонов для копипасты кода программного вывода отчета на СКД.
Так нельзя! Нужно универсальную функцию! Рррряя!
Существует 16 шаблонов для копипасты кода программного вывода отчета на СКД.

Шутка. Лойс за многофункциональные комбайны с трехтомником инструкций и поллитрой в комплекте.
CyberCerber; boln; +2 Ответить
36. muskul 05.07.19 05:18 Сейчас в теме
Походу такие васи типовые конфигурации и пишут. В результате при простом поиске где же заполняняется Фамилия ипэшника в УПД открывается 10 модулей в которые прыгаешь туда сюда. куча временных менеджеров запросов из которых толком не выделить блок получения ответсвенных лиц и посмотреть что же его не устраивает.
Slypower; MulderCelica; XACHAPURIN; memb3r; AurumFlare; ids79; Lazy_Stranger; krukoleg@mail.ru; asg.aleks; CoolSpawn; itozersk; 1cdevelopment; Pryanishnikov_Vladimir; Crazy_Max; CyberCerber; СаморезикРу; the1; bulpi; boln; user701287_darkowntheworld; +20 Ответить
38. CnupT 57 05.07.19 08:27 Сейчас в теме
(36) это как в детстве было "ставь лайк, если любишь маму", теперь "ставь плюсик, если тоже задрался искать где формируется ФИО ИПшника" :)
46. ids79 5717 14.07.19 07:59 Сейчас в теме
(36)А еще любят методы платформы в свои оборачивать. Например СообщениеПользователю. Зачем? Мне не понятно.
Проще от этого не становится. Вместо того, чтобы методы платформы изучать,
приходится изучать методы БСП, которые не сильно проще. А если не подходит этот метод, по какой-то причине, то приходится все равно дополнительно разбираться с методами платформы.
Написать 6 строк кода, если знать, что пишешь - минута времени.
Зато хоть понимаешь, ЧТО ты пишешь. И, если нужно сделать что-то не совсем стандартное, делаешь это быстро. А Вася то забудет через пару месяцев как отчет программно формируется, и зависнет, если метод его не подойдет по какой-то причине.

Но пусть Вася на меня не обижается, это просто мое мнение, а статья очень веселая и позитивная.
Chai Nic; +1 Ответить
39. zqzq 21 05.07.19 10:42 Сейчас в теме
Давно уже использую подобную процедуру для СКД. Очень удобно. Нет этого низкоуровнего мусора от 1С (по формированию СКД) в основных модулях.
42. AllexSoft 05.07.19 13:52 Сейчас в теме
В данной функции параметр НастройкиКомпоновки надо бы по умолчанию Неопределено сделать, а что если мне нужно с настройками компоновки по умолчанию сформировать схему? Зачем мне инициализировать компановщик где то и передавать его процедуре.. недоработка в общем )
Имею аналогичную функцию, только параметров побольше, и универсальности то же) из нужного: можно передавать параметры и отборы в виде структуры, и не париться с НастройкамиКомпановки, ну и отладка, можно возвращать результирующие запросы (скомпанованные СКД) для целей отладки
43. SeiOkami 1579 05.07.19 14:37 Сейчас в теме
(42) СкомпоноватьРезультатОтчета(Результат, СКД, СКД.НастройкиПоУмолчанию);
44. AllexSoft 05.07.19 15:04 Сейчас в теме
(43) как вариант должно прокатить
45. jekichan 12.07.19 11:22 Сейчас в теме
Спасибо, интересно. Ждем следующих новелл
47. skv_79 214 02.08.19 14:59 Сейчас в теме
Хороший пример того, как нужно писать универсальные процедуры.
48. awk 718 04.09.19 12:05 Сейчас в теме
А я бы переписал этот кусок:

    //Определяем тип генератора
    Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда
        ВыводВКоллекциюЗначений = Истина;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    Иначе
        ВыводВКоллекциюЗначений = Ложь;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");
    КонецЕсли;
Показать

Как:
    //Определяем тип генератора
    ВыводВКоллекциюЗначений = Ложь;
    ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");

    Если Результат = Неопределено Тогда
        Результат = Новый ТабличныйДокумент;
    ИначеЕсли ТипЗнч(Результат) <> Тип("ТабличныйДокумент") Тогда
        ВыводВКоллекциюЗначений = Истина;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    КонецЕсли;
Показать
49. herfis 372 06.09.19 09:52 Сейчас в теме
(48) Теорема Эскобара, как по мне. Я бы переделал процедуру на функцию, а требуемый тип результата вынес в необязательные параметры.
50. DoctorRoza 25.10.19 13:51 Сейчас в теме
Понял, я понял, где тут ошибка. В начале речь идет о Васе, а уже в конце нужно писать об Василии Ивановиче! ))
51. logarifm 1080 12.05.20 10:07 Сейчас в теме
А еще здесь не хватает программного создания саомй схемы компоновки данных. То-есть посмотреть если ТипПараметра СхемаКомпоновки = Неопределенно следовательно вызвать инициализацию создания самой схемы компоновки.
Оставьте свое сообщение

См. также

Как я начал администрировать сервер 1С: Предприятие 8.3 с телефона Промо

Администрирование данных 1С Мобильная разработка v8 Бесплатно (free)

Развитие инструментов управления кластером серверов 1С:Предприятие 8.3.

14.04.2017    61020    user700211_a.straltsou    27    

Новое отображение ошибок в 1С

Практика программирования Администрирование v8 1cv8.cf Бесплатно (free)

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)

10.08.2020    4236    SeiOkami    5    

Как ограничить поля отбора в динамическом списке и ничего не сломать

Практика программирования v8::УФ 1cv8.cf Бесплатно (free)

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

06.05.2020    4707    SeiOkami    3    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

15.01.2020    23034    John_d    22    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

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

15.01.2019    24481    itriot11    26    

Быстрое создание наполненных коллекций

Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

Разберем самые частые способы создания коллекции, значения которой известны заранее. И сравним скорость их выполнения.

28.10.2019    7102    SeiOkami    66    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    32527    Yashazz    50    

СКД. Отчеты с картинками

Практика программирования Работа с интерфейсом v8::СКД 1cv8.cf Бесплатно (free)

Решение популярных кейсов с картинками в отчетах на СКД.

25.09.2019    20828    YPermitin    37    

Обмен данными. Консистентность vs Многопоточность Промо

Интеграция v8 1cv8.cf Бесплатно (free)

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

03.09.2019    12141    m-rv    1    

"Хочу универсально!" [Часть 2]

Практика программирования v8 Бесплатно (free)

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

25.09.2019    5224    SeiOkami    5    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    48524    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    48456    ids79    54    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    37235    unichkin    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    79770    ids79    49    

Обработчики событий при записи объектов. Зачем и что за чем?

Математика и алгоритмы v8 Бесплатно (free)

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

25.07.2019    48995    AlbinaAAA    28    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    51746    ids79    25    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    30094    tormozit    100    

Не провоцируйте СКД, или пример "как не надо"

Практика программирования Разработка v8::СКД 1cv8.cf Бесплатно (free)

Пример того, что не нужно использовать в запросах, чтобы не провоцировать СКД.

10.06.2019    13708    SeiOkami    95    

Подсистема "Варианты отчетов". Используете ли Вы ее правильно?

Работа с интерфейсом БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Небольшая история про использование подсистемы "Варианты отчетов" из БСП. Используете ли Вы ее правильно?

04.06.2019    40963    YPermitin    52    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    77849    tormozit    131    

Выгрузка документа по условию

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16012    m-rv    2    

Как настроить правильную техподдержку (helpdesk, service desk на коленке)

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Документооборот и делопроизводство Монитор заказов Учет рабочего времени Управление взаимоотношениями с клиентами (СRM) Документооборот и делопроизводство Монитор заказов Учет рабочего времени v8 УУ Бесплатно (free)

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

24.04.2019    17744    siddy    0    

Как прикрутить ГУИД к регистру сведений

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20140    m-rv    17    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    48197    tormozit    41    

Excel vs 1С: битва с неожиданным исходом

Анализ учета Универсальные обработки Загрузка и выгрузка в Excel Финансовые Управленческие v8 1cv8.cf Россия Бесплатно (free)

Что лучше 1С или Excel? Разберемся, в казалось бы, очевидном, чтобы получить невероятное!

11.04.2019    36223    bolefirenko    116    

Добавление отчетов в типовые конфигурации 1С

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

Описание различных способов добавления общих и контекстных отчетов в конфигурации 1С, построенные на базе БСП. Основные моменты и нюансы.

07.03.2019    53266    ids79    46    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    44635    tormozit    74    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

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

14.12.2018    41089    ids79    72    

Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке

Универсальные функции Зарплата Управление персоналом (HRM) Зарплата v8 v8::СПР ЗКГУ3.0 ЗУП3.x БУ Бесплатно (free)

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

14.11.2018    85854    GeterX    114    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    34528    ids79    40    

Менеджер открытых форм Промо

Работа с интерфейсом v8::УФ 1cv8.cf Абонемент ($m)

Обработка получает информацию об открытых формах и позволяет ими манипулировать.

1 стартмани

13.04.2017    21018    37    SeiOkami    19    

Git + 1С. Часть 1. Как подключиться к команде разработки и начать использовать Git

Инструментарий разработчика Управление проектом v8 1cv8.cf Бесплатно (free)

Первая статья из цикла инструкций по работе с Git в 1С-разработке. Рассмотрим, как настроить рабочее место, как получить свою "копию" проекта для разработки и приступить к полезным действиям. Все примеры будут изложены в рамках трёх практических кейсов: 1. Моя команда дорабатывает типовую конфигурацию, использует приватный репозиторий на BitBucket, в котором версионируются внешние отчеты/обработки, расширения конфигураций и правила обмена; 2. Я участвую в стартап-команде, которая разрабатывает свою конфигурацию с использованием Git и GitLab; 3. Я принимаю участие в развитии OpenSource-продукта на GitHub как заинтересованный разработчик (контрибьютор).

18.10.2018    66069    stas_ganiev    75    

Приемы работы с СКД: делаем за 5 минут то, на что у других уйдет час

Практика программирования Инструментарий разработчика v8::СКД Бесплатно (free)

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

03.09.2018    44674    SergeyN    26    

Из Excel в 1С запросом

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

... ну, конечно, не прям так типовым языком запросов, а расширенным языком запросов. Речь пойдет о том, как "залить" данные в таблицы 1С и не пилить при этом бесконечного количества наколеночных обработок.

14.08.2018    19974    m-rv    5    

Тестер: частые вопросы

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29173    grumagargler    28    

[Шпаргалка] Свой заголовок отчету на СКД с параметрами, картинками (без программирования)

Работа с интерфейсом v8::СКД 1cv8.cf Бесплатно (free)

Если возникла необходимость в заголовок отчета вывести дополнительную информацию к примеру дату формирования отчета, тогда данная шпаргалка поможет вам быстро это сделать.

23.07.2018    49544    rpgshnik    60    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    28284    olegtymko    47    

Как сделать запрос на изменение данных

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    30479    m-rv    21    

Строим графы средствами 1С (без GraphViz)

Практика программирования v8 Бесплатно (free)

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    24099    slozhenikin_com    20    

Распределение расходов пропорционально продажам

Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Практика программирования Финансовый учет и бюджетирование (FRP) Учет доходов и расходов v8 v8::ОУ УТ10 УУ Бесплатно (free)

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    18193    Rustig    9    

Универсальный обмен между идентичными конфигурациями через REST интерфейс OData. Часть І: Справочники

Перенос данных из 1C8 в 1C8 v8 Бесплатно (free)

Сейчас все чаще интеграции различных конфигураций проектируются через HTTP-сервисы - они и работают быстрее, и "войти" в режим отладки гораздо проще, тем самым обойдя "черный ящик" универсального обмена через xml, например. Более года назад я начал работать в компании, в которой разработчики работали с конфигурациями 1С в режиме совместимости еще 8.2.16 (менять режим совместимости в типичных базах мы не хотели) - а как Вы наверное знаете, если интересовались HTTP-сервисами в 1С, их использование в режиме совместимости 8.3.4 и ниже недопустимо - и здесь я уже не надеялся на разработку и использование HTTP-сервисов. Но позже меня заинтересовал такой "сервис" как REST интерфейс OData, так как его можно использовать не меняя режим совместимости конфигурации - именно он и стал для меня идеальным вариантом решения "нетривиальных" задач.

11.05.2018    23080    V.Stavinsky    11    

Минимализмы 3

Практика программирования Универсальные функции v8 Бесплатно (free)

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    46356    ildarovich    45    

Этюды по программированию. Взаимодействие с Microsoft Word

Практика программирования v8 Бесплатно (free)

Часто приходится заниматься созданием сложных документов Word с таблицами, вложенными фрагментами, хитрым оформлением и прочими радостями жизни. Это - попытка как-то структурировать полученный опыт, чтобы не приходилось перерывать ворох старых обработок в поисках крупиц истины. Надеюсь, эта статья будет полезна и Вам.

11.12.2017    32193    milkers    23    

Метод формирования движений в типовых регистрах нетиповыми регистраторами

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28203    itriot11    34