Одним из сервисов предоставляемых пользователям в конфигурациях является показ в колонках форм списков справочников различных текущих итогов, таких как остатки товаров, материалов и т.д. Однако, часто эта сервисная возможность существенно сказывается на производительности работы со справочником. Приведем несколько рекомендаций:
- следует включать вычисляемые колонки не во все формы списка, а только в те, в которых это действительно необходимо;
- в ряде случаев целесообразно вынести вычисляемое выражение из колонки в текстовый элемент шапки, чтобы вычисление выполнялось не по каждой строке, а только по текущей;
- рекомендуется не включать обращение к итогам непосредственно в выражение элемента диалога, а вызывать в формуле функцию модуля;
- при получении итогов рекомендуется выполнять проверку является ли текущий элемент группой и не обращаться к итогам по группе (метод "ЭтоГруппа()" можно использовать непосредственно без обращения к текущему элементу - см. пример в методической конфигурации в модуле формы списка "ДляПодбораСписком" справочника "Товары" в функции "ТекущийОстаток" );
- в ряде случаев рекомендуется предусмотреть в форме отключение вывода итогов, чтобы пользователи могли регулировать производительность работы со справочником, для этого в функциях следует анализировать значение включенного в диалог формы флажка;
- при выборе способа получения итогов следует учитывать затраты системы на получение необходимых данных, например, получение остатка регистра с помощью метода "СводныйОстаток" может существенно зависеть с точки зрения производительности от количества реально существующих остатков, суммируемых данным методом.
В некоторых случаях возникает потребность организовать в справочниках определенный порядок следования элементов, который не является алфавитной последовательностью наименований или другого реквизита. В методической конфигурации эта возможность демонстрируется на примере справочника "Подразделения". Он организован таким образом, что при его заполнении можно расставить элементы в необходимом порядке, например, согласно штатному расписанию.
Для реализации данной задачи в справочнике создан числовой реквизит "Порядок" с признаком "Сортировка" и с установкой его использования и для групп и для элементов. Кроме того, для данного справочника отключен признак "Размещать группы сверху", чтобы порядок следования можно было задавать для элементов и групп в единой последовательности.
В форме элемента справочника при создании нового элемента вызывается функция определяющая максимальное значение реквизита "Порядок" в той группе, в которую вводится элемент. Новому элементу присваивается порядок на 100 больший максимального из существующих. Автоматическая расстановка порядка через 100 позволяет затем изменять порядок следования простым редактированием значения реквизита "Порядок" в форме элемента справочника.
В форме списка при открытии устанавливается режим сортировки списка соответствующий значениям реквизита "Порядок". Таким образом пользователь будет видеть список в необходимом порядке.
Для удобства перестановки элементов в форму включены кнопки "Вверх" и "Вниз". Они вызывают поцедуру, выполняющую изменение значений реквизита "Порядок" таким образом, что текущий элемент перемещается в порядке следования соответственно назад или вперед.
В данной процедуре выполняется обход элементов подчиненных текущему родителю и они помещаются в список значений. Далее в списке значений выполняется сдвиг текущего элемента в нужном направлении. Затем выполняется изменение значений реквизита "Порядок" у тех элементов, у которых он изменился.
Для обеспечении целостности данного действия оно выполняется в единой транзакции.
Для обеспечения контроля изменения заблокированного другим пользователем объекта используется обработка ошибочных ситуаций.
При работе пользователей с подчиненными справочниками иногда возникает потребность в одновременном открытии нескольких форм списка подчиненного справочника для различных элементов справочника - владельца. Такой штатной возможности в 1С:Предприятии не существует. После открытия формы списка подчиненного справочника, в ней будет автоматически изменяться владелец при смене текущей позиции в форме списка справочника - владельца. Однако, при конфигурировании системы существует возможность организовать открытие нескольких форм списка подчиненного справочника средствами встроенного языка.
В методической конфигурации такая возможность демонстрируется на примере открытия справочника "Договора" из формы списка справочника "Организации". Для этого в форме списка справочника - владельца ("Организации") создана кнопка, вызывающая процедуру, которая выполняет открытие формы списка подчиненного справочника "Договора" для текущей организации (на которой установлен курсор). Открытие формы выполняется с помощью функции "ОткрытьФорму". Добавление к первому параметру символа "#" и строкового представления элемента справочника - владельца обеспечивает открытие уникальной формы именно для данного элемента. То есть при повторном выполнении открытия для данного элемента активизируется уже открытая форма, а для другого элемента - откроется новая. После выполнения открытия формы, у ее контекста вызывается метод "ИспользоватьВладельца", которому передается текущий элемент справочника - владельца и признак того, что владелец не должен меняться автоматически при смене текущей строки в форме списка справочника - владельца. Таким образом, если мы открываем форму списка справочника "Договора" используя специальную кнопку, то открывается форма для просмотра именно договоров подчиненных текущей организации, и таких форм может быть открыто несколько. При других вариантах открытия справочника "Договора" (например, из главного меню) будет сохраняться традиционное поведение формы списка. То есть, будет открываться все время одна и та же форма, и текущий владелец в ней будет меняться при смене текущей строки в форме списка справочника "Организации".
Рекомендации по использованию периодических реквизитов справочников Использование периодических реквизитов существенно облегчает реализацию многих прикладных моментов конфигурации, однако, использование периодических реквизитов требует при конфигурировании особого внимания.
Не следует злоупотреблять этим свойством. Установка свойства "периодический" для реквизита справочника должна быть обоснованным и хорошо продуманным шагом, иначе это просто усложнит работу пользователей со справочниками, но не даст большого выигрыша. Например, реквизиты, используемые для печати документов, не обязательно делать периодическими. Обычно, периодическими имеет смысл делать реквизиты, значения которых используются в алгоритмах проведения документов. Это позволяет избежать неверного перепроведения документа ранее введенных документов при
изменении значений реквизитов.
При написании алгоритма следует всегда помнить, что для использования значения периодического реквизита справочника необходимо обязательно указывать дату, на которую требуется выбрать или записать значение. Установка даты использования периодических реквизитов для объекта типа "Справчоник" задается либо оператором "ИспользоватьДату", либо методами "Получить" и "Установить" (через точку после идентификатора самого реквизита). Одновременно использовать оба эти способа задания даты для одного и того же объекта типа "Справочник" нельзя. Если метод "ИспользоватьДату" не вызывался, то к периодическому реквизиту справочника следует обращаться с помощью методов "Получить" и "Установить". Если метод "ИспользоватьДату" был вызван, то можно обращаться только непосредственно к значениям реквизитов. Вызов метода "ИспользоватьДату" должен располагаться до позиционирования объекта на определенный элемент или у него в качестве параметра должен быть передан признак "УстановитьСразу".
Рекомендуется в основном обращаться к периодическим реквизитам с помощью методов "Получить" и "Установить". Применение метода "ИспользоватьДату" более вызывает, обычно, больше ошибок при конфигурировании. Примером, целесообразного использования этого метода может являться печать справочника с большим количеством периодических реквизитов. В этом случае, один раз вызвав в самом начале этот метод, Вы сможете получать значения всех реквизитов перебираемых элементов непосредственно, без вызова метода "Получить".
При написании алгоритмов также следует учитывать, что периодические реквизиты содержат "не пустые" значения только начиная с момента (даты) первой записи истории значений реквизита. Например, если самая первая запись периодического реквизита "Курс" отмечена датой '94' со значением 4800, а в программном модуле выполняется обращение к значению этого реквизита на '94', то система выдаст "пустое значение", т.е. ноль.
Еще одной особенностью использования периодических реквизитов является их редактирование в форме элемента справочника. Сама форма элемента справочника, как и форма списка, открывается с определенной датой. Если элемент открывается из списка справочника, то дата берется из списка. Если список в свою очередь открыт для выбора реквизита документа, то его дата будет совпадать с датой документа. Даты в формах списка и элемента справочника выводятся в заголовке окна и используются только для вывода и записи периодических реквизитов. Дату использования периодических реквизитов можно изменить методом "ИспользоватьДату" встроенного языка в модуле формы.
При записи элемента редактируемого в форме, если существуют периодические реквизиты, то выдается специальный запрос, в котором пользователь отмечает какие значения периодических реквизитов нужно установить на дату формы. По умолчанию изменения реквизитов выставляется на основании сравнения текущих значений со значениями, записанными на ближайшую предыдущую дату. Данный запрос выдается только для реквизитов, непосредственно включаемых в форму.
Если некоторый периодически реквизит непосредственно в форму не включен, а изменяется из встроенного языка, то он не будет выдаваться в стандартном запросе. Для того, чтобы не включенный в форму реквизит участвовал в запросе о записи периодических реквизитов можно использовать соответствующий вариант метода "СохранениеПериодическихРеквизитов" модуля формы.
Реквизиты могут записываться или не записываться на дату формы, но не могут быть записаны на разные даты. Для того, чтобы при записи элемента записать периодические реквизиты на некоторую дату следует воспользоваться методом "СохранениеПериодическихРеквизитов" модуля формы. Данная методика реализована, например, в типовой конфигурации 1С:Бухгалтерии 7.7 (редакция 3.1).
Заметим, что поддержка большого количества периодических реквизитов в справочнике сложна для пользователя. Типичной ошибкой пользователя является ввод элемента и запись соответственно его периодических реквизитов на рабочую дату, а затем попытка провести задним числом документ, использующий при проведении значения периодических реквизитов этого элемента.
При разработке конфигураций использующих периодические реквизиты одной из важнейших задач является уменьшение вероятности ошибки пользователя при записи элементов с периодическими реквизитами. Для этого следует, прежде всего, обеспечить наглядность для пользователя самого факта записи значений на определенную дату.
В некоторых случаях можно рекомендовать организовывать изменение периодических реквизитов справочника только специальным механизмом изменения периодических реквизитов при проведении документа и запретить ручное редактирование этих реквизитов. Для этого обычно создают специальный документ, например, "УстановкаЦенТоваров", который выполняет изменение периодически - зависимых цен товаров. При использовании такого документа установка периодических значений с некоторой даты становится для пользователей более наглядным, так как в качестве даты выступает дата документа, и фактически каждый документ фиксирует моменты изменения ериодических реквизитов.
На основе анализа опыта работы начинающих пользователей с периодическими реквизитами в редакции 3.1 типовой конфигурации 1С:Бухгалтерии 7.7 реализован комплекс мер, направленных на минимизацию ошибок и улучшение понимания пользователями самого принципа организации периодических реквизитов. Эти меры можно рекомендовать применять и при разработке других прикладных решений, рассчитанных на широкий круг пользователей.
При вводе новых элементов справочников, устанавливается дата записи периодических реквизитов '1980'. Это позволяет исключить ситуацию, когда при вводе проводок и документов с начала года реквизиты новых элементов записываются на текущую дату, что вызывает проблемы при проведении документов.
В формах списков и элементов справочников предусмотрены кнопки для вызова специальной обработки предназначенной для одновременного просмотра истории нескольких периодических реквизитов. При вызове обработки из формы списка в ней также допускается редактирование истории периодических реквизитов.
Применение этой обработки повышает наглядность работы с периодическими реквизитами для пользователя.
При записи элементов имеющих периодические реквизиты в форме элемента предусмотрен вызов специальной обработки, заменяющей стандартный диалог системы. В ней допускается изменение даты записи значений периодических реквизитов, а также предусмотрен вызов обработки для просмотра истории изменения значений. Основной целью применения данной обработки является привлечение внимания пользователя к важности правильной установки даты записи значений и предоставление возможности записи значений на другую дату.
При создании конкретных конфигураций довольно часто возникают задачи, когда надо реализовать для каждого конкретного элемента справочника - список относящихся к нему объектов (отношение один-ко-многим).
Например:
· Есть справочник товаров, и каждый товар должен иметь, произвольное число
единиц измерения.
· Есть справочник товаров, и каждый товар должен иметь список серийных
номеров изделий.
· Есть справочник клиентов, и по каждому клиенту нужно вести список
заключенных с ним договоров.
В системе 1С:Предприятие эти и другие аналогичные задачи решаются при помощи подчиненных справочников.
Например, справочник "Договора" создается как подчиненный справочнику "Клиенты".
Если существует два справочника - родительский и починенный, то интерактивное добавление элементов подчиненного справочника возможно только при открытом справочнике-владельце. Например, для того, чтобы добавить элемент в справочник "Договора", следует открыть форму списка справочника "Клиенты", и выбрать в нем курсором нужный элемент. При этом форма подчиненного справочника "Договора", будет отображать список договоров выбранного клиента. Заметим, что наличие элементов в подчиненном справочнике не допускается для групп справочника-владельца.
Когда владелец установлен, можно добавлять элементы в список договоров. Если владелец не установлен, то в заголовке подчиненного справочника будет выведена строка "Не задан элемент-владелец".
В форме списка справочника предусмотрены кнопки для открытия подчиненных справочников и справочника-владельца. Однако в некоторых случаях можно рекомендовать размещать в форме списка справочника-владельца специальные кнопки, для открытия определенных подчиненных справочников с помощью функции "ОткрытьФорму". Это позволит пользователю быстрее освоить работу с подчиненными справочниками.
Просмотр списка элементов подчиненного справочника при не заданном владельце доступен только при выключенной иерархии. Таким образом, выключение иерархии позволяет искать элементы справочника даже при не выбранном владельце. Следует заметить, что отключение иерархии при просмотре многоуровневых подчиненных справочников отключает одновременно и иерархию групп. Иногда для удобства просмотра подчиненного справочника с отключенной иерархией целесообразно включить в форму списка справочника текстовый элемент диалога с формулой "Владелец". Это позволит пользователю видеть владельца текущего элемента.
Выбор элементов подчиненного справочника, в форме, при условии, что в форме существует элемент диалога, в котором выбран элемент справочника владельца, для которого производится выбор, реализуется в конфигурации при помощи указания в форме в свойствах элемента диалога, предназначенного для выбора элемента подчиненного справочника, параметра "Связан с". В нем вводится имя идентификатора реквизита, который содержит элемент справочника-владельца. В этом случае при выборе элемента подчиненного справочника автоматически будет производиться выбор из элементов подчиненных установленному элементу справочника-владельца.
Другим способом установки элемента справочника-владельца, среди которых должен выполняться выбор подчиненного справочника является вызов метода ИспользоватьВладельца объекта подчиненного справочника. Это позволяет определить выбор подчиненного справочника даже в том случае, когда в форме нет элемента диалога имеющего тип справочника-владельца.
При вводе проводок, если одно из субконто счета имеет тип справочника подчиненного справочнику, который так же использован в качестве субконто данного счета, автоматически осуществляется выбор подчиненного справочника из элементов подчиненных выбранному элементу справочника-родителя в субконто данного счета.
В некоторых случаях ведение подчиненных справочников реализуется непосредственно в форме элемента справочника-владельца. Для этого рекомендуется использовать модальный режим открытия форм. Например, такая методика реализована в типовой конфигурации 1С:Бухгалтерии 7.7 (ред 3.1).
Однако следует учитывать, что ввод подчиненных элементов допускается только после того, как новый элемент справочника-владельца записан.
Механизм справочников 1С:Предприятия предполагает использование групп справочников как способа упорядочивания элементов для поиска, а также как средство группировки при составлении отчетности. То есть считается, что объектами, отражающими данные предметной области, являются непосредственно элементы справочника, а группы вводятся дополнительно, в качестве "надстройки" над элементами, упрощающими работу с ними.
Большинство механизмов 1С:Предприятия опирается именно на такую организацию справочников. Например, допускается свободное перемещение пользователем элементов из одной группы в другую.
При проектировании алгоритмов работающих с многоуровневыми справочниками не рекомендуется, кроме специальных случаев, опираться на принадлежность конкретного элемента определенной группе. Например, при делении товаров по группам, не рекомендуется устанавливать зависимость алгоритмов проведения документов от того, в какой группе находится товар. Более предпочтительно сосредоточить всю существенную информацию непосредственно в реквизитах элемента справочника, чтобы она оставалась неизменной при любых изменениях в структуре групп справочника.
Также не следует записывать группы справочников в качестве значений измерений регистров оперативного учета или субконто проводок.
В форме списка справочника существует возможность ограничить просмотр элементов, отобрав их по сколь - угодно сложным критериям. Для этого применяется метод "ИспользоватьСписокЭлементов". В этом разделе приводятся разъяснения по назначению и особенностям использования этого метода.
Прежде всего, заметим, что данный метод не устанавливает условие отбора элементов, а задает форме списка справочника непосредственно список элементов, которые нужно показывать в форме. Этим собственно и достигается максимальная гибкость отбора, так как список элементов может быть сформирован с использованием любых средств 1С:Предприятия. Эта возможность позволяет оптимизировать формирование необходимого списка, выбирая наиболее производительный способ отбора данных. Прежде всего, это позволяет при работе с данными в формате MS SQL Server максимально задействовать возможности SQL-сервера.
Важной особенностью применения метода "ИспользоватьСписокЭлементов" является необходимость формирования списка элементов отвечающих текущим значениям Родителя и Владельца в форме списка справочника. Типичной ошибкой при использовании данного метода является формирование полного списка элементов, удовлетворяющих требуемому условию.
В случае если методу "ИспользоватьСписокЭлементов" переданы элементы не соответствующие текущему Владельцу и Родителю, то такие элементы будут отображаться в списке пустой строкой, и будут отмечаться специальной пиктограммой с символом "?". При этом не будет выдаваться сообщение об ошибке. Фактически, появление такой пиктограммы означает, что метод "ИспользоватьСписокЭлементов" используется неправильно. Такой способ диагностирования ошибки применяется системой в данном случае потому, что проверка переданного списка на корректность в процессе вызова метода потребует фактически обращения к каждому элементу в информационной базе, что существенно замедлит работу данного механизма. Таким образом, после разработки алгоритма модуля формы списка справочника следует проверить его работу на реальных данных и убедиться, что все элементы в списке отображаются правильно.
Другой особенностью применения метода "ИспользоватьСписокЭлементов" является необходимость формирования списка элементов при изменениях текущих значений Родителя и Владельца. Для этого необходимо обрабатывать соответствующие предопределенные процедуры и выполнять формирование списка с учетом новых значений.
При работе с формой списка справочника с установленным списком элементов следует учитывать, что содержимое списка не будет автоматически обновляться при изменении данных справочника. Фактически просмотр списка будет отображать состояние справочника на момент формирования списка. По этой же причине в данном режиме запрещен ввод новых элементов. Если возможность динамического обновления необходима, то можно рекомендовать включить в форму кнопку для принудительного обновления списка.
При разработке алгоритма формирования списка следует обеспечить приемлемую производительность его выполнения на реальных данных. При работе с базами данных в формате MS SQL Server целесообразно воспользоваться рекомендациями по оптимизации выполнения запросов в версии 1С:Предприятия для SQL. Если формирование списка с выбранным критерием не удается выполнить с приемлемой производительностью, то целесообразно изменить критерий отбора или отказаться от отбора элементов в справочнике.
Таким образом, метод "ИспользоватьСписокЭлементов" следует рассматривать как весьма специализированный способ представления списка справочника, который с одной стороны предоставляет максимальную гибкость с точки зрения отбора элементов, а с другой стороны требует достаточно аккуратного применения.
Подробное описание примера использования данного метода, включенного в методическую конфигурацию, приводится в разделе "Методики организации подбора и выбора - Отбор элементов справочника по сложному критерию".
При работе с объектом типа "Справочник" метод "ВыборГруппы" используется для включения и выключения выбора групп при интерактивном выборе элемента справочника из формы списка.
Метод применяется для реквизита диалога типа "Справочник" или включенного в диалог реквизита типа "Справочник" какого либо объекта. В этом случае он управляет возможностью выбора в это поле группы при нажатии кнопки выбора.
В формах данный метод может быть вызван также для элементов диалога (атрибутов объекта "Форма"). Это позволяет, например, назначить режим выбора не для конкретного значения реквизита табличной части документа, а для значений данного реквизита во всех строках.
Этот метод может быть также вызван непосредственно в модуле формы списка справочника. Он имеет смысл, если форма списка открыта для выбора.
Для объектов созданных функцией "СоздатьОбъект" этот метод влияет только на интерактивный выбор, осуществляемый методом "Выбрать".
При обходе элементов справочника переменной созданной с помощью функции "СоздатьОбъект" метод "ВыборГруппы" не оказывает влияния на выборку. Для обработки только элементов (без групп) нужно выполнять проверку каждого полученного элемента методом "ЭтоГруппа".