Имя: Пароль:
1C
1С v8
Редактируемая ячейка СКД
,
0 ETurdymuratov
 
09.12.15
12:59
Есть отчет сделанный в СКД. Такого вида:
http://www.picshare.ru/view/6942691/
Все работает нормально. Поле "Оплачено" заполняется при проведении соответствующего документа, поле "Остаток" отражает разницу между полями "К оплате" и "Оплачено"
http://www.picshare.ru/view/6942692/
поле "Остаток" переходящий с предыдущего периода.
Вопрос такой, как можно сделать "Оплачено" редактируемым и при изменении данного поля чтобы автоматически пересчитывался остаток на каждую дату(поле "Остаток") и затем в итогах?
1 Nuobu
 
09.12.15
13:02
Нет.
2 zippygrill
 
09.12.15
13:03
(1) можно но не в СКД а на макет обычный
3 ETurdymuratov
 
09.12.15
13:05
(1) в смысле не реально?
4 kittystark
 
09.12.15
14:31
это можно сделать
для отчета СКД свою форму, на форме свой таб.док. Результат

1. в модуле объекта в ПриКомпоновкеРезультата смотришь что за поле выводится
и если это поле "Оплачено" снимаешь защиту для ячейки

2. в модуле формы Результату цепляешь обработчик ПриИзмененииСодержимогоОбласти - в нем смотришь что где было поменяно, и дальше алгоритм расчета
5 ETurdymuratov
 
11.12.15
08:03
(4) Благодарю за инф. Нашел примерно то что я хотел тут: http://catalog.mista.ru/public/158630/
6 ETurdymuratov
 
11.12.15
08:40
(4) Почти интегрировал механизм у себя в отчет,
1. в модуле объекта в ПриКомпоновкеРезультата смотришь что за поле выводится
и если это поле "Оплачено" снимаешь защиту для ячейки
- Алилуя теперь редактируется!!!

2. в модуле формы Результату цепляешь обработчик ПриИзмененииСодержимогоОбласти - в нем смотришь что где было поменяно, и дальше алгоритм расчета
выдает ошибку:
{Отчет.ВзаиморасчетыСПоставщиками.Форма.ФормаОтчета.Форма(96)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
    Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
по причине:
Недопустимое значение параметра (параметр номер '1')
проверил через отладчик функцию ПолучитьИзВременногоХранилища() параметр ДанныеРасшифровки оказалось пустая строка.
В самом примере все ок, туда передается адрес
Это как то связано с тем что пример сделан на упр формах а мой отчет на толстом клиенте?
7 aleks_default
 
11.12.15
09:18
"и дальше алгоритм расчета"
вот здесь самое интересное и начнется...
8 cw014
 
11.12.15
09:24
(6) А что у тебя в данных расшифровки? У тебя же вроде бы значение цеплять надо, не?
9 ETurdymuratov
 
11.12.15
09:40
Д (8) Да, там есть поле(редактируемое пользователем) от которого должны перерасчитываться остатки на дату и по итогам.
10 ETurdymuratov
 
11.12.15
09:41
(7) ...уже началось))
11 kittystark
 
11.12.15
10:10
(6) трюк с  Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
думаю нафиг не нужен

возьми в модуле объекта объяви экспортную переменную ДанныеРасшифровкиГлоб, в ПриКомпоновкеРезультата после того, как у тебя ПроцессорВывода выведет весь отчет запомни ДанныеРасшифровкиГлоб = ДанныеРасшифровки

а дальше с помощью этого
Функция ПолучитьПолеПоРасшифровкеОбластиСКД( областьТабличногоПоля ) Экспорт
    Попытка
        ИндексРасшифровки = Число(областьТабличногоПоля.Расшифровка);
        ЭлементРасшифровкиДанных = ДанныеРасшифровкиГлоб.Элементы[ИндексРасшифровки];
        ЭлементРасшифровкиДанныхПоля = ЭлементРасшифровкиДанных.ПолучитьПоля();
        возврат ЭлементРасшифровкиДанныхПоля[0].Поле;
    Исключение
        возврат Неопределено;
    КонецПопытки;
КонецФункции

определяешь что за поле соответствует ячейке табдока
12 aleks_default
 
11.12.15
10:12
(10) А еще интереснее будет когда ползователь залезет в настройки и поменяет группировки.
13 kittystark
 
11.12.15
10:31
(12) на первых порах можно отрубить стандартную форму настроек, подсунуть свою - чтоб не повадно было чего-то менять

а так да - на написание почти универсального алгоритма, учитывающего различные комбинации вложенности группировок как по строкам, так и по столбцам, с использованием массивов-структур-массивов-структур, заданием расчетных формул, влияющих и зависимых полей - у меня ушло НЕ МЕНЕЕ ПОЛУГОДА

пусть ТС решает что нужнее
14 aleks_default
 
