Обработка ячейки таблицы

Работа с предопределённой процедурой ОбработкаЯчейкиТаблицы()

Когда ты работаешь с отчётом, у тебя может возникнуть желание посмотреть более детальную информацию. Например, бухгалтер сформировал ведомость документов по начислению заработной платы за первое полугодие 2011 года. Не исключено, что при взгляде в эту ведомость бухгалтеру может захотеться посмотреть, какая зарплата была начислена работнику Иванову в Апреле 2011 года.

Естественно, чтобы посмотреть начисление зарплаты отдельного работника за отдельный период, можно сформировать ведомость начисления заработной платы или построить карточку счёта учёта расчётов по зарплате за указанный период. Но в озвученной задаче наш бухгалтер уже сформировал ведомость документов. Вот они выстроились последовательно перед ним на экране с Января по Июнь. И чтобы посмотреть зарплату Иванова за Апрель, нужно всего-лишь зайти в документ, который справочно выводится в колонку "Документ" сформированной ведомости.

Казалось бы, зайди и посмотри. Но в соответствующей ячейке таблицы отчёта выводится только текст. И сколько по нему ни щёлкай левой кнопкой мыши, но документ не открывается.

Думаю, ты, мой читатель, уже догадался, что программист, который написал отчёт, выводящий перечень документов по начислению зарплаты, не настроил отчёт так, чтобы по двойному щелчку мышкой в колонке "Документ" открывался соответствующий документ. А как же произвести такую настройку?

Расшифровка ячейки таблицы

При работе с табличными отчётами следует знать одну особенность. Курсор мыши, будучи наведённым на обычную ячейку твбличного отчёта, имеет вид крестика. А если поверх такого крестика появляется увеличительная лупа, значит это не простая ячейка.

Курсор меняется при наведении на ячейку с расшифровкой
Курсор меняется при наведении на ячейку с расшифровкой.

На рисунке выше курсор над обычной ячейкой выделен красным квадратиком, а курсор над особенной ячейкой выделен зелёным квадратиком. Вот об этих особенных ячейках табличного отчёта мы и поговорим подробнее.

Увеличительная лупа в изображении курсора над ячейкой означает, что значение такой ячейки можно рассмотреть более детально или подробно. Выражаясь иначе, значение ячейки можно расшифровать. И подразумевается, что в этой ячейке содержится некая расшифровка, расшифровывающая значение ячейки.

Следует заметить, что на практике расшифровка в ячейку помещается не только для того, чтобы выполнить соответствующую расшифровку значения ячейки. Нередко при анализе отчёта необходимо выполнить какое-нибудь действие. Например, анализируя ведомость задолженности покупателей, менеджер может отправить требование о погашении задолженности в письме по электронной почте всего-лишь дважды щёлкнув левой кнопкой мыши по ячейке с наименованием покупателя. Удобно ведь?

Как сделать так, чтобы в ячейке появилась расшифровка? Для этого необходимо в Конфигураторе в свойствах ячейки таблицы в реквизите "Расшифровка" написать имя переменной, которая будет содержать настройки расшифровки.

Расшифровка в свойствах ячейки таблицы
Расшифровка в свойствах ячейки таблицы

Следует помнить, что программа 1С не проверяет, насколько правильное значение помещено в реквизит "Расшифровка" свойств ячейки. Можно поместить любое значение в реквизит "Расшифровка", будь то число, текст или несуществующая переменная, и этого будет достаточно, чтобы программа 1С в табличном отчёте вывела курсор в виде крестика с увеличительной лупой над ячейкой с такой расшифровкой. Поэтому нужно быть бдительным и не всегда доверяться тому, что видишь.

Значение расшифровки

Чтобы правильно и в полной мере воспользоваться расшифровкой в ячейке таблицы, следует понимать, что в реквизите "Расшифровка" свойств ячейки можно вписать только текст. Если расшифровка у ячейки заполнена, то при наведении курсора мыши на такую ячейку к обычному крестику добавится увеличительная лупа, а при двойном щелчке левой кнопкой мыши по такой ячейке произойдёт обработка расшифровки, которая назначена для такой ячейки.

Сразу следует сказать о том, что для обработки расшифровки, установленной для ячейки таблицы, в системе 1С предусмотрена предопределённая процедура "ОбработкаЯчейкиТаблицы". Эта процедура может располагаться или в модуле объекта, которому принадлежит таблица (отчёт, обработка, документ, элемент справочника и тому подобное), или в Глобальном модуле.

