1. Общие сведения. Описываемый функционал позволяет расширять меню Контур-Зарплаты дополнительными пунктами, "привязывать" к ним пользовательские режимы/таблицы, имеющие поведение, аналогичное поставочным. Либо можно "привязывать" к дополнительным пунктам меню скриптовые функции. Расширять можно главное меню программы, контекстное меню по правой кнопке мыши на списке ЛС, главное меню окна ЛС, контекстное меню по правой кнопке мыши на списке видов в окне ЛС. Особым образом обрабатывается пункт меню "Отчеты" главного меню программы. Этот пункт меню дублируется в контекстном меню списка ЛС (Работа с текущим ЛС - Отчеты), в главном и контекстном меню окна ЛС. Поэтому, пункты меню, добавленные в меню Отчеты главного окна программы, появятся во всех указанных меню автоматически. Существует файл, обрабатываемый для любой спецверсии программы - это файл ExtMenu.xml. Затем обрабатываются файлы, расширяющие меню в спецверсиях ExtMenuB.xml, ExtMenuU.xml и ExtMenuM.xml, которые обрабатываются для Бюджетного, УВД и Медицинского вариантов программы соответственно. Если никакая модификация версии не указана - обрабатывается файл ExtMenuH.xml. Это поставочные файлы, вносить в них изменения не стоит, так как они могут быть перезаписаны при обновлении программы. Затем обрабатывается файл UserMenu.xml. Именно в него следует добавлять пользовательские пункты меню. Эти файлы должны располагаться в корне каталога ZPL (в сетевой версии - в корне Сетевого ZPL). 2. Пользовательские режимы/таблицы. Для пункта меню, добавляющего пользовательский режим/таблицу, должна быть указана директория в ZPL, в которой он содержится, а также директория поставочного режима, с которого пользовательский копирует поведение (далее будем называть этот поставочный режим "базовым"). Если базовый режим не указан - в качестве базового режима будет использована TABVEDRF, т.е. "Справочные ведомости и разное". Рекомендуется начинать наименования директорий пользовательских режимов с "USR_...", например "USR_REPORTS". Режимы, добавляемые в спецверсиях (файлы ExtMenu....xml), могут использовать в качестве базовых только поставочные режимы. Для пользовательских режимов (файл UserMenu.xml) в качестве базовых можно указывать как поставочные режимы, так и режимы, добавленные в используемой спецверсии программы. Следует учитывать, что в сетевой версии программы, для пользовательского режима должна быть добавлена настройка в файлах Registry.tab ( Г / О / Л ) в локальных ZPL расчетчиков, иначе режим будет считаться Локальным. Если в сетевом или локальном ZPL (в зависимости от настройки в Registry.tab) не будет найдена директория пользовательского режима - этот пункт меню не будет отображаться в меню программы. Таким образом можно настроить нескольким пользователям работающим с общим сетевым ZPL разный набор дополнительных пунктов меню. В качестве базовых режимов можно указывать следующие поставочные режимы: T_KVITOK "Расчетные листки" TAB_LS "Справки по ЛС" TABREFUS "Справки пользователя" T_LSCASH "Справки по выдаче" TABVEDRF "Справочные ведомости и разное" T_RAZVED "Развернутые ведомости" TABREFER "Отчетность по НДФЛ" TABLESN "Отчетность по страховым взносам в ПФ и ФСС" T_PFOND "Персонифицированная отчетность в ПФ" TABLSTAT "Отчетность по статистике" TABORDER "Приказы" T_VYB "Выборки" T_PROC "Таблицы массовой обработки" TABLCTRL "Таблицы контроля" T_PRCH "Списки перечислений" T_PAYSTBL "Таблицы для обработки платежей" TABLSUM "Таблицы разноски" TABLBRIG "Бригадные расчеты" T_COMMON "Общие таблицы" TABLBANK "Обмен с банками" В связи с возможным использованием таблиц в качестве базовых для пользовательских, настоятельно рекомендуется в скриптовых функциях, вызываемых из таблиц, использовать вместо заданного строкой имени директории режима функцию NameCommonDir(), аналогично тому, как это сделано в поставочных скриптах. Если в скрипте требуется узнать имя директории базового режима, его можно получить функцией KindCommonDir(), для поставочных режимов обе функции возвращают одинаковое значение. 3. Пункты меню, вызывающие скрипт. Для пункта меню, выполняющего скрипт, следует указать имя скриптового модуля и скриптовой функции, либо скриптовый блок кода, аналогично тому, как это делается в таблицах приема/разноски. Если в тексте, задающем скрипт встреачется return - он интерпретируется как блок кода, иначе - как имя модуля и функции. Следует учитывать, что никаких преобразований кодировки не производится, строки содержащие символы кирилицы, будут переданы в скриптовую функцию "как есть". 5. Формат файлов. Файлы ExtMenu...xml и UserMenu.xml - это стандартные xml файлы, и должны иметь следующий вид: Каждый из блоков menu расширяет соответствующее меню программы: MainWindow - главное меню программы; MainContext - контекстное меню по правой кнопке мыши на списке ЛС; LSWindow - главное меню окна ЛС; LSContext - контекстное меню по правой кнопке мыши на списке видов в окне ЛС. В блоке menu может быть неограниченное количество блоков menuitem с произвольной вложенностью. Блок menuitem может описывать или конечный пункт меню, или подменю с содержащимися в нем дочерними элементами menuitem. Любой блок menuitem задается следущим образом: ... ЗаголовокПунктаМеню - это текст, который будет отображаться на соответствующем пункте меню. _Атрибуты_ - это набор разделенных пробелами пар ИмяАтрибута="ЗначениеАтрибута". Возможные атрибуты: sepBefore="yes" - перед данным пунктом меню должен быть добавлен разделитель; sepAfter="yes" - после данного пункта меню должен быть добавлен разделитель; prevItem="ЗаголовокПредыдущегоПунктаМеню" - пункт меню, после которого должен быть вставлен данный; nextItem="ЗаголовокСледующегоПунктаМеню" - пункт меню, перед которым должен быть вставлен данный. Если атрибуты prevItem и nextItem не заданы, или пункт меню с таким заголовком не найден – данный пункт меню будет добавлен в конец текущего подменю. Атрибуты могут вообще отсутствовать, например, их не нужно указывать для существующих пунктов меню. Для конечных пунктов меню должны быть указаны параметры, задающие реакцию программы на выбор пункта меню. Параметры можно задать при помощи отдельных блоков param внутри блока menuitem: либо вместе с атрибутами блока menuitem, т.е. парами ИмяПараметра="ЗначениеПараметра". Например, следующие три записи равноценны: Для пункта меню, добавляющего пользовательский режим/таблицу, должны быть указаны параметры: process="table" - признак, что пункт меню добавляет пользовательский режим; dir="ИмяДиректории" - директория в ZPL, в которой хранится режим; base="ИмяПоставочнойДиректории" - директория в которой хранится базовый режим. Если параметр base не указан - используется "TABVEDRF". Для пункта меню, выполняющего скрипт, должны быть указаны параметры: process="script" - признак, что пункт меню выполняет скрипт; func = "_текст_" - имя скриптового модуля и скриптовой функции, либо скриптовый блок кода. Обратите внимание: чтобы в тексте блок-кода можно было использовать кавычки, весь текст параметра можно заключить не в кавычки а в апострофы (см. пример файла UserMenu.xml ниже). 6. Пример. Предположим, нужно добавить пользовательский режим "Дополнительные ведомости", работающий так же, как Развернутые ведомости, пункт меню должен быть расположен после Развернутых ведомостей и отделен от него разделителем. Директорию режима назовем, например USR_DOP_RVED. Версия программы сетевая, все упомянутые режимы Общие. Также нужно добавить в меню "Настройка"-"Настройка скриптов" подменю "Мои Скрипты", содержащее два пункта "Экспорт в формате 1" и "Экспорт в формате 2", вызывающие функции MyExportOne() и MyExportTwo() из файла user\MyExport.S. В сетевом ZPL и в локальных ZPL расчетчиков, которым этот режим должен быть доступен, нужно создать директории USR_DOP_RVED, скопировать в них все файлы из папок T_RAZVED соответсвующих ZPL. Возможно стоит в файле USR_DOP_RVED\Db_Main.shb в сетевом ZPL изменить заголовок столбца Descriptor изменить на "Дополнительные ведомости". Также в локальных ZPL расчетчиков нужно добавить в файл Registry.tab строку для ресурса USR_DOP_RVED, название ресурса "Дополнительные ведомости", Тип "О". Следует создать файл SCRIPTS\user\MyExport.S и описать в нем функции MyExportOne() и MyExportTwo(). Файл UserMenu.xml в сетевом ZPL должен выглядеть, например, так: