Редактирование данных прямо в отчете СКД (как в Excel). Теперь с пересчетом итогов!
Программирование - Практика программирования
Предлагаю вашему вниманию механизм (почти универсальный) по редактированию данных в ячейках СКД
Во вложении конфигурация с демо данными и отчетом "Планирование затрат"
Я смоделировал пример - необходимо планировать затраты по подразделениям
Все описание работы механизма в видеопрезентации. Теперь работает пересчет итогов по группировкам!
См. также
Специальные предложения
СохранитьЗначение("Значение и Номер Ячейки и Имя Пользователя и Вариант отчета", ТабличаЗначенийОтчета);
ТабличаЗначенийОтчета = ВосстановитьЗначение("Значение и Номер Ячейки и Имя Пользователя и Вариант отчета");
Обрабатывать Таблицу Значений Отчета, а при окончании расшифровки заменять значения ячейк в отчете.
Однако сижу на работе, не могу открыть видео... Хоть бы пояснение в пару фраз могли бы в статье и поместить. А то "редактирование как в Excel" - слишком расплывчато. Могу только строить домыслы. Например:
"Имеется отчет, построенный по регистру. К нему предлагается механизм, позволяющий набрать прямо в ячейках новые значения реквизитов, а затем сохранить их в записи регистра."
Ну вот насколько я угадал?
Использовал несколько иной механизм, в расшифровку засовывал открытие формы для редактирования (выбор из списка и комментарий) из которой и вносил изменения в регистр по которому строился отчёт, после записи отчёт переформировывал.
Хотелось бы всё таки чтобы менялись итоги без переформирования отчёта.
Хотелось бы всё таки чтобы менялись итоги без переформирования отчёта.
Эта задача совсем другого порядка - ее можно решить, но это уже другие трудозатраты
Правда не совсем мега супер универсально, но в 90% случаях подойдет
В модуле формы добавил рекурсивную процедуру ПересчетИтоговВТаблице
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
РезультатРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка, новый полеКомпоновкиДанных(ПолеРасшифровки));
Функция ПолучитьЗначенияГруппировокОтчета(знач ДанныеРасшифровки, Расшифровка, ПолеРасшифровки, ЗначенияГруппировок,ОбработкаРасшифровки)
//ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
РезультатРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка, новый полеКомпоновкиДанных(ПолеРасшифровки));
для каждого текСтрокаОтбора из РезультатРасшифровки.Отбор.Элементы цикл
для каждого текГруппировка из ЗначенияГруппировок цикл
если текСтрокаОтбора.ЛевоеЗначение = новый ПолеКомпоновкиДанных(текГруппировка.Ключ) и текСтрокаОтбора.Использование=Истина Тогда
ЗначенияГруппировок[текГруппировка.Ключ] = текСтрокаОтбора.ПравоеЗначение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ЗначенияГруппировок;
КонецФункции
ПоказатьСделал так отчет стал работать в разы быстрее, т.е. не создавать каждый раз обработку расшифровки а передавать 1 раз!
В своем отчете не использую группировки, возможно ли как то "отловить" содержимое ячейки, относительно выделенной изменяемой области? (Вместо статей затрат у меня колонка с номенклатурой, в конечном итоге в регистр сведений нужно писать Номенклатуру+ Значение выделенной ячейки)
ЭлементыФормы.Результат.Область(текСтрокаСвязи.Ряд, текСтрокаСвязи.Колонка+1, текСтрокаСвязи.Ряд, текСтрокаСвязи.Колонка+1),
но не получается, пишет что значение недоступно для чтения.
Есть какие-нибудь идеи как это реализовать?
ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета(ДанныеРасшифровки, ТекущаяОбласть.Расшифровка, "СуммаПлан", Новый Структура("Сотрудник, Контрагент, ТорговаяМарка"),ОбработкаРасшифровки);
надо внести в это если:
Если ЗначенияРасшифровки.Свойство("СуммаПланСКР") Тогда
Тогда и расшифровки норм останутся все и побыстрее еще будет работать!
ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета()
Для кол = ДокументРезультат.ФиксацияСлева+1 по ДокументРезультат.ШиринаТаблицы цикл
Для ряд = ДокументРезультат.ФиксацияСверху+1 по ДокументРезультат.ВысотаТаблицы цикл
ТекущаяОбласть = ДокументРезультат.Область(ряд, кол, ряд, кол);
если ТекущаяОбласть.Расшифровка = Неопределено Тогда Продолжить; КонецЕсли;
ЗначенияРасшифровки = ПолучитьВсеЗначенияРасшифровки(ДанныеРасшифровки.Элементы[ТекущаяОбласть.Расшифровка]);
Если ЗначенияРасшифровки.Свойство("КолонкаДляРедактирования") Тогда
ТекущаяОбласть.Защита=ложь;
ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета(ДанныеРасшифровки, ТекущаяОбласть.Расшифровка, "КолонкаДляРедактирования", Новый Структура("Товар, Клиент"),ОбработкаРасшифровки);
.
.
.
Иначе
// !Добавить прерывание цикла для неинтересных колонок
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьВ общем очень очень очень тормознутый метод для больших объемов информации. У меня мой метод работал мгновенно, но там были некие проблемы другого плана, поэтому подумал что ваша обработина мне поможет. Не помогла.
Но некоторые методы пригодятся в доработке моего решения (хотя уже было принято решение делать обработкой, а не отчетом). В общем нафига потратил стартмани - непонятно 0_о
Ну надо же их куда-то тратить, а то лежат и лежат уже года 2-3))
Я пытался сразу в макете указать данные свойства, но именно эти свойства не перенеслись в полученный табличный документ.
Может все-таки как-то можно решить задачу через макет, и не перебирать все ячейки?

Просмотры 30648
Загрузки 204
Комментарии 50
Создание 21.11.12 15:48
Обновление 08.09.17 17:18
№ Публикации 158630
Рубрики Практика программирования Работа с интерфейсом
Кому Программист
Тип файла Конфигурация (md, cf)
Платформа Система компоновки данных
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
печать кассовых чеков на одну кассу 54-фз с нескольких рабочих мест
|

