Ок, тепер перейдемо до справи. Минулого тижня мені треба було швиденько зварганити простенький звіт для нашої бухгалтерії. Роботи було вкрай небагато - написав запит, вивів дані і готово. Якби не одне маленьке "але". У звіті була графа "Інші", дані для якої неможливо отримати під час формування звіту. Для конкретної рядки дані можуть бути, а можуть і не бути. В голову відразу прийшло рішення: "потрібно реалізувати можливість редагування відповідних осередків табличного документа і організувати перерахунок підсумкових полів". Начебто нічого складного, але до цього моменту з подібними завданнями я не стикався, і перший раз довелося трошки поламати голову.
Намалювавши на клаптику паперу приблизний план дій, я приступив до реалізації. В результаті у мене вийшов наступний алгоритм дій:
1. Визначаємо в макеті табличного документа осередки, значення яких будуть редагуватися. В об'єктному інспектора (до сих пір не знаю, як ця штука називається на мові 1С'ніков, тому за звичкою використовую Delph'ячью інтерпретацію) для таких осередків виставляємо властивість: "Містить значення" і вибираємо відповідний тип даних (в моєму випадку "Число "). Для зручності редагування і відображення введених даних рекомендується також виставити значення для властивостей "Формат" і "Формат редагування". Для свого звіту я виставив "ЧЦ = 15; ЧДЦ = 2; ЧГ = 3,0 ".
2. Для табличного документа, в який відбуватиметься висновок даних (у мене він був розташований на формі) створюємо обробник події "ПріІзмененііСодержімогоОбласті". Дана подія завжди виникає в момент редагування будь-якої області табличного документа. У тілі обробника пишемо приблизно наступний код:
Процедура ТаблічнийДокументПріІзмененііСодержімогоОбласті (Елемент, Область) ТабДок = ЕлементиФорми.ТаблічнийДокумент; // Функція "ПолучітьНомераОбластейДанних" повертає структуру, яка містить // дані про становище колонок, які повинні редагуватися. Повний код функції // доступний нижче. НомераОбластей = ПолучітьНомераОбластейДанних (); НомераОбластей.ОбластьДаннихНіз = ТабДок.ВисотаТабліци - 3; // Якщо координати поточний області потрапляють в список редагованих, то можна // приступати до редагування Якщо Область.Лево> = НомераОбластей.КолонкаНачіслено І Область.Лево <= НомераОбластей.КолонкаСуммаКВыплате И Область.Верх>= НомераОбластей.ОбластьДаннихВерх І Область.Верх <= НомераОбластей.ОбластьДанныхНиз Тогда //Получаем введенные пользователем значения СуммаНачислено = ТабДок.Область(Область.Верх, НомераОбластей.КолонкаНачислено).Значение; СуммаНалогНаДоходы = ТабДок.Область(Область.Верх, НомераОбластей.КолонкаНалогНаДоходы).Значение; СуммаПрочие = ТабДок.Область(Область.Верх, НомераОбластей.КолонкаПрочие).Значение; //Расчитываем итоги по строке СуммаУдержаноВсего = СуммаПрочие + СуммаНалогНаДоходы; СуммаКВыплате = СуммаНачислено - СуммаУдержаноВсего; //Выводим в область расчитанное значение ТабДок.Область(Область.Верх, НОмераОбластей.КолонкаВсего).Значение = СуммаУдержаноВсего; ТабДок.Область(Область.Верх, НомераОбластей.КолонкаСуммаКВыплате).Значение = СуммаКВыплате; //Приступаем к расчету итогов ИтоговоеЗначение = 0; //считаем итог по колонке Для сч = НомераОбластей.ОбластьДанныхВерх ПО НомераОбластей.ОбластьДанныхНиз-1 Цикл ИтоговоеЗначение = ИтоговоеЗначение + ТабДок.Область(сч, Область.Лево).Значение; КонецЦикла; ТабДок.Область(НомераОбластей.ОбластьДанныхНиз, Область.Лево).Значение = ИтоговоеЗначение; КонецЕсли; КонецПроцедуры
Сподіваюся, що з розумінням цієї процедури проблем виникнути не повинно, а раз так, то тобі залишається лише поглянути на код функції ПолучітьНомераОбластейДанних ():
Функція ПолучітьНомераОбластейДанних () Повернення Новий Структура ( "КолонкаНачіслено, КолонкаНалогНаДоходи, КолонкаПрочіе, КолонкаВсего, КолонкаСуммаКВиплате, ОбластьДаннихВерх, ОбластьДаннихНіз", 29, 38, 45, 52, 60, 22); КонецФункціі
Функція складається з одного рядка і все що в ній відбувається так це формування структури зі значеннями координат розташування колонок.
За всю мою практику необхідність у вирішенні такого завдання виникла всього лише один раз, і я не впевнений, що щось подібне виникне в найближчому майбутньому, проте потрібно бути готовим до всього. Цілком можливо, що з щось подібним зіткнешся і ти. Якщо це трапиться, то сподіваюся, мій пост дозволить тобі заощадити крапельку часу.