Конструктор программиста – набор шаблонов программного кода для конструирования результата СКД и поддержки баз как типовых

Опубликовал Павел Панкратов (pavley2002) в раздел Программирование - Инструментарий

Эта статья позволит сократить трудозатраты программиста, за счет применения шаблонов программного кода. Каждый шаблон кода реализован как пример, который можно копировать. Примеры использования СКД базируются на решении http://infostart.ru/public/276806/ . Кроме того, добавлены варианты кода, позволяющие дорабатывать типовые конфигурации с сохранением возможности штатного обновления конфигурации.

Общие положения.

  1. Все примеры данной статьи разработаны на управляемом приложении.  Использование этих шаблонов в обычном приложении возможно и не требует разделение &НаКлиенте и &НаСервере.

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

  3.  Конструктор результата СКД и ключевые процедуры подробно описаны в //infostart.ru/public/276806/ . Поэтому здесь приложены только файлы, содержащие последнею версию и полностью исполняющие заявленную ранее функциональность Конструктора Результата СКД. А именно:

    1. Тип результатаСКД ТабличныйДокумент или ДеревоЗначений задаётся открытием нужной страницы.

    2. В качестве источника данных для СКД допускается внешняя база. Выбор источника данных на странице «Параметры базы данных».

    3. Чтение формата *.xls на странице «Загрузить *.xls».

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

Содержание примеров.

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

 

  1. Пример 01. (Простейший).  Получить табличный документ, используя СКД. Все входные данные по умолчанию.

  2. Пример 02. Различные варианты кодирования.

    1.  Получить таблицу значений, используя СКД.

    2.  Получить дерево значений для варианта настройки №2, используя СКД.

  3. Пример 03. Получить табличный документ с расшифровкой, используя СКД. Данные хранятся во временном хранилище.

  4. Пример 04. Получить дерево значений, используя СКД. Данные хранятся во временном хранилище.

  5. Пример 05. Получить дерево значений по данным внешней базы, используя СКД. Данные хранятся во временном хранилище. Строку соединения с базой программист может скопировать с экрана на странице «Параметры базы данных (Источника)».

    1.  Контрольная внешняя база входит в поставку.

    2. В контрольном примере_05 СтрокаСоединения = "File=D:\InfoStart\ИнфоСтарт3_\CD_3;Usr=Администратор;Pwd=";

    3.  Значение переменной необходимо привязать по месту.

  6. Пример 06. Получить ТабличныйДокумент на основании внешнего набора данных типа ТаблицаЗначений, используя СКД. Данные хранятся во временном хранилище.

  7. Пример 07. Получить ТабличныйДокумент на основании внешнего набора данных типа ДеревоЗначений, используя СКД. Данные хранятся во временном хранилище.

  8. Пример 08. (Поддержка типовой конфигурации). В типовом документе, выполненном в формате обычного приложения:

    1.  Добавить и обработать новый реквизит.

    2.  Добавить и обработать новую табличную часть.

    3.  Добавить новую кнопку процедуры.

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

    5.  Новые формы выполнить в формате управляемого приложения.

Порядок работы. 

  1. Создаём макет СКД. Макет размещаем либо в Отчет. РезультатСКДупр, либо в целевой объект конфигурации.

    1. В отчете. РезультатСКДупр заполняем переменную АдресМакетаСКД.

    2. В процедуре ЗаполнитьПараметрыСКДсрв() заполняем параметры макета.

  2. Применяем Отчет.РезультатСКДупр для отладки результата СКД.

    1. Выбираем внешнюю базу в качестве источника данных (не обязательно).

    2. Считываем дополнительную информацию из *.xls (не обязательно).

    3. Запускаем «СформироватьСКД». Выполняем отладку СКД.

    4. Процедура ВыполнитьПоАлгоритму() позволяет доработать полученную КоллекциюЗначений. (Не обязательно).

  3. По завершении отладки, приступаем к формированию программного кода для вставки в целевой объект.  

    1. В целевой объект копируем один из примеров Отчета. ПримерыИспользованияКонструктораСКД.

    2. Заполняем параметры результатом отладки.

    3. Запускаем целевой объект.

  4. В целевом объект получаем ТаблицуЗначений, ДеревоЗначений или ТабличныйДокумент.

 

Некоторый комментарий по применению СКД не только для отчетов.

Приложенная база данных выполнена как инструмент программисту для сокращения его бесценных трудозатрат. Простой механизм получения ТаблицЗначений с использованием технологии СКД– это один из вариантов сокращения трудозатрат. Кроме того, наличие схемы компоновки данных упрощает изучение алгоритма получения данных запросом.

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

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

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

