Переход с самописных конфигураций на платформе 7.7 на современную 8-ку (в частности, на «1С:Деньги») часто сопряжен с трудностями понимания новой архитектуры данных. Одной из самых неочевидных особенностей «1С:Деньги» является механизм хранения аналитики в документах Расход и Доход. В отличие от простых конфигураций, где проект или член семьи — это отдельные реквизиты, здесь используется механизм составных ключей аналитики.
Разберем подробно, как устроена эта система и как программно заполнить эти данные при переносе документов.
Проанализируем структуру табличной части документов Расход или Доход. Вы заметите, что там нет колонок «Проект» или «Член семьи» в привычном виде ссылок на соответствующие справочники. Вместо этого в строке документа присутствует реквизит Аналитика (или аналогичный), который ссылается на справочник ЗначенияСубконтоАналитика.
Этот справочник является своего рода «ключом», который объединяет в себе сразу несколько видов аналитики. Рассмотрим его особенности:
Субконто), где хранятся пары: ВидСубконто (ссылка на План видов характеристик) и Значение (ссылка на конкретный объект).Перед тем как записывать данные, нам нужно определить, какие именно виды аналитики мы хотим заполнить. Все они хранятся в объекте ПланыВидовХарактеристик.ВидыСубконтоАналитики. Выясним, как найти нужные нам виды программно:
// Пример получения ссылок на виды аналитики
ВидЧленСемьи = ПланыВидовХарактеристик.ВидыСубконтоАналитики.НайтиПоНаименованию("Член семьи");
ВидПроект = ПланыВидовХарактеристик.ВидыСубконтоАналитики.НайтиПоНаименованию("Проект");
Важный нюанс: Перечень доступных аналитик для конкретной строки документа жестко ограничен выбранной Статьей доходов/расходов. В самой статье указано, какие виды субконто для нее обязательны или разрешены. Если вы программно создадите ключ аналитики с проектом для статьи, которая проект не поддерживает, данные могут не отобразиться в интерфейсе.
Посмотрим на алгоритм, который позволяет найти существующую комбинацию аналитик или создать новую, если такой еще нет в базе. Это самый ответственный этап программного заполнения.
Рассмотрим пример функции, которая возвращает ссылку на нужный элемент справочника ЗначенияСубконтоАналитика:
Функция ПолучитьКлючАналитики(СтруктураАналитик)
// СтруктураАналитик содержит: Ключ - ВидСубконто, Значение - Ссылка на объект (физлицо, проект и т.д.)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Субконто.Ссылка КАК Ссылка
|ИЗ
| Справочник.ЗначенияСубконтоАналитика.Субконто КАК Субконто
|ГДЕ
| Субконто.ВидСубконто = &Вид1 И Субконто.Значение = &Значение1
| И Субконто.Ссылка В (
| ВЫБРАТЬ Ссылка ИЗ Справочник.ЗначенияСубконтоАналитика.Субконто
| ГДЕ ВидСубконто = &Вид2 И Значение = &Значение2
| )";
// В реальном коде запрос должен быть динамическим в зависимости от количества аналитик
// Здесь приведен упрощенный пример для двух аналитик (Член семьи и Проект)
// Если поиск не дал результатов, создаем новый элемент:
НовыйКлюч = Справочники.ЗначенияСубконтоАналитика.СоздатьЭлемент();
Для Каждого Аналитика Из СтруктураАналитик Цикл
НоваяСтрока = НовыйКлюч.Субконто.Добавить();
НоваяСтрока.ВидСубконто = Аналитика.Ключ;
НоваяСтрока.Значение = Аналитика.Значение;
КонецЦикла;
// Наименование в типовых часто формируется автоматически при записи или в обработке заполнения
НовыйКлюч.Записать();
Возврат НовыйКлюч.Ссылка;
КонецФункции
Теперь, когда у нас есть механизм получения «ключа», проанализируем ситуацию заполнения самого документа Расход. Мы должны сначала найти все составляющие, получить ключ и подставить его в табличную часть Состав.
Процедура ЗаполнитьДокументРасход(ДокОбъект, ДанныеИз77)
// 1. Заполняем шапку
ДокОбъект.Дата = ДанныеИз77.Дата;
ДокОбъект.Кошелек = НайтиКошелек(ДанныеИз77.КошелекНаименование);
// 2. Заполняем табличную часть
НоваяСтрока = ДокОбъект.Состав.Добавить();
НоваяСтрока.Статья = Справочники.СтатьиРасходов.НайтиПоНаименованию(ДанныеИз77.Статья);
НоваяСтрока.Сумма = ДанныеИз77.Сумма;
// 3. Формируем аналитику
Аналитики = Новый Структура;
Аналитики.Вставить(ВидыСубконтоАналитики.ЧленСемьи, Справочники.ФизическиеЛица.НайтиПоНаименованию(ДанныеИз77.ЧленСемьи));
Аналитики.Вставить(ВидыСубконтоАналитики.Проект, Справочники.Проекты.НайтиПоНаименованию(ДанныеИз77.Проект));
// 4. Присваиваем ключ аналитики строке документа
НоваяСтрока.Аналитика = ПолучитьКлючАналитики(Аналитики);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Проанализируем ситуацию, описанную в обсуждении: в документе отображается актуальное ФИО члена семьи, а в просматривателе объектов (или в наименовании ключа аналитики) — старое. Это происходит потому, что Наименование элемента ЗначенияСубконтоАналитика — это всего лишь статичная строка, которая записывается в момент создания элемента.
Если вы переименовали члена семьи в его основном справочнике, ссылка в табличной части ключа осталась прежней (правильной), но текстовое наименование самого ключа может не обновиться автоматически. При программном поиске всегда ориентируйтесь на ссылки и значения в табличной части ключа, а не на его текстовое Наименование.
Выясним основные правила, которые помогут избежать ошибок при работе с 8-кой:
РаботаСАналитикой), где уже реализована функция поиска или создания ключа аналитики. Поищите вызовы ЗначенияСубконтоАналитика в глобальном поиске по конфигурации.СтатьиРасходов для выбранной статьи действительно включено использование «Проекта» или «Члена семьи».ЗначенияСубконтоАналитика может влиять на то, как система распознает ключ. Лучше всего добавлять аналитики в том же порядке, в каком они определены в Плане видов характеристик.Таким образом, ключ к решению задачи — это работа не с документом напрямую, а с промежуточным справочником-контейнером, который консолидирует в себе все дополнительные разрезы учета.