Программирование в Штрих-М Кассир 5

13.03.20

Разработка - Механизмы типовых конфигураций

Методы и свойства для программирования в Штрих-М Кассир 5.

15

 

Введение

Основная задача этого материала - это ознакомление с методиками программирования в программе Штрих-М Кассир 5.

 

Пред обработчики в Штрих-М Кассир 5

    1. Случаи применения

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

    1. Синтаксис для пред обработчиков

 

Для того чтобы пред обработчики стали работать, необходимо помещать обработки в каталог «ExtForms\ LogicalModules», наименование обработки не имеет никакого значения, расширения "epf".

Схематическое изображение обработки:

Обязательные реквизиты «Формы» в обработке, показаны ниже на рисунке:

 

Чтобы программа увидела ваш обработчик ее нужно инициализировать, рассмотрим на примере функции «Функция ЗакрытьЧек(Отмена = 0) Экспорт»  из обработки «Регистрация»:

Процедура ИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда                                 

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры

и соответственно при завершении работы кассира деинициализировать:

Процедура ДеИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = " ШтрихМ_Кассир " Тогда

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры

Причем  Метаданные.Имя обязательно должны быть сравнимы с именем «ШтрихМ_Кассир», иначе программа не инициализирует вашу доработку.

И наконец вызов самой функции:

Функция Регистрация_ЗакрытьЧек_ПредОбработка(Отмена) Экспорт

       Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", _Источник, ЭтаФорма);

       Если Обработчик <> Неопределено Тогда

                      _РезультатВызова =

                      Обработчик.Регистрация_ЗакрытьЧек_ПредОбработка(Отмена);

                      Если Обработчик._Отказ Тогда

                                      Возврат _РезультатВызова;

                      КонецЕсли;

       КонецЕсли;

…

КонецФункции

1-я часть шапка самой функции, она является вызовом с главной функции, затем идет тело функции, здесь код программиста, и конец возврат какого значения или же ничего.

Если присвоить переменной «Обработчик._Отказ»  истину, в этом случае функция в основном теле программы после обработчика выйдет из функции, т.е. пропустит ее выполнение.

 

    1. Доступ к основной форме (источник)

 

Иногда необходимо обратиться к некоторым методам чтобы узнать или изменить что-либо на форме или в содержании программы, для этого есть возможность обратиться к функциям основной программы, если они имеют реквизит «Экспорт», Примеры:

_Источник.ФункцияФормыРегистрации_Вниз()

– спускает курсор вниз по табличному полю

_Источник.ФункцияФормыРегистрации_ПросмотрПечатьЧека()

– просмотр и печать закрытого чека

 

Обращение к переменным основной программы, примеры:

_Источник. ГлавноеПолеВвода 

Значение главного поля ввода

_Источник.СоставЧека

– Состав чека в виде табличного значения

 

    1. Способы передачи данных

 

Между обработок необходимо передавать данные, один из универсальных способов это сохранять данные в текстовый файл, а затем его считывание, пример:

Сохранение данных-

ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";

ЗначениеВФайл(ИмяФайла,ПАР);

ПАР – это переменная или структура данных

 

Загрузка данных-    

Перем ПАР;

       ПАР = Новый Структура;

       ПАР.Вставить("Имя1");

      …

       ПАР.Вставить("ИмяN");



       //Считать из файла

       ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";

       Файл = Новый Файл(ИмяФайла);

       Если Файл.Существует() Тогда

                      ФайлЗагрузки = Новый ТекстовыйДокумент();

                      Попытка

                                      ФайлЗагрузки.Прочитать(ИмяФайла, КодировкаТекста.ANSI);

                                      ФайлЗагрузки = Неопределено;

                      Исключение

                                      Возврат ПАР;

                      КонецПопытки;

                     

                      ПолученноеЗначение = ЗначениеИзФайла(ИмяФайла);

                      Для каждого эл из ПолученноеЗначение Цикл

                                      Попытка

                                                      ПАР[эл.Ключ] = эл.Значение;

                                      Исключение

                                      КонецПопытки;               

                      КонецЦикла;      

                      Возврат ПАР;

       КонецЕсли;

       Возврат ПАР;

 

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

 

    1. Пример
Процедура ДеИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры// ДеИнициализироватьМодуль()