Если система не обнаружит процедуру "ОбработкаЯчейкиТаблицы" в локальном или глобальном модулях, то интерпретирует расшифровку так, как сможет. Например, если расшифровка содержит переменную, в которой находится документ, то по умолчанию после двойного щелчка на ячейке с расшифровкой на экране появится форма документа. Если интерпретировать расшифровку ячейки не удастся, то будет выведено соответствующее сообщение об ошибке.

Давай рассмотрим несколько примеров заполнения расшифровки.

Переменная в расшифровке

Допустим, поставлена задача создать отчёт, в который выводится ведомость документов, отобранных по определённому признаку. Как правило, чтобы получить данные для такого отчёта, используется язык запросов. И, как следствие, при обходе результатов запроса можно сослаться на следующий документ, используя конструкцию "Запрос.Документ".

//запрос
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса="
|Период С ДатаН По ДатаК;
|_Элеватор=Регистр.Элеватор.Элеватор;
|_Культура=Регистр.Элеватор.Культура;
|_Количество=Регистр.Элеватор.Количество;
|Группировка Документ;
|Функция Расход=Сумма(_Количество);
|"
;
//проверка
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
    Возврат;
КонецЕсли;
//документы
Пока Запрос.Группировка(1)=1 Цикл
    Т.ВывестиСекцию("Строка");
КонецЦикла;

Если текст "Запрос.Документ" поместить в реквизит "Расшифровка" ячейки, которая будет выводиться в колонке "Документ" (секция "Строка") итогового отчёта, то в сформированном отчёте при двойном щелчке на ячейке в колонке "Документ" на экране будет появляться форма запрашиваемого документа.

В тексте модуля при обходе результатов выполнения запроса также можно предусмотреть переменную "ТекДокумент", которой присвоить значение документа, полученного в запросе.

ТекДокумент=Запрос.Документ;

В таком случае, в реквизит "Расшифровка" свойств ячейки следует поместить текст "ТекДокумент", соответствующий имени переменной.

Функция в расшифровке

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

Функция Расшифровка(Номер)
    гПакет.Установить("Отчет","РасходЭлеватор");
    гПакет.Установить("Кнопка",Номер);
    Возврат(гПакет);
КонецФункции

Вышеприведённая функция (точнее, её имя) обычно помещается в расшифровку "кнопки", которая находится в левом верхнем углу отчёта.

Расшифровка кнопки управления отчётом
Расшифровка кнопки управления отчётом

Если дважды щёлкнуть по кнопке "Обновить", то сначала будет выполнена функция "Расшифровка()" с аргументом "1", который соответствует кнопке "Обновить". Функция в качестве результата выдаст список значений, который содержит идентификатор отчёта и номер кнопки. Затем система 1С запустит предопределённую процедуру ОбработкаЯчейкиТаблицы() и в качестве аргумента передаст в неё полученный ранее список значений.

Обработка ячейки таблицы

Рассмотрим подробнее предопределённую процедуру ОбработкаЯчейкиТаблицы(). Напомню, что эта процедура может находиться и в локальном модуле объекта, из которого формируется таблица. Но в подавляющем большинстве случаев процедура ОбработкаЯчейкиТаблицы() располагается в Глобальном модуле системы 1С, а потому именно в этой процедуре описываются все возможные варианты значений, которые могут в процедуру передаваться.

Ниже можно увидеть пример процедуры ОбработкаЯчейкиТаблицы(). Примечательна она тем, что позволяет расширить тот функционал в работе с таблицами, который предусмотрен в типовых конфигурациях. Например, если в расшифровку ячейки поместить переменную, которая содержит документ, то при обработке расшифровки по такой ячейке можно будет открыть не только форму документа, но и открыть журнал документов, к которому относится искомый документ, при этом искомый документ будет активирован.

Контекстное меню с открытием документа в журнале
Контекстное меню с возможностью открытия документа в журнале документов

Если обрабатывается элемент справочника, то можно открыть не только форму элемента, но и форму списка элементов справочника, а искомый элемент будет активирован.

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

