Заказать звонок

УФ ERP 2.0 Cправочник, содержащий условия с описаниями в СКД

28.09.2016

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


 

Потребуются изменения в следующих объектах:

  1. Справочник

    1. Добавить реквизиты для хранения СКД и настроек СКД

    2. Добавить макет для хранения предопределенного условия

    3. Доработать модули справочника


 

Подробнее на примере конфигурации ERP 2.0 (используется общая форма УпрощеннаяНастройкаСхемыКомпоновкиДанных):


 

Часть 1. Добавление справочника.

Добавляем справочник Новый_ПравилаРаспределенияСуммыПоПартнерам. Добавляем реквизиты СхемаКомпоновкиДанных (тип ХранилищеЗначения), НастройкиКомпоновкиДанных (тип ХранилищеЗначения), ИмяШаблона (типСтрока, 50; у свойства Проверка заполнения значение Выдавать ошибку). Реквизит ИмяШаблона будет использоваться как признак хранения СКД в макете, если выбрано значение, отличное от Произвольный (т.е. если Произвольный, то СКД будет храниться в реквизите СхемаКомпоновкиДанных, иначе - в соответствующем макете).


 

Часть 2. Добавление макета.

Для хранения предопределенного правила распределения суммы по партнерам на вкладке Макеты добавляем макетПоДатеДоговора с типом Схема компоновки данных. В макет добавляем набор данных – запрос. В запросе выбираем из справочника ДоговорыКонтрагентов различных Партнеров, а КоэффициентРаспределения рассчитываем, как если у партнера есть договор с ДатойНачалаДействия >= &ДатаНачалаДействия, тогда 2, иначе 1 (рис. 1).

Рис. 1. Набор данных макета СКД


 

На вкладке Параметры проверяем, что у параметра ДатаНачалаДействия установлена галочка только у свойстваВключать в доступные поля, остальные галочки должны быть сброшены. На вкладке Настройки у Отчета у параметраДата начала действия устанавливаем значение по умолчанию Начало этого года, выбираем поля Партнер иКоэффициентРаспределения. Добавляем в Отчет новую группировку без указания поля (т.е. детальные записи; у этой группировки в выбранных полях будет указано <Авто> - это авто поле, содержащее выбранные ранее поля отчета Партнер иКоэффициентРаспределения). Макет настроен, закрываем окно СКД.


 

Часть 3. Доработка модулей справочника.

Добавляем форму элемента справочника. У элемента ИмяШаблона отмечаем свойство РежимВыбораИзСписка. Добавляем на форму реквизит ХранилищеНастроекКомпоновкиДанных и ХранилищеСхемыКомпоновкиДанных с типомПроизвольный. Добавляем команду Редактировать (для редактирования схемы СКД и ввода параметров) и ТестСКД (для демонстрации и проверки работы СКД; затем этот код можно будет использовать в процедурах, где будут определяться правила распределения суммы по партнерам).

Описываем процедуры модуля формы:

3.1. У формы элемента справочника определяем событие ПриСозданииНаСервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Для Каждого Макет Из Метаданные.НайтиПоТипу(ТипЗнч(Объект.Ссылка)).Макеты Цикл

Если Макет.ТипМакета = Метаданные.СвойстваОбъектов.ТипМакета.СхемаКомпоновкиДанных Тогда

Элементы.ИмяШаблона.СписокВыбора.Добавить(Макет.Имя, Макет.Синоним);

КонецЕсли;

КонецЦикла;

 

Элементы.ИмяШаблона.СписокВыбора.Добавить("Произвольный", "Произвольный");

 

ХранилищеНастроекКомпоновкиДанных = Объект.Ссылка.НастройкиКомпоновкиДанных;

ХранилищеСхемыКомпоновкиДанных = Объект.Ссылка.СхемаКомпоновкиДанных;

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


 

3.2. У формы элемента справочника определяем событие ПередЗаписьюНаСервере:

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

Если ТекущийОбъект.ИмяШаблона = "Произвольный" Тогда