Процедура ИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда                                 

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры // ИнициализироватьМодуль()



Функция Регистрация_ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек_ПредОбработка() Экспорт

       Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", _Источник, ЭтаФорма);

       Если Обработчик <> Неопределено Тогда

                      Обработчик.Регистрация_ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек_ПредОбработка();

       КонецЕсли;      

      

       Если ВыполнитьВнешнююОбработку("ОбщиеФункции","Константы_РежимПАЕ_Получить") Тогда

                      //И если карта на приборе тогда ф-ция запрещена

                      ЭтаФорма._Отказ = Истина;

                      Возврат Истина;

       КонецЕсли;

      

КонецФункции

 

Пост обработчики в Штрих-М Кассир 5

    1. Случаи применения

Пост  обработчики, аналогичен инструменту пред обработчиков, только используются после выполнения функции.

    1. Синтаксис для пост обработчиков

 

Для того чтобы пред обработчики работали необходимо помещать обработки в каталог «ExtForms\ LogicalModules», наименование обработки не имеет никакого значения.

Схематическое изображение обработки:

Обязательные реквизиты «Формы» в обработке, показаны ниже на рисунке:

 

Чтобы программа увидела ваш обработчик ее нужно инициализировать, рассмотрим на примере функции «Функция ЗакрытьЧек(Отмена = 0) Экспорт»  из обработки «Регистрация»:

Процедура ИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда                                 

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры

 

 и соответственно при завершении работы кассира деинициализировать:

Процедура ДеИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда

       МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры

 

Причем  Метаданные.Имя обязательно должны быть сравнимы с именем «ШтрихМ_Кассир», иначе программа не инициализирует вашу доработку.

И наконец вызов самой функции:

Функция ПриНачалеРаботыСистемы_ПостОбработка() Экспорт

      

       Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", _Источник, ЭтаФорма);

       Если Обработчик <> Неопределено Тогда

                      Обработчик.ПриНачалеРаботыСистемы_ПостОбработка();

       КонецЕсли;

…

КонецФункции

 

1-я часть шапка самой функции, она является вызовом с главной функции, затем идет тело функции, здесь код программиста, и конец возврат какого значения или же ничего.

 

    1. Доступ к основной форме (источник)

 

Иногда необходимо обратиться к некоторым методам чтобы узнать или изменить что-либо на форме или в содержании программы, для этого есть возможность обратиться к функциям основной программы, если они имеют реквизит «Экспорт», Примеры:

_Источник.ФункцияФормыРегистрации_Вниз() 

– спускает курсор вниз по табличному полю

_Источник.ФункцияФормыРегистрации_ПросмотрПечатьЧека()

– просмотр и печать закрытого чека

 

Обращение к переменным основной программы, примеры:

_Источник. ГлавноеПолеВвода

Значение главного поля ввода

_Источник.СоставЧека

– Состав чека в виде табличного значения

 

    1. Способы передачи данных

 

Между обработок необходимо передавать данные, один из универсальных способов это сохранять данные в текстовый файл, а затем его считывание, пример:

Сохранение данных-

ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";

ЗначениеВФайл(ИмяФайла,ПАР);

ПАР – это переменная или структура данных

 

Загрузка данных-    

Перем ПАР;

       ПАР = Новый Структура;

       ПАР.Вставить("Имя1");

      …

       ПАР.Вставить("ИмяN");



       //Считать из файла

       ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";

       Файл = Новый Файл(ИмяФайла);

       Если Файл.Существует() Тогда

                      ФайлЗагрузки = Новый ТекстовыйДокумент();

                      Попытка

                                      ФайлЗагрузки.Прочитать(ИмяФайла, КодировкаТекста.ANSI);

                                      ФайлЗагрузки = Неопределено;

                      Исключение

                                      Возврат ПАР;

                      КонецПопытки;

                     

                      ПолученноеЗначение = ЗначениеИзФайла(ИмяФайла);

                      Для каждого эл из ПолученноеЗначение Цикл

                                      Попытка

                                                      ПАР[эл.Ключ] = эл.Значение;

                                      Исключение

                                      КонецПопытки;               

                      КонецЦикла;      

                      Возврат ПАР;

       КонецЕсли;

       Возврат ПАР;

 

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

 

    1. Пример