11.12.15
10:47
(13) И... Твое резюме. Стоит ли желание буха увидеть в отчете "чтобы автоматически пересчитывался остаток"  полугода рабочего времени?
15 kittystark
 
11.12.15
12:12
в моем случае это была целая подсистема планирования продаж, я и не жалею - куча народа реально пользуется

а если жестко зафиксировать структуру настроек, отрубив стандартную форму, то в его случае можно наваять гораздо быстрее
16 ETurdymuratov
 
11.12.15
15:01
(15) Да скорее всего отрублю возможность пользователям менять структуру отчета. В принципе это и не нужно пользователям.
17 ETurdymuratov
 
13.12.15
19:09
(11) Объявил в модуле отчета переменную, тут же вставил функцию ПолучитьПолеПоРасшифровкеОбластиСКД. Параметр областьТабличногоПоля  у меня называется СуммаРасход(я так понимаю это наименование той самой редактируемой ячейки в макете?), затем из модуля формы обращаюсь к этой функции. Но при проверке ругается: Переменная не определена (СуммаРасход)
        ЗначенияРасшифровки = ПолучитьПолеПоРасшифровкеОбластиСКД(<<?>>СуммаРасход);
18 kittystark
 
14.12.15
11:43
(17) не-е-е...  так не пойдет, макеты тут ни причем

у тебя есть табличный документ, в СКД он обычно носит имя Результат, так вот ОбластьСКД в данном случае подразумевает под собой область этого табдока Результат, т.е. по-сути одну ячейку, ячейку и передавай

в моих отчетах редактируемых "видов" ячеек было несколько,
поэтому для начала приходилось определять чего отредактировал пользователь (количество,себестоимость,цену и т.д), а потом уже брать само значение


примеры вызовов
1) из модуля объекта в ПриКомпоновкеРезультата(ДокументРезультат, ...)
...
Поле = ПолучитьПолеПоРасшифровкеОбластиСКД(ДокументРезультат.Область(индСтр, индКол));
...
вернет тебе только название самого поля но не его значение

2) из модуля формы
...
Если ПолучитьПолеПоРасшифровкеОбластиСКД(ЭлементыФормы.Результат.Область(НомерСтроки,номерКолонки))="Количество" тогда
Колво = ПолучитьЗначениеПоРасшифровкеОбластиСКД(ЭлементыФормы.Результат.Область(НомерСтроки,номерКолонки));
...

чтобы написать код функции ПолучитьЗначениеПоРасшифровкеОбластиСКД - в (6) поменяй
возврат ЭлементРасшифровкиДанныхПоля[0].Поле;
на
возврат ЭлементРасшифровкиДанныхПоля[0].Значение;
и будет тебе счастье

в качестве параметра вызова этих функций можно использовать конструкцию ЭлементыФормы.Результат.ТекущаяОбласть
19 ETurdymuratov
 
14.12.15
13:09
(18) Спасибо за подробные ответы! Получилось достать содержимое ячейки. Но у автора той статьи в функция ПолучитьВсеЗначенияРасшифровки() возвращает структуру Название ячейки и содержимое ячейки, затем в функция ЗаписатьПланСервер() и дальше пересчет итогов...
20 ETurdymuratov
 
14.12.15
13:42
Может тогда возвратить структуру из ПолучитьПолеПоРасшифровкеОбластиСКД?
21 kittystark
 
14.12.15
17:33
(20) да без разницы, главное чтобы сам помнил и ориентировался что у тебя в коде возвращается

лично мне проще написать две почти похожие функции, а спустя пол года, мельком взглянув, по названию понять что же возвращается функцией
22 ETurdymuratov
 
15.12.15
14:28
(21) А если у меня нет группировок, как правильно переделать процедуру ПересчетИтоговВТаблице(...)? А то ругается {Отчет.ВзаиморасчетыСПоставщиками.Форма.ФормаОтчета.Форма(122)}: Значение не является значением объектного типа (Родитель)
        если ЗначенияГруппировок[массивГруппировок[номерГруппировки]] = ЗначенияГруппировок[массивГруппировок[номерГруппировки]].Родитель Тогда Возврат; КонецЕсли;
23 ETurdymuratov
 
15.12.15
14:45
(21)  ...при изменении данного поля чтобы автоматически пересчитывался остаток на каждую дату(поле "Остаток") и затем в итогах?
24 kittystark
 
15.12.15
15:25
(22) что там за код в (4) я не смотрел, и честно говоря нет ни времени ни желания

у тебя есть значение до редактирования - можно запоминать то что в ТекущейОбласти в обработчике ПриАктивизации для табдока

у тебя есть новое значение после ввода пользователем в ПриИзмененииСодержимогоОбласти, считаешь разность между ними, а дальше в цикле все ячейки остатка на последующие даты увеличиваешь на эту дельту, в т.ч. и итог

вот как-то так
25 ETurdymuratov
 
16.12.15
14:54
(24) Ок спасибо за внимание.