"ИИИИИИИИИИгорь, у нас на новый год новые статьи ДДС, надо настроить разнесение при загрузке банка", слышу я частенько, и доблестно и с важным видом иду в модуль объекта, в событие "Перед записью" документа. Чувствуя свое высшее предназначение писать код, в сотый раз переписываю конструкции "НайтиПоКоду" и многоуровневые "Если".
Хватит это терпеть скажете вы, и я тоже так подумал и решил создать гибкий пользовательский интерфейс для разнесения статей ДДС в банковских реквизитов, который бы учитывал любые комбинации условий и реквизитов.
Теперь пару слов о реализации:
1. За основу был взят механизм отбора компоновки данных, с помощью которого можно настраивать любые отборы по реквизитам объекта (привычный всем инструмент настройки отбора в отчетах или динамических списках), ниже пример создаваемого условия
2. Был создан регистр сведений с измерениями: СтатьяДДС, ИмяМетаданных, и ресурсами: "ВариантОтбора", "Приоритет". Приоритет служит чтоб не создавать взаимоисключающие условия, а выставить их в приоритете (При попадании в первый отбор, дальше условия не смотрятся). Ниже форма списка данного регистра, где непосредственно идет настройка условий.
3. Доработан "МенеджерОбменаЧерезУниверсальныйФормат", "ОтложеннаяОбработка" документов списание и поступление на р/с, так как в моем варианте первично банк загружается в БП, затем синхронизируется в УНФ. Ниже пример кода инициализации отбора СКД, и определения необходимой статьи ДДС.
&После("ОтложеннаяОбработка_ПБДС")
Процедура РДДС_ОтложеннаяОбработка_ПБДС(Объект)
//получим варианты отбора на дату
//получим первую подходящую статью
СтатьяНайдена = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РДДС_НастройкиРазнесенияДДС.ВариантОтбора КАК ВариантОтбора,
| РДДС_НастройкиРазнесенияДДС.СтатьяДДС КАК СтатьяДДС
|ИЗ
| РегистрСведений.РДДС_НастройкиРазнесенияДДС КАК РДДС_НастройкиРазнесенияДДС
|ГДЕ
| РДДС_НастройкиРазнесенияДДС.ПолноеИмяМетаданных = &ИмяМетаданныхДокумента
|
|УПОРЯДОЧИТЬ ПО
| РДДС_НастройкиРазнесенияДДС.Приоритет";
ИмяМетаданныхДокумента = Объект.Метаданные().имя;
Запрос.УстановитьПараметр("ИмяМетаданныхДокумента", ИмяМетаданныхДокумента);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОтборСКД = ВыборкаДетальныеЗаписи.ВариантОтбора;
ОтборСКД = ОтборСКД.Получить();
ДокументПоОтбору= ПолучитьДокументПоОтборуСКД(ИмяМетаданныхДокумента, Объект.ссылка, ОтборСКД);
Если ДокументПоОтбору <> 0 Тогда
Объект.Статья = ВыборкаДетальныеЗаписи.СтатьяДДС;
СтатьяНайдена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьДокументПоОтборуСКД(ИмяМетаданныхДокумента,СсылкаНаДокумент, ОтборСКД) экспорт
ТекстЗапроса = "ВЫБРАТЬ Разрешенные _.* ИЗ Документ."+ИмяМетаданныхДокумента+" КАК _ ";
Схема = ПолучитьОбщийМакет("РДДС_СхемаОтбораДокумента");
Схема.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
// восстановим настройки и добавим отбор по ссылке
РДДС_ОбщегоНазначения.СкопироватьЭлементы(Схема.НастройкиПоУмолчанию.Отбор, ОтборСКД);
ЭлементОтбора = Схема.НастройкиПоУмолчанию.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = СсылкаНаДокумент;
ЭлементОтбора.Использование = Истина;
Настройки = Схема.НастройкиПоУмолчанию;
//
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат.Количество();
КонецФункции
4. Расширение создавалось для конфигурации УНФ 1.6.26.191, но привязка к объектам конфигурации минимальная, Единственное, может быть расхождения по имени метаданных документов по банку и по версии Менеджера обмена, в данной конфигурации используется 1.8.
P.S В ответ музыкантам, баянистам) скажу, что под свою задачу похожих разработок не нашел, и поэтому выкладываю свою.