Процедура ДеИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры// ДеИнициализироватьМодуль()



Процедура ИнициализироватьМодуль() экспорт

       Если Метаданные.Имя = " ШтрихМ_Кассир " Тогда                                 

              МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", ЭтаФорма, Неопределено);

       КонецЕсли;

КонецПроцедуры // ИнициализироватьМодуль()



Функция Регистрация_ЗакрытьЧек_ПостОбработка(Отмена) Экспорт

       Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", _Источник,ЭтаФорма);

       Если Обработчик <> Неопределено Тогда

                      //Обработчик._РезультатВызова = внРезультат;

                      _РезультатВызова =

                      Обработчик.Регистрация_ЗакрытьЧек_ПостОбработка(Отмена);

                      Если Обработчик._Отказ Тогда

                                      Возврат _РезультатВызова;

                      КонецЕсли;

       КонецЕсли;

***              

КонецФункции

 

 

 

Добавление кнопок в меню «Супервизор»

    1. Случаи применения

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

    1. Как использовать, синтаксис содержимого

Во первых в папке ExtFiles создать файл «s_visor.ini», примерное содержимое:

[общие]

имя кнопки=Выгрузка Тов

[Настройка выгрузки]

функция=Data/btn1.1s

И выглядеть это будет так, для строки «имя кнопки=Выгрузка Тов» :

для строки «[Настройка выгрузки]» :

для строки «функция=Data/btn1.1s» :

Затем в папке «ExtForms» создадим каталог «Data» со следующим содержимым:

Содержимое файла btn1.1s

МодульОбмена = ВнешниеОбработки.Создать(Кассир5_DataAccess.КаталогВнешнихКомпонент + "Data\МодульСервиса.epf");

Если МодульОбмена <> Неопределено Тогда

                АктивнаяФорма = Неопределено;

                МодульОбмена.ПолучитьФорму("ФормаНастройки").ОткрытьМодально();

                АктивнаяФорма = ЭтаФорма;

КонецЕсли;

Обработка «МодульСервиса.epf», ее архитектура

Внутреннее содержимое Формы может быть любым, по нажатию кнопки можно выполнять любую функцию.

 

Добавление кнопки на форму регистрации и привязка функции к ней

    1. Случаи применения

В некоторых случаях необходимо  в режиме регистрации иметь функционал, который отсутствует в данной версии.

    1. Как расположить и синтаксис функции

Зайдем в Кассир 5 под правами администратора, в меню «Супервизора» перейдем в «Настройка»:

Затем в «Настройка формы регистрации»

Затем нажмем кнопку «>>»

В появившемся окне, добавим кнопку   правой кнопкой мыши «добавить кнопку», например «сертификат»

На добавленной кнопке нажмем правой кнопкой мыши «изменить», выбираем функцию

Сперва ее создадим, 

Заполним внутреннее содержимое, в данном случае это функция из обработки регистрация:

После сохранения функции, подключим функцию к кнопке, т.е. подключим.

Затем нажмем выход, «Esc»   и нажмем «Да», т.е. сохранить настройки.

    1. Редактирование и создание кнопок

Кнопки можно создавать через редакторы BMP или PNG и затем в настройке заходить в «Кнопки»

Через кнопку вставки добавлять кнопку или же ее изменять

Обязательно запомнить ее имя, а также заполнить значения картинок

На примере кнопки «Пром итог», нужно заполнить те расширения, в которых будет использоваться ваша кнопка, также это сделать для вариантов «Картинка нажатая», «Картинка недоступная», «Картинка активная»

 

 

Описание каталогов в папке «ExtForms»

В папке «ExtForms» есть следующие каталоги, см.ниже:

Каталог «AddOutputDev» - работа с дисплеями

Каталог «DataExchange» - загрузка и выгрузка файлов

Каталог «DCTerminals» - работа с терминалами данных

Каталог «Documents» - работа с документами

Каталог «Egais» - работа с ЕГАИС

Каталог «ExternalDB» - работа с базы данными(DBF, SQL)

Каталог «FPrinters» - работа с принтерами(ФР)

Каталог «LblComplex» - работа с весами, в которые можно загрузить товары.

Каталог «LogicalModules» - работа с дополнительными обработками

Каталог «Reports» - работа с отчетами

