Краткое описание механизма.
Данный механизм позволяет выполнить перепроведение большого количества документов за период более быстрым по сравнению со стандартными средствами способом.
Описание принципов действия.
Одним из факторов, увеличивающим время проведения документа задним числом, является обращение в ходе его проведения к неактуальным итогам регистров накопления или бухгалтерии. Таким обращением может, например, быть обращение к виртуальным таблицам Остатки этих регистров.
Чтобы понять, в чем именно заключается причина увеличения времени обращения к неактуальным итогам, следует представлять, каким образом платформой 1С:Предприятие 8.0 получаются остатки из этих регистров (на примере регистра накопления).
Данные регистра накопления (с видом Остатки) сохраняются в БД в двух таблицах: «таблице движений» и «таблице итогов». Структура первой таблицы известна, именно из нее получаются данные при выполнении запроса вида:
ВЫБРАТЬ * ИЗ РегистрНакопления.ТоварыНаСкладах |
Вторая таблица является служебной, в ней хранятся рассчитанные остатки по измерениям регистра по периодам (месяцам). В этой таблице всегда присутствуют записи актуальных остатков (на текущую дату), записи по другим периодам добавляются в таблицу при выполнении операции установки актуальности итогов. При этом добавляемые записи соответствуют остаткам регистра, рассчитанных на начало месяца, следующего после указанной даты.
То есть, если регистр был рассчитан по 31.10.2005, в таблице будут присутствовать записи на 01.11.2005 0:00:00.
Соответственно, получение остатка по набору измерений из регистра на произвольную (не текущую) дату упрощенно можно представить следующим образом:
1. Из «таблицы итогов» получается первый более поздний относительно необходимой даты рассчитанный остаток. Если рассчитанных итогов нет – берется актуальный (текущий) остаток, который присутствует всегда.
2. От полученного остатка «отнимаются» движения, полученные из «таблицы движений» регистра по данному набору измерений, за период от необходимой даты до момента найденного в п.1 остатка.
Пример.
Регистр накопления ТоварыНаСкладах рассчитан по 31.10.2005.
Требуется получить остаток на 05.10.2005 13:00:00.
В этом случае из «таблицы итогов» будет «взят» остаток на 01.11.2005.
От полученного остатка будут «вычтены» движения по данному набору измерений, где {05.10.2005 13:00:00} <= период < {01.11.2005 0:00:00}.
Из приведенного описания видно, чем больше движений попадает в период между необходимой датой и границей рассчитанных итогов, тем дольше будет выполняться запрос к остаткам, причем эта зависимость является нелинейной.
Рассматриваемый здесь механизм позволяет выполнить перепроведение документов с учетом данной особенности. Это достигается удалением из регистров всех «мешающих» движений, попадающих в период между моментом времени проводимого документа и ближайшего рассчитанного остатка.
То есть групповое перепроведение выполняется в два этапа:
- на первом этапе для всех без исключения документов, попавших в указанный период, удаляются движения по регистрам.
- на втором этапе документы перепроводятся. Поскольку в момент проведения документа, в таблице регистра уже не существует записей с более поздним периодом, обращение к итогам регистров выполняется намного быстрее.
Особенности применения.
Ограничением данного механизма является необходимость обязательного перепроведения всех документов от начала указанного периода до ближайшей границы рассчитанных итогов, или, если в данном периоде такой границы нет, до самого последнего документа.
Также следует учитывать, что данный механизм не удаляет движения документов, «введенных вручную». То есть документов, чьи движения формируются не в процедуре ОбработкаПроведения(), а вводятся непосредственно пользователем. Примером такого документа может служить документ «Операция (бухгалтерский и налоговый учет)» типовой конфигурации «Бухгалтерия предприятия», в котором движения по регистру бухгалтерии «Хозрасчетный» заполняются пользователем непосредственно в форме документа.
Наличие в информационной базе большого количества подобных документов может отрицательно сказаться на эффективности применения данного механизма.
Область применения.
Механизм группового перепроведения следует применять при перепроведения большого количества документов за период в информационных базах с большим документооборотом.
Описание механизма "Формирование подменю кнопки командной панели"
В данном материале описываются особенности реализации механизма "Формирование подменю кнопки командной панели".
Общее описание.
Необходимость в реализации данного механизма возникла в связи с несколькими причинами:
• Подменю "Перейти" во многих случаях очень сложно в использовании, его необходимо уменьшить и структурировать.
• Состав подменю "Печать" и подменю "Заполнить" для табличных частей не всегда является статичным, а формируется динамически при открытии формы.
Механизм служит для формирования подменю по переданному дереву значений.
Содержит средства для формирования этого дерева значений.
Реализацию механизма можно разделить на три этапа:
• Инициализация дерева значений
• Заполнение дерева значений
• Построение подменю на элементе управления типа "Кнопка"
Инициализация дерева значений
Для формирование структуры данных подменю кнопок командной панели используется дерево значений. Дерево значений позволяет построить многоуровневую иерархическую структуру данных, которую описываемый механизм переведет в пользовательское представление кнопок подменю.
Дерево значений для формирования подменю должно иметь определенный состав колонок, где каждая колонка определяет свойство для создаваемой кнопки в составе подменю:
Описание состава колонок дерева значений:
Имя
Тип: Строка, неограниченной длинны. Имя создаваемой кнопки (имя кнопки должно быть уникальным для всех строк дерева значений);
ТипКнопки
Тип: ТипКнопкиКоманднойПанели. Тип создаваемой кнопки (Кнопка, разделитель, подменю);
Текст
Тип: Строка, неограниченной длинны. Пользовательское представление (заголовок) создаваемой кнопки.
Действие
Тип: Действие. Действие, которое необходимо выполнить при нажатии на данную кнопку. Для типов кнопок "Разделитель" и "Подменю", действие указывать не нужно. Процедура, обработчик события данного действия должна быть описана в модуле формы, на которой расположена кнопка, у которой необходимо создать подменю.
Расшифровка
Тип: Произвольный. Расшифровка служит для идентификации кнопки в момент нажатия, когда нет возможности идентифицировать ее по имени или по пользовательскому представлению (заголовку).
Пометка
Тип: Булево. Пометка создаваемой кнопки. Может использоваться для кнопок с типом Действие.
Подсказка
Тип: Строка, неограниченной длинны. Содержит текст всплывающей подсказки, которая появляется при наведении курсора на создаваемую кнопку.
Картинка
Тип: Картинка. Картинка создаваемой кнопки.
Для инициализации дерева подменю необходимо использовать функцию, расположенную в общем модуле: ИнициализироватьДеревоДополнительныхКнопок(), которая возвращает дерево, с описанным выше составом колонок, но не содержит ни одной строки.
Заполнение дерева значений
После инициализации дерева значений, его необходимо заполнить данными о составе подменю кнопки командной панели.
Для добавления новой строки к дереву используется функция, расположенная в общем модуле:
ДобавитьСтрокуВДеревоКнопок(СтрокаПодменю, Имя, ТипКнопки, Текст, Действие, Расшифровка, Пометка, Подсказка, Картинка)
Параметры:
СтрокаПодменю (обязательный)
Тип: Дерево, когда добавляемая строка должна соответствовать кнопке верхнего уровня в подменю, или строка дерева значений (родитель добавляемой строки), когда кнопка, соответствующая добавляемой строке, должна находиться во вложенном подменю.
Назначение следующих параметров описано в разделе "Инициализация дерева значений":
Имя (обязательный)
Тип: Строка, неограниченной длинны.
ТипКнопки (необязательный)
Тип: ТипКнопкиКоманднойПанели.
Значение по умолчанию: "Действие"
Текст (необязательный)
Тип: Строка, неограниченной длинны.
Значение по умолчанию: пустая строка
Действие (необязательный)
Тип: Действие.
Расшифровка (необязательный)
Тип: Произвольный.
Пометка (необязательный)
Тип: Булево.
Значение по умолчанию: "Ложь"
Подсказка (необязательный)
Тип: Строка, неограниченной длинны.
Значение по умолчанию: пустая строка
Картинка (необязательный)
Тип: Картинка. Картинка создаваемой кнопки.
Возвращаемое значение:
Тип: СтрокаДереваЗначений. Возвращает добавленную в дерево значений строку.
Построение подменю
Для того, чтобы для кнопки командной панели было сформировано подменю, соответствующее строкам сформированного дерева значений, необходимо вызвать процедуру:
СформироватьПодменю (СтрокаПодменю, Подменю, Очищать, ДобавлятьРазделительВНачало)
Параметры:
СтрокаПодменю (обязательный)
Тип: Дерево или строка дерева значений, по данным которого необходимо построить подменю.
Подменю (обязательный)
Тип: Кнопка командной панели типа "Подменю", к которой необходимо добавить кнопки, состав и иерархия которых описан в параметре "СтрокаПодменю"
Очищать (необязательный)
Тип: булево. Определяет: следует ли перед построением подменю удалить все уже существующие кнопки. Используется, когда необходимо переформировать подменю новым составом кнопок.
Значение по умолчанию: "Ложь"
ДобавлятьРазделительВНачало (необязательный)
Тип: булево. Определяет: следует ли между существующими и создаваемыми кнопками подменю вставлять разделитель.
Значение по умолчанию: "Ложь"
Реализация механизма
В форме объекта, который использует данный механизм необходимо:
• Инициализировать дерево значений: вызвать функцию "ИнициализироватьДеревоДополнительныхКнопок()"
• Заполнить дерево значений: осуществить вызов функции "ДобавитьСтрокуВДеревоКнопок()" для каждой создаваемой кнопки (состав кнопок определяется в форме объекта и в рамках данного механизма не рассматривается)
• Построить подменю для элемента управления типа "Кнопка": вызвать процедуру "СформироватьПодменю()"
• Описать обработчик события нажатия на кнопку, сформированную данным механизмом.
Если в теле процедуры - обработчика события нет возможности однозначно идентифицировать нажатую кнопку по имени или по пользовательскому представлению (заголовку), то рекомендуется использовать следующий подход:
• При формировании дерева значений имена кнопок нумеровать по порядку (например: "Кнопка1", "Кнопка2"….)
• Идентификационные данные кнопки размещать в дереве значений в колонке "Расшифровка"
• Описать в модуле формы общую переменную, для хранения дерева значений. Хранение дерева значений необходимо для получения значения поля "Расшифровка" по имени нажатой кнопки в момент обработки события нажатия на кнопку подменю.
• В теле процедуры - обработчика события для поиска соответствующей строки дерева значений по имени нажатой кнопки использовать метод "Найти()" для строк дерева значений:
СтрокаДерева = ДеревоКнопокПодменюПерейти.Строки.Найти(Кнопка.Имя,"Имя", Истина);
Далее необходимо работать со значением поля "Расшифровка" найденной строки и по нему определять производимые программой действия.
Подробнее с описанной методикой можно ознакомиться на примере, приведенном в конце данного материала.
Инициализацию, заполнение и построение подменю необходимо вызывать каждый раз, когда состав подменю должен быть изменен. Если состав подменю не изменяется от данных в форме, то инициализацию, заполнение и построение подменю достаточно вызывать при открытии формы.
Следующий пример демонстрирует, как с помощью механизма "Формирование подменю кнопки командной панели" сформировать вместо привычного подменю "перейти" подменю, сгруппированное по видам движений для формы списка любого документа:
////////////////////////////////////////////////////////////////////////////// // МОДУЛЬ ФОРМЫ СПИСКА ДОКУМЕНТА ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // ПЕРЕМЕННЫЕ ФОРМЫ Перем ДеревоКнопокПодменюПерейти; // Процедура - обработчик события "ПриОткрытием" формы. // Процедура ПриОткрытии() Перем ПодменюРегистрыБухгалтерии; Перем ПодменюРегистрыНакопления; Перем ПодменюРегистрыРасчета; НомерКнопки = 0; ДеревоКнопокПодменюПерейти = ИнициализироватьДеревоДополнительныхКнопок(); Действие = Новый Действие("НажатиеНаКнопкуПодменюПерейти"); Для каждого Движение Из Метаданные.НайтиПоТипу(ТипЗНЧ(ДокументСписок)).Движения Цикл НомерКнопки = НомерКнопки + 1; Если Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда Если ПодменюРегистрыБухгалтерии = Неопределено Тогда ПодменюРегистрыБухгалтерии = ДобавитьСтрокуВДеревоКнопок(ДеревоКнопокПодменюПерейти,"РегистрыБухгалтерии",ТипКнопкиКоманднойПанели.Подменю, "Регистры бухгалтерии"); КонецЕсли; Подменю = ПодменюРегистрыБухгалтерии; ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Движение) Тогда Если ПодменюРегистрыНакопления = Неопределено Тогда ПодменюРегистрыНакопления = ДобавитьСтрокуВДеревоКнопок(ДеревоКнопокПодменюПерейти,"РегистрыНакопления" ,ТипКнопкиКоманднойПанели.Подменю, "Регистры накопления"); КонецЕсли; Подменю = ПодменюРегистрыНакопления; ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда Если ПодменюРегистрыРасчета = Неопределено Тогда ПодменюРегистрыРасчета = ДобавитьСтрокуВДеревоКнопок(ДеревоКнопокПодменюПерейти,"РегистрыРасчета" ,ТипКнопкиКоманднойПанели.Подменю, "Регистры расчета"); КонецЕсли; Подменю = ПодменюРегистрыРасчета; КонецЕсли; ДобавитьСтрокуВДеревоКнопок(Подменю, "Кнопка" + Формат(НомерКнопки, "ЧГ=") , ,Движение.Представление(), Действие, Движение); Сообщить(""+Движение.ПолноеИмя()); КонецЦикла; СформироватьПодменю(ДеревоКнопокПодменюПерейти, ЭлементыФормы.ДействияФормы.Кнопки.Перейти); КонецПроцедуры // Процедура - обработчик нажатия на любую из кнопок "перейти" // Процедура НажатиеНаКнопкуПодменюПерейти(Кнопка) ТекущиеДанные = ЭлементыФормы.ДокументСписок.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; СтрокаДерева = ДеревоКнопокПодменюПерейти.Строки.Найти(Кнопка.Имя,"Имя", Истина); Движение = СтрокаДерева.Расшифровка; Если Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда Форма = РегистрыБухгалтерии[Движение.Имя].ПолучитьФормуСписка(); ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Движение) Тогда Форма = РегистрыНакопления[Движение.Имя].ПолучитьФормуСписка(); ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда Форма = РегистрыРасчета[Движение.Имя].ПолучитьФормуСписка(); КонецЕсли; Форма.ПараметрОтборПоРегистратору = ЭлементыФормы.ДокументСписок.ТекущиеДанные.Ссылка; Форма.Открыть(); КонецПроцедуры // () //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ДОПОЛНИТЕЛЬНЫМИ КНОПКАМИ РАСПОЛОЖЕННЫЕ В ОБЩЕМ МОДУЛЕ // Функция инициализирует дерево дополнительных кнопок Функция ИнициализироватьДеревоДополнительныхКнопок() Экспорт ДеревоКнопок = Новый ДеревоЗначений; //Если ИмяКнопки = Неопределено, создается разделитель //Если Дерево имеет подчиненные, то ДеревоКнопок.Колонки.Добавить("Имя"); ДеревоКнопок.Колонки.Добавить("ТипКнопки"); ДеревоКнопок.Колонки.Добавить("Текст"); ДеревоКнопок.Колонки.Добавить("Подсказка"); ДеревоКнопок.Колонки.Добавить("Картинка"); ДеревоКнопок.Колонки.Добавить("Действие"); ДеревоКнопок.Колонки.Добавить("Пометка"); //Остальные свойства кнопки ДеревоКнопок.Колонки.Добавить("Расшифровка"); Возврат ДеревоКнопок; КонецФункции // () // Функция добавляет новую строку в дерево кнопок Функция ДобавитьСтрокуВДеревоКнопок(СтрокаПодменю, Имя, Знач ТипКнопки = Неопределено ,Текст = "", Действие = Неопределено, Расшифровка = Неопределено, Пометка = Ложь, Подсказка = "", Картинка = Неопределено ) Экспорт Если ТипКнопки = Неопределено Тогда ТипКнопки = ТипКнопкиКоманднойПанели.Действие; КонецЕсли; СтрокаКнопки = СтрокаПодменю.Строки.Добавить(); СтрокаКнопки.Имя = Имя; СтрокаКнопки.ТипКнопки = ТипКнопки; СтрокаКнопки.Текст = Текст; СтрокаКнопки.Действие = Действие; СтрокаКнопки.Картинка = Картинка; СтрокаКнопки.Подсказка = Подсказка; СтрокаКнопки.Пометка = Пометка; СтрокаКнопки.Расшифровка = Расшифровка; Возврат СтрокаКнопки; КонецФункции // Процедура формирует подменю по дереву значений Процедура СформироватьПодменю(СтрокаПодменю, Подменю, Очищать = Ложь, ДобавлятьРазделительВНачало = Ложь) Экспорт Строки = СтрокаПодменю.Строки; Кнопки = Подменю.Кнопки; Если Очищать Тогда Кнопки.Очистить(); КонецЕсли; Если ДобавлятьРазделительВНачало и Строки.Количество() > 0 Тогда Кнопки.Добавить(,ТипКнопкиКоманднойПанели.Разделитель); КонецЕсли; Для каждого СтрокаКнопки Из Строки Цикл Кнопка = Кнопки.Добавить(СтрокаКнопки.Имя,СтрокаКнопки.ТипКнопки, СтрокаКнопки.Текст, СтрокаКнопки.Действие); Если СтрокаКнопки.Строки.Количество() > 0 Тогда СформироватьПодменю(СтрокаКнопки, Кнопка, Ложь, Ложь) КонецЕсли; Если Не СтрокаКнопки.Картинка = Неопределено Тогда Кнопка.Картинка = СтрокаКнопки.Картинка; КонецЕсли; Кнопка.Подсказка = СтрокаКнопки.Подсказка; Кнопка.Пометка = СтрокаКнопки.Пометка; КонецЦикла; КонецПроцедуры |
Панель функций
Пользователь не сразу начинает работать с учетной системой быстро и эффективно. В самом начале работы происходит адаптация и обучение. В этот период пользователь учится вызывать конкретные функции учетной системы и осваивает последовательность ввода и обработки данных в ней.
Пользователь работает медленно прежде всего по двум причинам:
• ему трудно найти нужный пункт главного меню или кнопку панели инструментов
• он не знает что и в какой последовательности необходимо отражать в учетной системе для достижения требуемого результата.
Значительная часть пользователей не проходят предварительного обучение на курсах и не читают перед началом работы руководство пользователя. Они осваивают систему на практике, ориентируясь на примеры в демо-базе и встроенную справку.
Встроенная справка содержит подробную информацию о работе с объектом учетной системы и более полезна при работе с самим объектом. Представления о работе в целом, как правило, встроенная справка не дает и поэтому для освоения учетной системы пользователю требуется дополнительная помощь.
В большинстве случаев, пользователю достаточно небольшой оперативной справки, в двух-трех предложениях рассказывающей о назначении объекта конфигурации. При этом, такая справка должна быть легко доступна и организована в таком виде, чтобы была ясна последовательность действий.
Панель функций решает задачу информирования пользователя именно так, как описано выше. Она предоставляет доступ к объектам конфигурации, альтернативно главному меню и панелям инструментов, но в отличии от меню, которое содержит только названия пунктов и видно пользователю только в момент выбора, панель функций отображает страницу постоянно. Эту страницу можно не торопясь рассмотреть и изучить, а для каждого пункта приведено краткое описание. Содержание страницы демонстрирует примерный порядок работы, а описания дают краткую характеристику каждого конкретного действия. Таким образом, задача с каким конкретно объектом сейчас работать для пользователя значительно упрощается, он быстрее осваивает работу в учетной системе, а в период обучения и адаптации работает более эффективно, чем без панели функций.
Внутреннее устройство
Панель функций – это набор страниц, в каждой из которых тематически объединено несколько пунктов с кратким описанием. При нажатии мышью на пункт, вызывается соответствующая форма или выполняется другое, заранее заданное действие.
Имеет возможность быстрого перехода к содержанию и к каждой отдельной странице
Во время работы с панелью функций, запоминается история переходов.
Настройки запоминаются в настройках пользователя.
Для разных групп пользователей требуется разный набор функций (действий), поэтому панель функций позволяет задать несколько вариантов своего содержания и для каждого пользователя дает возможность выбрать требуемый ему вариант. Содержимое каждого варианта хранится в отдельном макете в виде XML описания, из которого при каждом запуске панели функций создаются страницы.
Дата: 2018-11-18, просмотров: 356.