ТекущийОбъект.СхемаКомпоновкиДанных = ХранилищеСхемыКомпоновкиДанных;

КонецЕсли;

 

Если ХранилищеНастроекКомпоновкиДанных <> Неопределено Тогда

ТекущийОбъект.НастройкиКомпоновкиДанных = ХранилищеНастроекКомпоновкиДанных;

КонецЕсли;

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


 

3.3. Определяем команду Редактировать:

&НаКлиенте

Процедура Редактировать(Команда)

ЗаголовокФормыНастройкиСхемыКомпоновкиДанных = НСтр("ru = 'Настройка схемы компоновки правила распределения суммы по партнерам ""%1""'");

ЗаголовокФормыНастройкиСхемыКомпоновкиДанных = СтрЗаменить(ЗаголовокФормыНастройкиСхемыКомпоновкиДанных, "%1", Объект.Наименование);

 

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

 

ОткрытьФорму("ОбщаяФорма.УпрощеннаяНастройкаСхемыКомпоновкиДанных",

Новый Структура(

"НеПомещатьНастройкиВСхемуКомпоновкиДанных,

|НеРедактироватьСхемуКомпоновкиДанных,

|НеЗагружатьСхемуКомпоновкиДанныхИзФайла,

|НеНастраиватьУсловноеОформление,

|НеНастраиватьВыбор,

|НеНастраиватьПорядок,

|УникальныйИдентификатор,

|АдресСхемыКомпоновкиДанных,

|АдресНастроекКомпоновкиДанных,

|Заголовок",

Истина,

Ложь,

Ложь,

Истина,

Истина,

Истина,

УникальныйИдентификатор,

Адреса.СхемаКомпоновкиДанных,

Адреса.НастройкиКомпоновкиДанных,

ЗаголовокФормыНастройкиСхемыКомпоновкиДанных),,,,, Новый ОписаниеОповещения("РедактироватьСхемуКомпоновкиДанныхЗавершение", ЭтотОбъект, Новый Структура("Адреса", Адреса)), РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);

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


 

3.4. Определяем процедуру, использующуюся в п. 3.3:

&НаСервере

Функция ПолучитьАдресаСхемыКомпоновкиДанныхВоВременномХранилище()

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

 

Если (ЗначениеЗаполнено(Объект.ИмяШаблона) ИЛИ ХранилищеСхемыКомпоновкиДанных = Неопределено)

И Объект.ИмяШаблона <> "Произвольный" Тогда

СхемаИНастройки = Справочники.Новый_ПравилаРаспределенияСуммыПоПартнерам.ПолучитьОписаниеИСхемуКомпоновкиДанныхПоИмениМакета(Объект.Ссылка, Объект.ИмяШаблона);

СхемаКомпоновкиДанных = СхемаИНастройки.СхемаКомпоновкиДанных;

Иначе

СхемаКомпоновкиДанных = ХранилищеСхемыКомпоновкиДанных.Получить();

КонецЕсли;

Если СхемаКомпоновкиДанных = Неопределено Тогда

СхемаКомпоновкиДанных = Справочники.Новый_ПравилаРаспределенияСуммыПоПартнерам.СформироватьНовуюСхемуКомпоновкиДанных();

КонецЕсли;

Адреса.СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);

 

НастройкиКомпоновкиДанных = ХранилищеНастроекКомпоновкиДанных.Получить();

Если ЗначениеЗаполнено(НастройкиКомпоновкиДанных) Тогда

Адреса.НастройкиКомпоновкиДанных = ПоместитьВоВременноеХранилище(НастройкиКомпоновкиДанных, УникальныйИдентификатор);

КонецЕсли;

 

Возврат Адреса;

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


 

3.5. Определяем процедуры модуля менеджера справочника, использующиеся в п. 3.4 (в функции СформироватьНовуюСхемуКомпоновкиДанных запрос возвращает поля Партнер и КоэффициентРаспределения, как и в макете):

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

Функция ПолучитьОписаниеИСхемуКомпоновкиДанныхПоИмениМакета(Ссылка, ИмяМакета = Неопределено) Экспорт