Внешняя база может использовать платформы 1cv82 и 1cv83. Однако, следует иметь ввиду, что фирма 1С обеспечивает преемственность с ранними версиями. То есть, если предполагается читать платформу 1cv83, то текущая база должна быть запущена на платформе 1cv83.

Комментарий о поддержке обновлений типовых конфигураций.

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

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

В примере_08 вызов новой формы выполняется кнопкой ПодменюЗаполнить.ЗаполнитьТабЧасть2локально

Схема работает.

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

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

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

      2.  Здесь один из вариантов аргументации. Если в типовой объект добавлена табличная часть, то обработка её предполагается на отдельной странице. Хлопоты пользователя по открытию страницы или новой формы различаются не значительно. С другой стороны, если сравнить предложенный вариант с вариантом программной записи новых элементов формы в типовой объект //infostart.ru/public/304736/ , то в трудозатраты программиста входит написание одной строки вызова новой формы. Все остальные изменения внутри новой формы обслуживаются типовыми конструкторами и не будут влиять на типовой объект. Это плюс и для новой ТАБЛИЧНОЙ ЧАСТИ программисту рационально использовать новую форму

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

        Рекомендации по добавлению нового кода в типовую конфигурацию.

  1. Как изменить процедуру типовой конфигурации?

    1. Изменения следует выполнить в локальной процедуре. Программисту следует постараться.

    2. Разместить локальную процедуру, желательно, в конце типовой().

    3. Имя локальной процедуры должно начинаться с _. В этом случае, все изменения будут в верху списка процедур.

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

      Процедура ИмяТиповойПроцедуры()

                  // текст типовой процедуры.

                 

                  _ ИмяТиповойПроцедурыИмяФирмы();

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

       

      Процедура _ ИмяТиповойПроцедурыИмяФирмы () //Локальная

                  // локальный текст

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

  2. Как добавить новые свойства объекту типовой конфигурации? Новые свойства следует обрабатывать в новой форме(управляемая). При этом, не следует забывать о различие данных на форме и объекте. То есть, программист должен согласовать данные новой формы с данными типовой формы и типовым объектом. Создание нового объекта из новой формы следует предотвратить.

    1. Как вариант, можно добавить обработку типовых свойств в новую форму.

  3. Новые кнопки на экране объекта типовой конфигурации следует добавлять программным методом, учитывая рекомендации п.1.

  4. Реализацию этих простых рекомендаций можно посмотреть в Примере_08.

Примеры.

 //////// 01 //////

&НаКлиенте

Процедура ПолучитьТабДок_01(Команда)

                Перем ТабДок;

                ПолучитьТабДок_01НаСервере(ТабДок);

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

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

 

&НаСервере

Процедура ПолучитьТабДок_01НаСервере(результатСКД)

                ПараметрыСКД =Новый Структура();

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                струкСКД =Новый Структура("АдресМакетаСКД,ПараметрыСКД" , АдресМакетаСКД,ПараметрыСКД ) ;

                результатСКД = ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );               

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

 

/////////// 02 //////////////

&НаКлиенте

Процедура Получить_тз_02_1(Команда)

                Перем тз;

                Получить_тз_02_1НаСервере(тз);

                ОткрытьЗначение(тз);        

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

&НаСервере

Процедура Получить_тз_02_1НаСервере(результатСКД)

                ПараметрыСКД =Новый Структура();

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                РезультатСКДтип = "ТаблицаЗначений"; //оставитьНужное смотри описание

                струкСКД =Новый Структура("РезультатСКДТип,АдресМакетаСКД,ПараметрыСКД" , РезультатСКДТип, АдресМакетаСКД,ПараметрыСКД ) ;

                результатСКД = ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );               

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

 

&НаКлиенте

Процедура Получить_дз_02_2(Команда)        

                дз = Получить_дз_02_2НаСервере();

                ОткрытьЗначение(дз);       

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

 

&НаСервере

Функция Получить_дз_02_2НаСервере()

                ПараметрыСКД =Новый Структура();

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                РезультатСКДтип = "ДеревоЗначений"; //оставитьНужное смотри описание

                НастройкиСКД = "Вариант2";

                струкСКД =Новый Структура("РезультатСКДТип,АдресМакетаСКД,НастройкиСКД,ПараметрыСКД" , РезультатСКДТип, АдресМакетаСКД,НастройкиСКД,ПараметрыСКД ) ;

                результатСКД = ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );               

                Возврат результатСКД;

КонецФункции

////////////  03  /////////////

&НаКлиенте

Процедура ПолучитьТабДокИзХранилища_03(Команда)            

                ПолучитьТабДокИзХранилища_03НаСервере();

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                РезультатСКД = СтрукРезультатСКД.РезультатСКД;       

                РезультатТабДок = РезультатСКД;    

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

 

&НаСервере

