Введение
Основная задача этого материала - это ознакомление с методиками программирования в программе Штрих-М Кассир 5.
Пред обработчики в Штрих-М Кассир 5
-
- Случаи применения
Пред обработчики сильнейший инструмент - используются для того, чтобы обработать аргументы перед выполнением функции или дать функции свои аргументы для обработки, или пропустить выполнение функции при определенных условиях.
-
- Синтаксис для пред обработчиков
Для того чтобы пред обработчики стали работать, необходимо помещать обработки в каталог «ExtForms\ LogicalModules», наименование обработки не имеет никакого значения, расширения "epf".
Схематическое изображение обработки:
Обязательные реквизиты «Формы» в обработке, показаны ниже на рисунке:
Чтобы программа увидела ваш обработчик ее нужно инициализировать, рассмотрим на примере функции «Функция ЗакрытьЧек(Отмена = 0) Экспорт» из обработки «Регистрация»:
Процедура ИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры
и соответственно при завершении работы кассира деинициализировать:
Процедура ДеИнициализироватьМодуль() экспорт
Если Метаданные.Имя = " ШтрихМ_Кассир " Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры
Причем Метаданные.Имя обязательно должны быть сравнимы с именем «ШтрихМ_Кассир», иначе программа не инициализирует вашу доработку.
И наконец вызов самой функции:
Функция Регистрация_ЗакрытьЧек_ПредОбработка(Отмена) Экспорт
Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ЗакрытьЧек.ПредОбработка", _Источник, ЭтаФорма);
Если Обработчик <> Неопределено Тогда
_РезультатВызова =
Обработчик.Регистрация_ЗакрытьЧек_ПредОбработка(Отмена);
Если Обработчик._Отказ Тогда
Возврат _РезультатВызова;
КонецЕсли;
КонецЕсли;
…
КонецФункции
1-я часть шапка самой функции, она является вызовом с главной функции, затем идет тело функции, здесь код программиста, и конец возврат какого значения или же ничего.
Если присвоить переменной «Обработчик._Отказ» истину, в этом случае функция в основном теле программы после обработчика выйдет из функции, т.е. пропустит ее выполнение.
-
- Доступ к основной форме (источник)
Иногда необходимо обратиться к некоторым методам чтобы узнать или изменить что-либо на форме или в содержании программы, для этого есть возможность обратиться к функциям основной программы, если они имеют реквизит «Экспорт», Примеры:
_Источник.ФункцияФормыРегистрации_Вниз()
– спускает курсор вниз по табличному полю
_Источник.ФункцияФормыРегистрации_ПросмотрПечатьЧека()
– просмотр и печать закрытого чека
Обращение к переменным основной программы, примеры:
_Источник. ГлавноеПолеВвода
– Значение главного поля ввода
_Источник.СоставЧека
– Состав чека в виде табличного значения
-
- Способы передачи данных
Между обработок необходимо передавать данные, один из универсальных способов это сохранять данные в текстовый файл, а затем его считывание, пример:
Сохранение данных-
ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";
ЗначениеВФайл(ИмяФайла,ПАР);
ПАР – это переменная или структура данных
Загрузка данных-
Перем ПАР;
ПАР = Новый Структура;
ПАР.Вставить("Имя1");
…
ПАР.Вставить("ИмяN");
//Считать из файла
ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";
Файл = Новый Файл(ИмяФайла);
Если Файл.Существует() Тогда
ФайлЗагрузки = Новый ТекстовыйДокумент();
Попытка
ФайлЗагрузки.Прочитать(ИмяФайла, КодировкаТекста.ANSI);
ФайлЗагрузки = Неопределено;
Исключение
Возврат ПАР;
КонецПопытки;
ПолученноеЗначение = ЗначениеИзФайла(ИмяФайла);
Для каждого эл из ПолученноеЗначение Цикл
Попытка
ПАР[эл.Ключ] = эл.Значение;
Исключение
КонецПопытки;
КонецЦикла;
Возврат ПАР;
КонецЕсли;
Возврат ПАР;
Еще один метод, расположить все функции в одной обработке, а переменные сохранять на форме.
-
- Пример
Процедура ДеИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры// ДеИнициализироватьМодуль()
Процедура ИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры // ИнициализироватьМодуль()
Функция Регистрация_ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек_ПредОбработка() Экспорт
Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек.ПредОбработка", _Источник, ЭтаФорма);
Если Обработчик <> Неопределено Тогда
Обработчик.Регистрация_ФункцияФормыРегистрации_ПродолжитьОтложенныйЧек_ПредОбработка();
КонецЕсли;
Если ВыполнитьВнешнююОбработку("ОбщиеФункции","Константы_РежимПАЕ_Получить") Тогда
//И если карта на приборе тогда ф-ция запрещена
ЭтаФорма._Отказ = Истина;
Возврат Истина;
КонецЕсли;
КонецФункции
Пост обработчики в Штрих-М Кассир 5
-
- Случаи применения
Пост обработчики, аналогичен инструменту пред обработчиков, только используются после выполнения функции.
-
- Синтаксис для пост обработчиков
Для того чтобы пред обработчики работали необходимо помещать обработки в каталог «ExtForms\ LogicalModules», наименование обработки не имеет никакого значения.
Схематическое изображение обработки:
Обязательные реквизиты «Формы» в обработке, показаны ниже на рисунке:
Чтобы программа увидела ваш обработчик ее нужно инициализировать, рассмотрим на примере функции «Функция ЗакрытьЧек(Отмена = 0) Экспорт» из обработки «Регистрация»:
Процедура ИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры
и соответственно при завершении работы кассира деинициализировать:
Процедура ДеИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры
Причем Метаданные.Имя обязательно должны быть сравнимы с именем «ШтрихМ_Кассир», иначе программа не инициализирует вашу доработку.
И наконец вызов самой функции:
Функция ПриНачалеРаботыСистемы_ПостОбработка() Экспорт
Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("МодульПриложения.ПриНачалеРаботыСистемы.ПостОбработка", _Источник, ЭтаФорма);
Если Обработчик <> Неопределено Тогда
Обработчик.ПриНачалеРаботыСистемы_ПостОбработка();
КонецЕсли;
…
КонецФункции
1-я часть шапка самой функции, она является вызовом с главной функции, затем идет тело функции, здесь код программиста, и конец возврат какого значения или же ничего.
-
- Доступ к основной форме (источник)
Иногда необходимо обратиться к некоторым методам чтобы узнать или изменить что-либо на форме или в содержании программы, для этого есть возможность обратиться к функциям основной программы, если они имеют реквизит «Экспорт», Примеры:
_Источник.ФункцияФормыРегистрации_Вниз()
– спускает курсор вниз по табличному полю
_Источник.ФункцияФормыРегистрации_ПросмотрПечатьЧека()
– просмотр и печать закрытого чека
Обращение к переменным основной программы, примеры:
_Источник. ГлавноеПолеВвода
– Значение главного поля ввода
_Источник.СоставЧека
– Состав чека в виде табличного значения
-
- Способы передачи данных
Между обработок необходимо передавать данные, один из универсальных способов это сохранять данные в текстовый файл, а затем его считывание, пример:
Сохранение данных-
ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";
ЗначениеВФайл(ИмяФайла,ПАР);
ПАР – это переменная или структура данных
Загрузка данных-
Перем ПАР;
ПАР = Новый Структура;
ПАР.Вставить("Имя1");
…
ПАР.Вставить("ИмяN");
//Считать из файла
ИмяФайла = Кассир5_DataAccess.КаталогВнешнихКомпонент + "data.ini";
Файл = Новый Файл(ИмяФайла);
Если Файл.Существует() Тогда
ФайлЗагрузки = Новый ТекстовыйДокумент();
Попытка
ФайлЗагрузки.Прочитать(ИмяФайла, КодировкаТекста.ANSI);
ФайлЗагрузки = Неопределено;
Исключение
Возврат ПАР;
КонецПопытки;
ПолученноеЗначение = ЗначениеИзФайла(ИмяФайла);
Для каждого эл из ПолученноеЗначение Цикл
Попытка
ПАР[эл.Ключ] = эл.Значение;
Исключение
КонецПопытки;
КонецЦикла;
Возврат ПАР;
КонецЕсли;
Возврат ПАР;
Еще один метод, расположить все функции в одной обработке, а переменные сохранять на форме.
-
- Пример
Процедура ДеИнициализироватьМодуль() экспорт
Если Метаданные.Имя = "ШтрихМ_Кассир" Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").СнятьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры// ДеИнициализироватьМодуль()
Процедура ИнициализироватьМодуль() экспорт
Если Метаданные.Имя = " ШтрихМ_Кассир " Тогда
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", ЭтаФорма, Неопределено);
КонецЕсли;
КонецПроцедуры // ИнициализироватьМодуль()
Функция Регистрация_ЗакрытьЧек_ПостОбработка(Отмена) Экспорт
Обработчик = МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").ПолучитьОбработчик("Регистрация.ЗакрытьЧек.ПостОбработка", _Источник,ЭтаФорма);
Если Обработчик <> Неопределено Тогда
//Обработчик._РезультатВызова = внРезультат;
_РезультатВызова =
Обработчик.Регистрация_ЗакрытьЧек_ПостОбработка(Отмена);
Если Обработчик._Отказ Тогда
Возврат _РезультатВызова;
КонецЕсли;
КонецЕсли;
***
КонецФункции
Добавление кнопок в меню «Супервизор»
-
- Случаи применения
В некоторых случаях необходимо получить какой-то отчет, отправить на печать что-либо или же задать свои константы. Для этого есть технология добавления копок в меню «Супервизора».
-
- Как использовать, синтаксис содержимого
Во первых в папке ExtFiles создать файл «s_visor.ini», примерное содержимое:
[общие]
имя кнопки=Выгрузка Тов
[Настройка выгрузки]
функция=Data/btn1.1s
И выглядеть это будет так, для строки «имя кнопки=Выгрузка Тов» :
для строки «[Настройка выгрузки]» :
для строки «функция=Data/btn1.1s» :
Затем в папке «ExtForms» создадим каталог «Data» со следующим содержимым:
Содержимое файла btn1.1s
МодульОбмена = ВнешниеОбработки.Создать(Кассир5_DataAccess.КаталогВнешнихКомпонент + "Data\МодульСервиса.epf");
Если МодульОбмена <> Неопределено Тогда
АктивнаяФорма = Неопределено;
МодульОбмена.ПолучитьФорму("ФормаНастройки").ОткрытьМодально();
АктивнаяФорма = ЭтаФорма;
КонецЕсли;
Обработка «МодульСервиса.epf», ее архитектура
Внутреннее содержимое Формы может быть любым, по нажатию кнопки можно выполнять любую функцию.
Добавление кнопки на форму регистрации и привязка функции к ней
-
- Случаи применения
В некоторых случаях необходимо в режиме регистрации иметь функционал, который отсутствует в данной версии.
-
- Как расположить и синтаксис функции
Зайдем в Кассир 5 под правами администратора, в меню «Супервизора» перейдем в «Настройка»:
Затем в «Настройка формы регистрации»
Затем нажмем кнопку «>>»
В появившемся окне, добавим кнопку правой кнопкой мыши «добавить кнопку», например «сертификат»
На добавленной кнопке нажмем правой кнопкой мыши «изменить», выбираем функцию
Сперва ее создадим,
Заполним внутреннее содержимое, в данном случае это функция из обработки регистрация:
После сохранения функции, подключим функцию к кнопке, т.е. подключим.
Затем нажмем выход, «Esc» и нажмем «Да», т.е. сохранить настройки.
-
- Редактирование и создание кнопок
Кнопки можно создавать через редакторы 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/