====== Инструкции по доработке конфигурации ======
===== Отладка через конфигуратор 1С =====
Для запуска отладки конфигурации из конфигуратора 1С нужно указать параметры сеанса 1С (указать используемый номер ПОС):\\
STARTER+POSNUMBER="1"+ROCKEY
Если используется ключ катран, тогда вместо ROCKEY нужно написать KATRAN.\\
===== Возможные способы доработки конфигурации: =====
Рекомендуем ознакомиться с вебинаром [[https://www.youtube.com/watch?v=6B2C0I5MIN0|Вебинар - доработки конфигурации Кассир 5]]
- пользовательские раскладки клавиатуры
- [[кассир5:стартер:пользовательскиекнопкисупервизора|пользовательские кнопки в форме супервизор]]
- [[кассир5:внешниемодули:reports|расширенные отчеты]]
- модуль логики
- изменение конфигурации и типовых внешних обработок
Способ №1 (использование собственных раскладок клавиатуры) рекомендуется использовать когда клиенту нужна функция (кнопка или горячая клавиша), которая выполнит типовые действия, которые отсутствуют в предопределенных раскладках клавиатуры. Например, применить определенную (или из списка) дисконтную карту, товар, продавца и т.п. Т.е. использовать набор функций формы регистрации.\\
Способ №2 используется когда нужно добавить дополнительную кнопку в супервизор.\\
Способ №3: Расширенные отчеты используются для вывода какой-то информации на экран или принтер, могут вызываться пользователем в произвольный момент времени и, опционально, автоматически при снятии отчета с гашением
Способ №4 решает большинство задач без необходимости доработок конфигурации и типовых обработок с максимальной совместимостью при обновлении конфигурации.\\
[[кассир5:внешниемодули:apiлогическихмодулей|API логических модулей]]\\
[[кассир5:внешниемодули:обработчикивзк|Список обработчиков в защищенной компоненте]]\\
Ниже можно скачать архивы с заготовкой модуля логики. В конце модуля основной формы каждой заготовки есть краткая пошаговая инструкция.\\
{{ :кассир5:внешниемодули:lm_empty.zip |ПустаяЗаготовка}} - пустой модуль логики, обработчики для добавления закладки подключатся автоматически при заполнении переменных ИмяМодуля и ЗаголовокЗакладкиНастроек.\\
{{ :кассир5:внешниемодули:lm_print.zip |ЗаготовкаМакетЧека}} - заготовка модуля логики, который позволяет добавить дополнительные поля в макет чека.\\
{{ :кассир5:внешниемодули:lm_main.zip |ЗаготовкаОсновныеОбработчики}} - заготовка модуля с наиболее часто используемыми обработчиками. Каждый обработчик прокомментирован.\\
{{ :кассир5:внешниемодули:lm_discount.zip |Переопределение активности автоскидок}} - модуль логики позволяет программно переопределять активность автоматических скидок.
{{ :кассир5:внешниемодули:settings_example.zip |Пример работы с элементами формы настроек модуля}} - модуль логики с примером работы с элементами формы настроек модуля.
Вариант №5 крайне не рекомендуется использовать по следующим причинам:\\
* Изменение базовой версии конфигурации невозможно.
* Обновление через дистрибутив невозможно, т.к. дистрибутив выполняет загрузку оригинальной конфигурации.
* При каждом обновлении конфигурации потребуется переносить изменения вручную.
* В новой версии конфигурации возможно изменение кода, которое потребует дополнительное время на актуализацию доработок.
===== Основные реквизиты, функции, процедуры, =====
При доработке конфигурации рекомендуется использовать типовые методы, которые можно найти в коде конфигурации.\\
Список методов в защищенной компоненте описан в статье [[[кассир5:интерфейсзк|API компоненты AddIn.CashContext]]\\
Наиболее часто используемые методы описаны ниже.\\
Формат описания методов:\\
\\
Имя метода - описание метода.\\
Параметры:\\
Номер параметра: Тип параметра (значение по-умолчанию) - описание параметра.\\
Пример кода.\\
==== Диалоги ====
**ИнтерфОшибка** - процедура выводит сообщение пользователю.\\
Параметры:\\
1: Строка - строка с текстом сообщения\\
2: Строка ("Ошибка") - заголовок формы\\
ИнтерфОшибка("Текст сообщения", "Внимание!");
\\
**ИнтерфВопросДаНет** - глобальная функция открывает окно с переданным текстом и двумя кнопками "Да" и "Нет", возвращает нажатую кнопку ("Да" или "Нет").\\
Параметры:\\
1: Строка - строка с текстом вопроса\\
2: Строка ("Нет") - кнопка по-умолчанию ("Да" или "Нет")\\
Если ИнтерфВопросДаНет("Текст вопроса") = "Да" Тогда
// обработка ответа на вопрос
КонецЕсли;
**ИнтерфВопросДаНетОтмена** - глобальная функция открывает окно с переданным текстом и кнопками "Да", "Нет", "Отмена", при нажатии кнопки возвращает строку ("Да", "Нет", "Отмена").\\
Параметры:\\
1: Строка - строка с текстом вопроса\\
Если ИнтерфВопросДаНетОтмена("Текст вопроса") = "Да" Тогда
// обработка ответа на вопрос
КонецЕсли;
**ПолучитьКоличество, ПолучитьСекцию, ПолучитьСумму и др.** - функции формы Регистрация.ФормаЗапросКоличества открывают окно для ввода числового значения (все возможные функции и их параметры см. в модуле Регистрация.ФормаЗапросКоличества).\\
ФормаЗапросКоличества = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.ФормаЗапросКоличества");
Если ФормаЗапросКоличества = Неопределено Тогда
ФормаЗапросКоличества = МенеджерОбъектов.СоздатьОбщуюФорму("Регистрация.ФормаЗапросКоличества", "MAIN");
КонецЕсли;
НеДробноеЧисло = ФормаЗапросКоличества.ПолучитьЧисло(10, 0, 2); // ввод недробного двузначного числа, значение по-умолчанию 10
**ВыбратьДату, ВыбратьВремя, ВыбратьДатуИВремя** - функции общей формы ВыборДаты открывает форму для ввода даты/времени/даты и времени, тип возвращаемого значения Булево.\\
1: Произвольный - в эту переменную запишится дата, которую указал пользователь.\\
2: Дата (Неопределено) - значение по-умолчанию.\\
УИД_Формы = Новый УникальныйИдентификатор();
ФормаВыбораДаты = МенеджерОбъектов.СоздатьОбщуюФорму("ОбщаяФорма.ВыборДаты", УИД_Формы);
Результат = Неопределено;
ДатаРождения = Дата(2000, 1, 1);
Если ФормаВыбораДаты.ВыбратьДату(Результат, ДатаРождения) Тогда
ДатаРождения = Результат;
КонецЕсли;
МенеджерОбъектов.ВыгрузитьОбщийОбъект("ОбщаяФорма.ВыборДаты", УИД_Формы);
==== Работа с составом чека ====
Как получить форму регистрации в коде:\\
ФормаРегистрации = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.Форма");
\\
Как получить состав чека формы регистрации:\\
ФормаРегистрации = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.Форма");
КоличествоСтрок = ФормаРегистрации.СоставЧека.Количество();
Как получить выделенную строку состава чека:\\
ФормаРегистрации = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.Форма");
ТекущаяСтрокаСоставаЧека = ФормаРегистрации.элтСоставЧека.ТекущаяСтрока;
Как добавить товар в состав чека по коду или артикулу (для добавления по артикулу нужно в 2-й параметр передать "Артикул"):\\
ФормаРегистрации = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.Форма");
ЗК = МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.CashContext");
ЗК.ДобавитьПозициюПоКодуАртикулу(100, "Код", "", -1, ФормаРегистрации);// добавить товар с кодом 100, цена цена по-умолчанию (из БД)
ЗК.ДобавитьПозициюПоКодуАртикулу(200, "Код", "", 500, ФормаРегистрации);// добавить товар с кодом 200 с ценой 500
ЗК.ДобавитьПозициюПоКодуАртикулу(300, "Код", "12345", -1, ФормаРегистрации);// добавить единицу с кодом "12345" товара с кодом 300, цена по-умолчанию
Как добавить товар в состав чека по штрихкоду:\\
ФормаРегистрации = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.Форма");
ЗК = МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.CashContext");
ЗК.ДобавитьПозициюПоШтрихкоду("12345", -1, ФормаРегистрации, Ложь, Ложь);
ЗК.ДобавитьПозициюПоШтрихкоду("12345",// штрихкод
-1, // цена (-1 = цена из БД)
ФормаРегистрации,
Ложь,// Истина - штрихкод считан сканером, Ложь - вручную
Ложь);// Истина - проверять право для регистрации по штрихкоду, Ложь - не проверять
==== Работа с главным полем ввода ====
Для установки значения главного поля ввода (ГПВ) используется процедура модуля формы регистрации **УстановитьГлавноеПолеВвода**.\\
Для установки нечислового значения в настройках должен быть разрешен строковый ввод.\\
Параметры:\\
1: строка или число - значение, которое нужно установить в ГПВ.\\
Пример:
УстановитьГлавноеПолеВвода("");// сбросить ГПВ
УстановитьГлавноеПолеВвода("Art1");// установить строку Art1
УстановитьГлавноеПолеВвода(1000.50);// установить строку 1000.5
Для получения текущего значения ГПВ используется функция формы регистрации ПолучитьГлавноеПолеВвода, единственный параметр определяет в каком виде нужно получить результат:
* 0 - Строка - Получаем строковое выражение Главного поля ввода (при вводе числа - точка не будет присутствовать в строке)
* 1 - Сумма - Получить значение главного поля ввода, преобразованного к формату суммы
* 2 - Количество - Получить значение главного поля ввода, преобразованного к формату количества
Пример:
УстановитьГлавноеПолеВвода(1.456);// установить значение ГПВ "1.456"
Значение = ПолучитьГлавноеПолеВвода(0);// вернёт строку "1456"
Значение = ПолучитьГлавноеПолеВвода(1);// вернёт число 1.46
Значение = ПолучитьГлавноеПолеВвода(2);// вернёт число 1.456
==== Работа с ККМ ====
Пример печати произвольного текста на ККМ (из формы регистрации, считаем что ККМ подключен):
//ф-я КонвертироватьВМассивДляПечати принимает на вход макет чека, можно использовать тэги форматирования
// - выравнивание по центру
// - выравнивание по левому краю (по-умолчанию)
// - выравнивание по правому краю
//Слева
Справа - разделить слова пробелами на всю ширину
//
. - повторить на всю ширину
// - штрихкод ean13
// - qr-код
// - отрезка
ПС = Символ(182);
Текст = "Строка по центру" + ПС +
"Строка слева" + ПС +
"Строка справа" + ПС +
"
*" + ПС +
"1234567890123" + ПС +
"http://host" + ПС +
" " + ПС +
" " + ПС +
"";
ЗК = МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.CashContext");
МассивДляПечати = ЗК.КонвертироватьВМассивДляПечати(Текст);
СтрокаККМ = Кассир5_DataAccess.ПолучитьККМ();
РезультатПечати_бул = ЗК.FnKKM_PrintStringBlock(СтрокаККМ, МассивДляПечати);
=== Подключение к ККМ ===
Если неизвестно подключен ККМ в данный момент или нет, то нужно выполнить следующий код.
Если ККМ не подключен, то выполнится подключение, а после окончания работы с ККМ - отключение, если он не был подключен.
Функция ВыполнитьЧтоТоНаККМ()
СтрокаККМ = Кассир5_DataAccess.ПолучитьККМ();
Если СтрокаККМ = Неопределено Тогда
ИнтерфОшибка("Не настроена ККМ");
Возврат Ложь;
КонецЕсли;
ЗК = МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.CashContext");
БылПолключен = ЗК.FnKKM_GetParam(СтрокаККМ, "Подключен");
Если НЕ БылПолключен И НЕ МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.CashContext").FnKKM_Connect(СтрокаККМ, Истина) Тогда
Возврат Ложь; // не удалось подключиться к ККМ
КонецЕсли;
//работа с ККМ
Результат = Истина;
Если НЕ БылПолключен Тогда
ЗК.FnKKM_Disconnect(СтрокаККМ, Истина);
КонецЕсли;
Возврат Результат;
КонецФункции
==== Работа со справочниками транзакций ====
В Кассир 5 есть два типа справочников с транзакциями:\\
1. Справочник Временные транзакции - хранит информацию о текущем чеке, при закрытии (или отмене) чека переносятся в справочник Транзакции и удаляются.\\
2. Справочник Транзакции - хранит информацию об основных действиях кассира, закрытых или отмененных чеках и пр.\\
Справочник выгружается в файл отчета по [[:таблицатранзакцийкассира|формату Кассир 5]].\\
Элементы удаляется только автоматически по регламенту.\\
\\
=== Работа со справочником Временные транзакции ===
Перед работой с временными транзакциями рекомендуется ознакомиться со статьей [[:таблицавременныхтранзакцийкассира|Таблица временных транзакций кассира]].\\
Если нужно записать произвольную транзакцию, которая относится к текущему чеку, тогда нужно записать временную транзакцию.\\
Все функции для работы с временными транзакциями находятся в модуле обработки Кассир5_DataAccess.\\
**ПолучитьВремТранзакцию** - ф-я получает информация о временной транзакции по коду. Если врем. транзакция не найдена, тогда в возвращенной структуре в свойство "Пустая" будет установлено значение Истина.\\
Параметры:\\
1: Число - код временной транзакции для поиска.\\
Транз = Кассир5_DataAccess.ПолучитьВремТранзакцию(100); // получить врем. транзакцию с кодом 100
**ПолучитьВремТранзакцииПоТипу** - ф-я выполняет отбор временных транзакций по типу (поле ТипТранзакции), тип возвращаемого значения Таблица значений.\\
Транзакции11 = Кассир5_DataAccess.ПолучитьВремТранзакцииПоТипу(11);// в переменнную Транзакции11 установится таблица со всеми транзакциями с типом 11
**ПисатьВремТранзакцию** - ф-я создаёт новый элемент справочника Временные транзакции.\\
Параметры:\\
1: Число - код транзакции (используется для уникальности врем. транзакций и определяет порядок записи в справочник Транзакции). Если передано значение "0", тогда установится текущий максимальный код + 1. \\
2: Число - поле Тип транзакции\\
3: Дата (Неопределено) - поле Дата транзакции (если не указана - подставляется текущая дата)\\
4: Число - поле Секция\\
5: Строка (до 150 символов) - поле Код товара (поле используется для записи строковых данных)\\
6: Число - поле Цена\\
7: Число - поле Количество\\
8: Число - поле Сумма\\
9: Число - номер ККМ (определяет к какому ККМ относится транзакция, если задать несуществующий номер ККМ - транзакция не будет перенесена в справочник Транзакции)\\
10: Строка ("")- поле Скидка, поле используется для оперативной работы с длинными строками, в справочник Транзакции не переносится\\
Пример записи врем. транзакции с типом 777 на чек, с явным указанием кода:
КодВремТранзакции = 900000;
// запишем транзакцию на чек, если транзакция с переданным кодом уже существует, тогда будет выполнено изменение транзакции
// дата транзакции = ТекущаяДата(), секция = 1, код товара = "2", цена = 3, количество = 4, сумма = 5, номер ккм = по-умолчанию
Кассир5_DataAccess.ПисатьВремТранзакцию(КодВремТранзакции, 777, ТекущаяДата(), 1, "2", 3, 4, 5, Кассир5_DataAccess.ИспользоватьККМ, "");
Пример записи врем. транзакции на чек, без явного указания кода:
ТипТранзакцииДопИнфо = 777;
// удаляем транзакцию с типом 777, чтобы не было дублей
Для Каждого Транз Из Кассир5_DataAccess.ПолучитьВремТранзакцииПоТипу(ТипТранзакцииДопИнфо) Цикл
Кассир5_DataAccess.УдалитьВремТранзакцию(Транз.Код);
КонецЦикла;
// запишем транзакцию на чек, код установится автоматически, дата транзакции = ТекущаяДата(), секция = 1, код товара = "2", цена = 3, количество = 4, сумма = 5, номер ккм = по-умолчанию
Кассир5_DataAccess.ПисатьВремТранзакцию(0, ТипТранзакцииДопИнфо, ТекущаяДата(), 1, "2", 3, 4, 5, Кассир5_DataAccess.ИспользоватьККМ, "");
См. также в модуле обработки Кассир5_DataAccess: \\
**ИзменитьВремТранзакциюПоСтруктуре**\\
**ИзменитьВремТранзакцию**\\
**УдалитьВремТранзакцию**\\
**ПолучитьВыборкуСкидок**\\
**ПолучитьВремТранзакцииЧека**\\
=== Работа со справочником Транзакции ===
Для записи транзакции напрямую в справочник Транзакции (транзакции, не относящиеся к конкретному чеку) используется процедура модуля обработки Кассир5_DataAccess **ЗаписатьТранзакции**.\\
Параметры:\\
1: Таблица значений (неопределено) - таблица значений, получаемая функцией модуля формы регистрациии или модуля обработки Кассир5_DataAccess **ДобавитьТранзакциюВТаблицу**.\\
Пример записи одной транзакции с типом 777:
Кассир5_DataAccess.ЗаписатьТранзакции(Кассир5_DataAccess.ДобавитьТранзакциюВТаблицу(Неопределено,
Неопределено,// код кассира
777,// тип транзакции
Неопределено,// дата транзакции
0,//секция
"",// код товара
0,//цена
0,//количество
0));//сумма
Пример записи нескольких транзакций:
ТаблицаТранзакций = Неопределено;
Кассир5_DataAccess.ДобавитьТранзакциюВТаблицу(ТаблицаТранзакций, Неопределено, 777, Неопределено, 0, "", 0, 0, 0);
Кассир5_DataAccess.ДобавитьТранзакциюВТаблицу(ТаблицаТранзакций, Неопределено, 778, Неопределено, 0, "", 0, 0, 0);
Кассир5_DataAccess.ЗаписатьТранзакции(ТаблицаТранзакций);
==== Работа с правами пользователя ====
**ПравоДоступно** - функции модуля обработки Кассир5_DataAccess, выполняет проверку наличия права у пользователя, тип возвращаемого значения булево.\\
1: Строка - имя права.\\
2: Булево (Истина) - если у текущего пользователя право отсутствует, но существует пользователь с набором прав, в котором это право присутствует - тогда откроется форма для считывания карты пользователя с этим правом.\\
3: Булево (Истина) - выводить сообщение об отсутствии права.\\
4: Число (Неопределено) - если параметр указан, тогда будет проверяться пользователь с кодом, указанным в этом параметре, иначе текущий пользователь.\\
5: Число (Неопределено) - в этот параметр запишится код пользователя, который подтвердил право.\\
Если НЕ Кассир5_DataAccess.ПравоДоступно("Право", Ложь, Ложь) Тогда
// действие при отсутствии права без запроса карты и без вывода сообщения
КонецЕсли;
**ПравоОтсутствует** - функции модуля обработки Кассир5_DataAccess, выполняет проверку отсутствия права у пользователя, тип возвращаемого значения булево.\\
1: Строка - имя права.\\
2: Булево (Истина) - если у текущего пользователя право присутствует, но существует пользователь с набором прав, в котором это право отсутствует - тогда откроется форма для считывания карты пользователя без этого права.\\
3: Булево (Истина) - выводить сообщение при наличии права.\\
4: Число (Неопределено) - если параметр указан, тогда будет проверяться пользователь с кодом, указанным в этом параметре, иначе текущий пользователь.\\
Если НЕ Кассир5_DataAccess.ПравоДоступно("Право", Ложь, Ложь) Тогда
// действие при отсутствии права без запроса карты и без вывода сообщения
КонецЕсли;
==== Отладка ====
Большинство действий пользователя (нажатие клавиш, события сканера и ридера магнитных карт) обрабатывается в конфигурации как внешнее событие.\\
Иногда нужно проверить - правильно ли отработает программа при определенных входящих данных от оборудования, а возможности использовать реальное оборудования нет.\\
Для этого можно (в модуле логики или назначить на кнопку) эмулировать внешнее событие методом GenerateEvent компоненты AddIn.ShtrihContext:\\
Параметры:\\
1: название источника события (для большинства событий не анализируется)\\
2: название события\\
3: данные события\\
Пример:\\
эмуляция работы со сканером:
МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.ShtrihContext").GenerateEvent("Scanner", "ScannerEvent", "123");
эмуляция работы с ридером магнитных карт:
МенеджерОбъектов.ПолучитьОбщийОбъект("AddIn.ShtrihContext").GenerateEvent("MSCReaderEvent", "MSCReaderEvent", "123");
Также в настройках сканера можно добавить эмулятор сканера.