Справочники и документы для настроек (добавление документов и справочников в типовую конфигурацию «1С:Бухгалтерия 8»).

Возникают случаи, когда нам необходимо ввести определенные настройки организации, пользователя и иные правила для расчетов, при которых схема отображения аналогична  с настройками пользователя (пункт меню Сервис –> Настройки пользователя).

Для примера рассмотрим создание документа «Правила расчета СЧА (стоимости чистых активов)»:

Список категорий правил находится в Планах видов характеристиках, поэтому создадим под названием «Параметры СЧА».

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

Если у нас будут использоваться папки для группирования настроек, то тогда ставим флаг на значение «иерархический» в закладке «Иерархия»:

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

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

Для того, чтобы данные хранить в документе или справочнике, используем Регистры сведений. Необходимо создать регистр сведений «ПараметрыСЧА», где сохраняются выбранные значения настроек.

Типы измерений Регистратор1, Организация и Категория соответственно равны Документу или Справочнику, сохраняющим значения, значение из справочника Организация и категории из планов видов характеристик «ПараметрыСЧА». Значение ресурса «Значение» является характеристикой «ПараметраСЧА»:

Теперь можно приступить к созданию самого документа «Правил расчета СЧА». Реквизиты документа Организация, ДатаВступленияВСилу и Комментарий, которые мы рассматривать в данной теме не будем. Нас интересует использование категорий и значений правил расчета их изменение и сохранение.

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

Теперь перейдем к написанию кода, для «ДереваКатегорий» необходимы события «ПриВыводеСтроки» и «ПриИзмененииФлажка».

Процедура ДеревоКатегорийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

                ОформлениеСтроки.Ячейки.Категория.ОтображатьКартинку = Истина;

                Если ДанныеСтроки.ЭтоГруппа Тогда

                               ОформлениеСтроки.Ячейки.Значение.ТолькоПросмотр = Истина;

                               ОформлениеСтроки.Ячейки.Категория.ИндексКартинки = 0;                           

                Иначе

                               ОформлениеСтроки.Ячейки.Категория.ИндексКартинки = 1;

                КонецЕсли;

 

                Если ДанныеСтроки.Категория.ТипЗначения.СодержитТип(Тип("Булево"))

                                И ДанныеСтроки.Категория.ТипЗначения.Типы().Количество() = 1 Тогда

                               ОформлениеСтроки.Ячейки.Значение.ОтображатьТекст  = Ложь;

                               ОформлениеСтроки.Ячейки.Значение.ОтображатьФлажок = Истина;

                               ОформлениеСтроки.Ячейки.Значение.ТолькоПросмотр   = Истина;

                               ОформлениеСтроки.Ячейки.Значение.Флажок           = ДанныеСтроки.Категория.ТипЗначения.ПривестиЗначение(ДанныеСтроки.Значение);

                КонецЕсли;

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

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

ПриИзмененииФлажка – это событие флажка в значении типа Булево.

Процедура ДеревоКатегорийПриИзмененииФлажка(Элемент, Колонка)

                СтрокаДерева = ДеревоКатегорий.Строки.Найти(Элемент.ТекущиеДанные.Категория, "Категория", Истина);

                СтрокаДерева.Значение = Не СтрокаДерева.Категория.ТипЗначения.ПривестиЗначение(СтрокаДерева.Значение);

                ЭтаФорма.Модифицированность = Истина;

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

Событие выполняет следующее, находит значение текущей строки и ставит ей противоположное значение, то есть если было «Истина» ставит «Ложь», после чего форме сообщает что были внесены изменения, т.к. значение меняются не напрямую, а через флажок, который не привязан к значению через свойства значения, а только через программный код.

При изменении данных формы:

Процедура ПриИзмененииДанных()

                ЗаполнитьДерево();

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

Процедура заполнить дерево выполняет очистку «ДеревоКатегорий» находит (смотрите запрос) значения в соответствии с планом видов характеристик в регистре сведений по данной организации и выводит полученные значения в форме.

Процедура ЗаполнитьДерево()

                ДеревоКатегорий.Строки.Очистить();

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

                Запрос.УстановитьПараметр("Организация", Организация);

                Запрос.Текст=

                "ВЫБРАТЬ

                |               Настройки.Родитель,

                |               Настройки.Ссылка,

                |               Настройки.ЭтоГруппа КАК ЭтоГруппа,

                |               ЗначениеСЧА.Значение

                |ИЗ

                |               ПланВидовХарактеристик.ПараметрыСЧА КАК Настройки

                |                               ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыСЧА КАК ЗначениеСЧА

                |                               ПО ЗначениеСЧА.Категория = Настройки.Ссылка И (ЗначениеСЧА.Организация = &Организация)

                |ГДЕ

                |               (Настройки.ПометкаУдаления = ЛОЖЬ)

                |УПОРЯДОЧИТЬ ПО

                |               ЭтоГруппа ИЕРАРХИЯ,

                |               Настройки.Код";

                Выборка = Запрос.Выполнить().Выбрать();

                Пока Выборка.Следующий() Цикл

                               Если Не Выборка.Родитель.Пустая() Тогда

                                               СтрокаГруппы = ДеревоКатегорий.Строки.Найти(Выборка.Родитель, "Категория", Истина);

                               Иначе

                                               СтрокаГруппы = ДеревоКатегорий;

                               КонецЕсли;

                               СтрокаНастройки = СтрокаГруппы.Строки.Добавить();

                               СтрокаНастройки.Категория = Выборка.Ссылка;

                               СтрокаНастройки.Значение  = Выборка.Ссылка.ТипЗначения.ПривестиЗначение(Выборка.Значение);

                               СтрокаНастройки.ЭтоГруппа = Выборка.ЭтоГруппа;        

                КонецЦикла;

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

При записи формы, выполняется:

Процедура ПриЗаписи(Отказ)

                ОбновитьНастройки(Отказ);

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

Процедура ОбновитьНастройки выполняет запись значений в регистр сведений, заполнение этих значений выполняет процедура ЗаполнитьНаборЗаписей.

Процедура ОбновитьНастройки(Отказ)

                Набор = РегистрыСведений.ПараметрыСЧА.СоздатьНаборЗаписей();

                Набор.Отбор.Организация.Использование = Истина;

                Набор.Отбор.Организация.Значение      = Организация;

                ЗаполнитьНаборЗаписей(ДеревоКатегорий.Строки, Набор);

                Набор.Записать();

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

Процедура заполнения набора записей выполняет запись каждой строки, которая не является группой.

Процедура ЗаполнитьНаборЗаписей(СтрокиДерева, НаборЗаписей)

                Для Каждого СтрокаДерева Из СтрокиДерева Цикл

                               Если Не СтрокаДерева.ЭтоГруппа Тогда

                                               Запись = НаборЗаписей.Добавить();

                                               Запись.Организация = Организация;

                                               Запись.Регистратор1    = Ссылка;

                                               Запись.Категория    = СтрокаДерева.Категория;

                                               Запись.Значение     = СтрокаДерева.Категория.ТипЗначения.ПривестиЗначение(СтрокаДерева.Значение);

                               Иначе

                                               ЗаполнитьНаборЗаписей(СтрокаДерева.Строки, НаборЗаписей)

                               КонецЕсли;

                КонецЦикла;

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

После всех процедур в модуле формы:

// Чтобы избежать чтения при выводе строки, заполним признак группы сразу запросом

ДеревоКатегорий.Колонки.Добавить("ЭтоГруппа");

Для просмотра работы документа «Правила расчета СЧА» можете скачать файл конфигурации.