Приведу пример. Допустим, бухгалтер сформировал шахматку, в которой отображается корреспонденция дебетовых и кредитовых счетов за период. Если разнообразие операций у организации велико, то шахматка по масштабам получается огромной, и бухгалтеру бывает тяжело определить, к какой корреспонденции относится конкретная сумма, показанная в отчёте. Чтобы упростить действия бухгалтера, который хочет из отчёта "Шахматная ведомость" сформировать отчёт "Карточка оборотов между счетами" для данной суммы, можно сделать так, как показано на рисунке ниже. Контекстное меню, которое открывается по щелчку на ячейке с исследуемой суммой, содержит не только наименование детализирующего отчёта, но и корреспонденцию счетов, по которой будет построен отчёт.

Подсказка по корреспонденции счетов в контекстном меню
Подсказка по корреспонденции счетов в контекстном меню

Кстати, чтобы проделать такой трюк, в модуле отчёта должен быть прописан специальный код. В частности, в список значений "гПакет", который помещается в расшифровку ячейки и который затем передаётся в предопределённую процедуру ОбработкаЯчейкиТаблицы(), добавляется значение с представлением "Меню". После текста "Меню" можно указывать порядковые номера элементов списка меню (например, "Меню1", "Меню5" или просто "Меню", если в контекстном меню будет всего один элемент). Значение данного элемента списка значений имеет тип "Строка" и состоит из двух частей. Левая и правая части значения разделяются символом "|" (вертикальная черта). В левой части значения указывается идентификатор отчёта, который требуется запустить. В правой части значения указывается в произвольной форме текст, который будет выводиться после пользовательского представления открываемого отчёта.

//счета
Б.ВыбратьСчета(1,1);
Пока Б.ПолучитьСчет()=1 Цикл
    Состояние("Заполнение: "+Б.Счет.Код);
    Если Б.Счет.Выбран()=0 Тогда
        Продолжить;
    ИначеЕсли Не(ФлагЗабалансовый=Б.Счет.Забалансовый) Тогда
        Продолжить;
    КонецЕсли;
    //счет
    тСчет=Б.Счет.Код;
    Т.ВывестиСекцию("Строка|Счет");
    //корсчета
    Б.ВыбратьКорСчета(1,1);
    Пока Б.ПолучитьКорСчет()=1 Цикл
        Если Б.КорСчет.Выбран()=0 Тогда
            Продолжить;
        ИначеЕсли Не(ФлагЗабалансовый=Б.КорСчет.Забалансовый) Тогда
            Продолжить;
        КонецЕсли;
        //пакет
        гПакет.УдалитьВсе();
        гПакет.Установить("ДатаН",ДатаН);
        гПакет.Установить("ДатаК",ДатаК);
        гПакет.Установить("Меню1","Б_КарточкаОборотыСчета|"+Б.Счет.Код+","+Б.КорСчет.Код);
        гПакет.Установить("СчетД",Б.Счет);
        гПакет.Установить("СчетК",Б.КорСчет);
        гПакет.Установить("Меню2","Б_АнализСчета|"+Б.Счет.Код);
        гПакет.Установить("Счет",Б.Счет);
        //сумма
        Сумма=Б.КорДО();
        Т.ПрисоединитьСекцию("Строка|Колонка");
    КонецЦикла;
    //сумма
    Сумма=Б.ДО();
    Т.ПрисоединитьСекцию("Строка|Всего");
КонецЦикла;

А в отдельных случаях может потребоваться прямо из отчёта по двойному щелчку мыши запустить какое-нибудь приложение MS Windows или выполнить какой-нибудь скрипт в оболочке MS Windows. Такие действия также можно выполнить, сделав необходимые настройки в предопределённой процедуре ОбработкаЯчейкиТаблицы().

