Понадобилось как-то дать возможность менеджерам компании видеть свои планы продаж в одной таблице. Более того, не просто видеть, а иметь возможность поменять значения для последующего сохранения в базе данных (в документах, регистрах и проч.). При этом одним из пожеланий было видеть данные в виде дерева значений для удобства понимания ситуации и возможностью сворачивать группировки, чтобы не мешали работать с нужными данными.
Пересмотрев несколько вариантов получения итогов в результирующих строках по колонкам, наиболее удобным для себя выбрал вариант пересчета с помощью рекурсивной процедуры. Удобство данного варианта для меня заключалось в том, что он позволял реализовать весь алгоритм на клиенте и тем самым не прибегая к таким функциям, как РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.
Для реализации потребовалось создать помимо дерева значений несколько реквизитов формы и заполнять их в подключаемых к дереву процедурах при начале изменении, активизации и изменении конкретной ячейки.
&НаКлиенте
Процедура ПриИзмененииКоличества()
ИмяКолонкиКоличества = Элементы["МатрицаПланов"].ТекущийЭлемент.Имя;
КолВоНовое = Элементы["МатрицаПланов"].ТекущиеДанные[ИмяКолонкиКоличества];
Если ВернутьКоличество Тогда
Элементы["МатрицаПланов"].ТекущиеДанные[ИмяКолонкиКоличества] = КолВоДоРедактирования;
Иначе
//------Точно рабочий вариант
КолвоДо = КолВоДоРедактирования; //0;
ОбновитьКоличество(ЭтаФорма.МатрицаПланов.НайтиПоИдентификатору(Элементы["МатрицаПланов"].ТекущаяСтрока), КолвоДо, КолВоНовое, ИмяКолонкиКоличества);
//------Альтернативный вариант, но надо доработать рекурсивное заполнение
//ПересчитатьДерево(ИмяКолонкиКоличества);
//------Да и после обновление дерево окажется закрытым см.процедуру
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриАктивацииКоличества()
ИмяКолонкиКоличества = Элементы["МатрицаПланов"].ТекущийЭлемент.Имя;
КонецПроцедуры
&НаКлиенте
Процедура ПриНачалеРедактированияКоличества()
ИмяКолонкиКоличества = Элементы["МатрицаПланов"].ТекущийЭлемент.Имя;
КолВоДоРедактирования = Элементы["МатрицаПланов"].ТекущиеДанные[ИмяКолонкиКоличества];
Если ЭтаФорма.МатрицаПланов.НайтиПоИдентификатору(Элементы["МатрицаПланов"].ТекущаяСтрока).ПолучитьЭлементы().Количество() <> 0 Тогда
ВернутьКоличество = Истина;
Иначе
ВернутьКоличество = Ложь;
КонецЕсли;
КонецПроцедуры
Далее при интерактивном изменении значения в ячейке пользователем запускается рекурсивная процедура.
&НаКлиенте
Процедура ОбновитьКоличество(ТекущаяСтрокаДерева, КолДо=0, КолПосле, ИмяКолонкиКоличества)
РодительСтроки = ТекущаяСтрокаДерева.ПолучитьРодителя();
Если РодительСтроки <> Неопределено Тогда
РодительСтроки[ИмяКолонкиКоличества] = ?(РодительСтроки[ИмяКолонкиКоличества]=Неопределено, 0, РодительСтроки[ИмяКолонкиКоличества]) + КолПосле - КолДо;
ОбновитьКоличество(РодительСтроки, КолДо, КолПосле, ИмяКолонкиКоличества);
КонецЕсли;
КонецПроцедуры
В прилагаемой обработке кроме указанных выше процедур существуют также процедуры по программному созданию дерева значений исходя из данных, заполненных в трёх таблицах и в реквизите "Период построения". По таблицам создаётся трёхуровневое дерево значений с колонками, представляющими месяцы из указанного периода.
Обработка тестировалась в Конфигурации 1С:ERP Управление предприятием 2.5.12.208 и 1С:Управление производственным предприятием на Платформе 1С v8.3.23.1865, но подойдут и другие конфигурации на управляемых формах начиная с платформы 1С v8.3.14.
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.14.82, 2.5.14.74