Каталог «Scales» - работа с весами

Каталог «Scanners» - работа с весами

Каталог «ShtrihPayMan.Modules» - работа с менеджером оплат

Каталог «Update» - работа с обновлением

Каталог «VideoControl» - работа с видео объектами наподобие кэшконтрола.

Данные каталоги имеют содержимое в виде обработок, так что у любого программиста 1С есть возможность изменить код.

 

Изменения самой конфигурации Штрих-М Кассир 5

Если вы купили типовую конфигурацию Штрих-М Кассир-5, есть возможность ее редактирования, единственное что при обновлении вам придется переносить ваши доработки, причем возможно что некоторые придется еще переписывать.

 

Заключение.

Из рассмотренных методов большая гибкость, она заключается в возможности создавать свою библиотеку и использовать по всем своим кассовым местам, с возможностью быстрого обновления.

Изменения интерфейса, изменения функционала – это сила данного метода.

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

 

Дополнительные ресурсы:

https://kkm.solutions/wiki/doku.php?id=кассир5:руководствопрограммиста

https://kkm.solutions/produkty/roznichnaya-torgovlya/shtrikh_m_kassir_5_0/

https://www.shtrih-m.ru/catalog/avtomatizatsiya-torgovli/shtrikh-m-kassir-5/

Штрих-М Кассир 5 программирование

См. также

Ценовая власть. Выносим из цикла схему СКД

Механизмы типовых конфигураций Ценообразование, анализ цен Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

Продолжение темы вынесения кусков повторно-используемого кода в запрос. В прошлый раз мы сделали это с вычислением пользовательских формул. Здесь замахнулись на формулы, задаваемые пользователем запросами.

1 стартмани

11.04.2024    477    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Какому-либо элементу списка сопоставляется числовое значение, зависящее от других значений, причем эта зависимость изменяется от элемента к элементу. Так, в справочнике "Валюты" курс какой-либо валюты может быть задан формулой (или даже запросом) от значения другой валюты. А в справочнике "Виды цен" формула определяет расчет цены для товарной позиции, т.е. элементов справочника "Номенклатура", у которых в карточке указан этот вид цены. А в 1С:ERP, например, этот механизм используется в ресурсной спецификации.

10 стартмани

11.04.2024    366    tango    5    

3

Ценовая власть. Второй сезон

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Бесплатно (free)

В первом сезоне мы рассмотрели (с точки зрения программиста) внутренний механизм, помещающий цены в регистр "Цены". Из этого регистра цена попадает в исходящие УПД (в продажи). Но эта цена (в прайс-листе) дифференцирована (ценообразована) в разрезах свойств самой номенклатуры. Но стратегия ценообразования, ценовая власть - это в первую очередь о работе с ценами для клиента. И тут вступает в дело второй акт марлезонского, Скидки (наценки) и кешбек.

08.04.2024    555    tango    0    

2

Ценовая власть (УТ 11.5) - 2

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Управление торговлей 11 Бесплатно (free)

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

06.04.2024    440    tango    1    

1

Ценовая власть или Управление ценообразованием (УТ 11.5)

Ценообразование, анализ цен Механизмы типовых конфигураций Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Абонемент ($m)

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    520    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2568    YA_418728146    11    

42

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1121    7    2ncom    3    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4952    mrXoxot    11    

100
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Van2507 11 18.03.20 15:40 Сейчас в теме
Интересная статья. Есть один вопрос. При заполнении содержимого функции на добавленной кнопки можно использовать только уже имеющиеся функции в конфигурации, точнее можно ли написать свою функцию в этом окне, или нужно указывать именно ссылку на функцию?
2. Ignatov_mu 40 24.03.20 23:09 Сейчас в теме
Можно описать полностью свою функцию.
3. SerSinelnik 30.08.21 22:54 Сейчас в теме
Как можно добавить на форму регистрации информационное поле:
Сумма чека в случае пересчета по доп цене товаров входящих в состав покупки?
4. Ignatov_mu 40 02.09.21 15:28 Сейчас в теме
(3)
Сумма чека в случае пересчета по доп цене товаров входящих в состав покупки

В ададптивном интерфейсе можно добавить "Пользовательская надпись" - и в обработчике устанавливать его заголовок.
Оставьте свое сообщение