Процедура ПолучитьТабДокИзХранилища_03НаСервере()

                ПараметрыСКД =Новый Структура();

                ЗаполнитьПараметрыСКД(ПараметрыСКД);   

                РезультатСКДтип = "ТабличныйДокумент"; //оставитьНужное смотри описание

                струкСКД =Новый Структура("АдресРезультатаСКД,РезультатСКДТип,АдресМакетаСКД,ПараметрыСКД" , АдресРезультатаСКД, РезультатСКДТип, АдресМакетаСКД,ПараметрыСКД ) ;

                ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );           

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

 

&НаКлиенте

Процедура РезультатТабДокОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)          

                СтандартнаяОбработка = Ложь;

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                цДанныеРасшифровки = СтрукРезультатСКД.ДанныеРасшифровки;

                ОсновноеДействие =цДанныеРасшифровки.Элементы.Получить(Расшифровка).ОсновноеДействие;

                мсДоступныеДействия = Новый Массив();

                мсДоступныеДействия.Добавить(ОсновноеДействие);

                схемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресМакетаСКД);

                ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(цДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(схемаКомпоновкиДанных));      

                Настройки = ОбработкаРасшифровки.Выполнить(Расшифровка, , мсДоступныеДействия );               

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

////////////  04  /////////////

&НаКлиенте

Процедура ПолучитьДЗизХранилища_04(Команда)

                Перем ПараметрыСКД;

                ЗаполнитьПараметрыСКД(ПараметрыСКД);   

                ПолучитьДЗизХранилища_04НаСервере(ПараметрыСКД);          

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

&НаСервере

Процедура ПолучитьДЗизХранилища_04НаСервере(ПараметрыСКД)

                РезультатСКДтип = "ДеревоЗначений"; //оставитьНужное смотри описание

                НастройкиСКД = "Вариант2";

                струкСКД =Новый Структура("АдресРезультатаСКД,РезультатСКДТип,АдресМакетаСКД,НастройкиСКД,ПараметрыСКД" , АдресРезультатаСКД, РезультатСКДТип, АдресМакетаСКД,НастройкиСКД,ПараметрыСКД ) ;

                ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );           

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                РезультатСКД = СтрукРезультатСКД.РезультатСКД;

                ИмяРеквизита = "РезультатДеревоЗначений";

                ОбщегоНазначенияСКД.ОбновитьКолонкиТЗ(ЭтаФорма, ИмяРеквизита, РезультатСКД);

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

///////////////  05  ///////////

&НаКлиенте

Процедура ПолучитьИзВнешнейБазы_05(Команда)

                Перем ПараметрыСКД;

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                РезультатСКДтип = "ДеревоЗначений"; //оставитьНужное смотри описание         

                //СтрокаСоединения = "Srvr=PankratovWork:1541;Ref=SQL_01;Usr=Администратор;Pwd=";

                СтрокаСоединения = "File=D:\InfoStart\ИнфоСтарт3_\CD_3;Usr=Администратор;Pwd=";

                ПолучитьИзВнешнейБазы_05НаСервере(струкСКД);

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                РезультатСКД = СтрукРезультатСКД.РезультатСКД;       

                ОткрытьЗначение(РезультатСКД);                   

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

 &НаСервере

Процедура ПолучитьИзВнешнейБазы_05НаСервере(струкСКД)

                ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );           

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

/////////////  06 //////////////

&НаКлиенте

Процедура ИзВнешнегоНабораТЗ_06(Команда)

                Перем ПараметрыСКД;

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                РезультатСКДтип = "ТабличныйДокумент"; //оставитьНужное смотри описание

                //РезультатСКДтип = "ТаблицаЗначений"; //оставитьНужное смотри описание

                //РезультатСКДтип = "ДеревоЗначений"; //оставитьНужное смотри описание

                струкСКД =Новый Структура("АдресРезультатаСКД,РезультатСКДТип,АдресМакетаСКД,ПараметрыСКД,СтрокаСоединения" , АдресРезультатаСКД, РезультатСКДТип, АдресМакетаСКД, ПараметрыСКД,   ) ;

                ИзВнешнегоНабораТЗ_06НаСервере(струкСКД);

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                РезультатСКД = СтрукРезультатСКД.РезультатСКД;       

                Если ТипЗнч(РезультатСКД)=Тип("ТабличныйДокумент") Тогда

                               РезультатСКД.Показать();

                Иначе

                               ОткрытьЗначение(РезультатСКД);   

                КонецЕсли;           

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

&НаСервере

Процедура ИзВнешнегоНабораТЗ_06НаСервере(струкСКД)        

                НастройкиСКД = "тзНаборДанных";  //имяВариантаСКД

                струкСКД.Вставить("НастройкиСКД", НастройкиСКД);

                цТЗнаборДанных = ПолучитьТЗ();     

                ВнешниеНаборыДанныхСКД = Новый Структура("тзНаборДанных",цТЗнаборДанных );

                струкСКД.Вставить("ВнешниеНаборыДанныхСКД",ВнешниеНаборыДанныхСКД);

                ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );           

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

 