Итак, твоему вниманию предлагается пример предопределённой процедуры ОбработкаЯчейкиТаблицы(), которая значительно расширяет функциональность работы с отчётами по сравнению с функционалом, заложенным в типовые конфигурации.

Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг,Таблица,Адрес)
     Перем Ответ;
     Перем Ко;
     Если ПустоеЗначение(Значение)=1 Тогда
          Предупреждение("Невозможно обработать значение ячейки!");
     ИначеЕсли ТипЗначенияСтр(Значение)="Документ" Тогда
          Если гПользователь.ФлагСписок=0 Тогда
               Флаг=1;
          Иначе
               А=СоздатьОбъект("СписокЗначений");
               А.ДобавитьЗначение(0,"Открыть документ");
               А.ДобавитьЗначение(1,"Открыть в журнале документов");
               Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
                    Если Ответ=0 Тогда
                         Флаг=1;
                    Иначе
                         Журнал=Метаданные.Документ(Значение.Вид()).Журнал.Идентификатор;
                         ОткрытьФорму("Журнал."+Журнал+".Основная",Ко);
                         Ко.АктивизироватьОбъект(Значение);
                    КонецЕсли;
               КонецЕсли;
          КонецЕсли;
     ИначеЕсли ТипЗначенияСтр(Значение)="Справочник" Тогда
          Если гПользователь.ФлагСписок=0 Тогда
               Флаг=1;
          Иначе
               А=СоздатьОбъект("СписокЗначений");
               А.ДобавитьЗначение(0,"Открыть элемент");
               А.ДобавитьЗначение(1,"Открыть в списке справочника");
               Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
                    Если Ответ=0 Тогда
                         Флаг=1;
                    Иначе
                         Журнал=Метаданные.Справочник(Значение.Вид()).ОсновнаяФорма;
                         ОткрытьФорму("Справочник."+Значение.Вид()+"."+Журнал,Ко);
                         Ко.АктивизироватьОбъект(Значение);
                    КонецЕсли;
               КонецЕсли;
          КонецЕсли;
     ИначеЕсли ТипЗначенияСтр(Значение)="СписокЗначений" Тогда
          //расшифровка - СписокЗначений
          Кнопка=Значение.Получить("Кнопка");
          Если Число(Кнопка)=0 Тогда
               Значение.СортироватьПоПредставлению();
               //обработка - Ячейка
               Представление="";
               А=СоздатьОбъект("СписокЗначений");
               Для i=1 По Значение.РазмерСписка() Цикл
                    Отчет=Значение.ПолучитьЗначение(i,Представление);
                    Если ПустаяСтрока(Отчет)=1 Тогда
                         Продолжить;
                    ИначеЕсли Лев(Представление,4)="Меню" Тогда
                         //элемент контекстного меню в ячейке
                         Позиция=Найти(Отчет,"|");
                         Если Позиция=0 Тогда
                              Представление=Метаданные.Отчет(Отчет).Представление();
                         Иначе
                              Добавка=Сред(Отчет,Позиция+1);
                              Отчет=Лев(Отчет,Позиция-1);
                              Представление=Метаданные.Отчет(Отчет).Представление()+": "+Добавка;
                         КонецЕсли;
                         А.ДобавитьЗначение(Отчет,Представление);
                    КонецЕсли;
               КонецЦикла;
               //контекстное меню в ячейке
               Если А.РазмерСписка()>0 Тогда
                    Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
                         Значение.Выгрузить(гПакет);
                         гПакет.Установить("Таблица","");
                         ОткрытьФормуМодально("Отчет."+Ответ,1+гПользователь.ФлагОтчет);
                    КонецЕсли;
               КонецЕсли;
          Иначе
               //обработка - Кнопка
               Значение.Выгрузить(гПакет);
               гПакет.Установить("Таблица",Таблица);
               Отчет=Значение.Получить("Отчет");
               ОткрытьФормуМодально("Отчет."+Отчет,Кнопка);
               гПакет.Установить("Таблица","");
          КонецЕсли;
     ИначеЕсли ТипЗначенияСтр(Значение)="Строка" Тогда
          Если ВРег(Лев(СокрЛП(Значение),6))="ССЫЛКА" Тогда
               СтрокаЗапуска=СокрЛП(Сред(Значение,7));
               ЗапуститьПриложение(СтрокаЗапуска);
          Иначе
               Флаг=1;
          КонецЕсли;
     Иначе
          //расшифровка - Стандартная обработка ячейки
          Флаг=1;
     КонецЕсли;
КонецПроцедуры

Как показывает практика, в программе 1С можно сделать всё. А опыт подсказывает, что возможности программы 1С ограничиваются исключительно возможностями программиста, который её настраивает.

Эпилог

В статье описана методика работы с предопределённой процедурой ОбработкаЯчейкиТаблицы() в программе 1С. Даны разъяснения, советы и рекомендации по оптимальной обработке расшифровки, которая настраивается в свойствах ячейки таблицы. Представлены визуальные примеры экранных форм и программного кода.

Реклама:
Смотрите также:
Методы увеличения производительности программиста 1С
Защитить здоровье при длительной работе за компьютером
Подписаться на новости