Добрый день!
По умолчанию в БИТ.Финанс возможно использовать 7 аналитик по своему усмотрению, то есть задать им произвольный тип. Собственно, этого количества может оказаться мало. В данной статье опишу мой опыт увеличения количества дополнительных аналитик в БИТ.Финанс. Было принято решение добавить сразу 3 аналитики, так как жадным быть плохо.
Я изменил конфигурацию только по тем объектам/фрагментам кода, которые задействуются в контурах автоматизации нашей организации. Плюс этого в том, что при обновлении не придется делать лишние объединения. Минус в том, что часть программы остается как бы недоработанной. Если позже понадобится использовать какой-то вид документа, который ранее не использовали, то придется возвращаться к этой задаче и делать доработку.
Во-первых, изменения касаются реквизитов объектов. Необходимо добавить реквизиты во все объекты, которые вы используете. Можно это сделать копированием существующих реквизитов и не тратить время на типизацию. Вот некоторые из примеров:
Вот список объектов, куда я добавил новые аналитики:
Регистры накопления:
- бит_ПланируемыйРасходДенежныхСредств
- бит_ОборотыПоБюджетам
- бит_КонтрольныеЗначенияБюджетов
- бит_ПричиныРасхожденийБюджета
- бит_ПланируемыеЗатраты
- бит_ПланируемоеПоступлениеДенежныхСредств
- бит_НезапланированныеРасходы
- бит_мто_ПотребностиНоменклатурыАналитика
- бит_мто_ПланируемаяЗакупкаНоменклатурыАналитика
- бит_мто_НезапланированныеЗакупки
- бит_ДвиженияДенежныхСредств
- бит_ГрафикиДоговоров
Регистры сведений:
- бит_ЗависимыеОбороты
- бит_СрокиКонтроляПоБюджету
- бит_ФормаВводаБюджетаЗависимыеОбороты
- бит_ФормаВводаБюджетаБДДС
- бит_НастройкиЗаполненияАналитикПоНазначениюПлатежа
- бит_ДанныеПроизвольныхОтчетов
Документы:
- бит_БюджетнаяОперация
- бит_ЗаявкаНаРасходованиеСредств
- бит_УстановкаКонтрольныхЗначений
- бит_ФормаВводаБюджета
- бит_УстановкаЗависимыхОборотов
- бит_КорректировкаКонтрольныхЗначений
- бит_КорректировкаБюджета
- СписаниеСРасчетногоСчета
- РасходныйКассовыйОрдер
- ПриходныйКассовыйОрдер
- ПоступлениеНаРасчетныйСчет
Обработки:
- бит_СозданиеФормВводаБюджета
- бит_ПодборДанныхБюджета
Кстати, список выбора доп.аналитик в назначении доп.аналитик определяется программно составом доп. аналитик в регистре накопления “бит_ОборотыПоБюджетам”.
Далее нужно дорабатывать код. Главный девиз: сделать по аналогии с имеющимися доп. аналитиками. По большей изменения в текстах запросов, где нужно опять же копипастом добавить новые аналитики. Обращайте внимание на группировки, соединения и т.п. в запросах по доп. аналитикам, чтобы ничего не сломать.
Самый обыкновенный пример:
Изменений было действительно много, вот некоторые места, где изменен код:
Общие модули:
бит_Казначейство
бит_КонтрольИсполненияБюджета
Общие формы:
бит_РедактированиеДополнительныхАналитик
Документы:
бит_БюджетнаяОперация - модуль менеджера
бит_ЗаявкаНаРасходованиеСредств - модуль объекта + модуль менеджера
бит_УстановкаКонтрольныхЗначений - модуль менеджера
бит_КорректировкаКонтрольныхЗначений - модуль менеджера
бит_ФормаВводаБюджета - модуль объекта + модуль менеджера
Также в коде много где содержится “магическое число” 7, несмотря на то что в самом БИТ.Финансе есть функция, возвращающая количество доп измерений. Таких мест я нашел 15. Исправляется довольно просто:
// Неправильно:
//Для Индекс = 1 По 7 Цикл
// Правильно:
Для Индекс = 1 По бит_МеханизмДопИзмерений.ПолучитьМаксимальноеКоличествоДополнительныхИзмерений() Цикл
Если НЕ ЗначениеЗаполнено(СтрокаРаспределения["Аналитика_" + Индекс]) Тогда
СтрокаРаспределения["Аналитика_" + Индекс] = Неопределено;
КонецЕсли;
КонецЦикла;
Соответственно, нужно сделать, чтобы функция возвращала число 10 вместо стандартных 7. Думаю, с этим проблем не возникнет.
Следующий шаг это доработка форм. В некоторых формах элементы и реквизиты доп. аналитик добавляются программно, так что не придется добавлять их на форму самостоятельно. Это, например, в “Форма ввода бюджета”.
А в “Заявка на расходование ДС” нужно будет прописать добавление реквизитов и элементов вручную. Не забыть повесить обработчики. При этом, могут быть реквизиты формы которые в конфигураторе не заданы, а добавляются программно в коде бит финанса, затем как-то используются. Фрагмент кода, который я добавил в заявку:
// При чтении документа вызывается эта процедура и определяет доступность элементов раньше,
// чем выполняется обработчик "ПриСозданииНаСервере". Поэтому элементы добавляем здесь.
// Кроме этого вызывается после записи.
&НаСервере
&Перед("ПодготовитьФормуНаСервере")
Процедура пари_ПодготовитьФормуНаСервере()
МассивРеквизитов = ПолучитьРеквизиты("Объект.Распределение");
ДобавляемыеРеквизитыУжеЕсть = Ложь;
Для Каждого Реквизит Из МассивРеквизитов Цикл
Если Реквизит.Имя = "Аналитика_8Доступность" Тогда
ДобавляемыеРеквизитыУжеЕсть = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ДобавляемыеРеквизитыУжеЕсть Тогда
Тип = Новый ОписаниеТипов("Булево");
Путь = "Объект.Распределение";
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_8Доступность", Тип, Путь));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_9Доступность", Тип, Путь));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_10Доступность", Тип, Путь));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_8Проверять", Тип, Путь));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_9Проверять", Тип, Путь));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Аналитика_10Проверять", Тип, Путь));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
НовыйЭлемент = Элементы.Добавить("Аналитика_8", Тип("ПолеФормы"), Элементы.ГруппаЗаявкаПравоОднострочныйДокумент);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Аналитика_8";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Аналитика_8ПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "АналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "АналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "АналитикаАвтоПодбор");
НовыйЭлемент = Элементы.Добавить("Аналитика_9", Тип("ПолеФормы"), Элементы.ГруппаЗаявкаПравоОднострочныйДокумент);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Аналитика_9";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Аналитика_9ПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "АналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "АналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "АналитикаАвтоПодбор");
НовыйЭлемент = Элементы.Добавить("Аналитика_10", Тип("ПолеФормы"), Элементы.ГруппаЗаявкаПравоОднострочныйДокумент);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Аналитика_10";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Аналитика_10ПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "АналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "АналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "АналитикаАвтоПодбор");
НовыйЭлемент = Элементы.Добавить("РаспределениеАналитика_8", Тип("ПолеФормы"), Элементы.Распределение);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Распределение.Аналитика_8";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "РаспределениеАналитикаПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "РаспределениеАналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "РаспределениеАналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "РаспределениеАналитикаАвтоПодбор");
НовыйЭлемент = Элементы.Добавить("РаспределениеАналитика_9", Тип("ПолеФормы"), Элементы.Распределение);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Распределение.Аналитика_9";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "РаспределениеАналитикаПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "РаспределениеАналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "РаспределениеАналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "РаспределениеАналитикаАвтоПодбор");
НовыйЭлемент = Элементы.Добавить("РаспределениеАналитика_10", Тип("ПолеФормы"), Элементы.Распределение);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Распределение.Аналитика_10";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "РаспределениеАналитикаПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "РаспределениеАналитикаНачалоВыбора");
НовыйЭлемент.УстановитьДействие("Очистка", "РаспределениеАналитикаОчистка");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "РаспределениеАналитикаАвтоПодбор");
КонецЕсли;
КонецПроцедуры
// Обработчики:
&НаКлиенте
Процедура Аналитика_8ПриИзменении(Элемент)
СинхронизироватьРеквизитыИОтобразитьБюджетСПаузой();
КонецПроцедуры
&НаКлиенте
Процедура Аналитика_9ПриИзменении(Элемент)
СинхронизироватьРеквизитыИОтобразитьБюджетСПаузой();
КонецПроцедуры
&НаКлиенте
Процедура Аналитика_10ПриИзменении(Элемент)
СинхронизироватьРеквизитыИОтобразитьБюджетСПаузой();
КонецПроцедуры
В отчетах добавление простое. В схему компоновки добавить поля, настроить по аналогии с имеющимися аналитиками. Не забудьте добавить настройки компоновщика данных, так как в примере ниже в СКД выключено автозаполнение.
Таким образом аналитики будут добавлены, в том числе их корректные заголовки в пользовательском режиме будут формироваться программно.
Есть изменения и в таких местах:
С помощью этой схемы осуществляется подбор лимитов в корректировку контрольных значений.
После всех изменений необходимо тщательно протестировать основные сценарии использования программы, дабы не сильно упасть лицом в грязь после переноса на прод. Вероятней всего в первое время вы всё же столкнетесь с багами разной критичности. Однако после их устранения всё будет работать как часы)
Всем удачи!