////////////////  07  ///////////

&НаКлиенте

Процедура ИзВнешнегоНабораДЗ_07(Команда)

                Перем ПараметрыСКД;

                ЗаполнитьПараметрыСКД(ПараметрыСКД);

                //РезультатСКДтип = "ТабличныйДокумент"; //оставитьНужное смотри описание

                //РезультатСКДтип = "ТаблицаЗначений"; //оставитьНужное смотри описание

                РезультатСКДтип = "ДеревоЗначений"; //оставитьНужное смотри описание         

                струкСКД =Новый Структура("АдресРезультатаСКД,РезультатСКДТип,АдресМакетаСКД,ПараметрыСКД,СтрокаСоединения" , АдресРезультатаСКД, РезультатСКДТип, АдресМакетаСКД, ПараметрыСКД,   ) ;    

                ИзВнешнегоНабораДЗ_07НаСервере(струкСКД);

                СтрукРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);

                РезультатСКД = СтрукРезультатСКД.РезультатСКД;       

                Если ТипЗнч(РезультатСКД)=Тип("ТабличныйДокумент") Тогда

                               РезультатСКД.Показать();                  

                Иначе

                               ОткрытьЗначение(РезультатСКД);                                  

                КонецЕсли;           

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

&НаСервере

Процедура ИзВнешнегоНабораДЗ_07НаСервере(струкСКД)

                НастройкиСКД = "дзНаборДанных";  //имяВариантаСКД

                струкСКД.Вставить("НастройкиСКД", НастройкиСКД);

                ДЗ = ПолучитьДЗ();             

                цТЗнаборДанных = ОбщегоНазначенияСКД.ДЗпреобразоватьВтз(ДЗ);     

                ВнешниеНаборыДанныхСКД = Новый Структура("тзНаборДанных",цТЗнаборДанных );

                струкСКД.Вставить("ВнешниеНаборыДанныхСКД",ВнешниеНаборыДанныхСКД);

                ОбщегоНазначенияСКД.СформироватьРезультатСКД(  струкСКД );           

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

Состав приложения RAR.

В приложение помещено КонструкторСКД.dt, КонструкторСКД.cf КонтрольнаяВнешняяБаза.cd и консоль5.dcf

  1.  КонструкторСКД.dt – Контрольная база. База содержит

    1.  отчет.РезультатСКДупр – инструмент для отладки алгоритма получения данных с использованием СКД.

    2. отчет. ПримерыИспользованияКонструктораСКД – шаблоны программного кода для копирования.

    3.  Документ. ДокументТиповой_01обыч – шаблон программного кода для внесения изменений в типовой документ, с возможностью сохранения поддержки при типовом обновлении. В примере_08 типовой документ выполнен по технологии обычного приложения, а новая форма по технологии управляемого приложения.

    4. ОбщиеМодули – обеспечивают заявленную функциональность. Эта версия модулей рекомендована для замены более ранней версии в //infostart.ru/public/276806/ .  

  2. КонтрольнаяВнешняяБаза.cd – используется для контроля соединения КонструктораСКД с внешней базой.

  3. консоль5.dcf – настройка консоли отчетов для оперативной проверки заполнения типового документа с локальными изменениями.

Примечание.

В //infostart.ru/public/276806/ приведен внешний отчет, который можно использовать как инструмент для отладки получения данных с использованием СКД. Указанный внешний отчет работает как в обычном режиме запуска, так и в управляемом.

Желаю успехов всем и каждому.

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

Наименование Файл Версия Размер
Шаблоны программного кода
.rar 313,81Kb
13.12.16
62
.rar 1.0.8 313,81Kb 62 Скачать

См. также

Комментарии
1. script Мальчинко (script) 192 28.02.15 13:43 Сейчас в теме
Это нужно делать в виде Шаблона универсального отчета для СКД
2. Павел Панкратов (pavley2002) 153 01.03.15 13:18 Сейчас в теме
(1) script,
Целью статьи не является создание отчета, в том числе универсального. Я привел примеры использования СКД вместо результата запроса для целей программирования.
Технология СКД обладает наглядность и расширенными возможностями по сравнению с запросом. Это преимущество можно использовать, если вместо результата запроса использовать ТаблицуЗначений или ДеревойЗначений. Примеры 01-07 описывают различные способы получения НаборовЗначений. Эти НаборыЗначений можно использовать, например, для ОбработкиПроведения.
СКД наглядно показывает алгоритм формирования информации. Это один из плюсов.