ВозвращаемоеЗначение = Новый Структура;

ВозвращаемоеЗначение.Вставить("Описание", "");

ВозвращаемоеЗначение.Вставить("СхемаКомпоновкиДанных", Неопределено);

ВозвращаемоеЗначение.Вставить("НастройкиКомпоновкиДанных", Неопределено);

 

Запрос = Новый Запрос(

"ВЫБРАТЬ

| Новый_ПравилаРаспределенияСуммыПоПартнерам.НастройкиКомпоновкиДанных,

| Новый_ПравилаРаспределенияСуммыПоПартнерам.СхемаКомпоновкиДанных

|ИЗ

| Справочник.Новый_ПравилаРаспределенияСуммыПоПартнерам КАК Новый_ПравилаРаспределенияСуммыПоПартнерам

|ГДЕ

| Новый_ПравилаРаспределенияСуммыПоПартнерам.Ссылка = &Ссылка");

 

Запрос.УстановитьПараметр("Ссылка", Ссылка);

 

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

 

Если Не ЗначениеЗаполнено(ИмяМакета) Тогда

ВозвращаемоеЗначение.Описание = ИмяМакета;

Если Выборка.Следующий() Тогда

СхемаКомпоновкиДанных = Выборка.СхемаКомпоновкиДанных.Получить();

Если СхемаКомпоновкиДанных = Неопределено Тогда

ВозвращаемоеЗначение.СхемаКомпоновкиДанных = СформироватьНовуюСхемуКомпоновкиДанных();

ВозвращаемоеЗначение.НастройкиКомпоновкиДанных = Неопределено;

Иначе

ВозвращаемоеЗначение.СхемаКомпоновкиДанных = СхемаКомпоновкиДанных;

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

КонецЕсли;

КонецЕсли;

Иначе

ВозвращаемоеЗначение.Описание = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Макеты.Найти(ИмяМакета).Синоним;

ВозвращаемоеЗначение.СхемаКомпоновкиДанных = Справочники.Новый_ПравилаРаспределенияСуммыПоПартнерам.ПолучитьМакет(ИмяМакета);

Если Выборка.Следующий() Тогда

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

КонецЕсли;

КонецЕсли;

 

Возврат ВозвращаемоеЗначение;

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


 

Функция СформироватьНовуюСхемуКомпоновкиДанных() Экспорт

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

Источник = СКД.ИсточникиДанных.Добавить();

Источник.Имя = "ИсточникДанных1";

Источник.ТипИсточникаДанных = "Local";

НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));

НаборДанных.Имя = "ПравилаРаспределения";

НаборДанных.Запрос =

"ВЫБРАТЬ

| Партнеры.Ссылка КАК Партнер,

| 1 КАК КоэффициентРаспределения

|ИЗ

| Справочник.Партнеры КАК Партнеры";

НаборДанных.ИсточникДанных = "ИсточникДанных1";

НаборДанных.АвтоЗаполнениеДоступныхПолей = Ложь;

 

Возврат СКД;

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

#КонецЕсли


 

3.6. Определяем процедуру оповещения из п.3.3:

&НаКлиенте

Процедура РедактироватьСхемуКомпоновкиДанныхЗавершение(Результат, ДополнительныеПараметры) Экспорт

Адреса = ДополнительныеПараметры.Адреса;

 

АдресХранилищаНастройкиКомпоновки = Результат;

Если ЗначениеЗаполнено(АдресХранилищаНастройкиКомпоновки) Тогда

ПрименитьИзмененияКСхемеКомпоновкиДанных(Адреса.СхемаКомпоновкиДанных, АдресХранилищаНастройкиКомпоновки);

КонецЕсли;

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


 

3.7. Определяем процедуру, использующуюся в п. 3.6:

&НаСервере

Функция ПрименитьИзмененияКСхемеКомпоновкиДанных(АдресСхемыКомпоновкиДанных, АдресНастроекКомпоновкиДанных)

Если ЗначениеЗаполнено(Объект.ИмяШаблона) И Объект.ИмяШаблона <> "Произвольный" Тогда

СхемаИНастройки = Справочники.Новый_ПравилаРаспределенияСуммыПоПартнерам.ПолучитьОписаниеИСхемуКомпоновкиДанныхПоИмениМакета(Объект.Ссылка, Объект.ИмяШаблона);

 

Если ПолучитьXML(СхемаИНастройки.СхемаКомпоновкиДанных) <> ПолучитьXML(ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных)) Тогда

Объект.ИмяШаблона = "Произвольный";

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

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

Иначе

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

Попытка

КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаИНастройки.СхемаКомпоновкиДанных));

Исключение

КонецПопытки;

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаИНастройки.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

КомпоновщикНастроек.Восстановить();

Если ПолучитьXML(КомпоновщикНастроек.ПолучитьНастройки()) <> ПолучитьXML(ПолучитьИзВременногоХранилища(АдресНастроекКомпоновкиДанных)) Тогда

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

КонецЕсли;

КонецЕсли;

Иначе

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

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

Попытка

КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

Исключение

КонецПопытки;

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

КомпоновщикНастроек.Восстановить();

 

ХранилищеСхемыКомпоновкиДанных = Новый ХранилищеЗначения(СхемаКомпоновкиДанных);

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

КонецЕсли;

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


 

3.8. Определяем процедуру, использующуюся в п. 3.7:

&НаСервере

Функция ПолучитьXML(Значение)

Запись = Новый ЗаписьXML();

Запись.УстановитьСтроку();

СериализаторXDTO.ЗаписатьXML(Запись, Значение);

Возврат Запись.Закрыть();

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


 

3.9. Определяем команду ТестСКД:

&НаКлиенте

Процедура ТестСКД(Команда)

Если ТестСКДСервер() Тогда

Сообщить("СКД проверена!");

КонецЕсли;

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


 

3.10. Определяем процедуру, использующуюся в п. 3.9:

&НаСервере

Функция ТестСКДСервер()

ПроверкаПройдена = Истина;

 

Попытка

СКД = ХранилищеСхемыКомпоновкиДанных.Получить();

Если СКД = Неопределено Тогда

СхемаИНастройки = Справочники.Новый_ПравилаРаспределенияСуммыПоПартнерам.ПолучитьОписаниеИСхемуКомпоновкиДанныхПоИмениМакета(Объект.Ссылка, Объект.ИмяШаблона);

СКД = СхемаИНастройки.СхемаКомпоновкиДанных;

КонецЕсли;

 

НастройкиСКД = ХранилищеНастроекКомпоновкиДанных.Получить();

 

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

 

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

Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));

Если НастройкиСКД <> Неопределено Тогда

Компоновщик.ЗагрузитьНастройки(НастройкиСКД);

Компоновщик.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);

Иначе

Компоновщик.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);

Конецесли;

 

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

Макет = МакетСКД.Выполнить(СКД, Компоновщик.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"),Ложь);

 

ПроцессорСКД = Новый ПроцессорКомпоновкиДанных;

ПроцессорСКД.Инициализировать(Макет);

 

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

ПроцессорВывода.УстановитьОбъект(ТаблицаВывода);

ПроцессорВывода.Вывести(ПроцессорСКД);

Исключение

ПроверкаПройдена = Ложь;

КонецПопытки;

 

Возврат ПроверкаПройдена;

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


 

Теперь можно открыть конфигурацию в режиме Предприятие и проверить внесенные изменения. Внимание! Для редактирования СКД конфигурацию нужно открыть в режиме Толстого клиента.

 

Автор

 

Королева Дина


Возврат к списку

Наши услуги и вакансии

Разработчики
на full-time
Программист 1С на 8 часов в день
от 1 600 руб/час
Позадачная
разработка 1С
Доработки и развитие любых решений на платформе 1С
Стоимость по оценке
Карьера в Neti

Вакансии разработчиков и консультантов 1С
З.П. от 100 000 рублей