Профессиональная разработка в системе «1С:Предприятие 8» В двух томах Том 1 Москва «1С-Паблишинг» 2012 Электронная версия книги «Профессиональная разработка в системе 1С:Предприятие 8» (издание 2) Том 1 © ООО «1С-Паблишинг», 2012 Материалы предназначены для личного индивидуального использования приобретателем книги «Профессиональная разработка в системе 1С:Предприятие 8», 2 издание (Москва, «1С-Паблишинг», ISBN 978-5-9677-1790-8, 2012). Запрещено тиражирование, распространение материалов, предоставление доступа по сети к материалам без письменного разрешения правообладателей. Разрешено копирование фрагментов программного кода для использования в разрабатываемых прикладных решениях. Оглавление Оглавление Введение....................................................................................7 От редактора...........................................................................................................................7 Благодарности........................................................................................................................7 Особенности книги..................................................................................................................7 Как читать книгу......................................................................................................................8 Что находится на компакт-диске...........................................................................................8 Скажите нам, что вы думаете . .............................................................................................8 Глава 1. Архитектура «1С:Предприятия»............................. 9 Платформа и прикладные решения......................................................................................9 Средства разработки в составе платформы........................................................................9 Метаданные – способ описания прикладного решения....................................................10 Метаданные и встроенный язык....................................................................................................10 Подсистемы.....................................................................................................................................10 Создание прикладных решений на основе модели...........................................................11 Объектные и необъектные данные.....................................................................................12 Три способа представления данных...................................................................................12 Сквозная типизация..............................................................................................................13 Поддержка составных типов данных..................................................................................13 Смешанный подход к манипулированию данными...........................................................13 Встроенный язык..................................................................................................................14 Язык запросов.......................................................................................................................14 Прикладные решения, независимые от используемого хранилища данных..................15 Управляемый интерфейс.....................................................................................................15 Командный интерфейс...................................................................................................................17 Ссылки.............................................................................................................................................18 История............................................................................................................................................20 Избранное........................................................................................................................................21 Использование информации из метаданных...............................................................................23 Расширения форм и элементов управления................................................................................23 Генерация форм по умолчанию.....................................................................................................23 Клиентские приложения ......................................................................................................24 Подключение через Интернет.............................................................................................24 Файловый и клиент-серверный варианты работы.............................................................25 Кластер серверов «1С:Предприятия»...........................................................................................25 Выполнение основной функциональности на сервере................................................................26 Том 1 Поддержка различных хранилищ данных..........................................................................26 Работа под управлением различных операционных систем ...........................................27 Обновление прикладных решений......................................................................................27 Интернационализация..........................................................................................................27 Глава 2. Функциональность «1С:Предприятия»............... 29 Обзор функциональности прикладных решений...............................................................29 Справочники....................................................................................................................................29 Документы.......................................................................................................................................29 Механизм характеристик................................................................................................................29 Механизм сведений........................................................................................................................30 Механизм учета движения средств...............................................................................................30 Механизм бухгалтерского учета....................................................................................................30 Механизм сложных периодических расчетов...............................................................................30 Механизм бизнес-процессов..........................................................................................................31 Механизм анализа данных и прогнозирования............................................................................31 Сложные отчеты, использующие систему компоновки данных..................................................31 Механизмы презентации текстовых и аналитических данных....................................................32 Средства интеграции и механизмы обмена данными.................................................................34 Web-сервисы...................................................................................................................................34 Web-расширение.............................................................................................................................35 Механизм полнотекстового поиска................................................................................................35 Механизм криптографии.................................................................................................................36 Механизм разделения данных.......................................................................................................36 Внешние источники данных...........................................................................................................36 Обзор функциональности средств разработки..................................................................36 Объекты конфигурации и инструменты для их редактирования................................................37 Конструкторы и редакторы.............................................................................................................37 Синтакс-помощник..........................................................................................................................38 Отладчик и режим замера производительности..........................................................................38 Проверка конфигурации.................................................................................................................39 Редактирование текстов интерфейса...........................................................................................39 Групповая разработка прикладных решений...............................................................................39 Поставка и поддержка прикладных решений...............................................................................39 Создание дистрибутивов................................................................................................................39 Функциональные опции..................................................................................................................39 Показатели производительности и режим имитации задержек при вызове сервера...............40 «1С:Библиотека стандартных подсистем 8.2».............................................................................40 3 Оглавление Обзор функциональности средств администрирования...................................................40 Список пользователей....................................................................................................................41 Механизмы аутентификации . .......................................................................................................41 Механизм заданий..........................................................................................................................41 Система прав доступа....................................................................................................................41 Ограничение прав на уровне записей и полей.............................................................................42 Журнал регистрации.......................................................................................................................42 Загрузка/выгрузка информационной базы....................................................................................42 Утилита администрирования кластера серверов.........................................................................42 «1С:Корпоративный инструментальный пакет» ..........................................................................43 Глава 3. Использование встроенного языка..................... 45 Модули конфигурации..........................................................................................................46 Контекст исполнения модулей.......................................................................................................47 Общий модуль.................................................................................................................................48 Модуль управляемого приложения...............................................................................................48 Модуль сеанса.................................................................................................................................50 Модуль внешнего соединения.......................................................................................................50 Модуль объекта...............................................................................................................................51 Модуль менеджера объекта...........................................................................................................52 Модуль управляемой формы.........................................................................................................53 Модуль команды.............................................................................................................................57 Работа встроенного языка на сервере...............................................................................58 Организация выполнения кода на сервере или на клиенте........................................................58 Вызов процедур из серверных модулей ......................................................................................59 Передача параметров на сервер и возврат значений.................................................................60 Привилегированный и безопасный режимы исполнения кода...................................................60 Работа с метаданными........................................................................................................61 Глава 4. Работа с данными................................................... 65 Объектные и необъектные данные.....................................................................................65 Объектные данные.........................................................................................................................65 Необъектные данные.....................................................................................................................75 Система типов.......................................................................................................................79 Типы значений и типы данных.......................................................................................................79 Типы значений.................................................................................................................................80 Типы данных....................................................................................................................................99 Транзакции..........................................................................................................................104 Использование явного вызова транзакций.................................................................................105 Обработка ошибок базы данных в транзакции...........................................................................105 Вложенный вызов транзакций.....................................................................................................107 Влияние транзакций на работу программных объектов............................................................108 Механизм управляемых блокировок................................................................................. 111 Возможные проблемы при многопользовательском доступе к одним и тем же данным....... 111 Уровни изоляции транзакций....................................................................................................... 113 4 Режим управляемых блокировок................................................................................................. 113 Установка управляемых блокировок........................................................................................... 114 Глава 5. Клиент-серверный вариант работы.................. 119 Общие сведения ................................................................................................................119 Программные компоненты клиент-серверной архитектуры «1С:Предприятия»..................... 119 Варианты использования.............................................................................................................121 Работа под управлением различных операционных систем ...................................................122 Кластер серверов...............................................................................................................122 Состав кластера............................................................................................................................122 Сеансы и соединения...................................................................................................................123 Масштабируемость и отказоустойчивость.......................................................................126 Масштабируемость кластера.......................................................................................................126 Устойчивость клиентских приложений........................................................................................127 Использование протокола HTTP..................................................................................................127 Отказоустойчивость кластера......................................................................................................128 Динамическое перераспределение нагрузки..............................................................................130 Безопасность.......................................................................................................................130 Многоуровневая аутентификация...............................................................................................130 Шифрование передаваемых данных..........................................................................................131 Глава 6. Установка и администрирование системы...... 135 Несколько дистрибутивов..................................................................................................135 Установка, обновление и запуск........................................................................................135 Запуск.............................................................................................................................................135 Установка.......................................................................................................................................137 Обновление...................................................................................................................................138 Управление кластером серверов......................................................................................139 Работа со списком администраторов центрального сервера...................................................139 Работа со списком кластеров центрального сервера................................................................139 Работа со списком менеджеров кластера..................................................................................140 Работа со списком администраторов кластера..........................................................................140 Работа со списком рабочих серверов кластера.........................................................................141 Работа со списком рабочих процессов.......................................................................................141 Работа со списком информационных баз...................................................................................142 Работа со списком сеансов..........................................................................................................142 Работа со списком соединений....................................................................................................143 Программные средства администрирования кластера серверов..................................143 Глава 7. Командный интерфейс прикладных решений.......................................... 145 Пользователь, интерфейс, команда.................................................................................145 Командный интерфейс системы.......................................................................................146 Команды «1С:Предприятия»........................................................................................................146 Структура командного интерфейса.............................................................................................147 Профессиональная разработка в системе «1С:Предприятие 8» Оглавление Формирование состава командного интерфейса.......................................................................149 Краткие итоги.................................................................................................................................154 Настраиваем состав команд..............................................................................................154 Постановка задачи........................................................................................................................154 Системные команды.....................................................................................................................155 Состав разделов...........................................................................................................................155 Стандартные команды..................................................................................................................157 Основные действия для создания командного интерфейса.....................................................161 Настраиваем доступность команд по ролям....................................................................161 Система прав доступа..................................................................................................................161 Система управления пользователями........................................................................................165 Редактирование командного интерфейса........................................................................168 Автоматическое размещение и видимость команд....................................................................168 Система настройки командного интерфейса..............................................................................174 Влияние функциональных опций на командный интерфейс..........................................183 Механизм функциональных опций..............................................................................................183 Отключаем неиспользуемые команды........................................................................................184 Пользовательская настройка интерфейса.......................................................................187 Настройка области системных команд.......................................................................................187 Настройка командного интерфейса.............................................................................................188 Настраиваем представление команд................................................................................190 Модель разработки глобального командного интерфейса.............................................192 Создаем произвольные команды......................................................................................193 Произвольные команды...............................................................................................................193 Особенности размещения............................................................................................................196 Развитие функциональности ценообразования.........................................................................197 «Командуем» формами......................................................................................................210 Необходимые сведения о формах..............................................................................................210 Функциональность по умолчанию................................................................................................ 211 Команды формы............................................................................................................................ 211 Способы формирования состава команд формы......................................................................215 Автоматическое формирование состава команд формы..........................................................215 Доступность команд формы для пользователя.........................................................................219 Управляем командами формы.....................................................................................................221 Если не хватает стандартных команд.........................................................................................230 Краткие итоги.................................................................................................................................232 Глава 8. Разработка форм................................................... 233 Конструирование форм......................................................................................................233 Форма «1С:Предприятия»............................................................................................................233 Создание формы...........................................................................................................................235 Редактирование формы...............................................................................................................240 Влияние объектов конфигурации на форму...............................................................................253 Реквизиты формы.........................................................................................................................258 Командный интерфейс формы....................................................................................................259 Том 1 Управление видимостью элементов формы..............................................................................261 Окно сообщений формы...............................................................................................................268 Примеры конструирования форм................................................................................................269 Рабочий стол.................................................................................................................................279 Программирование форм..................................................................................................283 Форма как элемент клиент-серверного взаимодействия...........................................................283 Параметры и реквизиты формы..................................................................................................284 Открытие форм.............................................................................................................................285 Преобразование прикладных данных в данные формы...........................................................294 Контекстные и внеконтекстные серверные вызовы...................................................................296 Работа с данными объекта в форме...........................................................................................297 Последовательность событий при открытии формы объекта..................................................299 Последовательность событий при записи объекта из формы..................................................301 Начальное заполнение.................................................................................................................305 Проверка заполнения...................................................................................................................310 Сообщения пользователю...........................................................................................................321 Способы информирования пользователя..................................................................................327 Обновление данных в динамических списках............................................................................329 Оформление списков....................................................................................................................332 Дополнительные колонки в списках............................................................................................341 Работа с таблицей в форме.........................................................................................................347 Работа с файлами и картинками.................................................................................................351 Ввод по строке...............................................................................................................................364 Программное изменение формы.................................................................................................372 Настройки пользователей ...........................................................................................................380 Оптимизация клиент-серверного взаимодействия в формах.........................................391 Общие рекомендации по оптимизации клиент-серверного взаимодействия..........................391 Инструменты, используемые при оптимизации клиент-серверного взаимодействия............392 Примеры оптимизации клиент-серверного взаимодействия....................................................397 Глава 9. Хранение информации......................................... 435 Задачи хранения информации..........................................................................................435 Варианты подходов к решению задач хранения информации.......................................438 Хранение информации, общей для информационной базы.....................................................438 Хранение единичных значений условно-постоянной информации..........................................439 Использование перечислений ...................................................................................................440 Использование предопределенных элементов..........................................................................442 Хранение информации объектных и необъектных сущностей.................................................443 Хранение информации в самих объектах или в других объектах............................................444 Хранение иерархической информации.......................................................................................446 Хранение информации, имеющей привязку ко времени...........................................................453 Использование объекта «ХранилищеЗначения».......................................................................454 Хранение информации в регистрах сведений.................................................................455 Уникальность записей регистра сведений..................................................................................455 Периодические регистры сведений.............................................................................................457 Подчинение записей регистратору..............................................................................................457 5 Оглавление Структура регистра сведений......................................................................................................459 Создание, изменение, удаление записей регистра сведений...................................................462 Получение данных из регистров сведений.................................................................................470 Проектирование структуры регистров сведений........................................................................479 Хранение дополнительных характеристик.......................................................................480 Хранение дополнительных характеристик определенного типа..............................................481 Хранение дополнительных характеристик произвольного типа . ............................................483 Глава 10. Документы и последовательности.................. 495 Место документов в концепции системы «1С:Предприятие».........................................495 Документы...........................................................................................................................496 Функциональность документов....................................................................................................496 Состав документов........................................................................................................................503 Отдельные вопросы типового использования документов.......................................................505 Специальные случаи использования документов. Ручная операция......................................529 Журналы документов.........................................................................................................531 Состав журналов...........................................................................................................................532 Заполнение журналов...................................................................................................................533 Последовательности документов......................................................................................533 Устройство последовательностей...............................................................................................535 Работа с последовательностями.................................................................................................536 Параллельный ввод документов, участвующих в последовательности..................................543 Получение оборотов.....................................................................................................................580 Получение остатков и оборотов в одной таблице......................................................................592 Применение отборов в запросах, использующих виртуальные таблицы регистров накопления . ................................................................................................................602 Когда следует использовать запрос вместо объектной модели обращения при получении данных регистров накопления............................................................................604 Отдельные вопросы использования регистров накопления...........................................605 Работа с регистрами при отображении динамических данных.................................................605 Получение остатков при проведении документов......................................................................609 Глава 12. Бухгалтерский учет............................................. 613 Диаграмма взаимодействия объектов..............................................................................613 План счетов и его основные свойства..............................................................................614 Коды счетов...................................................................................................................................617 Упорядочивание счетов в плане счетов.....................................................................................618 Иерархичность плана счетов.......................................................................................................620 Предопределенные и пользовательские счета..........................................................................623 Основы организации аналитического учета...............................................................................624 Принятие решений при организации аналитического учета.....................................................632 Предназначение регистра бухгалтерии............................................................................634 Объект «Регистр бухгалтерии».........................................................................................636 Основные свойства регистра бухгалтерии.................................................................................637 Данные регистра бухгалтерии.....................................................................................................638 Глава 11. Учет движения средств...................................... 545 Запись движений в регистр бухгалтерии..........................................................................646 Оперативный учет. Описание задач, решаемых регистрами накопления.....................545 Структура регистра накопления........................................................................................547 Механизмы заполнения таблиц регистров накопления в базе данных.........................550 Интерактивно: ручная операция..................................................................................................647 Программно при проведении документа.....................................................................................650 Программно без проведения документа.....................................................................................653 Запись данных в таблицу движений регистра накопления.......................................................551 Свойство «Движения» объекта документа ................................................................................552 Запись набора записей регистра без использования свойства «Движения»..........................560 Механизмы заполнения таблицы итогов регистра накопления................................................563 Получение данных из регистров накопления...................................................................568 Получение движений регистров накопления..............................................................................568 Получение остатков......................................................................................................................573 6 Чтение данных регистра бухгалтерии...............................................................................654 Таблицы регистра бухгалтерии...................................................................................................654 Вопросы производительности регистра бухгалтерии......................................................678 Физические таблицы регистра бухгалтерии...............................................................................678 Индексы таблиц итогов регистра бухгалтерии...........................................................................681 Построение виртуальных таблиц регистра бухгалтерии...........................................................684 Зависимость производительности от настроек субконто счета................................................689 Профессиональная разработка в системе «1С:Предприятие 8» Введение Введение От редактора Благодарности Идея этой книги заключается в том, чтобы собрать воедино и систематизировать наиболее важную информацию, которая может понадобиться разработчику прикладных решений «1С:Предприятия 8.2». Уровень изложения материала предполагает, с одной стороны, что разработчик уже знаком с системой «1С:Предприятие 8.2», а с другой стороны – что в этой книге он сможет найти ответ даже на довольно сложные вопросы, возникающие в процессе разработки. Написание такой книги, как эта, всегда требует совместных усилий. Поэтому кроме авторов в ее создании приняло участие большое количество специалистов. В одной книге, пусть даже такой большой, невозможно охватить абсолютно все ситуации, которые могут возникнуть при разработке прикладных решений. Однако на подавляющее большинство вопросов, возникающих перед разработчиками, книга дает ответы. Причем книга будет одинаково интересна как начинающим разработчикам, так и более «продвинутым». Как правило, прикладные разработчики имеют достаточно четко определенную специализацию, сосредотачивая свои усилия на решении задач одной предметной области. Вместе с этим довольно часто возникают ситуации, когда приходится осваивать «смежные» прикладные области, чтобы внести небольшие исправления в существующее решение или, наоборот, создать новую подсистему. Поэтому книга, помимо собственно глубокого изложения прикладных механизмов, содержит общие сведения как о самих механизмах, так и об автоматизируемой предметной области. Благодаря этому разработчик, хорошо знакомый с системой, но специализирующийся, например, на решении задач оперативного учета, всегда сможет быстро разобраться с задачами начисления заработной платы и понять работу механизмов, которые используются для решения этих задач. При написании этой книги мы стремились, чтобы она стала серьезным инструментом для серьезных разработчиков, книгой, к которой всегда можно обратиться в случае затруднений и которую просто интересно прочитать, чтобы узнать что-то новое о хорошо известной предметной области или познакомиться с новым взглядом на привычные вещи. От себя лично и от всех авторов этой книги хочу пожелать вам успехов в изучении системы «1С:Предприятие» и повышения вашего мастерства! Максим Радченко Том 1 Мы выражаем признательность всем, кто высказал свои замечания по тем или иным разделам книги: Александру Алексееву, Александру Безбородову, Александру Виноградову, Андрею Волкову, Геннадию Дамье, Одею Деруту, Дмитрию Зарецкому, Сергею Копиенко, Максиму Лейбовичу, Евгению Митрошкину, Сергею Мурзину, Сергею Нуралиеву, Константину Рупасову, Павлу Чикову и Андрею Чичерину. Хочется поблагодарить Одея Дерута, Дмитрия Русанова и Виталия Филиппова, которые оказали помощь авторам в разборе сложных вопросов по реализации и функционированию системы. При создании книги с разрешения фирмы «1С» использовались материалы информационно-технологического сопровождения и материалы докладов партнерских конференций. Мы выражаем признательность авторам этих материалов и выступлений. Также мы благодарим Евгения Медведева, Сергея Позднякова и Павла Чикова, которые выступили в качестве «бета-тестеров» некоторых глав и разделов книги. Особенности книги Существует ряд особенностей, отличающих эту книгу от других книг, посвященных системе «1С:Предприятие 8.2». Прежде всего, это освещение вопросов, которые обычно остаются в тени, когда речь идет о прикладных разработках. Например, такие вопросы, как общая концепция системы, описание используемых таблиц и принципы хранения информации системы. При описании тех или иных прикладных механизмов авторы стремились дать общее представление о механизме, его месте в системе, показать идеологию его работы. По мнению авторов, это поможет разработчику строить эффективные решения исходя из понимания идеологии работы механизма, выбирать те или иные варианты реализации, основываясь на знании принципов работы механизма. 7 Введение Довольно много внимания в книге уделено методическим вопросам разработки прикладных решений, когда разработка ведется коллективом разработчиков. Рассматривается использование механизма групповой разработки. Также излагается методика настройки производительности прикладного решения, рассматриваются конкретные шаги и инструменты, используемые на каждом из уровней, которые следует использовать в обычной практике. Применительно к методике создания прикладных решений рассматриваются механизмы интернационализации, содержащиеся в системе, их влияние и использование в каждом из элементов системы. Этот раздел дает целостное представление обо всех средствах интернационализации, которые содержит «1С:Предприятие 8.2». При подготовке этой книги были использованы самые различные источники информации: ■■ опыт преподавания на учебных курсах по платформе и прикладным решениям «1С:Предприятия 8»; ■■ опыт внедрения прикладных решений; ■■ опыт, накопленный разработчиками фирмы «1С»; ■■ материалы информационно-технологической поддержки (ИТС); ■■ материалы форума партнеров-разработчиков на http://partners.v8.1c.ru; ■■ общение на партнерских семинарах, проводимых фирмой «1С». или доработать любую имеющуюся конфигурацию. При этом учебная версия имеет ряд технических ограничений и не может быть использована для ведения реального учета на предприятии. Ограничения учебной версии платформы перечислены на сайте http://v8.1c.ru/edu/. Для учебной версии платформы периодически выпускаются обновления с тем, чтобы она соответствовала текущим возможностям, используемым в прикладных решениях. Обновить учебную версию платформы можно через сайт поддержки пользователей. Для этого необходимо: ■■ зарегистрироваться на сайте поддержки пользователей (ввести регистрационный номер, PIN-код и другую информацию); ■■ скачать новую учебную версию платформы. Регистрационная анкета и конверт с PIN-кодом входят в состав данного продукта. Адрес сайта поддержки пользователей – http://users.v8.1c.ru. Кроме учебной версии платформы на диске содержится более шестидесяти демонстрационных конфигураций, которые используются в ходе изложения различных глав книги. Все демонстрационные конфигурации содержатся на компакт-диске в виде одного дистрибутива. После его запуска (первый пункт меню диска) шаблоны конфигураций устанавливаются в текущий каталог шаблонов. Конфигурации созданы в версии «1С:Предприятия» 8.2.15.317. Как читать книгу Также на компакт-диске находится электронная версия этой книги в формате PDF. Ее можно использовать для быстрого поиска в тексте книги, а также для копирования фрагментов программного кода. Книга построена таким образом, чтобы можно было читать главы как подряд, так и выборочно. Кроме этого, на диске содержатся вспомогательные файлы, которые используются в некоторых примерах. Чтение глав по порядку позволяет получить целостное представление о системе и ее возможностях, постепенно переходя от общих архитектурных решений к более конкретным прикладным механизмам и их реализации. В то же время книгу можно читать отдельными главами, если требуется изучить работу какого-то конкретного прикладного механизма или понять принципы работы системных механизмов. Книга содержит достаточно подробное оглавление, что позволяет обращаться к отдельным разделам книги в тех случаях, когда нужно разобраться в конкретных особенностях работы того или иного механизма или просто освежить их в памяти. Что находится на компакт-диске К книге прилагается компакт-диск, который содержит материалы, предназначенные для самостоятельного изучения и использования. Прежде всего, это учебная версия платформы «1С:Предприятие 8.2». Она не имеет аппаратной или программной защиты и позволяет создать 8 Скажите нам, что вы думаете В процессе подготовки этой книги мы прилагали значительные усилия для того, чтобы устранить возможные неточности и опечатки, однако не можем гарантировать их отсутствие на 100 %. Мы понимаем, сколько негативных эмоций может доставить пример, который не работает, например, потому, что в имени переменной допущена ошибка. Поэтому сообщить об обнаруженных неточностях вы можете в форуме по адресу DevTrainingForum.v8.1c.ru. Здесь же вы можете написать свои впечатления от этой книги и пожелания по ее совершенствованию. Мы ценим обратную связь с читателями, и с благодарностью примем как слова критики, так и слова одобрения и учтем их в работе над будущими изданиями. Профессиональная разработка в системе «1С:Предприятие 8» Платформа и прикладные решения Глава 1. Архитектура «1С:Предприятия» Система «1С:Предприятие» в широком смысле представляет собой совокупность четырех составляющих (рис. 1.1): ■■ технологической платформы; ■■ прикладных решений различного масштаба и различной направленности, созданных на основе технологической платформы; ■■ методики создания прикладных решений; ■■ информационно-технологической поддержки пользователей и разработчиков. Платформа и прикладные решения Основным концептуальным решением, отличающим систему «1С:Предприятие» от универсальных средств программирования, является четкое разделение на платформу и прикладное решение. Прикладное решение «1С:Предприятия» является самостоятельной сущностью и может выступать в качестве отдельного программного продукта. Однако создание, модификация и собственно функционирование прикладного решения невозможны без использования технологий и механизмов платформы. Поэтому платформа поставляется с каждым комплектом «1С:Предприятия». Средства разработки в составе платформы Рис. 1.1. Структура «1С:Предприятия» Такая архитектура продиктована прежде всего задачами, которые призвана решать система «1С:Предприятие». Во-первых, система должна обеспечивать высокий уровень адаптируемости прикладных решений под требования заказчика. Во-вторых, система должна обеспечивать изменение готового прикладного решения разработчиком, не участвовавшим в его создании. Это особенно важно для прикладных решений в сфере экономических задач, где существенная часть разработчиков не создает собственные прикладные решения, а дорабатывает и развивает существующие типовые решения. В-третьих, система должна обеспечивать эффективное использование компьютерных технологий и платформ, не требуя при этом глубоких специальных знаний от разработчика. Прикладные решения «1С:Предприятия» являются открытыми. Благодаря этому клиент с помощью разработчика или собственными силами может модифицировать и настраивать любое прикладное решение под себя. Исключение составляют прикладные решения, которые выпускаются в так называемой «базовой версии». Кроме прочих ограничений это означает невозможность самостоятельной модификации прикладного решения пользователем. Для модификации прикладных решений не требуется использовать какие-либо отдельные программные продукты – все средства разработки входят в состав технологической платформы. Можно сказать, что платформа состоит из двух составляющих (рис. 1.2): ■■ среда исполнения, ■■ среда разработки. В-четвертых, система должна обеспечивать стандартизацию разработки. Таким образом, можно сказать, что «1С:Предприятие» не является универсальным средством программирования. Система обладает достаточно широкими возможностями, однако ее архитектура и конкретная реализация механизмов и технологий платформы продиктованы прежде всего необходимостью решения специализированных задач по созданию бизнесприложений и требованиями, предъявляемыми к самой системе. Том 1 Рис. 1.2. Структура технологической платформы «1С:Предприятия» 9 Глава 1. Архитектура «1С:Предприятия» Таким образом обеспечивается высокий уровень адаптируемости прикладных решений под требования заказчика. Среда исполнения «1С:Предприятия» исполняет, «проигрывает» метаданные, аналогично тому, как операционная система исполняет код привычной программы. Метаданные – способ описания прикладного решения Отличительной особенностью технологии метаданных является использование визуального конструирования прикладного решения. Вместо кропотливого написания кода разработчик просто добавляет визуальными средствами новый объект конфигурации в прикладное решение и получает сразу же описание нужных типов, структур данных, описание наборов прав, связей между объектами, информацию об особенностях их поведения, визуального представления и т. д. Прикладное решение «1С:Предприятия» не пишется в прямом смысле слова на языке программирования. При создании прикладных решений «1С:Предприятия» используется более абстрактная технология – технология метаданных. Метаданные представляют собой иерархическую структуру объектов, полностью описывающую все прикладное решение. Эта структура называется «дерево объектов конфигурации» (рис. 1.3). Метаданные и встроенный язык Все прикладное решение представляется не в виде строк с инструкциями на языке программирования, а в виде иерархической структуры объектов конфигурации. При этом разработчик использует встроенный язык и язык запросов для того, чтобы описать специфические алгоритмы поведения тех или иных объектов конфигурации в различные моменты исполнения прикладного решения. Использование встроенного языка при разработке прикладных решений ограничено в основном решением тех задач, которые действительно требуют алгоритмического описания, например, расчета налогов, проверки корректности введенных данных и пр. Основная же структура прикладного решения описывается структурой объектов конфигурации. Почти все объекты конфигурации содержат модули, в которых и могут быть описаны алгоритмы на встроенном языке. Эти модули будут вызываться средой исполнения в конкретные, заранее определенные моменты работы прикладного решения – события. Таким образом, можно сказать, что использование встроенного языка в прикладных решениях носит событийный характер. Подсистемы Платформа «1С:Предприятие» позволяет выделить в прикладном решении отдельные функциональные части – подсистемы, в совокупности представляющие все прикладное решение. Подсистемы могут иметь иерархическую структуру, т. е. одна подсистема может включать в себя несколько других подсистем. Структура подсистем определяет всю функциональность прикладного решения и служит основой для построения глобального командного интерфейса приложения (рис. 1.4). Рис. 1.3. Дерево объектов конфигурации прикладного решения 10 Разработка практически любого прикладного решения начинается с проектирования состава подсистем, так как структура подсистем Профессиональная разработка в системе «1С:Предприятие 8» Метаданные – способ описания прикладного решения (разделов в интерфейсе приложения) – это первое, что увидит пользователь при знакомстве с прикладным решением. Каждый такой шаблон (прототип) содержит определенную базовую реализацию объекта конфигурации (рис. 1.5). Рис. 1.5. Состав прототипа (шаблона) объекта конфигурации Рис. 1.4. Глобальный интерфейс прикладного решения Когда разработчик добавляет в дерево объектов конфигурации новый объект конфигурации, этот объект наследует базовую реализацию прототипа (рис. 1.6): Каждый объект конфигурации, описывающий данное прикладное решение, может быть отнесен к одной или нескольким подсистемам. Таким образом, наличие подсистем позволяет распределить объекты конфигурации по логически связанным с ними разделам и предоставить пользователю удобный интерфейс, в котором ему будут видны только те объекты (т. е. та функциональность прикладного решения), с которыми он работает. Создание прикладных решений на основе модели Важной особенностью системы «1С:Предприятие» является то, что для описания структуры прикладного решения разработчик использует не произвольные, а строго определенные объекты конфигурации. Платформа «1С:Предприятие» содержит ограниченный набор прототипов (шаблонов) объектов конфигурации. Среди этих шаблонов есть, например, шаблон справочника, документа, регистра накопления, бизнеспроцесса и т. д. Том 1 Рис. 1.6. Добавление нового объекта конфигурации 11 Глава 1. Архитектура «1С:Предприятия» При добавлении нового объекта конфигурации платформа основывается на «знаниях» о базовом классе объектов (рис. 1.7): ■■ платформа «знает», какие таблицы (состав полей, количество таблиц, их взаимная связь) нужно будет создать в хранилище данных при сохранении конфигурации; ■■ сразу же добавляются новые типы встроенного языка, позволяющие работать с данными создаваемого объекта, причем состав этих типов может быть разным для различных шаблонов (прототипов); ■■ сразу же создается набор прав, которые будут использоваться для данного объекта, причем наборы прав также могут быть различными для разных шаблонов (прототипов), поскольку различается их базовая функциональность; ■■ определяются стандартные действия, которые система может выполнять с данными этого объекта конфигурации; ■■ и т. д. Объектные и необъектные данные В «1С:Предприятии» принято разделять все прикладные данные на те, которые имеют объектную природу (объектные данные) и не имеют объектной природы (необъектные данные). Примерами объектных данных могут служить данные справочников, документов. Необъектными данными являются, например, данные регистров. Подобное деление определяет два различных подхода к работе с данными. Данные, имеющие объектную природу, хранятся в базе данных в виде объектов. Например, объектом является элемент справочника или конкретный документ. Каждый объект ценен для системы уже одним фактом своего существования и имеет уникальный идентификатор – ссылку. Могут измениться любые данные объекта, но это будет все тот же объект. Удалив объект, его нельзя создать заново. Даже если для нового объекта будут установлены те же данные, это будет уже другой объект с точки зрения «1С:Предприятия», обладающий другим уникальным идентификатором. Данные, имеющие необъектную природу, хранятся в базе данных в виде записей. Каждая запись полностью описывается значениями своих полей и не имеет какого-либо уникального идентификатора. Поэтому для «1С:Предприятия» собственно факт существования записи не важен. Можно удалить запись, а затем создать новую, с такими же значениями полей – состояние базы данных с точки зрения логики прикладного решения от этого не изменится. Подробнее Рис. 1.7. Добавление нового объекта конфигурации Благодаря этому разработчик, не производя никаких дополнительных действий, тут же может запустить прикладное решение и работать с только что добавленным объектом – базовая реализация объекта, унаследованная от прототипа (шаблона), обеспечит выполнение всех необходимых типовых действий. Таким образом, несмотря на то, что каждое прикладное решение обладает собственной «индивидуальностью», все они созданы по определенной модели, с использованием объектов конфигурации, которые обладают одинаковой базовой реализацией. Такой подход значительно упрощает модификацию прикладных решений разработчиками, которые не участвовали в их создании. Раздел «Объектные и необъектные данные», стр. 65. Три способа представления данных Для всех прикладных данных (как объектных, так и необъектных) «1С:Предприятие» поддерживает три способа представления данных (рис. 1.8): ■■ хранение в базе данных, ■■ представление во встроенном языке, ■■ отображение в формате XML. В базе данных информация хранится в виде объектов базы данных или в виде отдельных записей (в зависимости от ее природы – объектной или необъектной). Данные, хранимые в базе данных, могут быть считаны в объекты встроенного языка для их просмотра или изменения и записаны обратно в базу данных. 12 Профессиональная разработка в системе «1С:Предприятие 8» Три способа представления данных Поддержка составных типов данных Рис. 1.8. Три способа представления данных В то же время объекты встроенного языка могут быть сериализованы в/из элементы/ов XML. Представление данных в формате XML используется при обмене данными в распределенных информационных базах, а также может использоваться при взаимодействии с другими информационными системами. Важно отметить, что все три способа представления данных используют одну и ту же систему понятий, благодаря чему от разработчика не требуется специальных усилий для преобразования данных из одного представления в другое. Сквозная типизация Важной особенностью работы с данными является то, что в «1С:Предприятии» реализована общая система типов встроенного языка, полей баз данных и интерфейса. Иными словами, разработчик одинаковым образом определяет поля базы данных, переменные встроенного языка, реквизиты форм и одинаковым образом работает с ними (рис. 1.9). Важной особенностью модели данных «1С:Предприятия» является возможность использования реквизитов объектов конфигурации, имеющих составной тип. Например, в расходной накладной в качестве покупателя может быть указано либо юридическое лицо из справочника организаций, либо физическое лицо из справочника частных лиц. Соответственно, при проектировании базы данных разработчик может определить реквизит, который будет хранить значение любого из этих типов. Подробнее Раздел «Составной тип данных», стр. 101. Смешанный подход к манипулированию данными «1С:Предприятие» обеспечивает два способа доступа к данным – объектный (для чтения и записи) и табличный (только для чтения). В объектной модели разработчик оперирует объектами встроенного языка. В этой модели обращения к объекту, например документу, происходят как к единому целому – он полностью загружается в память, вместе с вложенными таблицами, к которым можно обращаться средствами встроенного языка как к коллекциям записей и т. д. (рис. 1.10). Рис. 1.9. Общая система типов Рис. 1.10. Объектный доступ к данным В результате разработчику не приходится заботиться о преобразованиях между типами данных, поддерживаемыми той или иной СУБД, типами, поддерживаемыми встроенным языком, и типами, используемыми для построения интерфейсных решений. При манипулировании данными в объектной модели обеспечивается сохранение целостности объектов, кеширование объектов, вызов соответствующих обработчиков событий и т. д. Подробнее Раздел «Система типов», стр. 79. Том 1 В табличной модели все множество объектов того или иного класса представляется как совокупность связанных между собой таблиц, к которым можно обращаться при помощи запросов – как к отдельной таблице, так и к нескольким таблицам во взаимосвязи (рис. 1.11). 13 Глава 1. Архитектура «1С:Предприятия» Язык запросов Язык запросов основан на SQL, но при этом содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений. Важной особенностью языка запросов является то, что он предоставляет доступ к данным только на чтение и использует те же типы данных, что и встроенный язык. Рис. 1.11. Табличный доступ к данным В этом случае разработчик получает доступ к данным сразу нескольких объектов, что очень удобно для анализа больших объемов данных, например, при создании отчетов. Однако в силу того, что данные, выбираемые таким способом, содержат не все, а лишь некоторые реквизиты анализируемых объектов, табличный способ доступа не позволяет изменять эти данные. Сочетание табличного и объектного доступа к данным позволяет, с одной стороны, сделать разработку прикладных решений простой и наглядной, а с другой стороны, получать сколь угодно сложные выборки данных и использовать возможности агрегирования полученных данных. Встроенный язык Встроенный язык имеет много общих черт с другими языками, такими как Pascal, Java Script, Basic, что облегчает его освоение начинающими разработчиками. Однако он не является прямым аналогом какого-либо перечисленного языка. Вот лишь некоторые наиболее значимые особенности встроенного языка: ■■ мягкая типизация (тип переменной определяется типом значения, которое она содержит, и может изменяться в процессе работы); ■■ отсутствие программного описания прикладных типов (они создаются при добавлении объектов метаданных); ■■ не требуется предварительное описание процедур/функций, если их вызов выполняется раньше их описания; ■■ событийная ориентированность встроенного языка; ■■ поддерживается обработка исключительных ситуаций; ■■ все операторы имеют как русское, так и английское написание, которое можно использовать одновременно; ■■ используется интерпретатор с предварительной компиляцией (перед исполнением модули, содержащие текст на встроенном языке, преобразуются во внутренний код); ■■ кеширование скомпилированных модулей в памяти. 14 Можно перечислить наиболее существенные возможности, реализуемые языком запросов: ■■ Обращение к подчиненным полям через точку. Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через точку («.»). При этом количество уровней вложенности таких ссылок система не ограничивает; ■■ Обращение к вложенным таблицам (например, табличным частям документов и элементов справочников). К вложенным табличным частям можно обращаться и как к отдельным таблицам, и как к целым полям одной таблицы; ■■ Автоматическое упорядочивание. Режим автоматического упорядочивания позволяет выводить информацию в наиболее правильном («естественном») порядке; ■■ Многомерное и многоуровневое формирование итогов. Итоги и подытоги формируются с учетом группировки и иерархии, обход уровней может выполняться в произвольном порядке с подведением подытогов. Обеспечивается корректное построение итогов по временным измерениям; ■■ Поддержка виртуальных таблиц. Виртуальные таблицы, предоставляемые системой, позволяют получить практически готовые данные для большинства прикладных решений без необходимости составления сложных запросов. Например, такая виртуальная таблица может предоставить данные по остаткам товаров в разрезе периодов на какой-то момент времени. При этом виртуальные таблицы максимально используют хранимую информацию, например, ранее рассчитанные итоги и т. д.; ■■ Стандартные SQL операции. В языке запросов поддерживаются стандартные для SQL операции, такие как объединение (Union), соединение (Join) и т. д.; ■■ Использование временных таблиц. Временные таблицы позволяют повысить производительность запросов, в некоторых случаях снизить количество блокировок и сделать текст запроса более легким для восприятия; Профессиональная разработка в системе «1С:Предприятие 8» Язык запросов ■■ Пакетные запросы. Пакетные запросы позволяют более удобно работать с временными таблицами за счет того, что создание временной таблицы и ее использование помещаются в один запрос. Пакетный запрос представляет собой последовательность запросов, разделенных символом «;». Запросы исполняются один за другим. Результатом выполнения пакетного запроса в зависимости от используемого метода будет являться либо результат, возвращаемый последним запросом пакета, либо массив результатов всех запросов пакета в той последовательности, в которой следуют запросы в пакете. Прикладные решения, независимые от используемого хранилища данных Пользовательский интерфейс «1С:Предприятия» можно охарактеризовать как задаче-ориентированный, позволяющий в каждом отдельном окне приложения (основном или вспомогательном) решать конкретную задачу. Основное окно приложения предназначено для навигации по прикладному решению и вызова различных команд. Вспомогательное окно предназначено для работы с объектами информационной базы (например, с документами или элементами справочников), построения отчетов или выполнения обработок данных. В основном окне приложения пользователю предоставляется вся структура прикладного решения (панель разделов) и рабочий стол (рис. 1.12). Платформа изолирует разработчика от понятий и подробностей более низкоуровневых технологий. При создании прикладных решений разработчик «1С:Предприятия» не обращается к базе данных напрямую. Непосредственно он работает с платформой «1С:Предприятие». При этом он может: ■■ описывать структуры данных в конфигураторе; ■■ манипулировать данными с помощью объектов встроенного языка; ■■ составлять запросы к данным, используя язык запросов. Платформа «1С:Предприятие» обеспечивает операции исполнения запросов, описания структур данных и манипулирования данными, транслируя их в соответствующие команды. Это могут быть команды одной из сторонних СУБД, поддерживаемых «1С:Предприятием», в случае клиент-серверного варианта работы или команды собственной СУБД для файлового варианта работы. Управляемый интерфейс В платформе «1С:Предприятие» реализован современный эргономичный пользовательский интерфейс, рассчитанный на комфортную работу с системой в течение продолжительного времени, в том числе и неподготовленных пользователей, имеющих небольшой опыт работы с компьютером. Удобный и интуитивно понятный интерфейс позволяет пользователям выполнять большой объем функционала, даже не пользуясь при этом инструкциями и документацией. Пользовательский интерфейс «1С:Предприятия» построен по принципу декларативного описания. Он называется «управляемым» потому, что с помощью прав и ролей пользователей, функциональных опций и настроек пользователя платформа автоматически строит командный интерфейс, управляемые формы и отчеты. Том 1 Рис. 1.12. Основное окно приложения Рабочий стол – это стандартный раздел программы, содержащий часто используемые документы, отчеты, справочники и т. п. Этот раздел автоматически активизируется при запуске прикладного решения. Это своеобразный «помощник» пользователя. Рабочий стол вводит пользователя в курс дел, отвечает на его вопросы и позволяет ему быстро включиться в работу. Панель разделов – это наиболее крупное разделение функциональности прикладного решения. Она расположена в верхней части основного окна 15 Глава 1. Архитектура «1С:Предприятия» и соответствует верхнему уровню подсистем, добавленных в конфигурацию. С ее помощью осуществляется переход к другим разделам программы. отчетов и обработок. Эти окна отображаются на экране компьютера независимо от основного окна приложения (рис. 1.14). При активизации раздела вся функциональность соответствующей подсистемы, включая вложенные подсистемы, представляется пользователю в виде команд в двух панелях: панели навигации и панели действий (рис. 1.13). Рис. 1.13. Основное окно приложения Панель навигации содержит своеобразное «оглавление» раздела. Она включает навигационные команды, которые позволяют перейти к той или иной точке этого раздела. Как правило, это команды перехода к каким-либо спискам. При вызове навигационной команды соответствующий ей список отображается в рабочей области раздела, замещая прежнее содержимое рабочей области. Панель действий содержит наиболее востребованные в повседневной работе команды, позволяющие быстро создавать новые объекты, выполнять типовые обработки или строить популярные отчеты. Такие команды называются командами действия, поскольку их вызов приводит к открытию нового, вспомогательного окна приложения и на некоторое время переключает пользователя на выполнение другой задачи. Вспомогательные окна приложения открываются при вызове команд ввода новых и редактирования существующих объектов, а также при открытии 16 Рис. 1.14. Основное и вспомогательное окна приложения Пользователь может открывать любое необходимое ему количество вспомогательных окон. Для удобства ввода данных и защиты от ошибок вспомогательное окно может быть открыто в режиме блокирования окнавладельца. Основное окно приложения также включает в себя главное меню системы и набор вспомогательных команд (калькулятор, календарь и пр.). А также предоставляет различные сервисные возможности, такие как: просмотр истории работы пользователя и возможность перемещаться по разделам прикладного решения, с которыми уже работал пользователь; добавление разделов, списков, объектов базы данных, отчетов и обработок в избранное; отображение в информационной панели (внизу окна) оповещений о последних действиях пользователя; возможность получить ссылку на любые разделы, списки, объекты базы данных, отчеты и обработки и перейти по полученной ссылке к этим данным и т. д. Профессиональная разработка в системе «1С:Предприятие 8» Управляемый интерфейс Командный интерфейс Командный интерфейс – это основное средство навигации пользователя по функциональности прикладного решения. Формирование командного интерфейса выполняется платформой автоматически в зависимости от прав пользователя, видимости команд по ролям, функциональных опций приложения и настроек самого пользователя. Глобальный командный интерфейс в системе «1С:Предприятие» строится на основе иерархии подсистем, созданных разработчиком в конфигурации. Состав подсистем верхнего уровня иерархии отражает наиболее общее разделение функциональности прикладного решения, в интерфейсе приложения он образует разделы глобального командного интерфейса. Структура подсистем определяет всю функциональность прикладного решения и служит основой для построения глобального командного интерфейса приложения (рис. 1.15). Рис. 1.15. Глобальный интерфейс прикладного решения Если подсистема имеет подчиненную подсистему, то для нее формируется подраздел, отображаемый группой в панели навигации раздела. Все прикладные объекты конфигурации (справочники, документы, отчеты и т. д.) привязываются разработчиком конфигурации к подсистемам. На основе этой информации (структуры подсистем и привязки объектов к подсистемам) платформа автоматически строит командный интерфейс Том 1 для пользователя. Пользователю отображается структура прикладного решения (иерархия подсистем) и предоставляются стандартные команды доступа к функциональности прикладных объектов (вызов списков справочников, документов, открытие отчетов, обработок и т. д.). При этом разработчик может по своему усмотрению отредактировать предлагаемое системой построение командного интерфейса (изменить порядок, видимость команд). Кроме того, разработчик может создать свои команды (общие для конфигурации или подчиненные прикладным объектам), которые будут включаться в командный интерфейс. При запуске прикладного решения платформа «превращает» полный командный интерфейс приложения в командный интерфейс пользователя, запустившего прикладное решение. Этот процесс включает несколько этапов (рис. 1.16): ■■ Автоматический учет ролей/прав. Прежде всего, при построении интерфейса автоматически анализируются права этого пользователя на доступ к данным. Например, из командного интерфейса исключаются команды для доступа к объектам, которые пользователю недоступны. Кроме того, в системе существует возможность установки прав на отдельные реквизиты объектов. Используя эту информацию, платформа сама исключает или делает недоступными для редактирования соответствующие поля в формах, а также исключает колонки из списков и отчетов; ■■ Видимость по умолчанию. Для различных интерфейсных элементов системы (команд, элементов формы) настраивается видимость по умолчанию для отдельных ролей. Это позволяет, в зависимости от ролей пользователя, предоставить ему наиболее важную часть функциональности. При этом у пользователя есть возможность включения видимости тех элементов, которые изначально были отключены разработчиком; ■■ Значения функциональных опций. Механизм функциональных опций позволяет определить в конфигурации ту функциональность, которая может использоваться или нет при внедрении в зависимости от потребностей конкретной организации. Различные элементы конфигурации (объекты, реквизиты, команды) могут быть привязаны к функциональным опциям. При внедрении можно управлять включением и выключением функциональных опций в конкретной информационной базе. Платформа при этом будет автоматически включать и выключать отображение всех элементов интерфейса (полей, команд, колонок списков, элементов отчетов), связанных с этими функциональными опциями; ■■ Пользовательская настройка. Платформа предоставляет пользователю возможность донастроить внешний вид командного интерфейса в соответствии со своими предпочтениями. Возможна настройка всех 17 Глава 1. Архитектура «1С:Предприятия» основных элементов интерфейса: панели разделов, рабочего стола, панели навигации и панели действий. Пользовательская настройка запоминается и учитывается при следующем запуске приложения этим пользователем. □□ реквизит табличной части объекта информационной базы; □□ запись регистра информационной базы; □□ реквизит записи регистра информационной базы; □□ временное хранилище. Интерактивные ссылки Эти ссылки можно запоминать для дальнейшего использования, например, чтобы быстро перейти к определенному документу. Этими ссылками можно обмениваться: например, передать сотруднику ссылку на неправильно оформленный документ. Получивший ссылку сотрудник может просто ввести текстовую ссылку, и нужный документ сразу откроется. Например, навигационная ссылка может выглядеть следующим образом (листинг 1.1). Рис. 1.16. Автоматическое формирование платформой командного интерфейса для пользователя Подробнее Глава 7 «Командный интерфейс прикладных решений», стр. 145. Ссылки В системе «1С:Предприятие» реализован механизм ссылок. Значительная часть этого механизма реализована в режиме 1С:Предприятие и доступна пользователю интерактивно. В полном же объеме механизм доступен из встроенного языка. Общий смысл этого механизма заключается в том, что в режиме 1С:Предприятие можно получать текстовые ссылки на данные, хранящиеся в информационной базе, на точки навигации и на отчеты и обработки. Условно такие ссылки можно разделить на два «вида» – интерактивные и неинтерактивные: ■■ интерактивные ссылки: □□ на объекты информационной базы – на элементы справочников, документы и т. д.; □□ отчеты; □□ обработки; □□ точки навигации – на разделы, формы списков, открывающиеся в основном окне; ■■ неинтерактивные ссылки: □□ на реквизит объекта информационной базы (например, реквизит элемента справочника); 18 Листинг 1.1. Навигационная ссылка e1cib/data/Документ.ПриходТовара?ref="a9b800055d49b45e11dbb50561cf0dac" Правила, по которым формируются ссылки, описаны в документации. Формат текстовых ссылок соответствует стандартам RFC 1738, 1808, 2368, 2396, и для того чтобы отличать ссылки «1С:Предприятия» от других (например, http или file), используется идентификатор схемы e1c. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», Приложение 2 «Форматы навигационных ссылок». Заметим, что одна и та же ссылка может быть представлена как внутренняя (относительно какой-то информационной базы) или внешняя, то есть включающая в себя сведения о конкретной информационной базе. Пример внутренней и внешней ссылки приведен в листинге 1.2. Листинг 1.2. Внутренняя и внешняя ссылка // Внутренняя ссылка e1cib/data/Документ.ПриходТовара?ref="a9b800055d49b45e11dbb50561cf0dac" // Внешняя ссылка e1c://filev/C/Bases/Platform82Demo#e1cib/data/Документ.ПриходТовара?ref= "a9b800055d49b45e11dbb50561cf0dac" Как видно, разница только в начальной части ссылки. У внешней ссылки добавляется идентификатор конкретной базы данных. В примере это файловая база данных (e1c://filev/), расположенная в каталоге C/Bases/Platform82Demo. Профессиональная разработка в системе «1С:Предприятие 8» Управляемый интерфейс С точки зрения пользователя, существует три способа использования таких ссылок: ■■ любые ссылки (и внешние, и внутренние) можно добавлять в избранное, чтобы затем, при необходимости, быстро вернуться к этому документу или списку. В диалоге получения ссылки можно сразу же скопировать ее в буфер обмена или переключить представление ссылки с внутренней на внешнюю. Чтобы перейти по полученной ссылке, нужно выполнить команду Перейти по ссылке в основном или во вспомогательном окне (рис. 1.18). Подробнее Раздел «Избранное», стр. 21. ■■ внутренние ссылки можно использовать внутри конкретной информационной базы. При этом не важно, каким клиентом пользователи подключены к этой информационной базе. Один пользователь может получить внутреннюю ссылку, передать ее другому пользователю, например, по электронной почте. Другой пользователь может перейти по этой ссылке; ■■ внешние ссылки задуманы для использования вне «1С:Предприятия». Внешние ссылки имеет смысл использовать только для веб-клиента. Один пользователь, подключенный к информационной базе веб-клиентом или тонким клиентом по протоколу http, может получить внешнюю ссылку и передать ее другому пользователю. Другой пользователь может ввести эту ссылку в строку веб-браузера. В результате будет запущен веб-клиент, выполнено соединение с нужной информационной базой и выполнен переход по ссылке. В режиме 1С:Предприятие ссылку можно получить по команде Получить ссылку в основном или во вспомогательном окне (рис. 1.17). Рис. 1.18. Команда «Перейти по ссылке» Встроенный язык поддерживает работу со ссылками. Для этого в глобальном контексте есть ряд методов: ■■ ПолучитьНавигационнуюСсылку(), ■■ ПолучитьНавигационнуюСсылкуИнформационнойБазы(), ■■ ПолучитьПредставленияНавигационныхСсылок(), ■■ ПерейтиПоНавигационнойСсылке(), ■■ НайтиОкноПоНавигационнойСсылке(). Неинтерактивные ссылки Неинтерактивные ссылки предназначены для использования во встроенном языке. Например, они могут использоваться для отображения картинок в форме, когда нужная картинка находится во временном хранилище или в реквизите объекта информационной базы. Рис. 1.17. Команда «Получить ссылку» Том 1 19 Глава 1. Архитектура «1С:Предприятия» История Платформа «1С:Предприятие» сохраняет историю работы пользователя. При интерактивном добавлении или изменении объектов информационной базы (например, документов, элементов справочников) информация об этом автоматически сохраняется системой. Кроме этого, последние оповещения об изменении объектов информационной базы отображаются в правой части информационной панели для быстрого доступа к ним (рис. 1.21). Пользователь всегда может открыть список этих изменений и перейти к любому из объектов, перечисленных в этом списке. Например, для того, чтобы уточнить, правильно ли он изменил данные (рис. 1.19). Рис. 1.19. История работы пользователя Перейти к окну История можно с помощью кнопки История в информационной панели или через Главное меню Сервис История в основном или вспомогательных окнах приложения (рис. 1.20). Рис. 1.21. Последние измененные объекты в информационной панели История хранится в служебной таблице информационной базы. Если один и тот же объект информационной базы изменялся несколько раз, то в истории будет храниться только одна запись о последнем изменении этого объекта. Если изменялись необъектные данные (например, запись регистра сведений), то история будет хранить записи о каждом изменении данных в ключевых полях этой записи. История хранит не более 200 записей. При добавлении новых записей в историю старые записи автоматически удаляются. Автоматически записи в историю попадают только при интерактивном изменении объектов. Если объекты изменяются программно (например, средствами встроенного языка с помощью внешней обработки), то стандартно при этом не появляется оповещение в правом нижнем углу основного окна приложения и не появляется записи в истории. Рис. 1.20. Переход к истории работы пользователя 20 Но разработчик может при необходимости принудительно вызвать появление оповещения и может занести запись в историю работы пользователя. Профессиональная разработка в системе «1С:Предприятие 8» Управляемый интерфейс Во встроенном языке для работы с историей используется менеджер истории работы пользователя. Его можно получить с помощью свойства глобального контекста ИсторияРаботыПользователя. Для показа оповещения используется метод глобального контекста ПоказатьОповещениеПользователя(). В качестве примера рассмотрим программное изменение элементов справочника. При программном изменении автоматически записи в историю не добавляются. Поэтому мы будем добавлять их самостоятельно, из встроенного языка. А при завершении работы выведем оповещение о том, что элементы справочника были изменены. Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Архитектура 1С:Предприятия». В новой информационной базе добавим в конфигурацию справочник Товары и создадим его форму списка. Расположим ее на рабочем столе. В эту форму добавим команду ИзменитьТовары. В обработчике действия команды напишем следующий код (листинг 1.3): Листинг 1.3. Обработчик команды «ИзменитьТовары» &НаКлиенте Процедура ИзменитьТовары(Команда) Количество = ИзменитьЭлементы(); Элементы.Список.Обновить(); ПоказатьОповещениеПользователя("Обработано " + Количество + " элемента", "e1cib/navigationpoint/desktop", "Список товаров"); КонецПроцедуры Сначала вызовем функцию ИзменитьЭлементы(). Ее пока нет, мы ее напишем позже. Она будет изменять наименование элементов справочника Товары и вернет нам количество измененных элементов. После этого мы обновим список справочника, расположенный в форме, чтобы увидеть новые наименования – Элементы.Список.Обновить(). И в заключение мы выведем оповещение, которое сообщит пользователю количество измененных элементов и будет содержать ссылку на рабочий стол – e1cib/navigationpoint/desktop, чтобы пользователь, если он находится в другом разделе программы, мог быстро перейти к рабочему столу и посмотреть выполненные изменения. Подробнее Раздел «Ссылки», стр. 18. Том 1 После этого добавим недостающую функцию листинг 1.4. ИзменитьЭлементы(), Листинг 1.4. Функция «ИзменитьЭлементы()» &НаСервереБезКонтекста Функция ИзменитьЭлементы() Экспорт Количество = 0; Выборка = Справочники.Товары.Выбрать( , , , "Код"); Пока Выборка.Следующий() Цикл ОбъектТовар = Выборка.ПолучитьОбъект(); ОбъектТовар.Наименование = "Новый товар" + Количество; ОбъектТовар.Записать(); ИсторияРаботыПользователя.Добавить(Выборка.Ссылка); Количество = Количество + 1; КонецЦикла; Возврат Количество; КонецФункции Функция очень простая. Выбираются все элементы справочника Товары. Каждому элементу изменяется наименование, и он записывается. После этого в историю добавляется запись об изменении этого элемента справочника – ИсторияРаботыПользователя.Добавить(Выборка.Ссылка). Функция возвращает количество измененных элементов. Теперь в результате выполнения команды ИзменитьТовары в списке справочника Товары наименования всех товаров будут изменены. Запись об изменении каждого товара будет добавлена в историю, а в конце работы будет выведено одно оповещение. Можно было бы выводить оповещения каждый раз после изменения очередного элемента справочника, но это бессмысленно, так как визуально все эти оповещения «сольются» в одно. Поэтому выводится одно «итоговое» оповещение в конце работы. Избранное Платформа «1С:Предприятие» позволяет пользователю вести собственный список избранных ссылок. В этот список пользователь самостоятельно может добавить ссылки на точки навигации: на разделы программы, списки, открывающиеся в основном окне, отчеты, обработки и объекты информационной базы – на элементы справочников, документы и т. д. Предполагается, что пользователь будет добавлять в этот список важные для него ссылки или ссылки, которыми он часто пользуется, для того чтобы быстро переходить к ним. 21 Глава 1. Архитектура «1С:Предприятия» Подробнее Раздел «Ссылки», стр. 18. Также ссылки в избранное можно добавить с помощью команды главного меню – Сервис Добавить в избранное (рис. 1.24). Чтобы увидеть список избранного, нужно открыть меню Избранное в основном или во вспомогательном окне приложения (рис. 1.22). Рис. 1.24. Добавление ссылок с помощью команды главного меню Рис. 1.22. Список избранного Еще один способ добавления ссылок – с помощью кнопки Добавить в избранное, которая есть в диалогах получения ссылки и перехода по ссылке (рис. 1.25). Ссылки в избранное можно добавить с помощью команды Добавить в избранное. Эта команда находится в меню Избранное, в области системных команд в основном и во вспомогательных окнах приложения (рис. 1.23). Рис. 1.25. Добавление ссылки из диалога получения ссылки Рис. 1.23. Добавление ссылок в избранное 22 Пользователь имеет возможность управлять списком избранного – менять ссылки местами, удалять ненужные ссылки. Профессиональная разработка в системе «1С:Предприятие 8» Управляемый интерфейс Это возможно в окне настройки избранного, которое открывается по команде Настройка избранного из меню избранного основного или вспомогательного окна приложения (рис. 1.26). Использование информации из метаданных Интерфейсные механизмы «1С:Предприятия» широко используют информацию из метаданных для того, чтобы автоматизировать процесс разработки интерфейса и уменьшить необходимость детальной настройки, выполняемой разработчиком. Объекты конфигурации имеют множество интерфейсных свойств (таких как Представление объекта, Представление списка, Маска, Формат и пр.). Настроив их, разработчик может управлять отображением объекта в интерфейсе и его интерактивным поведением в процессе работы прикладного решения. Расширения форм и элементов управления «1С:Предприятие» использует механизм расширений форм и элементов управления. Расширения содержат набор свойств, методов и событий, которыми дополняется стандартное поведение элементов управления и формы после того, как они связываются с данными. В зависимости от того, какой тип данных отображает элемент управления или форма, платформа будет использовать то или иное расширение. Такой подход позволяет реализовывать индивидуальные особенности поведения формы и элементов управления при работе с различными типами данных. Рис. 1.26. Настройка избранного Избранное хранится в хранилище системных настроек. Подробнее Раздел «Настройки пользователей», стр. 380. Документация «1С:Предприятие 8.2. Руководство разработчика»: ■■ глава 5 «Объекты конфигурации», ■■ Приложение 4 «Перечень автоматически сохраняемых настроек». Содержимым избранного можно управлять программно с помощью объекта встроенного языка ИзбранноеРаботыПользователя. Особенностью является то, что доступ к этому объекту не предоставляется через свойство глобального контекста, как, например, к истории работы пользователя. Для того чтобы получить доступ к избранному, нужно прочитать из системного хранилища настроек избранное, добавить в него новый элемент с нужной ссылкой и сохранить избранное обратно в системное хранилище настроек. Том 1 Командный интерфейс также наряду с командами, общими для данного элемента управления или формы, содержит и индивидуальный набор команд, определяемый конкретным типом данных, с которыми связан элемент управления или форма. Например, в форме документа содержится команда Провести, а в форме справочника – нет. Генерация форм по умолчанию Важной особенностью системы «1С:Предприятие» является механизм форм по умолчанию. Этот механизм освобождает разработчика от необходимости создания всех возможных форм для каждого объекта прикладного решения. Разработчику достаточно создать новый объект прикладного решения, а система сама сгенерирует в нужные моменты работы пользователя необходимые формы по умолчанию для работы с данными, содержащимися в этом объекте. Таким образом, разработчику нужно создавать собственные формы объектов прикладного решения лишь в том случае, если они должны иметь отличия (другой дизайн или специфическое поведение) от форм, генерируемых системой по умолчанию. 23 Глава 1. Архитектура «1С:Предприятия» Клиентские приложения Подключение через Интернет Клиентское приложение – это программа, работающая на компьютере пользователя и обеспечивающая интерактивное взаимодействие системы «1С:Предприятие» с пользователем. В системе «1С:Предприятие» существуют три клиентских приложения: толстый клиент, тонкий клиент и веб-клиент. Подключение через Интернет позволяет обеспечить удаленную online работу пользователей с информационными базами. Это возможно благодаря использованию тонкого клиента и веб-клиента. Они подключаются к специальным образом настроенному веб-серверу, который осуществляет их взаимодействие с кластером серверов «1С:Предприятия» или с файловой информационной базой (рис. 1.27). Толстый клиент позволяет реализовывать полные возможности «1С:Предприятия», как в плане разработки, администрирования, так и в плане исполнения прикладного кода. Однако он не поддерживает работу с информационными базами через Интернет, требует предварительной установки на компьютер пользователя и имеет довольно внушительный объем дистрибутива. Тонкий клиент не позволяет разрабатывать и администрировать прикладные решения, однако может работать с информационными базами через Интернет. Он также требует предварительной установки на компьютер пользователя, но имеет значительно меньший размер дистрибутива, чем толстый клиент. Веб-клиент не требует какой-либо предварительной установки на компьютер. В отличие от толстого и тонкого клиентов, он исполняется не в среде операционной системы компьютера, а в среде интернетбраузера (Windows Internet Explorer, Mozilla Firefox, Google Chrome или Safari). В веб-клиенте невозможна разработка прикладных решений. В сводном виде возможности этих клиентских приложений можно представить следующим образом (табл. 1.1). Таблица 1.1. Возможности клиентских приложений Толстый клиент Тонкий клиент Веб-клиент Разработка прикладных решений Работа в локальной сети Работа через Интернет Необходимость предварительной установки Да Да Нет Да, большой дистрибутив Нет Да Да Да, маленький дистрибутив Нет Да Да Нет Независимо от режима работы (толстый, тонкий, веб-клиент) вся разработка прикладного решения ведется полностью в конфигураторе «1С:Предприятия», серверный и клиентский код пишется на встроенном языке. Однако работа в конфигураторе доступна только в режиме толстого клиента, тонкий и веб-клиент поддерживают работу только в пользовательском режиме 1С:Предприятие. Рис. 1.27. Подключение к Интернету через веб-сервер в клиент-серверном варианте работы Прикладные решения не требуют какой-либо доработки для того, чтобы работать с ними через Интернет. И тонкий, и веб-клиент самостоятельно обеспечивают функционирование интерфейса «1С:Предприятия» на компьютере пользователя. Клиенты могут использовать различные способы выхода в Интернет. Это могут быть высокоскоростные подключения по выделенным линиям или через локальную сеть. А могут быть низкоскоростные подключения, например, через мобильное GPRS-соединение. Специально для таких случаев, когда работа с информационной базой осуществляется через низкоскоростные каналы связи, тонкий клиент и веб-клиент имеют специальный режим запуска – режим низкой скорости соединения. В результате даже на низкоскоростных каналах связи платформа обеспечивает приемлемую скорость работы пользователей. Подробнее Раздел «Программные компоненты клиент-серверной архитектуры «1С:Предприятия», стр. 119. 24 Профессиональная разработка в системе «1С:Предприятие 8» Файловый и клиент-серверный варианты работы Файловый и клиент-серверный варианты работы «1С:Предприятие» может работать в двух вариантах: ■■ файловый, ■■ клиент-серверный. И в том, и в другом варианте все прикладные решения работают полностью идентично, что позволяет выбирать один или другой вариант работы без изменения существующего прикладного решения. Файловый вариант работы рассчитан на персональную работу одного пользователя или работу небольшого количества пользователей в локальной сети. В этом варианте все данные информационной базы (конфигурация, база данных, административная информация) располагаются в одном файле – файловой базе данных. Работу с этой базой данных осуществляет файловая СУБД, разработанная фирмой «1С» и являющаяся частью платформы (рис. 1.28). Рис. 1.29. Клиент-серверный вариант работы Подробнее Глава 5 «Клиент-серверный вариант работы», стр. 119. Кластер серверов «1С:Предприятия» Кластер серверов «1С:Предприятия» – основной компонент платформы, обеспечивающий взаимодействие между пользователями и системой управления базами данных в клиент-серверном варианте работы. Наличие кластера позволяет обеспечить бесперебойную, отказоустойчивую, конкурентную работу большого количества пользователей с крупными информационными базами. Рис. 1.28. Файловый вариант работы Такой вариант работы обеспечивает легкость установки и эксплуатации прикладного решения. При этом для работы с информационной базой не требуются дополнительные программные средства, достаточно иметь операционную систему и «1С:Предприятие». Клиент-серверный вариант предназначен для использования в рабочих группах или в масштабе предприятия. Он реализован на основе трехуровневой архитектуры «клиент-сервер» (рис. 1.29). Клиентское приложение, работающее у пользователя (толстый клиент, тонкий клиент или веб-клиент), взаимодействует с кластером серверов «1С:Предприятия», а кластер при необходимости обращается к серверу баз данных (Microsoft SQL Server, PostgreSQL, IBM DB2 или Oracle Database). При этом физически кластер серверов «1С:Предприятия» и сервер баз данных могут располагаться как на одном компьютере, так и на разных. Это позволяет администратору при необходимости распределять нагрузку между серверами. Использование кластера серверов позволяет сосредоточить на нем выполнение наиболее объемных операций по обработке данных. Например, при выполнении даже весьма сложных запросов программа, работающая у пользователя, будет получать только необходимую ей выборку, а вся промежуточная обработка будет выполняться на сервере. Кластер серверов «1С:Предприятия» отличают следующие свойства: ■■ Масштабируемость – позволяет перераспределить нагрузку между менеджерами кластера и тем самым разгрузить главный менеджер кластера; ■■ Отказоустойчивость – позволяет обеспечить бесперебойную работу пользователей при программных и аппаратных сбоях в кластере серверов; ■■ Динамическое распределение нагрузки – автоматически переключает пользователя на более производительный рабочий процесс, что обеспечит его более эффективную работу, причем такое переключение будет совершенно незаметно для пользователя. Подробнее Раздел «Кластер серверов», стр. 122. Том 1 25 Глава 1. Архитектура «1С:Предприятия» Выполнение основной функциональности на сервере Вся работа с прикладными объектами, чтение и запись базы данных выполняются только на сервере. Функциональность форм и командного интерфейса также реализована на сервере. Это позволяет увеличить производительность и надежность работы прикладного решения. На сервере выполняется подготовка данных форм, расположение элементов, запись данных форм после изменения. На клиенте отображается уже подготовленная на сервере форма, выполняется ввод данных и вызовы сервера для записи введенных данных и других необходимых действий. Командный интерфейс и отчеты также полностью формируются на сервере и отображаются на клиенте (рис. 1.30). Использование встроенного языка на клиенте Управлять функциональностью форм можно не только на сервере, но и на клиенте. На клиенте также поддерживается работа встроенного языка, но в строго ограниченном объеме. Он используется в тех случаях, когда необходимо провести расчеты, связанные с отображенной на экране формой, например, быстро (без обращения к серверу) подсчитать сумму строки документа на основе цены и количества, задать пользователю вопрос и обработать ответ, прочитать файл из файловой системы компьютера и отправить его на сервер. Клиентские процедуры в модулях в явном виде отделяются от серверных, и в них используется ограниченный состав объектной модели встроенного языка. На клиенте не допускается непосредственная работа с базой данных, а также работа непосредственно с прикладными объектами, например, недоступны такие типы встроенного языка, как СправочникОбъект.<имя>. На клиенте невозможно использовать запросы. При необходимости вызова действий с данными в клиентском коде нужно вызывать серверные процедуры, которые, в свою очередь, будут обращаться к данным. Поддержка различных хранилищ данных В различных вариантах работы (файловый или клиент-серверный) «1С:Предприятие» использует различные хранилища данных. В файловом варианте работы все данные информационной базы хранятся в одном файле – 1Cv8.1CD. Этот файл имеет специальный формат, поддерживаемый системой «1С:Предприятие». Рис. 1.30. Выполнение основной функциональности на сервере При этом механизмы платформы ориентированы на минимизацию объема данных, передаваемых на клиентский компьютер. Например, данные списков, табличных частей и отчетов передаются с сервера не сразу, а по мере просмотра их пользователем или использования во встроенном языке. На сервере выполняются: запросы к базе данных, запись данных, проведение документов, различные расчеты, выполнение обработок, формирование отчетов, подготовка форм к отображению. На клиенте выполняется: получение и открытие форм, отображение форм, «общение» с пользователем (предупреждения, вопросы…), небольшие расчеты в формах, требующие быстрой реакции (например, умножение цены на количество), работа с локальными файлами, работа с торговым оборудованием. 26 В клиент-серверном варианте работы все данные хранятся в базах данных Microsoft SQL Server, PostgreSQL, IBM DB2 или Oracle Database. Бесспорным преимуществом файловой базы данных является простота ее использования и обслуживания, однако она не рассчитана на интенсивную конкурентную работу большого числа пользователей и хранение значительных объемов данных. В то же время использование сторонних СУБД, поддерживаемых «1С:Предприятием», позволяет обеспечить большую пропускную способность системы, хранение значительных объемов данных и надежность использования. Оборотной стороной этих преимуществ является более сложное, по сравнению с файловой базой данных, обслуживание и необходимость использования дополнительного программного обеспечения (в качестве сервера баз данных используются сторонние СУБД, поддерживаемые «1С:Предприятием»). Профессиональная разработка в системе «1С:Предприятие 8» Интернационализация Работа под управлением различных операционных систем Архитектура «1С:Предприятия» поддерживает многоплатформенность, то есть способность системы работать под управлением различных операционных систем. Все основные компоненты платформы способны функционировать как под управлением операционной системы Windows, так и под управлением операционной системы Linux. Благодаря тому, что взаимодействие процессов между собой осуществляется по протоколу TCP/IP, в составе системы могут присутствовать компоненты с различными операционными системами. В общем случае архитектура «1С:Предприятия» позволяет смешивать в одной системе элементы, работающие под управлением различных операционных систем, например, в одной системе может работать тонкий клиент под управлением операционной системы Windows, веб-клиент под управлением Linux в интернет-браузере Mozilla Firefox и веб-клиент под управлением Windows в браузере Internet Explorer (рис. 1.31). Обновление прикладных решений Одним из важных архитектурных решений «1С:Предприятия» является наличие механизмов обновления прикладных решений. Эти механизмы обеспечивают синхронизацию изменений, сделанных поставщиком прикладного решения, с изменениями, внесенными при внедрении на конкретном предприятии. Они предоставляют мощные функции сравнения и анализа изменений, а также средства управления их синхронизацией. Администратор или разработчик может детально настроить синхронизацию обновлений вплоть до отдельных объектов, отдельных свойств и отдельных процедур модулей. Например, если специалист, отвечающий за сопровождение прикладного решения на предприятии, отметит объекты, которые намерен поддерживать самостоятельно, они не будут в дальнейшем обновляться при установке очередного обновления от поставщика. Если объекты необходимо объединить, то для упрощения синхронизации изменений можно настроить приоритеты такого объединения. В то же время если прикладное решение не изменялось у клиента, то обновление может быть выполнено полностью в автоматическом режиме. Подробнее Том 2, глава 21, раздел «Механизм поставки и поддержки прикладных решений». Интернационализация Механизмы интернационализации, заложенные в технологическую платформу «1С:Предприятие», позволяют использовать различные языки, как при разработке прикладного решения, так и при работе пользователей прикладного решения. Кроме этого, на уровне технологической платформы поддерживаются национальные стандарты представления дат, чисел и т. д. Благодаря этому в «1С:Предприятии» возможно создание многоязычных прикладных решений, в которых различные пользователи работают с одной и той же информационной базой, используя интерфейсы на различных языках. Подробнее Том 2, глава 22, раздел «Многоязычные прикладные решения». Рис. 1.31. Элементы системы «1С:Предприятие», работающие под управлением различных операционных систем Том 1 27 Глава 1. Архитектура «1С:Предприятия» 28 Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности прикладных решений Глава 2. Функциональность «1С:Предприятия» Обзор функциональности прикладных решений Документы Значительная часть функциональности прикладных решений, создаваемых на платформе «1С:Предприятие», определяется теми возможностями, которые содержит базовая реализация используемых объектов конфигурации. Не претендуя на полное и глубокое изложение, рассмотрим лишь основные функциональные возможности некоторых объектов конфигурации. Документы отражают в системе события, происходящие в жизни предприятия: поступление материалов, перечисление денег через банк, прием сотрудника на работу и т. д. Прототип (шаблон) документа обеспечивает их отражение в различных учетных механизмах, поддерживает контроль последовательности обработки событий, реализует сквозную нумерацию объектов разного типа и т. д. Кроме этого, рассмотрим также и некоторые общие объекты технологической платформы, не реализующие конкретной прикладной специфики, но обеспечивающие важные функциональные возможности для прикладных решений. Одним из важных функциональных механизмов системы является механизм проведения документов. Он предлагает разработчику стандартную модель организации связи между информацией о событиях, происходящих на предприятии, и различными учетными механизмами. Любая вводимая пользователем в виде документов информация может отражаться в любых учетных механизмах (планировании, управленческом учете, бухгалтерском учете и т. д.). Разработчик должен только указать в свойствах метаданных связь между документами и учетными механизмами, а также описать алгоритм проведения документа. Справочники Справочники описывают каталоги, содержимое которых более или менее постоянно. Это может быть, например, перечень выпускаемой продукции, список клиентов компании, перечень валют и т. д. Справочники обеспечивают поддержку иерархических структур, позволяют относить данные к отдельным объектам и их группам, предоставляют ряд других сервисных возможностей. Многоуровневая иерархия, поддерживаемая справочниками, включается простой активизацией соответствующего свойства в метаданных. При этом поддержка иерархии распространяется сразу на все аспекты использования прикладного объекта. Например, прототип (шаблон) справочника обеспечивает поддержку необходимых свойств и методов в объектной модели манипулирования данными (определение уровня объекта, контроль зацикливания иерархии и т. д.). В интерфейсных механизмах реализуется представление данных в виде иерархического списка или дерева с навигацией по уровням и интерактивным изменениям иерархии. В механизмах отчетов обеспечивается формирование иерархических документов такого рода и получение многоуровневой иерархии итогов в любых отчетах, в которых объекты этого типа выступают в качестве параметров для группировки. Подробнее Глава 9 «Хранение информации», стр. 435. Том 1 Все необходимые действия по проведению и отмене проведения система будет выполнять автоматически. При этом системой предоставляются дополнительные возможности, такие как поддержка отражения событий в реальном времени, поддержка восстановления последовательности отражения событий, происходящих на предприятии, при изменении их задним числом и т. д. В результате предоставляется единая модель связи исходных данных и учетных механизмов, которая не просто облегчает разработку, но и обеспечивает единообразное предсказуемое поведение всех прикладных решений, что существенно облегчает их освоение и поддержку. Подробнее Глава 10 «Документы и последовательности», стр. 495. Механизм характеристик Механизм описания характеристик позволяет организовать хранение свойств объектов (справочников, документов и т. д.), которые еще не известны на момент разработки прикладного решения. Таким образом, например, для номенклатуры пользователь сможет самостоятельно вводить новые свойства: цвет, размер, габариты, мощность и т. д. 29 Глава 2. Функциональность «1С:Предприятия» Для каждой группы номенклатуры может быть создан свой набор свойств: для холодильников – объем морозильной камеры, число компрессоров, уровень шума; для компьютеров – объем оперативной памяти, объем жесткого диска; для одежды – размер, рост, цвет. Платформа «1С:Предприятие» позволяет описать дополнительные характеристики объектов конфигурации прямо в дереве метаданных один раз и хранить их в свойстве Характеристики. В дальнейшем на основе этих характеристик можно строить отчеты, анализировать объемы продаж, получать другую информацию для принятия решений. Подробнее Раздел «Использование плана видов характеристик», стр. 483. Механизм сведений Механизм хранения сведений, реализованный в платформе «1С:Предприятие», позволяет хранить в прикладном решении произвольные данные в разрезе нескольких измерений. Например, можно хранить курсы валют в разрезе валют или цены предприятия в разрезе номенклатуры и типа цен. Кроме этого, может быть задана различная периодичность хранения сведений, что позволяет хранить не только сами значения, но и историю их изменения. Подробнее Раздел «Хранение информации в регистрах сведений», стр. 455. Механизм учета движения средств Механизм учета движения средств (финансов, товаров, материалов и т. д.) позволяет автоматизировать такие направления, как складской учет, взаиморасчеты, планирование. Основу этого механизма составляют регистры накопления. Регистр накопления образует многомерную систему измерений и позволяет «накапливать» числовые данные в разрезе нескольких измерений. Например, в таком регистре можно накапливать информацию об остатках товаров в разрезе номенклатуры и склада или информацию об объемах продаж в разрезе номенклатуры и подразделения компании. Информация из регистров используется в основном в различных экономических и аналитических отчетах. Для более быстрого и эффективного формирования отчетов в платформе реализован механизм агрегатов для оборотных регистров накопления. Это особенно важно для больших информационных баз, содержащих сотни тысяч и миллионы записей 30 в регистрах. Используя механизм агрегатов, система автоматически оценивает интенсивность работы пользователей с теми или иными разрезами информации и на основе накопленной статистики выбирает оптимальный состав поддерживаемых агрегатов. Подробнее Глава 11 «Учет движения средств», стр. 545. Механизм бухгалтерского учета Механизмы бухгалтерского учета позволяют реализовать систему двойной записи бухгалтерского учета. Они не навязывают разработчику собственно принципов ведения бухгалтерского учета и позволяют создавать модели учета, применимые как в России, так и в других странах. Можно перечислить следующие основные возможности, реализуемые механизмами бухгалтерского учета: ■■ ведение многоуровневых планов счетов с произвольной иерархией, в которых поддерживается фиксированная или переменная разрядность кодов счетов; ■■ ведение аналитического учета в нескольких разрезах и уровнях; ■■ ведение учета одновременно по нескольким планам счетов; ■■ ведение консолидированного учета по нескольким юридическим лицам; ■■ возможность указания для отдельных разрезов аналитики произвольного числа видов учета, таких как количественный, суммовой, валютный учет и т. д. Подробнее Глава 12 «Бухгалтерский учет», стр. 613. Механизм сложных периодических расчетов Механизм сложных периодических расчетов позволяет реализовывать различные модели расчета заработной платы. Работа механизма основана на двух составляющих. С одной стороны, механизм сложных периодических расчетов содержит средства для описания различных видов расчета, которые будут использоваться в прикладном решении. Например, это могут быть такие виды расчета, как оклад, алименты, штраф и т. д. Помимо собственно описания этих видов расчета, существует возможность задать правила, по которым одни виды расчета будут влиять на другие виды расчета. Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности прикладных решений С другой стороны, этот механизм предоставляет возможность хранения промежуточных данных, которые используются для выполнения расчетов, и конечных результатов расчетов. Расчет зарплаты является наиболее типичным применением данного механизма, но сам механизм не имеет ориентации именно на эту задачу и успешно используется для решения других задач, требующих описания периодических расчетов со сложными взаимосвязями, например, расчета дивидендов, стоимости коммунальных услуг и т. д. Подробнее Том 2, глава 13 «Сложные периодические расчеты». Механизм бизнес-процессов Механизм бизнес-процессов позволяет описывать, создавать и управлять выполнением бизнес-процессов в прикладных решениях. Целью этого механизма является автоматизация цепочек связанных операций, направленных на достижение общей цели, обычно в контексте организационной структуры, определяющей функциональные роли и связи. Этот механизм включает средства для описания в прикладном решении схем бизнес-процессов и их ролевой маршрутизации для формирования заданий, выполняющихся в каждой точке маршрута, для управления бизнес-процессом и организации его связи с другими функциями прикладного решения. Важно отметить, что данный механизм предлагает готовую стратегию автоматизации совместной деятельности работников предприятия. Для описания простейших бизнес-процессов достаточно визуально задать схемы маршрута и указать условия ветвления в их узловых точках. Все остальные действия выполняются системой автоматически. При реализации сложных бизнес-процессов усилия разработчика требуются в основном для тесной их увязки с функциями прикладного решения. Подробнее Том 2, глава 14 «Бизнес-процессы». Механизм анализа данных и прогнозирования Этот механизм поддерживает выполнение нескольких типов анализа данных, таких как общая статистика, поиск ассоциаций, дерево решений, поиск последовательностей, кластерный анализ. Подробнее Том 2, глава 15 «Анализ данных и прогнозирование». Сложные отчеты, использующие систему компоновки данных Для формирования сложных экономических и аналитических отчетов платформа «1С:Предприятие» содержит мощный и гибкий механизм – систему компоновки данных. Отчеты строятся на основе схемы компоновки данных – специального макета отчета, содержащего его декларативное описание. Схема компоновки данных создается разработчиком и содержит описание наборов данных (источников информации для отчета) и связей между ними, параметров получения данных, полей отчета и т. п., а также в ней разработчик задает стандартные настройки компоновки данных – структуру отчета, порядок, отбор и др. У каждого отчета разработчик может предусмотреть несколько вариантов настроек, представляющих данные в виде диаграммы, таблицы или группировок, имеющих другой состав полей, итогов и т. п. Разработчик может описать, какие настройки отчета будут доступны пользователю (пользовательские настройки) и какие из этих настроек будут присутствовать прямо в форме отчета (быстрые пользовательские настройки). С их помощью пользователь может настроить вариант отчета под себя и сохранить его для дальнейшего использования. Система компоновки данных предоставляет широкие возможности для настройки оформления отчета и его отдельных элементов – выбор макета оформления (в том числе и собственного), настройка вывода группировок, итогов, заголовка отчета и многое другое. Таким образом, большинство отчетов может быть описано и настроено разработчиком в схеме компоновки данных и не требует написания программного кода. Механизм анализа данных и прогнозирования позволяет реализовывать в прикладных решениях инструменты для выявления закономерностей, которые обычно скрываются за большими объемами информации. На основе описания в схеме компоновки данных и стандартных настроек система компоновки данных компонует отчет и выводит его пользователю в виде табличного документа (программным образом данные также можно вывести в таблицу значений, дерево значений и др.). Например, проанализировав данные о продажах товаров, можно выявить группы товаров, которые обычно покупаются вместе, и при очередной покупке рекомендовать клиенту дополнительные товары, исходя из найденных закономерностей и тех товаров, которые клиент уже выбрал. Пользователь может выбрать вариант отчета, являющийся с его точки зрения наиболее информативным, а может, при желании и соответствующей квалификации, задать собственные настройки и получить другой отчет, основанный на той же схеме компоновки данных. Том 1 31 Глава 2. Функциональность «1С:Предприятия» Таким образом, система компоновки данных предоставляет пользователям возможность получать разнообразные необходимые им отчеты быстро, не обращаясь к разработчикам. Система компоновки данных позволяет использовать в отчетах произвольные характеристики объектов информационной базы, предоставляет возможность расшифровывать информацию, содержащуюся в отчете, выводить в отчет иерархические данные и многое другое. Подробнее Том 2, глава 16 «Сложные аналитические отчеты». Механизмы презентации текстовых и аналитических данных Технологическая платформа «1С:Предприятие» содержит целый ряд объектов, которые позволяют представлять итоговую информацию в удобном для пользователя виде, обеспечивая при этом в большей или меньшей степени интерактивное взаимодействие. Одним из мощных средств презентации любой информации и вывода ее на печать является табличный документ (рис. 2.1). Он обеспечивает не только эффективную подготовку печатных документов, но и просмотр их на экране в удобном для пользователя виде. Перечислим основные возможности табличного документа: Рис. 2.1. Табличный документ Используя форматированный документ, можно создавать фрагменты текста, содержащие различное шрифтовое, цветовое оформление, выравнивание, включающие картинки и гиперссылки. В основном он используется для редактирования в формах в тех случаях, когда текст должен содержать различное шрифтовое, цветовое оформление, гиперссылки и картинки. Например, в формах электронных писем (рис. 2.2). ■■ оформление отчета, включая тип и размер шрифта, цвет текста и фона, тип и цвет рамки, рисунки и т. д.; ■■ использование группировок (как вертикальных, так и горизонтальных), с помощью которых можно отражать промежуточные итоги; ■■ поддержка механизма расшифровок, когда при щелчке на строке или ячейке отчета формируется более детальный отчет или открывается объект базы данных; ■■ использование примечаний, содержащих дополнительную информацию о данных, расположенных в ячейке или области документа; ■■ поддержка сводных таблиц, которые позволяют отобразить многомерные данные в виде плоской таблицы с вложенными заголовками; ■■ поддержка диаграмм различного вида для наглядного представления экономической информации в графическом виде; ■■ возможность сохранения табличного документа в различных форматах; ■■ и др. Рис. 2.2. Форматированный документ 32 Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности прикладных решений Для представления итоговых данных в разрезе их географического положения в «1С:Предприятии» используется специальный объект – географическая схема (рис. 2.3). Она позволяет создавать отчеты, иллюстрирующие, например, объемы продаж тех или иных товаров в различных регионах страны. Также географическая схема может быть использована просто для отображения тех или иных географических данных, например, схемы проезда к офису или маршрута движения транспортного средства. Рис. 2.3. Географическая схема ■■ круговая (обычная и объемная); ■■ биржевая (обычная и «свеча»); ■■ изометрическая (обычная, непрерывная и т. д.); ■■ поверхностная (каркасная, выпуклая, вогнутая поверхность, сотовая и др.); ■■ радарная (с областями, с накоплением, нормированная и др.); ■■ измерительная диаграмма. Рис. 2.4. Графическая схема Графическая схема (рис. 2.4) позволяет создавать различные организационные, структурные и другие схемы для графического оформления прикладного решения. Она предназначена для оформления форм и отчетов, в которых требуется представить те или иные организационные процессы, блок-схемы и пр. Кроме этого, графическая схема может быть использована как отдельный документ, являющийся частью оформления прикладного решения. С помощью графических схем удобно создавать иллюстрации, поясняющие состав тех или иных алгоритмов, структуру тех или иных процессов, организационные схемы и пр. Еще одним объектом, используемым для графического представления данных, является диаграмма (рис. 2.5). Платформа «1С:Предприятие» поддерживает работу с различными видами диаграмм, в том числе: ■■ график (обычный, по шагам, с областями и т. д.); ■■ гистограмма (обычная, с накоплением, объемная и т. д.); Том 1 Рис. 2.5. Круговая объемная диаграмма 33 Глава 2. Функциональность «1С:Предприятия» Диаграммы акцентируют внимание пользователя на динамике изменения данных и помогают быстро производить относительное сравнение данных. Кроме этого, специализированные виды диаграмм могут отражать закономерности, обычно скрытые за большими объемами данных. Одним из специальных видов диаграмм, поддерживаемых платформой, является диаграмма Ганта (рис. 2.6). Она содержит набор интервалов, расположенных на оси времени, и отражает использование объектами (точками) ресурсов (серий). Этот вид диаграммы широко используется для визуализации хода выполнения задач, планирования ресурсов, графика рабочего времени и других данных, которые представляются не конкретными числовыми значениями, а набором временных интервалов. В системе «1С:Предприятие» имеется целый набор средств, с помощью которых можно: ■■ создавать, обрабатывать и обмениваться данными различных форматов; ■■ осуществлять доступ ко всем объектам системы «1С:Предприятие», реализующим ее функциональные возможности; ■■ поддерживать различные протоколы обмена; ■■ поддерживать стандарты взаимодействия с другими подсистемами; ■■ разрабатывать собственные интернет-решения. Механизмы обмена данными позволяют создавать территориально распределенные информационные системы на основе: ■■ «1С:Предприятия»; ■■ других информационных систем, не основанных на «1С:Предприятии». Обмен данными в системе «1С:Предприятие» реализуется благодаря использованию ряда средств технологической платформы, которые разработчик может применять как по отдельности, так и в различных комбинациях, в зависимости от конкретной решаемой задачи. Такой подход позволяет обеспечить гибкость механизмов обмена и их «настраиваемость» на решение как можно большего круга задач. Рис. 2.6. Диаграмма Ганта Диаграмма Ганта имеет гибкую структуру данных. Как точки, так и серии представляют собой иерархические коллекции, что позволяет, например, представить проект как набор связанных иерархических задач. Поддерживается возможность установки связей между различными интервалами диаграммы. Таким образом, окончание одного интервала может быть связано с началом следующего интервала диаграммы. Также поддерживается возможность интерактивного перемещения и растягивания интервалов диаграммы в режиме 1С:Предприятие при помощи мыши. Подробнее Том 2, глава 17 «Средства графического представления данных». Средства интеграции и механизмы обмена данными Система «1С:Предприятие» является открытой системой благодаря тому, что технологическая платформа предоставляет возможности для интеграции практически с любыми внешними программами и оборудованием на основе общепризнанных открытых стандартов и протоколов передачи данных. 34 Подробнее Том 2, глава 18 «Интеграция с другими информационными системами», глава 19 «Обмен данными». Web-сервисы Механизм Web-сервисов позволяет использовать систему «1С:Предприятие» как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими информационными системами с использованием сервис-ориентированной архитектуры (SOA). Конфигурация системы «1С:Предприятие» может экспортировать свою функциональность через Web-сервисы. Web-сервисы определяются в дереве объектов конфигурации и становятся доступны произвольным информационным системам после их публикации на веб-сервере. Кроме того, система «1С:Предприятие» может обращаться к Webсервисам сторонних производителей как через статические ссылки на Web-сервисы, определенные в дереве объектов конфигурации, так и используя динамические ссылки на Web-сервисы, создаваемые с помощью встроенного языка. Подробнее Том 2, глава 18, раздел «Web-сервисы». Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности прикладных решений Web-расширение Одним из средств интеграции, позволяющим расширить сферу применения «1С:Предприятия», является Web-расширение. Данный программный продукт позволяет организовать доступ через веб-интерфейс к функциональности прикладных решений новых категорий пользователей, в том числе и тех, у которых на компьютерах не установлена платформа «1С:Предприятие». Это могут быть мобильные пользователи, сотрудники территориально удаленных подразделений, посетители интернет-магазинов и веб-порталов. Web-расширение позволяет встраивать доступ к данным «1С:Предприятия» в существующие веб-сайты и веб-приложения и создавать готовые веб-приложения и веб-сервисы, использующие информационную базу «1С:Предприятия». Механизмы Web-расширения могут использоваться для решения задач нескольких уровней, в различных комбинациях с другими системами: ■■ реализация веб-доступа к информационной базе «1С:Предприятия»; ■■ встраивание прикладной функциональности «1С:Предприятия» в существующие сайты; ■■ организация доступа к данным «1С:Предприятия» для решения других задач; ■■ организация программного доступа к «1С:Предприятию» из других систем. Подробнее Том 2, глава 20 «Web-расширение». Механизм полнотекстового поиска Механизм полнотекстового поиска предоставляет возможность пользователю быстро находить нужную информацию в информационной базе и в справочной системе. Например, позволяет найти все вхождения заданного слова или сочетания слов в данных информационной базы, при этом найденные слова выделяются цветом (рис. 2.7). Механизм полнотекстового поиска основан на использовании двух составляющих: ■■ полнотекстового индекса, ■■ средств выполнения полнотекстового поиска. Поиск осуществляется по тем данным, которые содержатся в полнотекстовом индексе. Полнотекстовый индекс создается один раз и затем должен периодически обновляться (в зависимости от частоты модификации информационной базы). Создание и обновление полнотекстового индекса может выполняться как интерактивно, в режиме 1С:Предприятие, так и программно, средствами встроенного языка. Том 1 Рис. 2.7. Поиск данных в информационной базе В процессе работы информационной базы система отслеживает факт изменения данных в тех объектах конфигурации, которые могут участвовать в полнотекстовом поиске. Такими объектами являются, например, планы обмена, справочники, документы, планы видов характеристик, планы счетов, планы видов расчета, регистры (сведений, накопления, бухгалтерии, расчета), бизнес-процессы и задачи. Впоследствии при создании или обновлении полнотекстового индекса система анализирует данные, содержащиеся в реквизитах этих объектов, и включает эти данные в полнотекстовый индекс. При этом система «1С:Предприятие» позволяет осуществлять выборочное включение данных прикладных объектов и их реквизитов в полнотекстовый поиск. Также существует возможность ограничить область поиска данными только указанных объектов конфигурации. Собственно полнотекстовый поиск выполняется средствами встроенного языка, например, с помощью обработки. Полнотекстовый поиск выполняется в соответствии с правами пользователя. Таким образом, если какая-то информация недоступна данному пользователю, он не сможет получить ее и при помощи полнотекстового поиска. Результаты полнотекстового поиска возвращаются порциями, и, кроме того, они отсортированы в определенном порядке. Это сделано для того, чтобы с большой долей вероятности пользователь получал требуемые ему данные в начале первой порции результатов поиска. 35 Глава 2. Функциональность «1С:Предприятия» Механизм полнотекстового поиска предоставляет возможность нечеткого поиска с указанием порога нечеткости, выполнения поиска с учетом синонимов русского, английского и украинского языков, возможность использования дополнительных словарей полнотекстового поиска и многое другое. Механизм криптографии Механизм криптографии позволяет прикладным решениям использовать криптографические операции для обработки данных, хранящихся в информационной базе. Криптографические операции включают методы зашифровывания/расшифровывания информации, системы электронной цифровой подписи и др. Таким образом, с помощью механизма криптографии система «1С:Предприятие» обеспечивает высокую конфиденциальность и аутентичность информации, хранящейся в информационной базе. Механизм криптографии не содержит собственных алгоритмов криптографии, но при этом обеспечивает набор объектов, позволяющих взаимодействовать с внешними модулями криптографии сторонних производителей – криптопровайдерами. Для взаимодействия с криптопровайдерами в операционной системе Windows используется интерфейс CryptoAPI. Таким образом, прикладные решения могут взаимодействовать с любыми криптопровайдерами, поддерживающими этот криптографический интерфейс. Для взаимодействия с модулями криптографии в операционной системе Linux используется непосредственное взаимодействие с установленными компонентами. Механизм разделения данных Этот механизм позволяет, например, хранить в одной информационной базе данные нескольких независимых друг от друга организаций. При этом для работы с этими данными используется одна и та же конфигурация, находящаяся в этой же информационной базе. Механизм позволяет разделять данные как полностью, так и частично. Например, какая-то информация может быть общей для всех организаций (справочник банков), а какая-то – индивидуальной, видимой и доступной только данной конкретной организации. Например, информация о хозяйственной или финансовой деятельности. Такой подход значительно облегчает администрирование и обновление прикладных решений в тех случаях, когда одно и то же прикладное решение используется для ведения учета разных организаций. Например, когда фирма оказывает услуги по ведению бухгалтерского учета для многих небольших организаций, не имеющих собственной бухгалтерии. 36 Внешние источники данных Платформа «1С:Предприятие» позволяет работать с внешними источниками данных. Это может быть необходимо для использования средств платформы для работы с базами данных, уже существующими на предприятии или для разработки прикладных решений, которым нужно получать данные из внешних баз данных. Механизм работы с внешними источниками данных позволяет получать данные из различных ODBC-источников. При этом в случае получения данных из СУБД, поддерживаемых «1С:Предприятием» (SQL Server, PostgreSQL, IBM DB2 или Oracle Database), обеспечиваются полные возможности платформы в построении запросов, отчетов и т. д. В случае использования ODBC-источников для других СУБД эти возможности могут быть ограничены стандартами самой СУБД. Внешние источники данных описываются в конфигураторе в отдельной ветви объектов конфигурации. Каждый объект, описывающий внешний источник данных, включает таблицы, поля и связи между таблицами. Внешние источники данных поддерживаются в большинстве механизмов платформы: запросы, отчеты, основанные на системе компоновке данных, динамические списки, управляемые формы, встроенный язык и др. Данные внешних источников могут использоваться только на чтение и не могут быть изменены из встроенного языка. Реквизиты объектов конфигурации (например, реквизит справочника) могут иметь ссылочный тип и ссылаться на объектную таблицу внешнего источника данных. При подключении к внешнему источнику данных используются параметры соединения, которые задаются в параметрах сеанса, параметрах пользователя или в общих параметрах. Для управления процессом подключения/отключения и настройкой параметров соединения используется стандартная обработка Управление внешними источниками данных. Кроме того, подключение к внешнему источнику данных выполняется автоматически при обращении к данным внешнего источника, например, при выполнении запроса. Обзор функциональности средств разработки Состав средств разработки достаточно широк и разнообразен. Это позволяет выполнять полный цикл действий, от создания конфигурации и до получения тиражируемого дистрибутива прикладного решения, не прибегая к помощи каких-либо продуктов сторонних производителей (рис. 2.8). Перечислим основные средства, используемые при разработке прикладных решений «1С:Предприятия». Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности средств разработки Дерево объектов конфигурации является одним из основных инструментов для работы с конфигурацией. Оно представляет состав конфигурации в виде древовидной структуры, каждая ветвь которой описывает определенную составляющую конфигурации и позволяет выполнять различные действия над отдельными объектами конфигурации. Окно редактирования объекта конфигурации позволяет выполнять в числе прочего последовательную установку свойств объекта, что удобно (особенно для начинающих разработчиков), т. к. позволяет задать в первую очередь те свойства объекта, которые могут определять наличие или отсутствие других свойств объекта. Палитра свойств также предоставляет возможность изменять свойства объекта и получать быстрый доступ к информации, связанной с данным объектом. Палитра свойств удобна в использовании для опытных разработчиков, а также тогда, когда необходимо просмотреть или изменить одноименные свойства у различных объектов конфигурации. Окно Дополнительно служит для отображения в едином списке свойств объекта, относящихся к различным объектам конфигурации. В этом окне можно настраивать вхождение команд объекта в командный интерфейс, просматривать и изменять включение объекта конфигурации в подсистемы, редактировать связи с функциональными опциями, настраивать права и выполнять другие действия. Конструкторы и редакторы В состав средств разработки входит довольно большое количество конструкторов и редакторов. Конструкторы позволяют автоматизировать и облегчить создание некоторых часто используемых элементов прикладного решения, модификация которых может быть формализована. Как правило, эти элементы прикладного решения могут быть созданы и без использования конструктора, но конструктор позволяет сделать это быстрее и легче. Рис. 2.8. Состав средств разработки Объекты конфигурации и инструменты для их редактирования Прежде всего, это, конечно же, сами объекты конфигурации и инструменты для их редактирования – дерево объектов конфигурации, окно редактирования объекта конфигурации, палитра свойств и окно Дополнительно. С помощью этих инструментов выполняется добавление, удаление объектов конфигурации, изменение их свойств, установка связей с другими объектами конфигурации и пр. Том 1 Например, текст запроса может быть полностью написан самим разработчиком. Для этого разработчик должен хорошо знать синтаксис языка запросов и понимать назначение различных предложений языка запросов. В то же время текст запроса можно создать с помощью конструктора запросов. При этом используется визуальное конструирование запроса, когда с помощью мыши необходимо выбрать и перетащить нужные таблицы, поля, установить связи между ними и т. д. После нажатия кнопки ОК конструктор запроса создаст синтаксически верный текст запроса. Кроме того, можно использовать конструктор запроса с обработкой результата, который позволяет создать готовый фрагмент кода для получения данных с помощью запроса и вывода их, например, в табличный документ. 37 Глава 2. Функциональность «1С:Предприятия» Можно перечислить, например, следующие конструкторы, присутствующие в интерфейсе разработки и администрирования: ■■ конструктор запроса, ■■ конструктор запроса с обработкой результата, ■■ конструктор движений регистров, ■■ конструктор печати, ■■ конструктор ввода на основании, ■■ конструктор форм объектов конфигурации, ■■ конструктор макета, ■■ конструктор форматной строки, ■■ конструктор строк на разных языках, ■■ конструктор агрегатов, ■■ конструктор схемы компоновки данных, ■■ конструктор настроек компоновки данных, ■■ конструктор макета оформления компоновки данных, ■■ конструктор ограничения доступа к данным. Редакторы позволяют создавать и изменять элементы прикладного решения, модификацию которых затруднительно формализовать или для которых подобная формализация не имеет практического смысла. Например, конструктор форм объектов конфигурации позволяет создать некоторую типовую форму объекта, разместить на ней необходимые поля, назначить источники данных и т. д. Этот процесс легко формализуется и потому может быть выполнен конструктором. Однако дальнейшее редактирование формы, как правило, является процессом творческим и формализации не поддается. Поэтому платформа предоставляет в распоряжение разработчика редактор форм, с помощью которого он придает форме нужный вид, располагает дополнительные элементы управления, настраивает при необходимости привязки и т. д. в соответствии с конкретным назначением формы. Можно перечислить, например, следующие редакторы, реализованные в интерфейсе разработки и администрирования: ■■ редактор форм, ■■ редактор текстов и модулей, ■■ редактор командного интерфейса конфигурации, ■■ редактор рабочей области рабочего стола, ■■ редактор командного интерфейса рабочего стола, ■■ редактор командного интерфейса, ■■ редактор «Все подсистемы», 38 ■■ редактор роли, ■■ редактор «Все роли», ■■ редактор «Все ограничения доступа», ■■ редактор табличных документов, ■■ редактор графической схемы, ■■ редактор картинок, ■■ HTML-редактор. Синтакс-помощник Синтакс-помощник позволяет получать справку по использованию конструкций встроенного языка, свойствам, методам и событиям объектов встроенного языка (как поставляемых непосредственно платформой, так и создаваемых наследованием от прототипов объектов конфигурации), а также справку по составу таблиц, являющихся источниками данных в языке запросов. Синтакс-помощник может быть использован как самостоятельно, так и в связке с редактором текстов и модулей. Находясь в тексте модуля, можно, используя сочетание клавиш, перейти к описанию соответствующего свойства, метода, функции и т. д. в синтакс-помощнике, а конструкции встроенного языка, описанные в синтакс-помощнике, в свою очередь, могут быть перенесены в текст модуля с помощью мыши. Отладчик и режим замера производительности Среди средств разработки, используемых наиболее часто и интенсивно, можно отметить также отладчик и режим замера производительности. Отладчик позволяет проанализировать работу прикладного решения, выполнить остановку в указанном месте кода на встроенном языке, просмотреть значения переменных, состояние используемых объектов в определенные моменты работы, выполнить фрагмент кода по шагам и т. д. Режим замера производительности используется для того, чтобы проанализировать эффективность выполнения участка кода, узнать время, затраченное на выполнение каждой строки этого участка кода (как абсолютное, так и относительное, в процентах к общему времени выполнения всего участка). Таким образом можно определить операторы, выполнение которых занимает основное количество времени, и попытаться оптимизировать используемый алгоритм. Подробнее Том 2, глава 22, раздел «Отладка прикладных решений». Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности средств разработки Проверка конфигурации Групповая разработка прикладных решений Режим проверки конфигурации позволяет выявить ошибки, которые не являются критичными для функционирования прикладного решения в принципе, но наличие которых может существенно снизить скорость работы прикладного решения или даже привести к возникновению ошибок при работе в некоторых специальных режимах. Использование этого режима не является обязательным, но может оказаться очень полезным, например, для проверки конфигурации перед поставкой заказчику, перед выпуском тиражного решения, для проверки после массированного удаления объектов или после объединения конфигураций. Механизм групповой разработки позволяет вести и версионировать разработку прикладных решений группе разработчиков, внося изменения в конфигурацию одновременно, по мере выполнения каждым из них своего участка работы. Сравнение/объединение конфигураций Механизм поставки и поддержки прикладных решений служит для автоматизации процесса поддержки разработчиками прикладного решения, используемого пользователем. Задача поставки и поддержки заключается в создании новых версий прикладного решения и обновления той версии прикладного решения, которая находится у пользователей. Механизм сравнения/объединения конфигураций позволяет выполнять, например, детальный анализ отличий между разными версиями одного и того же прикладного решения. Также с помощью этого механизма можно выполнять переход от одной версии прикладного решения к другой версии того же или другого прикладного решения. При этом разработчик имеет возможность задать различные правила объединения для различных элементов прикладного решения, указывая, какой элемент должен быть взят из новой версии, какой оставлен без изменений, а какие элементы, например, должны быть объединены и содержать как старый, так и новый варианты. После нажатия кнопки Выполнить платформа автоматически выполнит объединение в соответствии с правилами, заданными разработчиком. Использование механизма сравнения/объединения конфигураций позволяет избежать ручной модификации конфигурации (и связанного с этим большого количества ошибок) при переносе изменений из одной конфигурации в другую, а также значительно ускорить этот процесс. Редактирование текстов интерфейса Платформа «1С:Предприятие» позволяет создавать многоязычные прикладные решения, в которых каждый пользователь может работать с интерфейсом на своем родном языке. Для того чтобы помочь разработчику при создании многоязычных прикладных решений, в состав средств разработки входит механизм редактирования текстов интерфейса. Этот механизм позволяет найти и сгруппировать все вхождения той или иной строки в конфигурации и в одно нажатие заменить их или добавить аналог этой строки на другом языке. Кроме этого, механизм позволяет переносить строки на разных языках из одного прикладного решения в другое. Подробнее Том 2, глава 22, раздел «Редактирование текстов интерфейса». Том 1 Подробнее Том 2, глава 22, раздел «Групповая разработка прикладных решений». Поставка и поддержка прикладных решений Подробнее Том 2, глава 21, раздел «Механизм поставки и поддержки прикладных решений». Создание дистрибутивов Механизм создания дистрибутивов позволяет разработчику создать комплект поставки – набор файлов, предназначенных для установки на компьютере пользователя. Комплект поставки включает в себя программу установки Setup.exe и набор файлов поставки, сжатых в архив. Для установки прикладного решения пользователю достаточно запустить на своем компьютере программу установки, входящую в комплект поставки, и следовать инструкциям, появляющимся на экране. Программа установки имеет стандартный интерфейс и помогает пользователю установить все компоненты прикладного решения. Подробнее Том 2, глава 21, раздел «Механизм создания комплектов поставки». Функциональные опции Функциональные опции позволяют разработчику выделить некоторую часть функциональности прикладного решения, которую можно оперативно включать или выключать на этапе внедрения и/или в процессе работы системы. Объекты конфигурации и их реквизиты можно привязать к функциональным опциям, добавленным в конфигурацию. Отображение этих 39 Глава 2. Функциональность «1С:Предприятия» объектов в интерфейсе приложения зависит от того, включена связанная с ними функциональная опция или нет. Функциональные опции могут использоваться с параметрами. В этом случае вид конкретной формы может зависеть от значения параметра, выбранного в форме. Таким образом, в зависимости от потребностей конкретной организации внедренец или администратор прикладного решения в режиме 1С:Предприятие может включить или выключить определенные функциональные опции, ограничив тем самым функциональность прикладного решения задачами, решаемыми конкретным пользователем. Показатели производительности и режим имитации задержек при вызове сервера В процессе отладки и работы конфигурации разработчик может использовать показатели производительности и режим имитации задержек при вызове сервера в качестве инструментов для оптимизации клиентсерверного взаимодействия в разрабатываемом прикладном решении. Показатели производительности прикладного решения позволяют разработчику оценить, насколько эффективно работает прикладное решение. Они отражают информацию о количестве текущих и накопленных вызовов сервера, длительности вызовов сервера, объеме принятых и отправленных данных. Окно показателей производительности всплывает в левом нижнем углу монитора при выполнении каких-либо действий, приводящих к вызову сервера в процессе работы «1С:Предприятия». Это окно можно мышью перетащить в любое другое место экрана. При запуске сеанса «1С:Предприятия» из конфигуратора отображение показателей производительности включено по умолчанию. В текущем сеансе в режиме 1С:Предприятие также можно включить отображение окна показателей производительности. Установить данный режим можно также при запуске «1С:Предприятия» из командной строки с соответствующим параметром. Режим имитации задержек при вызове сервера позволяет разработчику оценить реальную скорость работы его прикладного решения у клиента. При включении этого режима платформа (даже в файловом варианте на локальном компьютере) будет работать с теми временными задержками, с которыми работает реальный канал связи. Установка режима имитации задержек при вызове сервера позволяет разработчику превратить быстрый канал связи в медленный. Причем сделать это можно как при запуске приложения в настройках конфигуратора, так и в процессе его работы в режиме 1С:Предприятие. При этом режим, 40 в котором было запущено приложение, не изменится. Однако включить режим имитации задержек при вызове сервера можно только для тонкого клиента и толстого клиента, запущенного в режиме управляемого приложения. Установить данный режим можно также при запуске «1С:Предприятия» из командной строки с соответствующим параметром. Подробнее Раздел «Инструменты, используемые при оптимизации клиентсерверного взаимодействия», стр. 392. «1С:Библиотека стандартных подсистем 8.2» «1С:Библиотека стандартных подсистем 8.2» (БСП) – это инструмент, облегчающий разработку прикладных решений. Она содержит набор универсальных функциональных подсистем и технологию для разработки прикладных решений на платформе «1С:Предприятие 8.2». С помощью библиотеки стандартных подсистем можно быстро создавать новые конфигурации с уже готовой базовой функциональностью, а также включать готовые функциональные блоки в существующие конфигурации. Подсистемы, содержащиеся в библиотеке стандартных подсистем, включают различные области разработки: администрирование информационной базы, администрирование пользователей системы, настройка доступа к данным информационной базы, ведение различной нормативносправочной информации (адресный классификатор, курсы валют, календарные графики и пр.). БСП предоставляет базовые пользовательские и программные интерфейсы для работы с задачами и бизнес-процессами, прикрепляемыми файлами и электронными цифровыми подписями, контактной информацией, дополнительными реквизитами и сведениями, почтовыми сообщениями и пр. Они могут быть использованы в разрабатываемой конфигурации как все вместе, так и по отдельности. Обзор функциональности средств администрирования Средства администрирования, входящие в состав интерфейса разработки и администрирования, позволяют управлять составом пользователей информационной базы, осуществлять регламентные операции по ее обслуживанию и выполнять другие административные действия (рис. 2.9). Перечислим основные средства, используемые для администрирования информационных баз «1С:Предприятия». Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности средств администрирования Система поддерживает два вида аутентификации: аутентификация «1С:Предприятия» и аутентификация операционной системы, которые могут использоваться в зависимости от конкретных задач, стоящих перед администратором информационной базы. В случае аутентификации средствами «1С:Предприятия» в конфигураторе для каждого пользователя в списке задается пароль. Для выполнения аутентификации средствами «1С:Предприятия» пользователь при начале работы с прикладным решением должен выбрать (или ввести) имя пользователя и соответствующий этому имени пароль. В случае аутентификации средствами операционной системы в конфигураторе для пользователя выбирается один из пользователей операционной системы. Система анализирует, от имени какого пользователя операционной системы выполняется подключение к прикладному решению, и на основании этого определяет соответствующего пользователя «1С:Предприятия». При этом диалог аутентификации «1С:Предприятия» не отображается, если не указан специальный параметр командной строки. Механизм заданий Рис. 2.9. Состав средств администрирования Список пользователей Платформа «1С:Предприятие» позволяет вести список пользователей, которым разрешена работа с данной информационной базой. Этот список не является частью прикладного решения, а создается отдельно, в каждой конкретной организации, в которой используется прикладное решение. Существует возможность добавлять, удалять пользователей системы, назначать им различные виды аутентификации, набор ролей, доступных в системе, режим запуска приложения, язык пользователя и пр. Механизмы аутентификации Механизм аутентификации позволяет определить, кто именно из пользователей, перечисленных в списке пользователей, подключается к прикладному решению. Эта информация может быть в дальнейшем использована для выбора соответствующего командного интерфейса пользователя, разрешения доступа к той или иной информации и пр. Том 1 Механизм заданий предназначен для выполнения административных действий по расписанию. Механизм заданий включает в себя фоновые и регламентные задания. Каждое задание представляет собой некоторую последовательность действий, описанных с помощью встроенного языка, содержащуюся в общих модулях. Фоновые задания позволяют инициализировать выполнения процедур общих модулей асинхронно (без ожидания завершения). Регламентные задания позволяют организовать автоматический вызов процедур общих модулей по расписанию. Механизм фоновых заданий реализуется средствами встроенного языка. Регламентные задания описываются на этапе конфигурирования и являются составной частью конкретного прикладного решения. Система прав доступа Для каждого конкретного прикладного решения система «1С:Предприятие» позволяет описать наборы прав, соответствующие должностям пользователей или виду деятельности. Структура прав определяется конкретным прикладным решением. Все права, поддерживаемые системой «1С:Предприятие», можно разделить на две большие группы: основные и интерактивные. Основные права описывают действия, выполняемые над элементами данных системы или над всей системой в целом, и проверяются всегда, независимо от способа 41 Глава 2. Функциональность «1С:Предприятия» обращения к данным. Интерактивные права описывают действия, которые могут быть выполнены пользователем интерактивно. Соответственно, проверяются они только при выполнении интерактивных операций стандартными способами, причем в клиент-серверном варианте все проверки прав (кроме интерактивных) выполняются на сервере. какие документы изменялись определенным пользователем в заданный промежуток времени. Также журнал регистрации может быть полностью или частично выгружен в формат XML для программного анализа. Ограничение прав на уровне записей и полей Команды загрузки/выгрузки информационной базы позволяют сохранить информационную базу в файл на диске или загрузить информационную базу из файла. Эти команды используются, например, для того, чтобы перенести базу из файлового варианта в клиент-серверный и обратно. Среди действий над объектами, хранящимися в базе данных, есть действия, отвечающие за чтение или изменение информации, хранящейся в базе данных. К таким действиям относятся: ■■ чтение – получение записей или их фрагментов из таблицы базы данных; ■■ добавление – добавление новых записей без изменения существующих; ■■ изменение – изменение существующих записей; ■■ удаление – удаление некоторых записей без внесения изменений в оставшиеся. Для этих действий могут быть заданы дополнительные условия на данные (ограничение доступа к данным). В этом случае над конкретным объектом, хранимым в базе данных, может быть выполнено запрошенное действие только в том случае, если ограничение доступа к данным для данных этого объекта принимает значение Истина. Аналогичные условия могут быть заданы и для таблиц базы данных, не имеющих объектной природы (регистров). Ограничение доступа к данным представляет собой условие, описанное на языке, который является подмножеством языка запросов. Это условие применяется для каждой записи таблицы базы данных, над которой выполняется операция. При просмотре списков и формировании отчетов существует возможность обеспечить отображение только тех данных, доступ к которым пользователю разрешен. Журнал регистрации Для хранения информации о событиях, происходящих в информационной базе, система «1С:Предприятие» ведет журнал регистрации. Администратор информационной базы имеет возможность настроить уровень событий, которые будут отображаться в журнале регистрации (ошибки, и/или предупреждения, и/или информация, и/или примечания). Просмотр журнала регистрации может быть выполнен с помощью специального фильтра, позволяющего отбирать информацию по большому количеству критериев. Например, можно отобрать только информацию о том, 42 Загрузка/выгрузка информационной базы Утилита администрирования кластера серверов Утилита администрирования кластера серверов используется при работе в клиент-серверном варианте и позволяет выполнять такие действия, как: ■■ создание, изменение и удаление кластеров серверов; ■■ модификация существующих кластеров: создание, изменение параметров и удаление рабочих серверов, рабочих процессов кластера, информационных баз, входящих в состав кластера; ■■ управление списками администраторов центральных серверов кластеров и списками администраторов кластеров; ■■ мониторинг соединений пользователей с информационными базами и служебных соединений; ■■ отключение пользователей от информационной базы; ■■ мониторинг объектных блокировок «1С:Предприятия» и блокировок клиентского соединения; ■■ оперативный анализ транзакционных блокировок системы управления базами данных; ■■ управление блокировкой установки соединений пользователей с информационной базой; ■■ управление блокировкой выполнения регламентных заданий. Утилита представляет собой подключаемый модуль MMC (Microsoft Management Console) и может быть использована на компьютерах, на которых установлено соответствующее программное обеспечение (для операционных систем Windows 2000/XP/Server 2003 это программное обеспечение является стандартным). Подробнее Раздел «Управление кластером серверов», стр. 42. Профессиональная разработка в системе «1С:Предприятие 8» Обзор функциональности средств администрирования «1С:Корпоративный инструментальный пакет» Этот продукт предназначен для повышения производительности, масштабируемости и надежности информационных систем на платформе «1С:Предприятие». Он используется для нагрузочного тестирования и последующего сопровождения крупных корпоративных систем. Продукт «1С:КИП» включает в себя следующие инструменты: ■■ 1С:Центр управления производительностью – инструмент мониторинга и анализа производительности информационных систем на платформе «1С:Предприятие». Этот инструмент предназначен для оценки производительности системы, сбора подробной технической информации об имеющихся проблемах производительности и анализа этой информации с целью дальнейшей оптимизации; Том 1 ■■ 1С:Тест-центр – инструмент автоматизации многопользовательских нагрузочных испытаний информационных систем на платформе «1С:Предприятие». С его помощью можно моделировать работу предприятия без участия реальных пользователей, что позволяет оценивать применимость, производительность и масштабируемость информационной системы в реальных условиях; ■■ 1С:Центр контроля качества. Инструмент позволяет гарантировать эффективную и надежную работу системы на платформе «1С:Предприятие» за счет своевременного и правильного технического обслуживания системы. Это особенно важно для внедрений с высокими требованиями по производительности и надежности системы. 43 Глава 2. Функциональность «1С:Предприятия» 44 Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации Глава 3. Использование встроенного языка Как уже говорилось выше, прикладное решение «1С:Предприятия» представляет собой определенную структуру метаданных, которая исполняется технологической платформой. В то же время технологическая платформа содержит в себе интерфейс разработки и администрирования, позволяющий создавать новые и модифицировать существующие прикладные решения. Разработка прикладного решения заключается по большому счету в двух основных действиях: визуальном конструировании объектов конфигурации и описании специфического поведения системы с использованием встроенного языка и языка запросов. Создание нового прикладного решения начинается с добавления новой информационной базы в список баз «1С:Предприятия». При этом платформа создает некую «базовую» структуру метаданных, которая уже представляет собой работоспособное прикладное решение. В соответствии с этой структурой метаданных платформа также создает ряд информационных структур (таблиц), обеспечивающих работу этой конфигурации и хранение данных. Информационные структуры создаются в том варианте работы, который выбран пользователем (например, файловый или клиент-серверный). Таким образом, разработчик начинает создание прикладного решения не с нуля, а с некоторой «базовой» структуры метаданных (пустой конфигурации), которую он может изменять в соответствии со своими потребностями. Следующим шагом в разработке прикладного решения является, как правило, создание структур для хранения данных. Отличительной особенностью разработки в системе «1С:Предприятие» является то, что платформа изолирует разработчика от физических деталей хранения данных, предлагая более высокий уровень абстракции – уровень объектов метаданных. Другими словами, разработчик добавляет в структуру метаданных нужные ему объекты, определяет, например, какие реквизиты и табличные части будет содержать тот или иной объект. Платформа же анализирует изменения, выполняемые разработчиком, и создает в информационной базе соответствующие информационные структуры, позволяющие хранить и эффективно использовать данные. В результате, с точки зрения разработчика, процесс создания прикладного решения в файловом или в клиент-серверном варианте выглядит совершенно одинаково, так как он Том 1 не оперирует физическими таблицами базы данных, а имеет дело с более абстрактными сущностями – объектами метаданных. Таким образом, вся структура хранимых данных описывается средствами визуального конфигурирования и не может быть изменена в процессе работы прикладного решения (в реальном режиме времени). Такой подход позволяет платформе контролировать целостность информационной базы и данных, которые в ней хранятся. Платформе известно о назначении того или иного объекта конфигурации, она знает, в каких таблицах должны храниться данные этого объекта, и обладает информацией о том, как эти данные должны взаимодействовать с данными других объектов конфигурации. Таким образом, с одной стороны ограничивая разработчика в динамической модификации структуры информационной базы, она значительно облегчает задачу создания и модификации прикладного решения, избавляя разработчика от необходимости самостоятельно контролировать правильность таблиц информационной базы и их связей. Другим положительным моментом такого подхода является то, что структура прикладного решения становится прозрачной и легко читаемой. Любому разработчику, не принимавшему непосредственного участия в разработке данного решения, достаточно взглянуть на структуру объектов метаданных, чтобы понять в общих чертах, как оно устроено. Открыв конфигуратор, он увидит привычный набор объектов метаданных, назначение каждого из которых ему хорошо известно. Ограниченный набор объектов конфигурации, которые может использовать разработчик, является еще одной особенностью прикладных решений «1С:Предприятия». Платформа поддерживает фиксированный набор прототипов объектов метаданных (например, справочник, документ, регистр накопления, бизнес-процесс и т. д.). Разработчик не имеет возможности каким-либо образом создать собственный объект конфигурации (например, просто таблицу, содержащую набор колонок). Он может только добавить в прикладное решение новый объект конфигурации, соответствующий одному из прототипов, поддерживаемых системой (например, регистр сведений, обладающий набором реквизитов). Такой подход позволяет создать среду описания прикладных решений, состоящую из логических сущностей, одинаковых для всех прикладных решений (рис. 3.1). 45 Глава 3. Использование встроенного языка В этом случае разработчик имеет возможность использовать встроенный язык «1С:Предприятия» для того, чтобы определить поведение прикладного решения, отличное от стандартного. С помощью встроенного языка разработчик может «вмешиваться» в работу прикладного решения: выполнять какие-либо алгоритмы, обрабатывать и модифицировать данные, изменять или вообще отменять стандартные действия системы в зависимости от тех или иных результатов работы. Ключевым моментом здесь является то, что подобное «вмешательство» возможно не всегда, а только в определенные моменты работы прикладного решения. Таким образом, встроенный язык не является неким универсальным языком программирования, с помощью которого создаются прикладные решения, а служит лишь для описания особенных алгоритмов работы прикладного решения. Модули конфигурации Для размещения текста программы на встроенном языке предназначены модули прикладного решения (например, модуль приложения, общие модули, модули объектов, модули форм, модули команд, модули менеджеров и т. д.). Эти модули располагаются в различных местах конфигурации и имеют различное назначение. Рис. 3.1. Сравнение логических уровней приложения Добавление новых объектов конфигурации в прикладное решение сразу же позволяет использовать их для ввода и модификации информации. Технологическая платформа «знает», как работать с данными того или иного объекта конфигурации, и в определенные моменты работы прикладного решения самостоятельно может сгенерировать нужные формы для работы с данными. Таким образом, все объекты конфигурации, которые может использовать разработчик, обладают некоторым базовым поведением, которое реализуется платформой без участия разработчика. В простейшем варианте создание функционального и работоспособного прикладного решения возможно исключительно средствами визуального конструирования, без написания какого-либо текста программы. Платформа проанализирует состав объектов конфигурации и обеспечит все необходимые функции для работы с ними. Однако реальные задачи, решаемые с помощью системы «1С:Предприятие», всегда требуют наличия в прикладном решении некоторых алгоритмов, специфичных для автоматизируемой области. Это могут быть, например, различные алгоритмы расчета себестоимости, контроля остатков, распределения средств и т. д. Также возникает необходимость в создании специфических форм, обладающих нестандартным поведением, поскольку удобное визуальное представление информации является одной из наиболее важных задач для любого прикладного решения. 46 Большинство модулей привязано к определенным объектам конфигурации (например, к формам) или к самому прикладному решению (например, модуль управляемого приложения). Такие модули вызываются в определенные моменты работы прикладного решения (например, модуль управляемого приложения, который запускается при запуске системы «1С:Предприятие» в режиме управляемого приложения, или модуль объекта справочника Номенклатура, который запускается при создании объекта (элемента) справочника). Таким образом, если модуль содержит некоторый код, то этот код будет выполнен и работа прикладного решения продолжена. В таких модулях могут располагаться процедуры обработки событий, определенных для различных объектов прикладного решения. Эти процедуры также будут выполняться при наступлении соответствующего события. Наряду с модулями, вызываемыми в процессе работы прикладного решения, существуют общие модули, которые сами по себе не вызываются в процессе работы прикладного решения. Они служат лишь для размещения в них текстов функций и процедур, которые могут вызываться из других модулей прикладного решения. Таким образом, код, располагающийся в общих модулях, будет исполнен только тогда, когда к нему будет выполнено явное обращение из другого модуля конфигурации или из командного интерфейса. Каждый модуль связан с остальной частью конфигурации, и эта связь называется контекстом выполнения модуля. Контекст определяет Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации «программное окружение», в котором исполняется код модуля, – набор доступных для модуля объектов, переменных, процедур и функций. Для всех программных модулей доступен глобальный контекст задачи. Он образуется значениями свойств и методов глобального контекста, а также системными перечислениями и системными наборами значений. С другой стороны, почти все модули конфигурации (за исключением модуля сеанса и модуля команды), показанные на следующей схеме стрелками, поставляют в глобальный контекст свои экспортируемые процедуры/функции (рис. 3.2). Рис. 3.3. Программные компоненты «1С:Предприятия» в клиент-серверном варианте работы При этом физически все программные компоненты в клиент-серверном варианте работы «1С:Предприятия» могут располагаться как на одном компьютере, так и на разных. Подробнее Глава 5 «Клиент-серверный вариант работы», раздел «Варианты использования», стр. 121. Наличие серверного и клиентского контекста исполнения модулей определяет следующие особенности. Рис. 3.2. Контексты прикладного решения Локальный контекст модуля образуется тем конкретным местом конфигурации задачи, для которого использован программный модуль. Локальный контекст виден только конкретному программному модулю и определяет для модуля набор непосредственно доступных ему объектов, их свойств и методов. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 4.2 «Формат исходных текстов программных модулей». Контекст исполнения модулей С точки зрения места исполнения модуля существует понятие «контекст исполнения модулей», определяющий программную среду, в которой выполняется модуль. Для клиент-серверного варианта работы «1С:Предприятия» таких контекстов два – контекст клиента и контекст сервера (рис. 3.3). Том 1 Во-первых, в контексте клиента (на клиенте) и в контексте сервера (на сервере) доступны разные свойства, методы и объекты встроенного языка. Все действия, связанные с доступом к данным (их чтение и запись), возможны только на сервере, а отображение этих данных пользователю и другие интерактивные действия возможны только на клиенте. Поэтому клиентские процедуры в модулях в явном виде отделяются от серверных, и в них используется ограниченный состав объектной модели встроенного языка. Во-вторых, реальным вариантом работы клиент-серверного варианта будет ситуация, когда все программные компоненты «1С:Предприятия» расположены на отдельных компьютерах. Как правило, сервер «1С:Предприятия» и сервер СУБД находятся в пределах одной локальной сети, а вот клиентский компьютер с клиентским приложением может находиться как в этой же сети, так и подключаться к серверу через Интернет с использованием самых разных каналов связи с разной скоростью передачи информации. В процессе работы «1С:Предприятия» клиентское приложение все время вызывает сервер для выполнения каких-либо действий, сервер выполняет их и возвращает управление и результат этих действий обратно, на клиента. Механизмы платформы оптимизируют клиент-серверное взаимодействие для того, чтобы обеспечить приемлемую скорость работы системы даже на низкоскоростных каналах связи. Поэтому разработчик, организующий клиент-серверное взаимодействие путем вызова серверных процедур 47 Глава 3. Использование встроенного языка из процедур, исполняющихся на клиенте, также должен стремиться к такой оптимизации. Подробнее Раздел «Оптимизация клиент-серверного взаимодействия в формах», стр. 391. Общий модуль В конфигурации может быть определено произвольное количество общих модулей, в том числе и ни одного. Контекст общего модуля образуется глобальным контекстом и локальным контекстом самого общего модуля, т. е. процедурами и функциями, определенными внутри общего модуля. Поскольку общий модуль не исполняется системой непосредственно, в нем отсутствует раздел описания переменных и раздел основной программы. Общий модуль может содержать только определения процедур и функций. Если процедуры или функции общего модуля определены как экспортируемые, то они становятся частью глобального контекста и будут доступны другим модулям прикладного решения (за некоторыми исключениями, о которых будет сказано далее). Если у общего модуля установлено свойство Глобальный, то экспортируемые методы общего модуля являются частью глобального контекста, и из встроенного языка можно обращаться к ним по имени, как к другим функциям, методам и свойствам глобального контекста. Если же модуль неглобальный, то при обращении к его экспортируемой процедуре или функции ее имя нужно указывать через точку от имени модуля (например, Обмен.ПолучитьПрефиксНомера()). Последний способ предпочтительнее, так как неглобальные общие модули компилируются по мере обращения к ним, а не при запуске системы, как глобальные. Поскольку общий модуль не привязан к какому-либо объекту конфигурации, а относится ко всему прикладному решению, имена экспортируемых процедур и функций должны быть различными в разных общих модулях. В противном случае будет выдана синтаксическая ошибка, т. к. глобальный контекст будет содержать повторяющиеся имена. С помощью свойств Клиент (управляемое приложение) и Сервер, а также указаний препроцессору можно организовывать выполнение различных процедур и функций общих модулей на сервере приложения или на клиентском месте. По умолчанию в свойствах общих модулей устанавливается флажок Сервер. Это означает, что все процедуры и функции общего модуля будут доступны только на сервере. Если при этом установить свойство Вызов сервера, то процедуры и функции этого общего модуля станут доступны 48 на клиенте. Соответственно, если у общего модуля установлены свойства Клиент (управляемое приложение) и/или Внешнее соединение, то экспортируемые (определенные с ключевым словом Экспорт) процедуры и функции этого общего модуля будут доступны на клиенте (тонком клиенте, веб-клиенте, толстом клиенте в режиме управляемого приложения) и/или во внешнем соединении. Если у неглобального общего модуля установлено свойство Клиент (управляемое приложение), то в контексте этого модуля будут доступны экспортируемые переменные, процедуры и функции модуля управляемого приложения. Если у неглобального общего модуля установлено свойство Внешнее соединение, то в контексте этого модуля будут доступны экспортируемые переменные, процедуры и функции модуля внешнего соединения. Также у неглобальных общих модулей доступно свойство Повторное использование возвращаемых значений. Установка этого свойства ускоряет выполнение экспортируемых функций (только функций, а не процедур) неглобальных общих модулей. Это происходит за счет использования механизма кеширования, так как значения параметров, переданных в функцию, и возвращенный ей при этом результат запоминаются и сохраняются для дальнейшего использования. Модуль управляемого приложения Модуль управляемого приложения выполняется при запуске системы «1С:Предприятие» в управляемом режиме (свойство конфигурации Основной режим запуска установлено в значение Управляемое приложение, т. е. в режимах тонкого клиента, веб-клиента и толстого клиента в режиме управляемого приложения) или при обращении к приложению как к Automation-серверу (объект V82c.Application). Этот модуль предназначен для отработки действий, связанных с сеансом работы конечного пользователя. Помимо описания переменных и основной программы, модуль приложения может содержать описание процедуробработчиков событий, связанных с началом и окончанием сеанса работы пользователя. ПРИМЕЧАНИЕ В конфигурации существует также модуль обычного приложения, который выполняется при запуске «1С:Предприятия» в обычном режиме. Он остался от прежних версий платформы и в рамках этой книги рассматриваться не будет. Далее везде речь пойдет об управляемом клиенте (тонком клиенте, веб-клиенте, толстом клиенте в режиме управляемого приложения), управляемом приложении и об управляемых формах, даже если слово «управляемое» опущено. Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации В конфигурации всегда существует единственный модуль управляемого приложения, который располагается в корневом разделе конфигурации. Контекст модуля управляемого приложения (рис. 3.4) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение), и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ локальным контекстом самого модуля управляемого приложения. Рис. 3.5. Видимость модуля управляемого приложения Модуль управляемого приложения недоступен для процедур, работающих на сервере. Также экспортируемые переменные, процедуры или функции модуля управляемого приложения недоступны для модуля внешнего соединения и глобальных общих модулей. Основными событиями, которые могут обрабатываться в модуле приложения, являются события начала и окончания работы приложения. Последовательность их вызова представлена на рис. 3.6. Рис. 3.4. Контекст модуля управляемого приложения Экспортируемые переменные, процедуры или функции модуля управляемого приложения (у которых в заголовке указано ключевое слово Экспорт) будут доступны (рис. 3.5): ■■ в неглобальных клиентских общих модулях с установленным свойством Клиент (управляемое приложение); ■■ клиентских процедурах и функциях модуля управляемой формы; ■■ клиентских процедурах и функциях модуля команды. Том 1 Рис. 3.6. Последовательность вызова событий модуля приложения 49 Глава 3. Использование встроенного языка Событие ПередНачаломРаботыСистемы возникает при запуске системы в управляемом режиме 1С:Предприятие до открытия главного окна. Обрабатывая это событие, разработчик имеет возможность отказаться от запуска системы в случае, если какие-либо условия не выполнены. Следует учитывать, что, поскольку это событие вызывается в тот момент, когда главное окно программы еще не открыто, будет недоступен ряд действий, требующих наличия главного окна (например, выдача сообщений, открытие форм и т. д.). Событие ПриНачалеРаботыСистемы возникает при запуске системы в управляемом режиме 1С:Предприятие после открытия главного окна. В обработчике этого события разработчик уже не может отказаться от запуска системы, зато может выполнить действия, которые обязательно должны быть выполнены при начале работы пользователя системы (например, открыть форму, содержащую справочную информацию, и т. д.). Событие ПередЗавершениемРаботыСистемы возникает при завершении работы системы в управляемом режиме 1С:Предприятие до закрытия главного окна. Обрабатывая это событие, разработчик имеет возможность отказаться от завершения работы, если какие-либо условия не выполнены. Событие ПриЗавершенииРаботыСистемы возникает при завершении работы системы в управляемом режиме 1С:Предприятие после закрытия главного окна. В обработчике этого события разработчик уже не может отказаться от закрытия приложения, но может выполнить действия, которые обязательно должны быть выполнены при окончании работы пользователя. Следует учитывать, что, поскольку это событие вызывается в тот момент, когда главное окно программы уже закрыто, будет недоступен ряд действий, требующих наличия главного окна (например, выдача сообщений, открытие форм и т. д.). Модуль сеанса Модулем сеанса называется модуль, который автоматически выполняется при старте системы «1С:Предприятие» в момент загрузки конфигурации. Исполнение модуля сеанса происходит до начала исполнения модуля управляемого приложения или модуля внешнего соединения. Модуль сеанса предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы. Модуль сеанса всегда исполняется в привилегированном режиме сервера «1С:Предприятия». Установка параметров сеанса выполняется в обработчике события УстановкаПараметровСеанса(). Модуль внешнего соединения В конфигурации всегда существует единственный модуль внешнего соединения, который располагается в корневом разделе конфигурации. Контекст модуля внешнего соединения образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей (если для этих модулей установлено свойство Внешнее соединение); ■■ локальным контекстом самого модуля внешнего соединения. Модуль внешнего соединения выполняется при обращении к приложению как к COM-серверу (в режиме внешнего соединения). В режиме внешнего соединения запускается не полноценное приложение «1С:Предприятия», а «облегченный» вариант приложения, в котором недоступны все функции, так или иначе связанные с организацией пользовательского интерфейса. Поэтому в режиме внешнего соединения вместо модуля приложения исполняется модуль внешнего соединения. Этот модуль предназначен для отработки действий, связанных с сеансом работы с приложением «1С:Предприятия». Если переменные, процедуры или функции модуля внешнего соединения определены как экспортируемые, то они будут доступны другим модулям внешнего соединения, за исключением глобальных общих модулей, в которых они доступны не будут. Экспортируемые переменные, процедуры или функции модуля внешнего соединения также будут доступны для неглобальных общих модулей с установленным свойством Внешнее соединение. Помимо описания переменных и основной программы, модуль внешнего соединения может содержать описание двух процедур-обработчиков событий, связанных с началом и завершением работы: ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы. При работе в модуле внешнего соединения следует помнить о том, что ряд объектов встроенного языка, процедур и функций глобального контекста будет недоступен для использования, т. к. COM-сервер «1С:Предприятия» не содержит «интерфейсной» части приложения. Например, в режиме внешнего соединения нельзя использовать такие объекты, как диаграмма, табличный документ, недоступны функции для вызова диалога ввода данных и т. д. Точная информация о возможности использования объектов, процедур и функций в модуле внешнего соединения находится в документации, в описании конкретных объектов, процедур и функций. Модуль сеанса может содержать только определения неэкспортируемых процедур и функций и может использовать процедуры из общих модулей конфигурации. 50 Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации Модуль объекта Каждый прикладной объект конфигурации, данные которого могут быть модифицированы в режиме 1С:Предприятие, имеет свой модуль. Этот модуль исполняется при создании объекта встроенного языка, который позволяет модифицировать данные объекта конфигурации. Соответствующий объект встроенного языка создается, например, при вводе нового объекта, при копировании, при получении данных существующего объекта и т. д. Для различных объектов конфигурации этот модуль имеет разное название (табл. 3.1). Таблица 3.1. Название модуля объекта для различных объектов конфигурации Объект конфигурации Название модуля Константа Модуль менеджера значения Справочник Модуль объекта Документ Отчет Обработка План видов характеристик План счетов План видов расчета План обмена Бизнес-процесс Задача Последовательность Модуль набора записей Регистр сведений Регистр накопления Регистр бухгалтерии Регистр расчета Перерасчет Объект встроенного языка, который расширяется модулем КонстантаМенеджерЗначения.<имя> СправочникОбъект.<имя> ДокументОбъект.<имя> ОтчетОбъект.<имя> ОбработкаОбъект.<имя> ПланВидовХарактеристикОбъект.<имя> ПланСчетовОбъект.<имя> ПланВидовРасчетаОбъект.<имя> ПланОбменаОбъект.<имя> БизнесПроцессОбъект.<имя> ЗадачаОбъект.<имя> ПоследовательностьНаборЗаписей.<имя> РегистрСведенийНаборЗаписей.<имя> РегистрНакопленияНаборЗаписей.<имя> РегистрБухгалтерииНаборЗаписей.<имя> РегистрРасчетаНаборЗаписей.<имя> ПерерасчетНаборЗаписей.<имя> Контекст модуля объекта (рис. 3.7) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ свойствами и методами объекта встроенного языка, контекст которого расширяется модулем; ■■ реквизитами объекта конфигурации, которому принадлежит модуль; ■■ локальным контекстом самого модуля объекта. Рис. 3.7. Контекст модуля объекта Если переменные, процедуры или функции модуля объекта определены как экспортируемые, то они будут доступны в качестве свойств и методов соответствующих объектов встроенного языка. Например, пусть в модуле справочника ТиповыеАнкеты определена экспортируемая процедура (листинг 3.1). Листинг 3.1. Экспортируемая процедура в модуле справочника Процедура ПроверитьКорректностьЗаполненияАнкеты() Экспорт // Алгоритм вывода на экран печатной формы анкеты. // … КонецПроцедуры // Тогда возможен следующий вызов этой процедуры, например, из модуля внешней обработки (листинг 3.2). Листинг 3.2. Пример вызова экспортируемой процедуры объекта справочника Анкета = Справочники.ТиповыеАнкеты.НайтиПоКоду("000000001").ПолучитьОбъект(); Анкета.ПроверитьКорректностьЗаполненияАнкеты(); Помимо описания переменных и основной программы, модуль объекта может содержать описание процедур-обработчиков событий, связанных с данным объектом конфигурации. Состав этих событий различен Том 1 51 Глава 3. Использование встроенного языка для разных объектов, однако есть три события, которые вызываются для всех объектов, – ОбработкаПроверкиЗаполнения, ПередЗаписью и ПриЗаписи. Последовательность их вызова представлена на рис. 3.8. Модуль менеджера объекта Для каждого прикладного объекта существует менеджер, предназначенный для управления этим объектом как объектом конфигурации. С помощью менеджера можно создавать объекты, работать с формами и макетами. Модуль менеджера позволяет расширить функциональность менеджеров, предоставляемых системой, за счет написания процедур и функций на встроенном языке. Фактически это позволяет описать методы для объекта конфигурации (например, справочника), которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации. Контекст модуля менеджера (рис. 3.9) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ локальным контекстом самого модуля менеджера. Рис. 3.8. Последовательность вызова событий модуля объекта Событие ОбработкаПроверкиЗаполнения вызывается перед записью данных объекта, до начала транзакции записи. В обработчике этого события разработчик может реализовать собственные алгоритмы проверки заполнения реквизитов объекта, добавить в массив проверяемых реквизитов дополнительные реквизиты, чтобы платформа выполнила их проверку, или очистить массив проверяемых реквизитов, отказавшись от их стандартной проверки. Установив параметр Отказ в значение Истина, разработчик может отказаться от записи объекта, если, например, какие-то условия проверки не были выполнены. Событие ПередЗаписью вызывается перед записью данных, после начала транзакции записи, но до начала непосредственной записи данных в базу данных. В обработчике этого события разработчик имеет возможность отказаться от записи данных, если, например, не выполнены требуемые условия. Событие ПриЗаписи вызывается после того, как была выполнена запись данных в базу данных, но до окончания транзакции записи. В обработчике этого события выполняются действия над данными, неразрывно связанными с данными объекта, которые не могут быть изменены отдельно от основных данных. Здесь также разработчик может отказаться от записи данных, если, например, в результате записи этих данных в базу нарушаются какие-либо условия. 52 Рис. 3.9. Контекст модуля менеджера Модуль менеджера исполняется только на сервере и не может иметь переменных и тела модуля. Если функции или процедуры модуля менеджера объявлены как экспортируемые, к ним можно будет получить доступ через менеджера объекта. Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации Например, пусть в модуле менеджера справочника Контрагенты определена экспортируемая функция (листинг 3.3). Листинг 3.3. Экспортируемая функция в модуле менеджера справочника «Контрагенты» Функция ПолучитьСписокДебиторов() Экспорт // … КонецФункции Тогда возможен следующий вызов этой функции, например, из модуля внешней обработки (листинг 3.4). Листинг 3.4. Пример вызова экспортируемой функции справочника «Контрагенты» Дебиторы = Справочники.Контрагенты.ПолучитьСписокДебиторов(); В модулях менеджеров объектов располагается обработчик события ОбработкаПолученияДанныхВыбора. Это событие возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе. Модуль управляемой формы Каждая форма, определенная в конфигурации, имеет свой собственный модуль. ■■ свойствами и методами расширения формы, определяемого основным реквизитом формы; ■■ свойствами и методами объекта УправляемаяФорма встроенного языка; ■■ реквизитами формы, которой «принадлежит» модуль; ■■ локальным контекстом самого модуля формы, скомпилированным в управляемых клиентах. Контекст серверных процедур и функций модуля управляемой формы (рис. 3.10) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ свойствами и методами расширения формы, определяемого основным реквизитом формы; ■■ свойствами и методами объекта УправляемаяФорма встроенного языка; ■■ реквизитами формы, которой «принадлежит» модуль; ■■ серверными процедурами и функциями самого модуля управляемой формы, а также переменными и телом модуля, скомпилированными на сервере. Модуль управляемой формы исполняется при создании объекта УправляемаяФорма встроенного языка, а также может создаваться при открытии формы прикладного объекта (например, при открытии формы элемента справочника) либо явно получаться средствами встроенного языка (листинг 3.5). Листинг 3.5. Пример получения управляемой формы ФормаСписка = ПолучитьФорму("Справочник.Номенклатура.ФормаСписка"); Контекст клиентских процедур и функций модуля управляемой формы (рис. 3.10) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение) и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ экспортируемыми переменными, процедурами и функциями модуля управляемого приложения; Том 1 Рис. 3.10. Контекст модуля управляемой формы 53 Глава 3. Использование встроенного языка В контексте управляемой формы недоступны свойства и методы объекта, который назначен основным реквизитом формы. Получить к ним доступ можно только из серверной процедуры модуля формы, предварительно преобразовав данные формы в объект. Например, пусть в модуле объекта справочника определена экспортируемая процедура ПересчитатьЦены(), листинг 3.6. Листинг 3.6. Экспортируемая процедура в модуле объекта справочника Процедура ПересчитатьЦены() Экспорт // … КонецПроцедура Тогда в серверной контекстной процедуре модуля формы элемента этого справочника можно преобразовать данные формы в объект (РеквизитФормыВЗначение()) и выполнить метод этого объекта ПересчитатьЦены(). Затем, чтобы пересчитанные данные отразились в форме, нужно выполнить обратное преобразование (ЗначениеВРеквизитФормы()), конвертировав объект справочника в данные формы (листинг 3.7). Листинг 3.7. Пример вызова экспортируемой процедуры справочника из модуля формы &НаСервере Процедура ОбновитьДанные() СправочникОбъект = РеквизитФормыВЗначение("Объект"); СправочникОбъект.ПересчитатьЦены(); ЗначениеВРеквизитФормы(СправочникОбъект, "Объект"); КонецПроцедуры Исполнение модуля формы на клиенте и на сервере Основная особенность формы как программного объекта заключается в том, что она существует одновременно и на клиенте, и на сервере. Форма состоит из двух взаимодействующих между собой частей, каждая из которых выполняется в разных контекстах. Одна часть – в контексте сервера, а другая – в контексте клиента. По этой причине все процедуры и функции, создаваемые в модуле формы, должны иметь явное указание на то, в каком контексте они будут исполняться. Для этого используются директивы компиляции, набор которых определен во встроенном языке. Одна из возможных директив компиляции обязательно должна быть указана перед объявлением каждой процедуры или функции, находящейся в модуле формы. Например, директива компиляции и процедура могут выглядеть следующим образом (листинг 3.8). 54 Листинг 3.8. Процедура «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Объект.Ссылка = ПланыОбмена.УдаленныеСклады.ЭтотУзел() Тогда Элементы.Главный.Доступность = Ложь; Элементы.Склад.Доступность = Ложь; Элементы.АдресОбмена.Доступность = Ложь; КонецЕсли; КонецПроцедуры В приведенном примере стандартная процедура, выполняемая платформой при создании формы на сервере, предваряется соответствующей директивой компиляции &НаСервере. Поскольку стандартные события вызываются платформой в заранее известных контекстах (на клиенте или на сервере), то и директивы компиляции, указываемые перед обработчиками этих событий, должны соответствовать контексту события. Что же касается контекстов исполнения собственных процедур или функций – их определяет сам разработчик в зависимости от своих нужд. Вообще в модуле формы могут быть использованы четыре различные директивы компиляции: ■■ &НаКлиенте, ■■ &НаСервере, ■■ &НаСервереБезКонтекста, ■■ &НаКлиентеНаСервереБезКонтекста. Директива &НаКлиенте указывает, что процедура или функция будет исполняться в контексте клиентского приложения. В этой процедуре будет доступен весь контекст формы: реквизиты, элементы и параметры формы. Эта директива используется для всех обработчиков клиентских событий формы, а также для процедур, описывающих локальные команды формы. Часто такие процедуры называют клиентскими процедурами формы. Директива &НаСервере аналогична предыдущей с той разницей, что исполнение кода происходит в контексте сервера. Эта директива используется для всех обработчиков серверных событий формы. Также эту директиву часто используют разработчики для собственных процедур, чтобы передать исполнение кода на сервер. Часто такие процедуры называют серверными процедурами формы. А вызов такой процедуры из клиентской процедуры называют контекстным серверным вызовом. Директива &НаСервереБезКонтекста также определяет, что код будет исполняться в контексте сервера, но при этом контекст формы (реквизиты, элементы, параметры) будет недоступен. Эту директиву также используют разработчики для собственных процедур, чтобы передать исполнение кода на сервер. Как и в предыдущем случае, такие процедуры Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации называют серверными процедурами формы. А вот вызов такой процедуры из клиентской процедуры называют внеконтекстным серверным вызовом. И последняя директива, &НаКлиентеНаСервереБезКонтекста, определяет, что процедура или функция может исполняться как в контексте клиента, так и в контексте сервера. Эта директива используется редко. Обычно она требуется в тех случаях, когда нужно выполнять одинаковые действия, как при создании формы, так и в процессе ее жизнедеятельности на клиенте. Тогда вместо двух одинаковых процедур, одна из которых исполняется на сервере, а другая – на клиенте, создается одна процедура с директивой &НаКлиентеНаСервереБезКонтекста. Если по ошибке никакая директива компиляции не указана, то платформа считает, что используется директива &НаСервере. Переменные модуля формы В модуле формы директивы компиляции должны быть указаны не только перед определением процедур и функций, но и перед определением переменных. Если перед описанием переменной используется директива компиляции &НаКлиенте, то такая переменная будет существовать с момента создания формы до момента ее закрытия. Причем только в клиентской части формы. Из серверных процедур формы она доступна не будет. Если перед описанием переменной используется директива компиляции &НаСервере, то такая переменная будет существовать только на период вызова и исполнения какой-либо серверной процедуры или функции. После того как исполнение кода вернется на клиента, модуль, исполнявшийся на сервере, будет уничтожен вместе с этой переменной (рис. 3.11). Почему важно понимать эту особенность? Потому что порой переменные модуля объявляются в явном виде, без указания директивы компиляции. В этом случае, как уже говорилось выше, платформа будет использовать директиву &НаСервере. Можно пытаться в одной серверной процедуре устанавливать значение этой переменной и читать ее в другой. Но так получится только в том случае, если все эти процедуры выполняются в одном серверном вызове. Если серверные вызовы разные, переменная будет инициализироваться каждый раз заново. В то же время на клиенте можно использовать переменные модуля для хранения значений на все время жизни формы, но для этого при объявлении таких переменных обязательно должна быть указана директива компиляции &НаКлиенте. Том 1 Рис. 3.11. Однократная компиляция клиентской части модуля и многократная компиляция серверной части модуля Передавать значения с клиента на сервер с помощью переменных модуля формы нельзя. Хранить значения на сервере в переменных модуля также не получится. Для этого нужно использовать либо реквизиты формы (и выполнять контекстные серверные вызовы), либо передавать значения в параметрах вызываемой процедуры/функции. Экспортируемые процедуры формы Разработчик может создать в модуле формы экспортируемые процедуры или функции. Они будут доступны как методы программного объекта Форма во встроенном языке. Для таких процедур/функций также нужно указывать директивы компиляции. При этом практический смысл есть, наверное, в использовании лишь единственной директивы – &НаКлиенте. Поясним почему. Как мы уже знаем, объект формы создается методами ОткрытьФорму() или ПолучитьФорму(). Оба они доступны только в контексте клиента. Поэтому созданная форма также будет существовать в контексте клиента. Соответственно, в этом же контексте должны быть определены ее экспортируемые процедуры/функции. 55 Глава 3. Использование встроенного языка В принципе программный объект формы может существовать как на клиенте, так и на сервере. Однако для чего, в какой ситуации может потребоваться обращаться к нему «извне» на сервере – сложно представить. Поэтому основное замечание этого раздела заключается в том, что при написании собственных экспортируемых процедур/функций формы нужно не забывать указывать для них директиву компиляции &НаКлиенте. Если никакая директива указана не будет, платформа будет считать, что используется директива &НаСервере, и, значит, вызвать процедуру/функцию на клиенте вы не сможете. Клиентские и серверные обработчики событий формы Помимо описания переменных и основной программы, модуль формы может содержать описание процедур-обработчиков событий, связанных с формой. В первую очередь это событие, возникающее при создании формы на сервере. Последовательность событий, вызывающихся при создании формы уже существующего объекта информационной базы, а также открытии и закрытии окна формы, представлена на рис. 3.12. Подробнее Раздел «Последовательность событий при открытии формы объекта», стр. 299. Раздел «Последовательность событий при записи объекта из формы», стр. 301. Синтакс-помощник: Интерфейс (управляемый) – Управляемая форма – УправляемаяФорма – События. Форма полностью подготавливается к открытию на сервере и затем открывается на клиенте. При открытии формы на стороне сервера вызываются два события – ПриЧтенииНаСервере и ПриСозданииНаСервере. Первое событие формы ПриЧтенииНаСервере вызывается только для существующих в информационной базе объектов. Причем поставляется это событие не самой формой, а ее расширением, определяемым типом основного реквизита формы. В обработчике этого события, в параметре ТекущийОбъект разработчику доступен прикладной объект, содержащийся в форме, со всей его функциональностью. То есть здесь можно вызвать экспортируемые методы этого объекта или получить значения его реквизитов, не конвертируя данные формы в объект. Таким образом, в обработчике этого события разработчик может подготовить данные формы, зависящие от данных объекта, к открытию. Второе событие формы ПриСозданииНаСервере вызывается всегда при открытии форм и новых, и существующих объектов. Здесь уже недоступен прикладной объект, отображаемый в форме. В обработчике этого события разработчик может полностью подготовить форму, ее внешнее представление, к открытию, в зависимости от различных условий настроить ее интерфейсные свойства. В обработчике этого события разработчик имеет возможность отказаться как от открытия формы (Отказ = Истина), так и от выполнения стандартных действий при открытии формы (СтандартнаяОбработка = Ложь), если, например, не выполнены требуемые условия. Набор стандартных действий различен для разных форм и определяется расширением формы, соответствующим основному реквизиту формы. Например, для формы списка стандартная обработка заключается в передаче параметров, указанных при открытии формы, в динамический список, а при открытии формы отчета при выполнении стандартной обработки в форму загружается вариант и пользовательские настройки отчета. Рис. 3.12. Последовательность вызова событий модуля формы 56 После этого уже полностью подготовленная к изображению форма передается на клиента, и вызывается клиентское событие формы ПриОткрытии. Это событие возникает при открытии формы до показа ее окна пользователю. Здесь также можно отказаться от открытия формы, если по каким-то причинам она не должна быть открыта. Если форма наверняка будет открыта, то разработчик может в обработчике этого события выполнить некоторые интерактивные действия, которые невозможны на сервере: выдать предупреждение пользователю или открыть связанную форму, данные которой зависят от основной открываемой формы. Профессиональная разработка в системе «1С:Предприятие 8» Модули конфигурации При закрытии формы на стороне клиента происходят два события – ПередЗакрытием и ПриЗакрытии (здесь не рассматриваются события, возникающие при записи объекта из формы при ее закрытии). Событие ПередЗакрытием возникает при закрытии формы до закрытия окна формы. В обработчике этого события разработчик имеет возможность отказаться как от закрытия формы (Отказ = Истина), так и от выполнения стандартных действий при закрытии формы (СтандартнаяОбработка = Ложь), если, например, не выполнены требуемые условия. Набор стандартных действий, выполняемых после события ПередЗакрытием, также различен для разных форм и определяется расширением формы, соответствующим основному реквизиту формы. Например, если элемент справочника был модифицирован, одним из стандартных действий будет запрос сохранения изменений перед закрытием формы. Событие ПриЗакрытии возникает при закрытии формы после закрытия окна формы. В обработчике этого события можно описывать алгоритмы, которые должны быть выполнены только в случае, когда форма будет наверняка закрыта. Например, если нужно закрыть вспомогательную форму, существующую только в случае, если открыта основная форма. Контекст клиентских процедур модуля команды (рис. 3.13) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение), и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ экспортируемыми переменными, процедурами и функциями модуля управляемого приложения; ■■ локальным контекстом самого модуля команды. Контекст серверных процедур модуля команды (рис. 3.13) образуется: ■■ свойствами и методами глобального контекста; ■■ экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ серверными методами модуля команды. Модуль команды Для прикладных объектов конфигурации существуют подчиненные объекты Команды. Существуют также общие объекты конфигурации – объекты Общая команда. У каждой команды существует модуль команды, в котором можно написать предопределенную процедуру ОбработкаКоманды(), в которой на встроенном языке описываются действия, которые должна выполнить система при вызове этой команды. Модуль команды, так же как и модуль управляемой формы, существует и на сервере, и на клиенте. В модуле команды могут быть использованы следующие директивы компиляции: ■■ &НаКлиенте – процедура/функция исполняется в управляемом клиенте; ■■ &НаСервере – процедура/функция исполняется на сервере; ■■ &НаКлиентеНаСервере – процедура/функция может исполняться и в управляемом клиенте, и на сервере. Процедура ОбработкаКоманды() обязательно должна предваряться директивой компиляции &НаКлиенте, так как выполнение команды происходит в клиентском приложении. Из клиентских процедур модуля команды можно вызывать серверные, после их выполнения исполнение кода возвращается на клиента. Но при этом из серверных процедур/функций вызывать клиентские процедуры нельзя. Том 1 Рис. 3.13. Контекст модуля команды Модуль команды должен содержать только описание и функций и не может иметь переменных и тела модуля. процедур 57 Глава 3. Использование встроенного языка Хотя в модуле команды можно описывать методы с ключевым словом Экспорт, из встроенного языка невозможно получить доступ к командам и, следовательно, к их контексту тоже. Работа встроенного языка на сервере Организация выполнения кода на сервере или на клиенте Используя возможность управления компиляцией модулей, исполнение кода передается с клиента на сервер. После выполнения вызванной процедуры или функции система продолжит исполнение кода на клиенте. Архитектура системы ориентирована на максимальный перенос выполнения всей функциональности на сервер и максимальное «облегчение» клиента. На сервере выполняется вся работа прикладных объектов, выполняется подготовка к отображению форм (чтение объектов из информационной базы и заполнение данных формы, расположение элементов, запись данных формы после изменения) и командного интерфейса, формируются отчеты. На клиенте выполняется только отображение информации, подготовленной на сервере, выполняется взаимодействие с пользователем и вызовы серверных методов для выполнения необходимых действий. После запуска прикладного решения выполнение кода всегда осуществляется на клиенте. Передача выполнения с клиента на сервер может быть выполнена путем вызова серверных процедур, описанных с директивой компиляции &НаСервере, &НаСервереБезКонтекста из клиентских процедур модуля формы или команды, а также путем вызова процедуры общего модуля, исполняющегося на сервере. После того как вызываемая процедура завершит свою работу, выполнение будет передано обратно на клиента. (с директивой компиляции &НаКлиенте) можно вызывать серверные (с директивой компиляции &НаСервере, &НаСервереБезКонтекста), тем самым передавая выполнение с клиента на сервер. После выполнения серверных процедур исполнение кода возвращается на клиента. Принудительно передать исполнение кода в обратную сторону, с сервера на клиента, невозможно, то есть нельзя из серверных процедур модуля формы/команды вызывать клиентские. Рассмотрим пример. Пусть в форме накладной при изменении товара нужно подставлять цену товара из регистра сведений. Работа с прикладными объектами, в частности с регистром сведений, на клиенте невозможна. В этом случае на клиенте, в обработчике события при изменении товара, можно вызвать серверную (лучше внеконтекстную) процедуру, которая возвращает актуальную цену выбранного товара на указанную дату (листинги 3.9, 3.10). Листинг 3.9. Процедура «ТоварыТоварПриИзменении()» &НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) // … ЦенаТовара = РозничнаяЦена(Товар, Дата); КонецПроцедуры Листинг 3.10. Функция «РозничнаяЦена()» &НаСервереБезКонтекста Функция РозничнаяЦена(ВыбранныйТовар, АктуальнаяДата) // … Возврат Цена; КонецФункции Взаимодействие клиентского и серверного контекста исполнения в модуле формы показано на рис. 3.14. Клиентские и серверные процедуры в модуле формы, команды Простейшим примером передачи выполнения кода на сервер может служить вызов серверных процедур, описанных с директивой компиляции &НаСервере, &НаСервереБезКонтекста из клиентских процедур модуля формы или команды. Как уже говорилось выше, модуль формы и модуль команды существуют одновременно как на клиенте, так и на сервере. Таким образом, процедуры, содержащиеся в этих модулях, исполняются или в контексте клиента, или в контексте сервера. В целом исполнение модуля формы/команды на клиенте и на сервере характеризуется тем, что из клиентских процедур модуля формы/команды 58 Рис. 3.14. Передача исполнения кода на сервер в модуле формы Если процедура часто используется, имеет смысл поместить ее в общем серверном модуле и вызывать ее из серверной процедуры модуля формы. Профессиональная разработка в системе «1С:Предприятие 8» Работа встроенного языка на сервере Для реализации нужной функциональности форм разработчик может использовать клиентские и серверные процедуры в модуле формы. В целях оптимизации клиент-серверного взаимодействия нужно соблюдать следующие рекомендации: ■■ основной объем кода должен содержаться в серверных процедурах (с директивой компиляции &НаСервере, &НаСервереБезКонтекста). Клиентские процедуры (&НаКлиенте) должны содержать небольшой и несложный для исполнения код; ■■ нужно стремиться к минимизации серверных вызовов, то есть ситуаций, когда из клиентских процедур вызываются серверные; ■■ везде, где возможно, нужно использовать внеконтекстные серверные вызовы (&НаСервереБезКонтекста) вместо вызовов сервера с контекстом формы (&НаСервере). Это быстрее и эффективнее. Подробнее Раздел «Оптимизация клиент-серверного взаимодействия в формах», стр. 391. Листинг 3.11. Передача исполнения кода на сервер путем вызова процедуры серверного общего модуля &НаКлиенте Процедура ВыполнитьНаСервере(Команда) Серверный.ВыполнитьНаСервере(); КонецПроцедуры После того как выполнение передано на сервер, все остальные вызовы процедур и функций будут выполняться также на стороне сервера (рис. 3.16). Например, общий модуль Расчеты, который компилируется как на стороне сервера, так и на стороне клиента, содержит экспортируемую процедуру Пересчитать(). Как видно из рисунка, сначала на клиенте в модуле формы отчета вызывается экспортируемая процедура общего серверного модуля Серверный, и управление передается на сервер. Затем из этой процедуры вызывается процедура Пересчитать(). При этом выполнение кода продолжится на сервере, и процедура Пересчитать() будет вызвана из серверного экземпляра модуля Расчеты. Вызов процедур из серверных модулей Передача выполнения кода на сервер может быть осуществлена посредством вызова экспортируемой процедуры общего модуля, у которого установлено свойство Сервер и свойство Вызов сервера. Экземпляр этого модуля будет скомпилирован только на стороне сервера. При вызове в модуле формы отчета этой экспортной процедуры выполнение будет передано на сервер, в экспортируемую процедуру общего модуля. После ее завершения управление вернется на клиента (рис. 3.15). Рис. 3.16. Исполнение вызовов процедур на сервере После ее завершения управление вернется на клиента. Затем из модуля формы снова вызывается процедура Пересчитать(). Однако теперь эта процедура будет вызвана из клиентского экземпляра модуля Расчеты. Рис. 3.15. Передача выполнения кода на сервер Например, можно вызвать процедуру неглобального серверного общего модуля (с установленными свойствами Сервер и Вызов сервера) из клиентского обработчика команды в модуле формы (листинг 3.11). Том 1 Важно отметить, что разработчик не может «управлять» передачей выполнения с сервера обратно на клиента. Выполнение будет передано только после завершения выполнения вызванной процедуры или функции. Другими словами, если выполнение осуществляется на сервере, и вызываемая процедура не найдена в скомпилированном на стороне сервера коде, то будет выдано сообщение об ошибке даже в том случае, если вызываемая процедура присутствует в экземпляре, скомпилированном на стороне клиента (рис. 3.17). 59 Глава 3. Использование встроенного языка Привилегированный и безопасный режимы исполнения кода В процессе функционирования прикладного решения могут возникать ситуации, когда некоторые действия нужно выполнить максимально быстро, без проверки прав пользователя на используемые данные, а при выполнении некоторых действий, наоборот, нужно оградить систему от выполнения «ненадежного» кода, представляющего потенциальную угрозу для ее безопасности. Для этого платформа поддерживает привилегированный и безопасный режимы исполнения кода. Привилегированный режим Рис. 3.17. Исполнение вызовов процедур на сервере Передача параметров на сервер и возврат значений При передаче выполнения кода на сервер, как правило, выполняется передача некоторых параметров вызываемой процедуры или функции. Также в случае вызова функции будет выполняться передача результата работы функции с сервера на клиента. Важно учитывать, что не все типы значений и объекты, работа с которыми возможна на сервере, могут быть переданы с клиента на сервер и обратно. В привилегированном режиме код исполняется на сервере без проверки прав. Использование привилегированного режима позволяет, во-первых, ускорить работу, так как не будут накладываться ограничения на доступ к данным, а во-вторых, позволяет выполнять операции с данными от лица пользователей, которым эти данные недоступны. Для поддержки привилегированного режима в платформе существует несколько возможностей. Для документов прямо в свойствах конфигурации можно задать использование привилегированного режима при проведении и при отмене проведения документа. Эти свойства стандартно устанавливаются платформой для новых документов (рис. 3.18). Точная информация о возможности использования типов значений и объектов на сервере и передаче их между клиентом и сервером находится в документации, в описании конкретных объектов. В синтакс-помощнике при описании объектов, которые могут передаваться между клиентом и сервером, содержится фраза «Возможен обмен с сервером». Поскольку на клиенте невозможна работа с объектными данными, то на сервер можно передавать ссылку на объект, а в серверной процедуре получать по этой ссылке объект и работать с ним. Обмен с сервером возможен некоторым набором типов, для которых такой обмен поддерживается, а для обмена «специфическими» данными (например, файлами, картинками, табличными частями документа) предназначено временное хранилище. Методом ПоместитьВоВременноеХранилище() сериализуемое значение сохраняется во временном хранилище, а затем методом ПолучитьИзВременногоХранилища() значение извлекается из временного хранилища по указанному адресу. Например, временное хранилище может быть использовано для передачи данных между формами, минуя клиента, что особенно эффективно в случае больших объемов передаваемых данных. 60 Рис. 3.18. Установка привилегированного режима при проведении и отмене проведения документа Профессиональная разработка в системе «1С:Предприятие 8» Работа встроенного языка на сервере Для бизнес-процессов также прямо в свойствах конфигурации можно задать использование привилегированного режима при создании задач. Эти свойства стандартно устанавливаются платформой для новых бизнес-процессов (рис. 3.19). Безопасный режим Безопасный режим работы предназначен для защиты системы от выполнения на сервере «ненадежного» программного кода. Потенциальную опасность представляют внешние обработки или программный код, вводимый пользователем для использования в методах Выполнить() и Вычислить(). Безопасный режим рекомендуется включать при выполнении на сервере программного кода, надежность которого разработчик гарантировать не может. Для этого в глобальном контексте существует процедура УстановитьБезопасныйРежим(), а также функция БезопасныйРежим(), которая позволяет определить, включен безопасный режим или нет. А также при создании и подключении внешних обработок и отчетов платформа стандартно устанавливает параметр БезопасныйРежим в значение Истина. В безопасном режиме накладываются следующие ограничения: Рис. 3.19. Установка привилегированного режима при создании задач Привилегированный режим исполнения кода можно включить/выключить средствами встроенного языка. Для этого в глобальном контексте существует процедура УстановитьПривилегированныйРежим(), а также функция ПривилегированныйРежим(), которая позволяет определить, включен привилегированный режим или нет. Привилегированный режим рекомендуется использовать тогда, когда работа с данными от лица некоторого пользователя не нарушает установленные для этого пользователя права доступа. Например, кладовщик имеет доступ к документу, регистрирующему продажи, но не имеет доступа к самому регистру продаж, в котором содержатся движения документа, возникающие при его проведении. В этом случае использование привилегированного режима при проведении документа не делает данные регистра продаж доступными кладовщику, но позволяет проводить документ и сохранять в регистре движения документа. Можно также поместить код, не требующий проверки прав, в привилегированные общие модули, у которых установлено свойство Привилегированный. В такие модули могут быть перенесены операции, использующие данные, на которые у текущего пользователя нет прав. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 5.5.4.2. Том 1 ■■ привилегированный режим отменяется, если он был установлен; ■■ попытки перехода в привилегированный режим игнорируются; ■■ запрещены операции с COM-объектами; ■■ запрещена загрузка и подключение внешних компонентов; ■■ запрещен доступ к файловой системе (кроме временных файлов); ■■ запрещен доступ к Интернету. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 5.5.4.3. Работа с метаданными Встроенный язык «1С:Предприятия» позволяет работать с метаданными. Одним из концептуальных моментов этой работы является то, что доступ к метаданным предоставляется только на чтение. Таким образом, средствами встроенного языка разработчик не может модифицировать метаданные. Изменение структуры метаданных возможно только средствами визуального конструирования в режиме Конфигуратор. Для доступа к метаданным из встроенного языка используется объект ОбъектМетаданныхКонфигурация, который доступен через свойство глобального контекста Метаданные. Этот объект предоставляет доступ как к свойствам самой конфигурации, так и к отдельным коллекциям объектов метаданных, которые описывают различные виды прикладных 61 Глава 3. Использование встроенного языка объектов, определенных в прикладном решении. Например, для доступа к коллекции объектов метаданных, описывающих документы, можно использовать следующий код (листинг 3.12). Листинг 3.12. Доступ к коллекции метаданных МетаданныеДокументов = Метаданные.Документы; А для того, чтобы получить доступ к объектам конфигурации, описывающим справочники, можно использовать такой вызов (листинг 3.13). Листинг 3.13. Доступ к коллекции метаданных МетаданныеСправочников = Метаданные.Справочники; Элементами таких коллекций являются объекты метаданных, которые позволяют получить доступ как к специфическим свойствам объектов, так и к свойствам, общим для различных объектов метаданных. Например, можно получить описание реквизитов объекта, табличных частей объекта и их реквизитов, описания форм, макетов объекта и т. д. (листинг 3.14). Листинг 3.14. Получение описаний реквизитов объектов метаданных // Для объекта метаданных "Документ.АккредитивПереданный" можно получить: // описание реквизита "ВалютаДокумента" Объект = Метаданные.Документы.АккредитивПереданный.Реквизиты.ВалютаДокумента; // описание табличной части "РасшифровкаПлатежа" Объект = Метаданные.Документы.АккредитивПереданный.ТабличныеЧасти.РасшифровкаПлатежа; // описание реквизита табличной части "ДоговорКонтрагента" Объект = Метаданные.Документы.АккредитивПереданный. ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.ДоговорКонтрагента; Реквизиты, табличные части объекта метаданных также представляют собой коллекцию объектов метаданных, состоящих из объектов метаданных, описывающих отдельный реквизит или отдельную табличную часть. В качестве примера на следующей схеме представлена связь объектов, описывающих реквизиты и табличные части объекта метаданных Документ.АккредитивПереданный (рис. 3.20). Таким образом, в большинстве случаев значение некоторого свойства объекта метаданных может быть получено по следующей цепочке программных объектов (рис. 3.21). Рис. 3.20. Описание реквизитов и табличных частей документа 62 Профессиональная разработка в системе «1С:Предприятие 8» Работа с метаданными Листинг 3.15. Пример использования метода «Содержит()» // В качестве примера выбирается первая запись из первого набора записей, // содержащегося в движениях документа. Сообщение = Новый СообщениеПользователю; Движения = Документы.АвансовыйОтчет.НайтиПоНомеру("ТК000009", '20110101000000'). ПолучитьОбъект().Движения[0]; Движения.Прочитать(); ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Движения[0])); Если Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру накопления"; Сообщение.Сообщить(); Рис. 3.21. Цепочка объектов описания метаданных Такой подход позволяет упростить и унифицировать работу с метаданными. Объекты метаданных имеют различный набор свойств, перечень которых можно узнать при помощи команды Конфигурация Отчет по конфигурации… Кроме этого, все коллекции объектов метаданных допускают обращение к элементам коллекции по имени или индексу. Также показанные на схеме объекты имеют набор следующих методов (рис. 3.22). ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру сведений"; Сообщение.Сообщить(); ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру бухгалтерии"; Сообщение.Сообщить(); ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру расчета"; Сообщение.Сообщить(); КонецЕсли; Поскольку метаданные имеют иерархическую структуру, объект, полученный методом НайтиПоТипу(), не всегда может находиться в первом уровне иерархии нужной коллекции объектов метаданных. В этом случае можно использовать метод Родитель() объекта метаданных для того, чтобы получить объект, находящийся на нужном уровне иерархии. Например, если некоторая универсальная процедура обрабатывает табличные части справочников по одному алгоритму, а табличные части документов – по другому, то проанализировать принадлежность табличной части определенному виду метаданных можно следующим образом (листинг 3.16). Рис. 3.22. Методы объектов описания метаданных Объект ОбъектМетаданныхКонфигурация содержит два метода, которые позволяют найти объект метаданных, описывающий некоторое значение или тип. Полученное таким образом значение может быть использовано для того, чтобы найти его в некоторой коллекции объектов метаданных (метод Содержит() объекта КоллекцияОбъектовМетаданных) или сравнить с конкретным объектом метаданных. Например, в процессе перебора движений документа требуется определить, к какому именно виду регистров относится данная запись регистра. В этом случае для записи можно найти соответствующий объект метаданных и затем определить, в какую из коллекций объектов метаданных, описывающих регистры, входит полученный объект метаданных (листинг 3.15). Том 1 Листинг 3.16. Пример использования метода «Родитель()» // В качестве примера получается табличная часть "Товары" // документа "АвансовыйОтчет". Сообщение = Новый СообщениеПользователю; ТабличнаяЧасть = Документы.АвансовыйОтчет.НайтиПоНомеру("ТК000009", '20110101000000'). ПолучитьОбъект().Товары; ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ТабличнаяЧасть)).Родитель(); Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это табличная часть справочника"; Сообщение.Сообщить(); ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это табличная часть документа"; Сообщение.Сообщить(); КонецЕсли; 63 Глава 3. Использование встроенного языка Как уже говорилось выше, коллекция объектов метаданных позволяет обращаться к объектам по имени или индексу. Кроме этого, коллекция поддерживает итератор Для Каждого…, с помощью которого, например, может быть организован перебор всех элементов справочников, содержащихся в конфигурации (листинг 3.17). Листинг 3.17. Использование итератора «Для Каждого» 64 Профессиональная разработка в системе «1С:Предприятие 8» Сообщение = Новый СообщениеПользователю; Для Каждого Справочник из Метаданные.Справочники Цикл Сообщение.Текст = Символы.ПС + Справочник.ПолноеИмя(); Сообщение.Сообщить(); МенеджерСправочника = Справочники[Справочник.Имя]; Выборка = МенеджерСправочника.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение.Текст = Выборка.Наименование; Сообщение.Сообщить(); КонецЦикла; КонецЦикла; Объектные и необъектные данные Глава 4. Работа с данными Объектные и необъектные данные Объектные данные Все данные, которые хранятся в базе данных «1С:Предприятия», можно разделить на две категории: объектные и необъектные. Поскольку природа этих данных различна, различаются и способы работы с ними. Модель хранения данных К объектным данным относятся данные справочников, документов, планов видов характеристик, планов счетов, планов видов расчета, бизнеспроцессов, задач, планов обмена. К необъектным данным относятся данные регистров сведений, регистров накопления, регистров расчета, перерасчетов, регистров бухгалтерии и последовательностей. Также к необъектным данным относятся константы. С точки зрения системы объектные данные состоят из отдельных объектов. Каждый из этих объектов обладает внутренним уникальным идентификатором, благодаря наличию которого к некоторой совокупности значений, хранящихся в базе данных, можно обращаться как к единому целому – объекту. Например, объектом является элемент справочника или документ. Каждый объект, помимо того что он является совокупностью значений некоторых полей, имеет также определенную значимость сам по себе. Например, элемент справочника ФизическиеЛица – это некое физическое лицо, которое имеет набор характеризующих его значений: имя, фамилия, отчество, паспортные данные и т. д. У него может поменяться, например, фамилия или паспортные данные, но при этом с точки зрения системы он останется тем же самым физическим лицом – объектом. Удаление какоголибо объекта из системы приводит к тому, что состояние базы данных с точки зрения прикладного решения изменяется. Даже создав новый элемент справочника ФизическиеЛица с теми же самыми значениями реквизитов, мы получим уже другое состояние базы данных, поскольку это будет уже другой объект с другим уникальным идентификатором. К объектным данным в «1С:Предприятии» относятся данные следующих объектов конфигурации: ■■ Справочник, ■■ Документ, ■■ План видов характеристик, ■■ План счетов, ■■ План видов расчета, ■■ План обмена, ■■ Бизнес-процесс, ■■ Задача. Для каждой объектной сущности конфигурации система создает набор связанных между собой таблиц, в которых и будут храниться данные этого объекта. Количество и состав таблиц различны для каждого объекта метаданных. Структура хранения объектных данных всегда состоит из основной таблицы и, возможно, нескольких других таблиц (по одной таблице на каждую табличную часть объекта). Например, для документа Доверенность, который имеет некоторый набор реквизитов и табличную часть Товары (рис. 4.1), в базе данных будут созданы две таблицы. В отличие от объектных данных, необъектные данные не имеют собственной ценности и полностью описываются значениями своих полей. Необъектные данные представляют собой записи, которые хранятся в базе данных. Для записей не поддерживаются внутренние уникальные идентификаторы. Удалив некоторую запись и создав новую с точно такими же значениями полей, мы получим то же самое состояние базы данных, которое было до удаления записи. Рассмотрим работу с объектными и необъектными данными более подробно. Том 1 Рис. 4.1. Документ «Доверенность» 65 Глава 4. Работа с данными Таблица документа будет содержать поля для каждого реквизита документа, а для табличной части будет создана отдельная таблица, содержащая поля для всех реквизитов табличной части документа (рис. 4.2). Ссылка Значение ссылочного типа (СправочникСсылка.<имя>, ДокументСсылка.<имя> и т. д.) используется везде, где требуется однозначно идентифицировать объект базы данных. Фактически такое значение представляет собой внутренний идентификатор, который хранится в поле Ссылка таблиц базы данных. Например, справочник Валюты хранится в базе данных в таблице, которая, помимо служебных колонок (стандартных реквизитов), содержит отдельные колонки для каждого реквизита справочника, заданного в конфигураторе. Поле Ссылка – это одно из служебных полей. Значение этого поля позволяет однозначно отличить один элемент справочника от другого (проще говоря, одну валюту от другой), рис. 4.3. Рис. 4.2. Таблицы документа «Доверенность» Отличительной особенностью этих таблиц является то, что каждая из них содержит поле Ссылка, в котором хранится внутренний идентификатор, соответствующий каждому из документов. Таким образом, объект документа представляет собой совокупность записи основной таблицы и строк табличных частей, относящихся к этому документу. Основная таблица объектных данных также содержит обязательное поле, в котором хранится текущая версия объекта. Значение этого поля изменяется при каждой записи данных объекта в базу данных. Благодаря использованию этого поля обеспечивается оптимистическая блокировка объектных данных. Подробнее Раздел «Оптимистическая блокировка», стр. 74. Для работы с объектными данными во встроенном языке существуют два основных типа: ссылка и объект. Рассмотрим каждый из них более подробно. 66 Рис. 4.3. Поле «Ссылка» справочника «Валюты» Значение ссылки может, например, выбираться в полях ввода, храниться в полях других таблиц базы данных и т. д. Например, поля Организация и ФизЛицо документа Доверенность будут хранить ссылки на элементы справочников Организации и ФизическиеЛица (рис. 4.4). Значения ссылочного типа можно сравнивать между собой. Важным моментом является то, что для каждого объекта конфигурации во встроенном языке создается свой тип ссылки. Таким образом, например, ссылка на справочник Организации никогда не будет равна ссылке на справочник ФизическиеЛица, поскольку это значения разных типов. Однако две ссылки на справочник Организации могут быть равны между собой, и это будет выполняться только в том случае, если это ссылки на один и тот же объект базы данных (рис. 4.5). Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные Листинг 4.1. Сравнение объектов «Ссылка» Ссылка1 = Справочники.Валюты.НайтиПоКоду("000000810"); ВыборкаВалют = Справочники.Валюты.Выбрать(); Пока ВыборкаВалют.Следующий() Цикл Если Ссылка1 = ВыборкаВалют.Ссылка Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " " + ВыборкаВалют.Код + " " + ВыборкаВалют.Наименование; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; Типы ссылок имеют значение по умолчанию – так называемую пустую ссылку. Пустая ссылка – это значение ссылки, которому не соответствует ни один объект в базе данных. Фактически такой внутренний идентификатор выглядит следующим образом: 00000000-0000-0000-0000-000000000000 Рис. 4.4. Хранение ссылок в полях базы данных Так как тип ссылки создается для каждого объекта конфигурации, то, например, пустые ссылки на разные справочники никогда не будут равны между собой (листинг 4.2). Листинг 4.2. Сравнение пустых ссылок ПустаяСсылкаНоменклатура = Справочники.Номенклатура.ПустаяСсылка(); ПустаяСсылкаКонтрагенты = Справочники.Контрагенты.ПустаяСсылка(); Если ПустаяСсылкаНоменклатура <> ПустаяСсылкаКонтрагенты Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Ссылки не равны"; Сообщение.Сообщить(); КонецЕсли; Ссылка позволяет обращаться к свойствам объекта базы данных, а также получать сам объект. При этом выполняется чтение информации из базы данных, поскольку сама ссылка не содержит этих данных. Подробнее Раздел «Объект», стр. 69. Представление ссылочных значений Рис. 4.5. Сравнение объектов «Ссылка» Ссылки, указывающие на один и тот же объект базы данных, будут равны между собой независимо от того, каким образом они получены. Например, ссылка на валюту с кодом 810 (рубли), полученная через менеджера справочника Валюты, будет равна ссылке на эту валюту, полученной из выборки справочника Валюты (листинг 4.1). Том 1 Поскольку ссылочные значения могут выбираться в поле ввода и использоваться в других элементах интерфейса системы, существует механизм формирования представлений ссылочных значений. Благодаря этому механизму, пользователь может оперировать не безличными внутренними идентификаторами, которые содержит ссылка, а вполне определенными и понятными ему данными, идентифицирующими объекты базы данных. При добавлении объектов конфигурации система самостоятельно определяет правила формирования представлений ссылочных значений, 67 Глава 4. Работа с данными и от разработчика не требуется никаких специальных действий. Однако при необходимости он может внести изменения в правила формирования представлений для ссылок на некоторые типы объектов базы данных. Например, для элементов справочников, видов характеристик, счетов, видов расчетов и узлов планов обмена представление ссылок может быть задано либо в виде кода, либо в виде наименования (рис. 4.6). А для документов и бизнес-процессов система предоставляет только единственное неизменяемое представление ссылочных значений в виде совокупности синонима документа или бизнес-процесса, его номера и даты. Например: «Приходная накладная 000000003 от 03.05.2011 15:35:27». Контроль ссылочной целостности «1С:Предприятие» предоставляет разработчику возможность контролировать ссылочную целостность базы данных, однако использование этой возможности не является обязательным. С точки зрения платформы в базе данных вполне могут содержаться неразрешимые ссылки (т. е. ссылки на объекты, которых не существует в базе данных), и это не является ошибкой. Необходимость поддержания ссылочной целостности базы данных определяется логикой прикладного решения, и ситуация, когда база данных содержит ссылки на несуществующие объекты, может быть вполне допустимой для данного прикладного решения. Вопрос о необходимости контроля ссылочной целостности возникает при удалении данных из базы данных. Система позволяет гибко использовать возможности контроля ссылочной целостности как при интерактивном, так и при программном удалении объектов. Интерактивное удаление объектов может быть выполнено двумя способами. Рис. 4.6. Задание представления справочника Для задач разработчик может выбрать между представлением ссылок в виде номера или наименования (рис. 4.7). Во-первых, объект может быть удален непосредственно из базы данных. В этом случае не будет выполняться никаких проверок ссылочной целостности и последующее восстановление объекта будет невозможно. Возможность непосредственного интерактивного удаления регулируется правом Интерактивное удаление. Во-вторых, интерактивное удаление может быть выполнено с использованием механизма контроля ссылочной целостности. В этом случае удаление выполняется в два этапа: сначала пользователь устанавливает пометку удаления для тех объектов, которые он собирается удалить, а затем выполняет процедуру удаления помеченных объектов. При этом сначала будет выполнен поиск ссылок на удаляемые объекты в других данных, а затем для объектов, ссылки на которые отсутствуют, будет выполнено удаление. Рис. 4.7. Задание представления задачи 68 При удалении объектов средствами встроенного языка также существует возможность использовать или не использовать контроль ссылочной целостности. Непосредственное удаление объектов может быть выполнено методом объекта Удалить(), в то время как пометка на удаление может быть установлена с помощью метода объекта УстановитьПометкуУдаления(). Последующий поиск помеченных на удаление объектов может быть выполнен при помощи функции глобального контекста НайтиПомеченныеНаУдаление(), а их удаление – глобальной процедурой УдалитьОбъекты(), которая позволяет удалять объекты как с контролем Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные ссылочной целостности, так и без. При этом следует учитывать, что удаление с контролем ссылочной целостности выполняется в монопольном режиме. При необходимости может быть выполнен отдельно только поиск ссылок на удаляемые объекты – для этого используется функция глобального контекста НайтиПоСсылкам(), которая возвращает список найденных ссылок на переданные ей объекты. Особенности использования пометки удаления Для того чтобы отличить объекты, помеченные на удаление, от других объектов базы данных, таблицы, хранящие данные этих объектов, содержат специальное поле ПометкаУдаления. Значение этого поля может быть установлено двумя способами. Рис. 4.8. Документ «ЗаказПоставщику» Объект документа (ДокументОбъект.ЗаказПоставщику) будет представлять собой совокупность значений полей основной таблицы документа и полей каждой из таблиц, в которых хранятся данные его табличных частей (рис. 4.9). Во-первых, может использоваться интерактивная установка пометки удаления или программное выполнение метода объекта УстановитьПометкуУдаления(). В этом случае кроме собственно установки значения этого поля будет выполнен ряд дополнительных действий, состав которых зависит от типа помечаемого объекта. Например, для справочника будет установлена пометка удаления для всех подчиненных элементов этого справочника и подчиненных справочников, для документа будет выполнена отмена проведения и т. д. Также будет вызвано событие объекта ПередЗаписью(), поскольку будет выполняться сохранение измененного свойства ПометкаУдаления этого объекта. Во-вторых, значение поля ПометкаУдаления может быть установлено путем непосредственной установки свойства ПометкаУдаления объекта и последующей его записи. В этом случае никаких дополнительных действий выполняться не будет, однако следует учитывать особенности работы некоторых объектов. Например, документ не может быть одновременно проведен и помечен на удаление, поэтому, если требуется пометить на удаление проведенный документ, предварительно следует установить его свойство Проведен в значение Ложь или выполнить отмену проведения документа (Записать(РежимЗаписиДокумента.ОтменаПроведения)). Объект Тип объекта служит, прежде всего, для модификации (чтения и изменения) данных, содержащихся в объекте базы данных. Остальные объекты встроенного языка позволяют только читать информацию базы данных. Как уже говорилось ранее, объект представляет собой совокупность записи основной таблицы и строк табличных частей, относящихся к этому объекту. Например, рассмотрим документ ЗаказПоставщику, имеющий три табличные части (рис. 4.8). Том 1 Рис. 4.9. Данные объекта документа Тип объекта используется при создании новых объектов для редактирования и удаления существующих объектов. Кроме этого, тип объекта используется для отображения и редактирования всех данных объекта в форме объекта. 69 Глава 4. Работа с данными Значения этого типа, так же как и значения ссылок, можно сравнивать между собой. Однако, в отличие от ссылок, значения этого типа будут равны между собой только тогда, когда они являются одним и тем же экземпляром программного объекта. Например, если в следующем примере (листинг 4.3) в переменную Объект1 получить экземпляр программного объекта, соответствующий элементу справочника Номенклатура и затем значение этой переменной присвоить переменной Объект2, то значения этих переменных будут равны. Во-вторых, значение этого типа может быть получено из ссылки путем выполнения метода ПолучитьОбъект(). В этом случае будет создан экземпляр программного объекта и выполнено чтение данных из базы данных (или из кеша). При этом считываются значения всех реквизитов объекта и значения всех реквизитов всех его табличных частей (рис. 4.11). Листинг 4.3. Сравнение объектов Объект1 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Объект2 = Объект1; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объект1 = Объект2"; Сообщение.Сообщить(); Если же в переменные Объект1 и Объект2 получить экземпляры объекта, соответствующие одному и тому же элементу справочника Номенклатура, то значения этих переменных не будут равны, несмотря на то, что в них считан один и тот же объект базы данных и совпадают все данные этого объекта (листинг 4.4). Листинг 4.4. Сравнение объектов Объект1 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Объект2 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объект1 <> Объект2"; Сообщение.Сообщить(); Рис. 4.11. Получение объекта В-третьих, значение этого типа может быть получено из выборки путем выполнения метода с аналогичным названием – ПолучитьОбъект(). В этом случае также будет создан экземпляр программного объекта, однако чтение из базы данных выполняться не будет, т. к. выборка считывает из базы данных все данные объектов, и данные созданного экземпляра объекта будут заполнены непосредственно из программного объекта выборки (рис. 4.12). Значение типа Объект может быть получено несколькими способами. Во-первых, значение этого типа может быть получено через менеджер объекта, с использованием соответствующего метода (например, для справочников это метод СоздатьЭлемент(), для документов – СоздатьДокумент() и т. д.). При этом будет создан новый экземпляр программного объекта, которому не соответствует ни один объект в базе данных. В дальнейшем, когда будет выполнена запись этого объекта, появится и новый объект в базе данных (рис. 4.10). Рис. 4.12. Получение объекта В связи с тем, что тип объекта позволяет модифицировать данные, он имеет (помимо свойств и методов) целый ряд событий, позволяющих разработчику определять собственный алгоритм обработки выполняемых действий. Среди основных событий, поддерживаемых этим типом, можно перечислить следующие. ПередЗаписью – это событие возникает перед записью объекта в базу данных, после начала транзакции записи, но до начала непосредственной записи данных. В обработчике этого события можно проанализировать необходимость (или возможность) выполнения записи данных и отказаться от нее, если какие-либо условия не выполняются. ПриЗаписи – это событие возникает после того, как данные записаны Рис. 4.10. Создание нового объекта 70 в базу данных, но до того, как окончится транзакция записи. В обработчике этого события можно выполнять те действия, которые обязательно Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные должны быть выполнены только в том случае, если объект записан. Здесь также разработчик может отказаться от записи данных, если, например, в результате записи этих данных в базу нарушаются какие-либо условия. – это событие возникает у нового объекта данных в том случае, если он создается путем копирования (интерактивного или программного) существующего объекта данных. ПриКопировании ОбработкаЗаполнения – это событие также возникает у нового объекта данных при интерактивном создании нового объекта, при вводе объекта на основании (интерактивного или программного), а также при выполнении метода объекта Заполнить(). В обработчике этого события предусматривается некоторый алгоритм, позволяющий выполнять начальное заполнение реквизитов нового объекта в зависимости от типа объекта-основания. ОбработкаПроверкиЗаполнения – это событие вызывается перед записью данных объекта, до начала транзакции записи. В обработчике этого события разработчик может реализовать собственные алгоритмы проверки заполнения реквизитов объекта, добавить в массив проверяемых реквизитов дополнительные реквизиты, чтобы платформа выполнила их проверку, или очистить массив проверяемых реквизитов, отказавшись от их стандартной проверки. Разработчик также может отказаться от записи объекта, если, например, какие-то условия проверки не были выполнены. ПередУдалением – это событие возникает в транзакции удаления перед непосредственным удалением объекта из базы данных. В обработчике этого события можно предусмотреть выполнение каких-либо действий перед удалением объекта, а также при необходимости отменить удаление объекта, если не выполняются какие-либо условия. Кеширование представлений и объектов При работе с объектными данными (как программно, так и интерактивно), система выполняет кеширование считываемых данных в оперативной памяти. Для этого используется кеш объектов. При любых интерактивных действиях и при программном доступе к объектным данным с использованием объектной модели прежде всего система будет выполнять обращение к кешу объектов для того, чтобы получить запрашиваемые данные. Кеш объектов состоит из двух частей: транзакционного кеша и обычного кеша. В зависимости от того, происходит ли чтение в рамках транзакции или нет, будет выполняться обращение к той или иной части кеша (рис. 4.13). В кеш объектов считываются два «вида» данных: либо все данные объекта целиком, либо значения полей, необходимые для формирования представления ссылки на данный объект. Том 1 Рис. 4.13. Обращение к кешу объектов Значения полей, необходимые для получения представления ссылки, считываются тогда, когда возникает необходимость отобразить ссылку на объект в каком-либо элементе интерфейса, а также при явном или неявном преобразовании ссылочной переменной к типу Строка. В остальных случаях выполняется полное чтение всех данных объекта, в том числе и тогда, когда выполняется обращение к какому-либо реквизиту объекта через точку от ссылки. Эту особенность нужно учитывать при проектировании структуры объектов конфигурации. Так, например, если предполагается хранение в информационной базе картинок, образов файлов или больших текстовых данных, то рекомендуется создавать для этого отдельные структуры хранения (например, справочники или регистры сведений), а не включать эту информацию в состав реквизитов или табличных частей объектов, которым эта информация соответствует. Это позволит избежать считывания и записи больших объемов данных при работе с этими объектами. Обычный кеш Если при обращении к обычному кешу требуемых данных в нем нет, то выполняется чтение данных объекта из базы данных и сохранение их в кеше. Уникальным идентификатором для кеша в данном случае будет являться ссылка на объект базы данных. Поэтому данные каждого считанного объекта могут существовать в кеше в одном из двух видов: либо все данные объекта, либо представление объекта. Таким образом, если мы обратимся к кешу для получения представления объекта и в кеше есть информация для нашей ссылки, данные будут взяты из кеша (если в кеше весь объект, нужное представление будет получено из данных объекта). Если в кеше нет информации для нашей ссылки, из базы данных в кеш будут считаны только поля, необходимые для формирования представления объекта. 71 Глава 4. Работа с данными Если мы обратимся к кешу для получения реквизита объекта (через точку от ссылки) и в кеше есть информация для нашей ссылки, дальнейшие действия будут зависеть от того, какие именно данные находятся в кеше. Если в кеше весь объект, значение реквизита будет получено из кеша. Если в кеше представление объекта, оно будет удалено из кеша и в кеш будут считаны все данные объекта. Если же при получении реквизита объекта в кеше нет информации для нашей ссылки, из базы данных будут считаны все поля объекта. Считанные данные будут находиться в кеше до тех пор, пока не наступит одно из четырех событий: ■■ считанные данные будут вытеснены из кеша другими считанными данными других объектов (переполнение кеша); ■■ при очередном обращении к кешу окажется, что считанные данные были изменены в базе данных; ■■ закончится интервал времени в 20 минут; ■■ данные будут изменены в базе данных. Все считанные данные помещаются в последовательную очередь, и, поскольку объем кеша ограничен, наиболее старые данные будут вытесняться из кеша последними считанными данными. При повторном обращении к кешу за данными уже считанного объекта будет анализироваться интервал времени, прошедший с момента появления данных в кеше. Если обращение происходит в пределах 20 секунд после поступления данных в кеш, данные считаются верными (валидными). Если интервал превысил 20 секунд, будет выполняться проверка на то, что версия данных, хранящихся в кеше, соответствует версии данных, находящихся в базе данных. Если окажется, что версии данных не совпадают (т. е. произошло изменение данных в базе данных), данные, находящиеся в кеше, будут удалены из него и выполнено повторное считывание данных из базы данных. Начиная с этого момента, начнется отсчет следующего 20-секундного интервала валидности этих данных. Кроме всех вышеперечисленных событий, считанные данные будут удалены из кеша по истечении 20 минут после их последнего считывания из базы данных. На выполнение второго оператора будет тратиться гораздо меньше времени, поскольку в первом случае (с большой долей вероятности) будет выполняться обращение к базе данных и чтение всех данных объекта, а во втором – чтение из оперативной памяти (кеша объектов). Транзакционный кеш Если обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кешу. Транзакционный кеш по сути представляет собой ту же последовательную очередь, что и обычный кеш, за исключением того, что все данные, находящиеся в транзакционном кеше, являются валидными (гарантированно актуальными). При считывании данных в транзакционный кеш устанавливается блокировка на данные в базе данных, поэтому они гарантированно не могут быть изменены до окончания транзакции. Транзакционный кеш хранит считанные данные до тех пор, пока они не будут вытеснены более поздними считанными данными или пока не закончится транзакция. По окончании транзакции транзакционный кеш очищается, однако действия, выполняемые при этом, зависят от состояния завершения транзакции. Если транзакция завершена успешно (Commit), данные всех объектов, содержащиеся в транзакционном кеше, переносятся в обычный кеш, а транзакционный кеш очищается (рис. 4.14). Рис. 4.14. Успешное завершение транзакции Если был выполнен отказ от изменений (Rollback), то просто очищается транзакционный кеш (рис. 4.15). Рассмотрим последовательное выполнение двух операторов (листинг 4.5), где Номенклатура – это ссылка на объект справочника, а Наименование и ВидНоменклатуры – реквизиты справочника Номенклатура. Листинг 4.5. Последовательное обращение к реквизитам объекта А = Номенклатура.Наименование; В = Номенклатура.ВидНоменклатуры; Рис. 4.15. Откат транзакции 72 Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные Оптимизированная запись объектов При записи объектов базы данных (программной или интерактивной) выполняется оптимизация записи изменений в базу данных. Так, например, если не менялись значения реквизитов самого объекта, то будет записана только минимальная информация об изменении (версия объекта). Неопределено, если новый элемент создается интерактивной командой из панели действий. Поэтому в алгоритме начального заполнения нового объекта полезно проанализировать этот параметр и в зависимости от его значения выполнить определенные действия. Следует учитывать, что при копировании (как интерактивном, так и средствами встроенного языка) событие ОбработкаЗаполнения не вызывается. Если не менялись строки табличной части, то табличная часть записываться не будет. Блокировки Если менялись только отдельные строки табличной части или добавлялись новые строки, то будут записаны только измененные и добавленные строки. Однако если менялся порядок строк или строки удалялись, то будут записаны все строки табличной части. При работе с объектными данными система обеспечивает два вида блокировок – пессимистическую и оптимистическую, которые позволяют выполнять целостные изменения объектов при одновременной работе нескольких пользователей. Создание новых объектов Пессимистическая блокировка Зачастую при разработке или модификации прикладных решений требуется выполнять некоторые действия, сопровождающие создание тех или иных новых объектов базы данных. Например, при создании новой приходной накладной может потребоваться автоматически заполнять поле Склад, если известно, что все поступающие товары должны приходоваться только на один определенный склад. Также может потребоваться установка каких-либо других реквизитов документа по умолчанию. Механизм пессимистической блокировки запрещает изменение данных объекта другими сессиями или данной сессией до тех пор, пока блокировка не будет снята этим объектом встроенного языка (рис. 4.16). Прежде всего, при заполнении нового объекта данными можно во многих случаях обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства Значение заполнения и Заполнять из данных заполнения. Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта. Механизм пессимистической блокировки используется системой «1С:Предприятие» для блокировки объектов, редактируемых в форме. В то же время разработчик также имеет возможность задействовать этот механизм, используя средства встроенного языка. Если этих возможностей недостаточно, то нужно использовать возможности встроенного языка. Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения. Это событие возникает при интерактивном создании нового объекта, при вводе объекта на основании (интерактивном или программном), а также при выполнении метода объекта Заполнить(). В обработчике этого события предусматривается некоторый алгоритм, позволяющий выполнять начальное заполнение реквизитов нового объекта в зависимости от типа объекта-основания. При этом в параметр ДанныеЗаполнения этого обработчика могут быть переданы различные значения в зависимости от того, каким образом создается новый элемент. Например, он может иметь тип ссылки, если новый объект вводится на основании. Или он может иметь тип Структура, если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка. Также этот параметр может иметь тип Том 1 Рис. 4.16. Пессимистическая блокировка Если говорить о системе, то механизмом пессимистической блокировки управляют расширения форм прикладных объектов. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект. Когда пользователь, редактировавший объект, закроет форму объекта, расширение формы снимет пессимистическую блокировку. Поэтому пессимистическую блокировку можно рассматривать как блокировку данных для редактирования, связанную с идентификатором конкретной формы, в которой редактируется объект. 73 Глава 4. Работа с данными Расширения стандартных форм объектов устанавливают пессимистическую блокировку автоматически, но разработчик, находясь в модуле формы, может с помощью метода формы ЗаблокироватьДанныеФормыДляРедактирования() обеспечить поведение любой другой формы, аналогичное стандартному. Для снятия блокировки используется метод формы РазблокироватьДанныеФормыДляРедактирования(). При использовании этих методов блокировка будет привязана к идентификатору той формы, из которой она установлена. Кроме того, чтобы задействовать пессимистическую блокировку, разработчик может использовать методы глобального контекста ЗаблокироватьДанныеДляРедактирования() и РазблокироватьДанныеДляРедактирования(). В эти методы обязательно нужно передать ссылку на объект информационной базы или ключ записи регистра сведений, данные которого требуется заблокировать. Если блокировка устанавливается с привязкой к конкретной форме, то в метод ЗаблокироватьДанныеДляРедактирования() нужно передать также идентификатор этой формы. В этом случае для снятия блокировки методом РазблокироватьДанныеДляРедактирования() указывается этот же идентификатор. Исключение // Нельзя модифицировать данные объекта. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Данные объекта уже заблокированы"; Сообщение.Сообщить(); Возврат Ложь; КонецПопытки; КонецФункции Следует помнить, что попытки установить блокировку одного и того же объекта с указанием идентификатора формы и без указания идентификатора несовместимы друг с другом. Оптимистическая блокировка Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных (рис. 4.17). Можно не использовать в методах глобального контекста идентификатор формы. В этом случае устанавливаемая пессимистическая блокировка не будет привязана к конкретной форме. Например, это может понадобиться в обработке, выполняющей программную модификацию данных параллельно работе других пользователей. Перед модификацией данных нужно попытаться их заблокировать. Если попытка удалась, данные можно модифицировать. Если объект уже заблокирован, то будет вызвано исключение, которое может быть обработано конструкцией Попытка … Исключение … КонецПопытки (листинг 4.6). Листинг 4.6. Пример проверки пессимистической блокировки &НаСервере Функция ПримерМодификации() ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000001"); Попытка ЗаблокироватьДанныеДляРедактирования(ТоварСсылка); // Можно выполнять модификацию данных объекта. // ... ТоварОбъект = ТоварСсылка.ПолучитьОбъект(); ТоварОбъект.Наименование = "Новое наименование"; ТоварОбъект.Записать(); Возврат Истина; 74 Рис. 4.17. Оптимистическая блокировка Строго говоря, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Когда программный объект считывает данные из базы данных, в числе прочего считывается и версия объекта, хранящегося в базе данных. Предположим, что до начала редактирования данных (до установки пессимистической блокировки) данные объекта в базе данных были изменены (например, другим пользователем). В этом случае номер версии объекта, хранящийся в базе данных, также изменится. При попытке первого пользователя записать или заблокировать этот объект будет выполнена проверка соответствия версии объекта, находящегося в памяти, и версии объекта, хранящейся в базе данных. Так как версии отличаются, будет выдано сообщение об ошибке, т. е. сработает оптимистическая блокировка. Оптимистическая блокировка гарантирует, что если пользователь изменяет объект, то его изменения не «затрут» изменения, сделанные другими сессиями или другими программными объектами в этой же сессии. Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные Пессимистические блокировки и транзакции Важным моментом является то, что пессимистическая и оптимистическая блокировки обеспечиваются не средствами базы данных, а средствами собственного менеджера блокировок, который работает «над уровнем» базы данных. По этой причине объектные блокировки абсолютно прозрачны для транзакций. Единственная особенность заключается в том, что если пессимистическая блокировка была установлена в транзакции и в результате был выполнен откат этой транзакции (rollback), то блокировка будет автоматически снята. Подробнее стей выделяются только константы: для каждой константы в базе данных хранится одно значение. Поэтому в дальнейшем мы их рассматривать не будем; работа с ними не вызывает сложностей. Подчинение регистратору Важным свойством всех записей является их подчинение регистратору. Регистратор – это некоторый документ, с которым связаны записи необъектных данных. Не может существовать записей, не относящихся к какому-либо регистратору. Исключение составляет лишь регистр сведений, когда для него выбран независимый режим записи (без подчинения регистратору). Поэтому любая запись всегда содержит обязательное поле Регистратор (рис. 4.18). Раздел «Транзакции», стр. 104. Необъектные данные Модель хранения данных К необъектным данным в «1С:Предприятии» относятся данные следующих объектов конфигурации: ■■ регистр сведений, ■■ регистр накопления, ■■ регистр бухгалтерии, ■■ регистр расчета, ■■ перерасчет, ■■ последовательность, ■■ константа. Необъектные данные с точки зрения «1С:Предприятия» представляют собой некоторый набор записей, которые хранятся в таблице. Каждая из этих записей полностью описывается значениями своих полей. Для системы эти записи не обладают какой-либо значимостью, кроме того, что в их полях содержатся некоторые значения. Запись можно удалить, а затем создать новую, с такими же значениями полей. Состояние базы данных при этом не изменится (с точки зрения логики прикладного решения). Это принципиально отличает необъектные данные от объектных: объект нельзя создать дважды, он ценен сам по себе, самим фактом своего существования. Второе важное отличие заключается в том, что, изменив значения полей записи, мы получаем другую запись, в то время как изменение значений полей объекта не влечет за собой появление нового объекта. Большинство необъектных сущностей конфигурации имеют общий порядок работы с данными. Из всей совокупности необъектных сущноТом 1 Рис. 4.18. Поле «Регистратор» Записи, относящиеся к одному регистратору, называются движениями этого регистратора. Движения не являются частью владеющего ими документа, при записи и чтении документа они не записываются и не считываются. Однако они тесно связаны с ним. Движения могут создаваться при проведении документов, при записи документов, могут формироваться интерактивно или в виде набора записей регистра (с отбором по регистратору). Движения не могут существовать отдельно от своих регистраторов. Поэтому при удалении документов или отмене проведения (если свойство Удаление движений установлено в значение, отличное от Не удалять) система производит поиск движений этого документа в таблицах всех регистров, для которых данный документ может быть регистратором, и удаляет их. Кроме этого, при удалении документа его движения всегда удаляются. Таким образом, время жизни записей определяется их регистратором: если регистратора нет, то и нет смысла в существовании его движений. Даже в том случае, когда записи создаются без непосредственного участия регистратора, они все равно обязательно должны быть подчинены какомулибо документу; запись нельзя записать, если в ней не указана ссылка на регистратор. 75 Глава 4. Работа с данными Наличие или отсутствие движений не связано с проведенностью документа-регистратора или с пометкой его на удаление: непроведенный документ может иметь движения, проведенный документ может не иметь движений, помеченный на удаление документ также может иметь движения. Такой подход позволяет реализовывать в системе «1С:Предприятие» различные способы регистрации изменений в учетных механизмах (регистрах). Например, движения документа могут редактироваться непосредственно в самом документе, и в этом случае понятие проведения документа просто не имеет смысла. Такой прием используется при автоматизации бухгалтерских задач, для ручного ввода проводок. Также дата движений документа не связана жестко с датой регистратора. Например, один и тот же документ может иметь движения разными датами. Эта возможность используется, например, при автоматизации задач планирования, для ввода тех или иных планируемых в будущем значений. Наиболее простой моделью использования регистров является создание движений в обработчике проведения регистратора. В этом случае вся остальная логика работы будет поддерживаться системой автоматически. Другие варианты взаимодействия движений и регистратора следует разрабатывать и описывать самостоятельно, в зависимости от конкретной прикладной задачи. Уникальность записей Для каждого объекта метаданных в системе определен ключ записи. Данные объекта конфигурации не могут содержать записи с одинаковыми значениями ключа записи. Ключ записи формируется, как правило, из значений нескольких полей объекта конфигурации. Для разных объектов конфигурации состав ключа записи отличается, кроме этого он может быть различным для одного и того же объекта конфигурации, в зависимости от его свойств. Для всех необъектных сущностей, подчиненных регистратору, ключ записи включает ссылку на регистратор и номер строки. Номер строки, собственно, и используется для обеспечения уникальности записей, а также для упорядочивания записей в пределах регистратора. Кроме этого, в состав ключа записи могут входить и другие поля, например, период, измерения регистра – для необъектных сущностей, не подчиненных регистратору. Наличие уникального ключа требуется системе для решения различных задач. Например, это позволяет позиционироваться в табличном поле на некоторую запись. 76 Набор записей По аналогии с объектными данными, изменение которых возможно только при помощи типов объектов, наборы записей используются для модификации необъектных данных: они позволяют читать, модифицировать и удалять необъектные данные. По своей сути набор записей представляет собой коллекцию отдельных записей, принадлежащих некоторому объекту конфигурации. В зависимости от объекта конфигурации набор записей может содержать только некоторые или же все записи, принадлежащие этому объекту конфигурации. Для указания того, какие именно записи должны входить в набор записей, используется его свойство Отбор. Элементы отбора в наборе записей для того или иного объекта конфигурации создаются платформой; разработчик не имеет возможности добавлять собственные элементы отбора, но может использовать существующие, устанавливая для них условия равенства нужному значению. В таблице 4.1 представлен состав отбора в наборе записей для различных объектов конфигурации. Таблица 4.1. Поля, по которым устанавливается отбор Объект конфигурации Поля, по которым устанавливается отбор Регистр сведений (подчиненный регистратору) Регистр сведений (непериодический, независимый) Регистр сведений (периодический, независимый) Регистр накопления Регистр бухгалтерии Регистр расчета Перерасчет Регистратор Набор измерений Период и набор измерений Регистратор Регистратор Регистратор и набор измерений Объект перерасчета (регистратор регистра расчета) и набор измерений перерасчета Регистратор Последовательность Существует следующая особенность работы системы с наборами записей: если среди элементов отбора существует отбор по регистратору, то он должен обязательно быть установлен, иначе при записи такого набора будет выдано сообщение об ошибке. Отсюда следует, что для большинства объектов конфигурации, которые хранят необъектные данные, допускается модификация этих данных только частями, «гранулами» – наборами записей, относящихся к определенному регистратору (или более мелкими, если есть возможность установки других отборов). Наряду с этим для независимых регистров сведений допускается модификация сразу всех данных, хранящихся в регистре (если ни одно из условий отбора не задано). Например, для независимого регистра сведений Комплектующие номенклатуры набор записей может включать в себя как все записи регистра (если отбор не установлен), так и лишь некоторые его записи (рис. 4.19). Профессиональная разработка в системе «1С:Предприятие 8» Объектные и необъектные данные Рис. 4.19. Примеры наборов записей В то же время для регистра расчета Основные начисления, у которого обязательно должен быть установлен отбор по регистратору, набор записей может включать в себя максимум все записи, принадлежащие одному регистратору, или некоторое их подмножество (рис. 4.20). Рис. 4.20. Примеры наборов записей Отличительной особенностью наборов записей является то, что для них не существует понятия удаления. Набор записей можно только записать, причем запись может быть выполнена либо с замещением существующих записей, удовлетворяющих отбору, либо с добавлением новых записей к существующим. При записи с добавлением новые записи будут добавлены к существующим (рис. 4.21). Том 1 77 Глава 4. Работа с данными не используется. Основное назначение этого типа – предоставить доступ к значениям полей записи. Рис. 4.22. Запись с замещением Рис. 4.21. Запись с добавлением При записи с замещением существующие записи будут заменены новыми (рис. 4.22). Таким образом, для удаления записей необъектных данных необходимо просто записать с замещением пустой набор записей (т. е. набор записей, не содержащий ни одной записи). Набор записей представляет собой коллекцию объектов, имеющих тип записи. Перебрать все записи, входящие в набор записей, можно с помощью конструкции Для Каждого Из … Цикл. Тип записи используется только в наборах записей. Отдельно от наборов записей этот тип 78 Интерактивное редактирование наборов записей Для необъектных данных не существует механизма, аналогичного объектным блокировкам (оптимистической и пессимистической). Поэтому при использовании набора записей для интерактивного редактирования следует учитывать, что в период после считывания данных из базы данных и перед записью их обратно в базу данных они могут быть изменены в базе данных другой сессией или другим набором записей в этой же сессии. Таким образом, может возникнуть ситуация, когда изменения, внесенные одним пользователем, могут быть потеряны в результате того, что второй пользователь перезапишет их старыми данными. Профессиональная разработка в системе «1С:Предприятие 8» Система типов Система типов Типы значений и типы данных Прикладное решение «1С:Предприятия» оперирует различными величинами: числами, символами, объектами. Каждая величина имеет тип. Тип величины определяет возможные значения и набор определенных для них операций. Существуют типы, определенные на уровне системы, и типы, создаваемые в конкретном прикладном решении. Например, на уровне системы определены примитивные типы, такие как Строка, Число, Булево и т. д. Также на уровне системы определены и другие типы, которые могут быть использованы в прикладном решении, например, универсальные коллекции значений (Массив, Структура, СписокЗначений), общие типы (ТекстовыйДокумент, ТабличныйДокумент, ПостроительОтчета, АнализДанных) и др. Полный перечень типов значений, которые может использовать система «1С:Предприятие», приведен в описании встроенного языка и в синтакс-помощнике. Переменные встроенного языка «1С:Предприятия» не типизированы. Это значит, что тип переменной определяется типом того значения, которое хранится в переменной в данный момент. Таким образом, в произвольные моменты работы прикладного решения переменная может иметь различные типы значения. Подробнее Раздел «Типы значений», стр. 80. В то же время данные «1С:Предприятия» существуют не только в оперативной памяти компьютера, где они содержатся в объектах встроенного языка, но и в базе данных, где осуществляется долговременное хранение этих данных. База данных представляет собой совокупность некоторого количества таблиц, создаваемых в соответствии со структурой объектов конфигурации прикладного решения. Таблицы базы данных состоят из полей, и для каждого поля обязательно должен быть указан тип значений, которые могут храниться в этом поле. По этой причине все объекты конфигурации, которые «отвечают» за создание тех или иных полей в базе Том 1 данных, должны иметь совершенно определенный тип. Такими объектами являются, например, реквизиты, измерения, ресурсы и т. д. Для того чтобы указать тип объекта конфигурации, «отвечающего» за создание того или иного поля базы данных, в системе «1С:Предприятие» используются не типы значений, а более сложное понятие – тип данных. Такой подход позволяет, с одной стороны, изолировать разработчика от конкретного хранилища данных, а с другой стороны – сделать работу с данными значительно более гибкой. Отличие типа данных от типа значения заключается в том, что тип данных является характеристикой, которая может содержать описание как одного, так и нескольких типов значений. В результате у разработчика появляются две важные возможности: ■■ уточнение некоторых примитивных типов значений. Например, можно указать, что реквизит Количество будет содержать не просто числовые значения, а неотрицательные числовые значения с количеством разрядов не более 15 и дробной частью из 3 разрядов; ■■ указание одновременно нескольких возможных типов значений. Например, можно указать, что реквизит Сделка может содержать ссылку как на счет, выставленный покупателю, так и на счет, выставленный поставщику. В результате в реквизите Сделка смогут одновременно храниться как значения одного, так и другого типа. При этом тип данных этого реквизита будет всегда одним и тем же, но тип значения этого реквизита в каждый конкретный момент времени будет определяться типом значения, которое в нем хранится. Типы данных используются в системе «1С:Предприятие» не только в части, связанной с базой данных, но и в интерфейсной части. Так, например, типы данных должны быть определены для всех реквизитов форм и для всех элементов управления, расположенных в форме. Кроме этого, некоторые объекты встроенного языка в силу специфики своего использования также могут потребовать указания типа данных, которые в них хранятся. Например, указание типа данных может использоваться для списка значений, для колонок таблицы значений и дерева значений. Подробнее Раздел «Типы данных», стр. 99. 79 Глава 4. Работа с данными Типы значений Примитивные типы Число Числовой тип предназначен для представления десятичных чисел. Максимально допустимая разрядность числа, которая может быть сохранена в базе данных, составляет 32 знака, включая десятичную точку. Для числовых значений, хранящихся в памяти (являющихся, например, значением некоторой переменной), разрядность неограниченна. Такое поведение таблицы позволяет создать список, который легко читается и не содержит лишней информации. Однако если есть необходимость указывать для нулевых значений определенное представление, то это можно выполнить, используя свойства Формат и ФорматРедактирования соответствующей колонки таблицы (в приведенном примере – колонки ТЗЗначение), рис. 4.24. Литерал значения типа «Число» Конкретные значения числового типа во встроенном языке и языке запросов могут быть заданы литералом, который представляет собой набор цифр, написанных непосредственно в тексте модуля. Этот набор цифр может начинаться с символов «+» или «-», обозначающих знак числа. В качестве разделителя целой и дробной части числа используется символ «.» (точка), табл. 4.2. Таблица 4.2. Примеры литералов типа «Число» Число Литерал 3874 -1475,25 3874 -1475.25 Значение типа «Число» по умолчанию Для числового типа значением по умолчанию является значение 0. По умолчанию, если не задан специальный формат, это значение будет представляться как 0. Рис. 4.24. Установка формата колонки таблицы Для колонки таблицы форматная строка поддерживает параметр ЧН, который задает представление нулевого значения. В результате приведенная выше таблица будет выглядеть, например, следующим образом (рис. 4.25). Однако некоторые элементы управления, используемые в интерфейсе системы, имеют другое представление нулевого значения, что сделано для более удобного представления информации пользователю. Например, в ячейке таблицы значение по умолчанию числового типа отображается как пустое место (рис. 4.23). Рис. 4.25. Представление нулевого значения в колонке таблицы Аналогичного результата можно добиться средствами встроенного языка (листинг 4.7). Листинг 4.7. Установка формата колонки таблицы Рис. 4.23. Представление значения типа «Число» по умолчанию в колонке таблицы 80 Элементы.ТЗЗначение.Формат = "ЧН='---'"; Элементы.ТЗЗначение.ФорматРедактирования = "ЧН="---'"; Профессиональная разработка в системе «1С:Предприятие 8» Система типов При задании представления нулевого значения для колонки таблицы следует иметь в виду, что концевые пробелы при выводе заданного представления нулевого значения в ячейке таблицы будут обрезаны. В поле ввода значение по умолчанию числового типа отображается в зависимости от разрядности дробной части, заданной при указании числового типа данных этого поля ввода. Подробнее Раздел «Числовые типы данных», стр. 99. Если количество разрядов дробной части равно нулю, то числовое значение будет отображаться как 0. Если количество разрядов дробной части отлично от нуля, то числовое значение будет отображено как 0,000 (количество нулей после запятой будет соответствовать количеству разрядов дробной части), рис. 4.26. Таблица 4.4. Логические операции для типа «Число» Операция Операнды Результат Больше или равно Число >= Число Равно Число = Число Истина, если первый операнд больше либо равен второму. В противном случае Ложь Не равно Число <> Число Меньше Число < Число Больше Число > Число Меньше или равно Число <= Число Истина, если первый операнд больше второго. В противном случае Ложь Истина, если первый операнд равен второму. В противном случае Ложь Истина, если первый операнд не равен второму. В противном случае Ложь Истина, если первый операнд меньше второго. В противном случае Ложь Истина, если первый операнд меньше либо равен второму. В противном случае Ложь Преобразование значений типа «Число» Неявное преобразование Рассмотрим пример, когда переменная, указанная в качестве значения логического выражения в операторе цикла, по каким-либо причинам имеет тип Число (листинг 4.8). Листинг 4.8. Неявное преобразование значения типа «Число» Рис. 4.26. Представление значения типа «Число» по умолчанию в поле ввода В отличие от колонки таблицы, для поля ввода нельзя задать собственное представление нулевого значения. Операции со значениями типа «Число» Для значений типа (табл. 4.3). Число определены арифметические операции Операнды Сложение Вычитание Умножение Деление Число + Число Число - Число Число * Число Число / Число Остаток от деления Унарный минус Результат Сумма операндов Разность операндов Произведение операндов Частное операндов. Если второй операнд имеет значение 0, будет вызвана ошибка исполнения Число % Число Остаток от деления первого операнда на второй. Если второй операнд имеет значение 0, будет вызвана ошибка исполнения - Число Изменение знака числа Для значений типа Число определены логические операции (табл. 4.4). Том 1 В этом случае будет выполняться неявное преобразование значения типа Число к нужному типу. Такое преобразование в ряде случаев может быть выполнено системой. Если же такое преобразование невозможно, будет вызвана ошибка исполнения. Неявное преобразование к типу «Строка» Таблица 4.3. Арифметические операции для типа «Число» Операция Условие = 22; … Если Условие Тогда … КонецЕсли; Любое значение типа Число может быть преобразовано к типу Строка. Это позволяет всегда иметь возможность получить представление такого значения (листинг 4.9). Листинг 4.9. Неявное преобразование значения типа «Число» к значению типа «Строка» Переменная = 156935.785; Сообщить(Переменная); Результатом выполнения этих операторов будет представление числа: 156935,785. Преобразование будет выполняться в соответствии с текущими региональными настройками информационной базы, например, как в данном случае, группы разрядов будут отделены друг от друга символом «пробел». 81 Глава 4. Работа с данными Неявное преобразование к типу «Булево» При выполнении булевых операций или при вычислении логических выражений любое значение, отличное от 0, приводится к значению Истина. Значение 0 приводится к значению Ложь (листинг 4.10). Листинг 4.10. Неявное преобразование значения типа «Число» к значению типа «Булево» Условие = 22; Сообщение = Новый СообщениеПользователю; Если Условие Тогда Сообщение.Текст = "Условие истинно"; Иначе Сообщение.Текст = "Условие ложно"; КонецЕсли; Сообщение.Сообщить(); В приведенном примере будет получено сообщение об истинности условия, поскольку при вычислении логического выражения значение переменной Условие будет преобразовано к типу Булево, результатом чего будет значение Истина. Также, например, при выполнении булевой операции НЕ в следующем примере сначала значение переменной Условие будет преобразовано к типу Булево (значение Истина), а затем уже выполнена операция НЕ. В результате в окно сообщений будет выведено Нет (листинг 4.11). Листинг 4.11. Неявное преобразование значения типа «Число» к значению типа «Булево» Условие = 22; Сообщить(НЕ Условие); Значения логического типа Истина/Ложь будут представлены в соответствии с языком интерфейса платформы, выбранным в параметрах конфигуратора или заданным в параметре /L командной строки при запуске «1С:Предприятия». Если «1С:Предприятие» запущено с русским языком интерфейса, логические значения будут представлены как «Да»/«Нет», с английским – «Yes»/«No», с турецким – «Evet»/«Hayır» и т. д. Например, в приведенном примере для русского языка интерфейса будет выведено Нет, а если платформа будет запущена с литовским интерфейсом, то Ne. Неявное преобразование в операциях сравнения Порядок неявного преобразования типов в операциях сравнения несколько отличается от описанного выше. Если в операции сравнения один из операндов имеет тип Число, а другой – Булево, то значение типа Булево будет приводиться к типу Число, а затем будет выполнено сравнение. 82 Например, в результате выполнения следующего кода (листинг 4.12) будет получено сообщение о ложности условия, поскольку булев операнд будет приведен к типу Число (значение 1), а затем уже будет выполнено сравнение. Листинг 4.12. Неявное преобразование в операции сравнения Условие = 22; Сообщение = Новый СообщениеПользователю; Если Истина = Условие Тогда Сообщение.Текст = "Условие истинно"; Иначе Сообщение.Текст = "Условие ложно"; КонецЕсли; Сообщение.Сообщить(); Явное преобразование Преобразование к типу «Булево» Встроенный язык позволяет выполнить явное преобразование значения типа Число к типу Булево. Для этого используется встроенная функция Булево(), в качестве параметра которой передается преобразуемое число. Значение 0 преобразуется в Ложь, все остальные значения преобразуются в значение Истина. Например, в результате выполнения оператора (листинг 4.13) будет получено сообщение Да. Листинг 4.13. Явное преобразование к типу «Булево» Сообщить(Булево(34.456)); А в результате выполнения следующего оператора (листинг 4.14) будет получено сообщение Нет. Листинг 4.14. Явное преобразование к типу «Булево» Сообщить(Булево(0)); Преобразование к типу «Строка» Любое числовое значение может быть преобразовано к типу Строка при помощи встроенной функции Строка(). Результатом такого преобразования будет строковое представление числа, полученное в соответствии с текущими региональными установками информационной базы. Например, результатом выполнения оператора (листинг 4.15) будет сообщение 26475834,456, в котором используются в данном случае разделители групп разрядов (символ «пробел») и десятичный разделитель (символ «запятая»). Профессиональная разработка в системе «1С:Предприятие 8» Система типов Листинг 4.15. Явное преобразование к типу «Строка» Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(26475834.456); Сообщение.Сообщить(); Вторым способом указания многострочных литералов является использование символа «|». В этом случае кавычки используются только в начале и конце литерала, а символ «|» размещается в начале каждой новой строки (листинг 4.17). Строка Листинг 4.17. Пример литерала типа «Строка» Строковый тип предназначен для представления строк в формате Unicode произвольной длины. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Внимание! |В документе не могут присутствовать строки |с нулевым количеством!"; Сообщение.Сообщить(); Литерал значения типа «Строка» Для того чтобы задать конкретные значения строкового типа, во встроенном языке и языке запросов используются литералы строкового типа. Они представляют собой набор символов, заключенных в кавычки (табл. 4.5). Результатом как первого, так и второго оператора будет следующее сообщение: Внимание! В документе не могут присутствовать строки с нулевым Таблица 4.5. Примеры литералов типа «Строка» Для строкового типа значением по умолчанию является пустая строка (литерал ""). Это значение не имеет представления, иначе говоря, оно не отображается. В некоторых случаях, например, при вычислении значений в отладчике, для наглядности в качестве представления этого значения может использоваться его литерал ("). Строка Литерал книга проверка работы "книга" "проверка работы" Если в строке необходимо задать символ кавычка ("), то записываются две кавычки подряд (табл. 4.6). Таблица 4.6. Пример литерала типа «Строка» Строка Литерал фирма "Ваш сад" "фирма ""Ваш сад""" Наряду с однострочными литералами во встроенном языке могут быть использованы строковые литералы, состоящие из нескольких строк. Для обозначения таких литералов используются два различных способа записи. Во-первых, отдельные строки могут быть заключены в кавычки. В этом случае между ними не должно находиться никаких символов, кроме пробелов, переводов строки и комментариев. Например, строка Внимание! В документе не могут присутствовать строки с нулевым количеством! может быть записана следующим образом (листинг 4.16). Листинг 4.16. Пример литерала типа «Строка» Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Внимание!" "В документе не могут присутствовать строки" "с нулевым количеством!"; Сообщение.Сообщить(); Том 1 количеством! Значение типа «Строка» по умолчанию Операции со значениями типа «Строка» Для значений типа Строка определена операция конкатенации (табл. 4.7). Таблица 4.7. Операция конкатенации Операция Операнды Результат Конкатенация Строка + Строка Строка, являющаяся соединением первой и второй строки. Длина результирующей строки равна сумме длин соединяемых строк Для значений типа Строка определены логические операции (табл. 4.8). Таблица 4.8. Логические операции Операция Больше Больше или равно Меньше Меньше или равно Равно Не равно Операнды Строка > Строка Результат Истина, если первая строка больше второй. В противном случае Ложь Строка >= Строка Истина, если первая строка больше либо равна второй. В противном случае Ложь Строка < Строка Истина, если первая строка меньше второй. В противном случае Ложь Строка <= Строка Истина, если первая строка меньше либо равна второй. В противном случае Ложь Строка = Строка Истина, если первая строка равна второй. В противном случае Ложь Строка <> Строка Истина, если первая строка не равна второй. В противном случае Ложь 83 Глава 4. Работа с данными При выполнении логических операций больше, больше или равно, меньше, меньше или равно существует особенность, связанная с тем, что система «1С:Предприятие» позволяет создавать прикладные решения на различных языках. Внутри платформы «1С:Предприятие» работа со строками ведется только в Unicode, и строковые данные в базах данных также сохраняются в Unicode. Стандартом определен некоторый генеральный порядок сортировки для Unicode. Но он подходит не для всех языков. Поэтому для некоторых языков в этот генеральный порядок внесены минимальные изменения для обеспечения соответствия конкретному языку. Порядок сортировки строковых значений, принятый в конкретном регионе, определяет параметр Язык/Страна, выбранный в диалоге Региональные установки информационной базы. В результате этого, например, для русских и латышских региональных установок будет различный порядок следования строк при сортировке их по возрастанию (табл. 4.9). Таблица 4.9. Порядок следования строк для различных региональных установок Русский (Россия) Латышский (Латвия) Ača Acb Acb Ača Такой порядок соответствует принятому в России и Латвии алфавиту. Поскольку сортировка строковых значений выполняется на основе сравнения их друг с другом, то один и тот же оператор (листинг 4.18) при установке параметра Язык/Страна в диалоге Региональные установки информационной базы в значение Россия будет давать результат Истина, представленный в соответствии с русским языком интерфейса как Да, а если Язык/Страна установлен в значение Латвия, то – Ложь, представленный как Нет. Если запустить «1С:Предприятие» из командной строки с латышским языком интерфейса ("C:\Program Files\1Cv82\8.2.15.310\bin\1cv8.exe" /L lv), то будет выведено Nē, что значит Нет. Преобразование значений типа «Строка» Неявное преобразование При выполнении различных операторов могут возникать ситуации, когда значения типа Строка не подходят для выполнения данных операций. Например, если при выполнении следующего оператора переменная Строка будет иметь значение 25 (листинг 4.19), будет выполняться неявное преобразование значения типа Строка к нужному типу. Листинг 4.19. Неявное преобразование значения типа «Строка» Строка = "25"; Результат = 35 + Строка; Сообщить(Результат); Такое преобразование в ряде случаев может быть выполнено системой. Если же такое преобразование невозможно, будет вызвана ошибка исполнения. Неявное преобразование к типу «Число» Если выполнить приведенный выше пример, то строка 25 будет преобразована к типу Число и в окно сообщений будет выведено 60. Однако следует заметить, что преобразование значения типа Строка к типу Число будет выполняться только тогда, когда подобное преобразование осмысленно. Например, если значение переменной Строка будет равно а25, то преобразование уже выполнено не будет и будет вызвано исключение. Неявное преобразование к типу «Булево» Неявное преобразование значений строкового типа к типу Булево также выполняется лишь тогда, когда такое преобразование имеет смысл. К значениям типа Булево будут преобразованы строки, соответствующие литералам булевых значений, т. е. Истина, Ложь, True и False. Например, рассмотрим (листинг 4.20). выполнение следующего Листинг 4.18. Сравнение строк Листинг 4.20. Неявное преобразование к типу «Булево» Результат = "acb" > "ača"; Сообщить(Результат); Сообщение = Новый СообщениеПользователю; Если "истина" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); Таким образом, результат выполнения логических операций над строковыми значениями будет зависеть не только от самих операндов, участвующих в выражении, но и от региональных установок информационной базы, в которой выполняется эта операция. 84 фрагмента кода Если "false" тогда Сообщение.Текст = "Истина"; Профессиональная разработка в системе «1С:Предприятие 8» Система типов Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); В результате в окно сообщений будет выведен текст: Истина Ложь Однако кроме этого к булевым значениям будут преобразовываться также строковые значения, соответствующие представлению булевых значений для языка, выбранного в языке интерфейса платформы. Например, если запустить «1С:Предприятие» из командной строки с литовским языком интерфейса ("C:\Program Files\1Cv82\8.2.15.310\bin\1cv8.exe" /L lt), то тогда следующий код (листинг 4.21) будет выполнен без ошибок и в окно состояния будет выведено Ложь. Листинг 4.21. Неявное преобразование к типу «Булево» Сообщение = Новый СообщениеПользователю; Если "Ne" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); Если этот же код попытаться выполнить с языком интерфейса de (Немецкий), то будет вызвано исключение, в результате того что значение ne не может быть преобразовано к типу Булево. Если же в этой ситуации строку ne заменить на Nein, что значит Нет по-немецки, то пример (листинг 4.22) отработает без ошибок и в окно сообщений будет выведено Ложь. Листинг 4.22. Неявное преобразование к типу «Булево» Сообщение = Новый СообщениеПользователю; Если "Nein" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); Явное преобразование Преобразование к типу «Число» Встроенный язык позволяет выполнить явное преобразование значения типа Строка к типу Число при помощи встроенной функции Число(). При этом будут преобразованы только те строки, которые представляют собой правильное строковое представление литерала численного типа. Том 1 Например, может быть выполнено преобразование строки 1125.78 к числу 1125.78 (листинг 4.23). Листинг 4.23. Явное преобразование к типу «Число» Сообщить(Число("1125.78")); Следует заметить, что если в строке в качестве разделителя целой и дробной части будет использоваться не точка, а запятая, преобразование также будет выполнено (листинг 4.24). Листинг 4.24. Явное преобразование к типу «Число» Сообщить(Число("1125,78")); Преобразование к типу «Дата» Строковое значение может быть преобразовано к типу Дата. Для этого используется встроенная функция Дата(). Она позволяет преобразовать строку, которая представляет собой части даты, записанные в определенном порядке: год, месяц, день, час, минута и секунда. Например, для того, чтобы получить дату 15 апреля 2011 года 17 часов 45 минут 34 секунды, преобразуемая строка должна иметь вид 20110415174534 (листинг 4.25). Листинг 4.25. Преобразование к типу «Дата» Сообщить(Дата("20110415174534")); В результате выполнения приведенного кода будет получена нужная дата: 15.04.2011 17:45:34. Дата Тип Дата предназначен для представления значения даты и времени с точностью до секунды. Минимальным значением типа Дата является дата 01 января 0001 года 00 часов 00 минут 00 секунд. Литерал значения типа «Дата» Конкретные значения типа Дата могут быть заданы литералом, который представляет собой последовательность цифр, заключенных в одинарные кавычки. Последовательность цифр представляет собой части даты в следующем порядке: год, месяц, день, час, минута и секунда. Части даты могут быть отделены друг от друга различными разделителями; час, минута и секунда могут быть не указаны – в этом случае предполагается, что они равны нулю (табл. 4.10). 85 Глава 4. Работа с данными Таблица 4.10. Примеры литералов типа «Дата» Дата Литерал 15.04.2011 22:45:33 15.04.2011 0:00:00 15.04.2011 22:45:33 15.04.2011 22:45:33 '20110415224533' '20110415' '2011-04-15 22:45:33' '2011/04/15-22/45/33' Задать собственное представление даты по умолчанию можно с помощью свойства ФорматРедактирования поля ввода (рис. 4.28). В языке запросов для указания литералов типа Дата используется ключевое слово ДАТАВРЕМЯ, после которого в скобках последовательно указываются год, месяц, день, час, минута и секунда. Последние три указывать не обязательно (табл. 4.11). Таблица 4.11. Примеры литералов типа «Дата» Дата Литерал 15.04.2011 22:45:33 15.04.2011 0:00:00 ДАТАВРЕМЯ(2011, 04, 15, 22, 45, 33) ДАТАВРЕМЯ(2011, 04, 15) Значение типа «Дата» по умолчанию Для типа Дата значением по умолчанию является 01 января 0001 года 00 часов 00 минут 00 секунд. Рис. 4.28. Установка формата в поле ввода В поле ввода форматная строка поддерживает параметр ДП, который задает представление значения даты по умолчанию. В результате приведенный выше пример будет выглядеть следующим образом (рис. 4.29). При выводе значения даты по умолчанию она отображается в соответствии с используемыми региональными установками сеанса (например, 01.01.0001 0:00:00). Однако при выводе значения даты по умолчанию в некоторые элементы управления она будет представляться иначе, что обусловлено удобством ввода или отображения. Например, значение даты по умолчанию в поле ввода будет отображено в виде символов-разделителей даты, используемых при заданных региональных установках. Состав разделителей будет определяться составом даты (Дата и время, Дата, Время), указанным при описании типа данных, с которыми работает данное поле ввода (рис. 4.27). Рис. 4.29. Отображение пустой даты в поле ввода Аналогичного результата можно добиться, используя средства встроенного языка (листинг 4.26). Листинг 4.26. Установка формата в поле ввода Элементы.ПолеВводаДатаИВремя.ФорматРедактирования = "ДП='01.01.2011 00:00:00'"; Элементы.ПолеВводаДата.ФорматРедактирования = "ДП='01.01.2011'"; Элементы.ПолеВводаВремя.ФорматРедактирования = "ДП='00:00:00'"; Рис. 4.27. Пустая дата в поле ввода При выводе значения даты по умолчанию в колонку таблицы она будет отображаться как пустое место, вне зависимости от того, какой состав даты установлен при описании типа данных (рис. 4.30). Подробнее Раздел «Типы данных, описывающие значения типа «Дата»», стр. 101. 86 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Аналогичного результата можно добиться средствами встроенного языка (листинг 4.27). Листинг 4.27. Установка формата колонки таблицы Элементы.ТЗЗначение.Формат = "ДП='01.01.2011 00:00:00'"; Элементы.ТЗЗначение.ФорматРедактирования = "ДП='01.01.2011 00:00:00'"; Рис. 4.30. Пустая дата в колонке таблицы Если необходимо указывать для значений даты по умолчанию определенное представление, то это можно выполнить с помощью свойств Формат и ФорматРедактирования колонки таблицы (в приведенном примере – колонки ТЗЗначение), рис. 4.31. Операции со значениями типа «Дата» Для значений (табл. 4.12). типа Дата определены арифметические операции Таблица 4.12. Арифметические операции Операция Операнды Результат Сложение Вычитание Дата + Число Дата - Дата Вычитание Дата - Число Дата, увеличенная на количество секунд Число, соответствующее разнице между двумя датами, измеренной в секундах Дата, уменьшенная на количество секунд Для значений типа Дата определены логические операции (табл. 4.13). Таблица 4.13. Логические операции Операция Больше Операнды Дата > Дата Больше или равно Дата >= Дата Рис. 4.31. Установка формата для колонки таблицы Для колонки таблицы форматная строка поддерживает параметр ДП, который задает представление пустой даты. В результате приведенная выше таблица будет выглядеть, например, следующим образом (рис. 4.32). Равно Дата = Дата Не равно Дата <> Дата Меньше Дата < Дата Меньше или равно Дата <= Дата Результат Истина, если первый операнд больше второго. В противном случае Ложь Истина, если первый операнд больше либо равен второму. В противном случае Ложь Истина, если первый операнд равен второму. В противном случае Ложь Истина, если первый операнд не равен второму. В противном случае Ложь Истина, если первый операнд меньше второго. В противном случае Ложь Истина, если первый операнд меньше либо равен второму. В противном случае Ложь Преобразование значений типа «Дата» Неявное преобразование При выполнении различных операторов могут возникнуть ситуации, когда значения типа Дата не подходят для выполнения данных операций. Например, при выводе значений типа Дата может быть выполнено преобразование к строке (листинг 4.28). Листинг 4.28. Неявное преобразование значения типа «Дата» Рис. 4.32. Представление пустой даты в колонке таблицы Том 1 ПеременнаяДата = '20110514234512'; Сообщить(ПеременнаяДата); 87 Глава 4. Работа с данными Явное преобразование Таблица 4.15. Операции сравнения Явным образом значение типа Дата может быть преобразовано только к строке. Для этого используется встроенная функция Строка(), в качестве параметра которой передается преобразуемая дата. Результатом такого преобразования будет строковое представление даты, полученное в соответствии с региональными установками сеанса. Операция Операнды Больше Больше или равно Равно Не равно Меньше Меньше или равно Булево > Булево Булево >= Булево Булево = Булево Булево <> Булево Булево < Булево Булево <= Булево Например, результатом выполнения оператора (листинг 4.29) будет сообщение 27.04.2011 12:36:58. Листинг 4.29. Явное преобразование типа «Дата» Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка('20110427123658'); Сообщение.Сообщить(); А для сеанса, запущенного с параметром командной строки /VL, равным el_GR (Греция), результатом выполнения этого же оператора будет другое сообщение – 27/4/2011 12:36:58 μμ. Для значений типа Булево определены булевы операции (табл. 4.16). Таблица 4.16. Булевы операции Операция Операнды Результат И Булево И Булево Истина, если оба операнда имеют значение Истина. В остальных случаях Ложь ИЛИ Булево ИЛИ Булево Ложь, если оба операнда имеют значение Ложь. В остальных случаях Истина НЕ НЕ Булево Истина, если значение операнда Ложь. В противном случае Ложь Булево Тип Булево предназначен для представления логических величин. Он имеет только два значения: Истина и Ложь. Преобразование значений типа «Булево» Литерал значения типа «Булево» Конкретные значения типа Булево во встроенном языке и языке запросов задаются литералами (табл. 4.14). При выполнении различных операторов могут возникать ситуации, когда значения типа Булево не подходят для выполнения данных операций (листинг 4.30). Таблица 4.14. Литералы типа «Булево» Листинг 4.30. Неявное преобразование значений типа «Булево» Значение Литерал Истина Ложь Истина или True Ложь или False Значение типа «Булево» по умолчанию Значением типа Булево по умолчанию является значение Ложь. Неявное преобразование Число = 10; Булево = Истина; Сообщить(Число + Булево); В этом случае может быть выполнено неявное преобразование значения типа Булево к нужному типу. Если такое преобразование не может быть выполнено, будет вызвана ошибка исполнения. Операции со значениями типа «Булево» Неявное преобразование к типу «Число» Для значений типа Булево определены операции сравнения. При сравнении булевых значений считается, что значение Истина больше, чем значение Ложь (табл. 4.15). Если логика исполнения требует преобразования значения типа Булево к типу Число, то это преобразование выполняется по следующим правилам: значение Истина преобразуется к значению 1, а значение Ложь – к значению 0. Таким образом, результатом выполнения предыдущего примера (листинг 4.30) будет строка «11». 88 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Неявное преобразование к типу «Строка» Неявное преобразование к типу Строка будет выполняться, например, в следующем примере (листинг 4.31). Листинг 4.31. Неявное преобразование к типу «Строка» Булево = Истина; Сообщить(Булево); В результате будет получено представление значения в соответствии с языком интерфейса платформы. Например, для русского интерфейса это будет значение Да, а для литовского – Taip. Явное преобразование Преобразование к типу «Число» Встроенный язык позволяет выполнить явное преобразование значения типа Булево к типу Число. Для этого используется встроенная функция Число(), которой в качестве параметра передается булево значение. При этом значение Истина преобразуется в 1, а значение Ложь – в 0 (листинг 4.32). Листинг 4.32. Преобразование к типу «Число» Результат = Число(Истина); Сообщить(Результат); Преобразование к типу «Строка» Встроенный язык позволяет также преобразовывать значение типа Булево к типу Строка. Для этого используется встроенная функция Строка, которая возвращает представление булева значения в соответствии с языком интерфейса платформы (листинг 4.33). Листинг 4.33. Преобразование к типу «Строка» Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(Истина); Сообщение.Сообщить(); В результате выполнения этого кода в окно сообщений будет выведено Да (для русского языка интерфейса). Значение «Неопределено» Значение типа Неопределено применяется тогда, когда необходимо использовать «пустое значение», не принадлежащее ни к одному другому типу данных, определенных в прикладном решении. Тип Неопределено имеет одно-единственное значение – Неопределено. Это значение используется, например, как значение составного типа по умолчанию. По этой причине составной тип всегда содержит тип Неопределено. Том 1 Подробнее Раздел «Составной тип данных», стр. 101. Представлением значения Неопределено является пустая строка. Литерал значения типа «Неопределено» Значение типа Неопределено во встроенном языке и языке запросов задается литералом Неопределено. Операции со значением «Неопределено» Для значения Неопределено определены операции сравнения на равенство и неравенство со значениями других типов. Таким образом, для любой переменной всегда может быть выполнено сравнение на равенство (или неравенство) ее значения значению Неопределено (листинг 4.34). Листинг 4.34. Сравнение со значением «Неопределено» Сообщение = Новый СообщениеПользователю; Если РеквизитФормыСоставной = Неопределено Тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); Преобразование значений типа «Неопределено» Значение Неопределено может быть преобразовано только в значение типа Строка. Такое преобразование может выполняться системой неявно, например, при выводе значения Неопределено, или явно, с использованием встроенной функции Строка(). Результатом преобразования является пустая строка. Null Тип Null, так же как и тип Неопределено, имеет единственное значение – Null. Это значение используется системой для обозначения отсутствующего значения при работе с базой данных. Такая ситуация может возникнуть, например, при соединении нескольких таблиц в запросах, когда для одной из соединяемых таблиц нет записей в другой таблице, удовлетворяющих указанным условиям. Кроме приведенного примера, значение Null может быть получено и в других случаях. Например, когда выполняется обращение к реквизитам объекта, которые не используются. Допустим, у иерархического справочника Номенклатура существует реквизит Артикул, для которого свойство Использование установлено в значение ДляЭлемента. В этом случае поле 89 Глава 4. Работа с данными Артикул будет доступно для редактирования только у элементов спра- вочника. У групп справочника это поле не будет содержать никакой информации. Поэтому при обращении к реквизиту Артикул у группы справочника Номенклатура система будет возвращать значение Null (листинг 4.35). Листинг 4.35. Значение типа Null Сообщение = Новый СообщениеПользователю; Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Префикс = "Группа: "; Иначе Префикс = "Элемент: "; КонецЕсли; Сообщение.Текст = Префикс + СокрЛП(Выборка.Наименование) + ", тип артикула: " + ТипЗнч(Выборка.Артикул); Сообщение.Сообщить(); КонецЦикла; В приведенном примере выбираются все элементы справочника Номенклатура, и затем выводится информация о типе значения реквизита Артикул для каждого элемента выборки. Литерал значения типа Null Значение Null во встроенном языке и языке запросов задается литералом Null, а представлением значения Null является пустая строка. Операции со значениями типа Null Для значения Null определены операции сравнения на равенство и неравенство со значениями других типов. В результате этого для любой переменной всегда может быть выполнено сравнение на равенство (или неравенство) ее значения значению Null (листинг 4.36). Листинг 4.36. Сравнение со значением типа Null Сообщение = Новый СообщениеПользователю; Выборка = Справочники.Номенклатура.Выбрать(); В приведенном примере выбираются все элементы справочника Номенклатура. Затем для каждого элемента проверяется равенство его артикула значению Null, и в зависимости от этого формируется строка для вывода сообщения. Преобразование значений типа Null Значение Null может быть преобразовано только в значение типа Строка. Такое преобразование может выполняться системой неявно, например, при выводе значения Null, или явно, с использованием встроенной функции Строка(). Результатом преобразования является пустая строка. Тип Значения типа Тип используются для идентификации различных типов значений и их сравнения. Значения этого типа возвращаются двумя системными функциями: Тип() и ТипЗнч(). Также значения этого типа могут быть получены из объекта ОписаниеТипов в виде массива значений (метод Типы()). Функция Тип() позволяет получить значение этого типа, соответствующее переданному в качестве параметра имени некоторого типа (листинг 4.37). Листинг 4.37. Использование функции «Тип()» ТипСтрока = Тип("Строка"); ТипЧисло = Тип("Число"); ТипСсылкаНаСправочникНоменклатура = Тип("СправочникСсылка.Номенклатура"); Функция ТипЗнч() также позволяет получить значение типа Тип, однако в качестве параметра ей передается не имя типа, а само значение какоголибо типа (листинг 4.38). Листинг 4.38. Использование функции «ТипЗнч()» ТипСтрока = ТипЗнч("произвольная строка"); ТипЧисло = ТипЗнч(387.67); ТипСсылкаНаСправочникНоменклатура = ТипЗнч(Справочники.Номенклатура.НайтиПоКоду("000000001")); Операции со значениями типа «Тип» Для значений типа Тип определены операции сравнения на равенство и неравенство. Это позволяет выполнять проверку принадлежности произвольного значения некоторому типу (листинг 4.39). Пока Выборка.Следующий() Цикл Суффикс = ?(Выборка.Артикул = Null, "не используется", Выборка.Артикул); Сообщение.Текст = СокрЛП(Выборка.Наименование) + ", артикул: " + Суффикс; Сообщение.Сообщить(); КонецЦикла; Листинг 4.39. Проверка принадлежности значения типу 90 Профессиональная разработка в системе «1С:Предприятие 8» Сообщение = Новый СообщениеПользователю; Если ТипЗнч(ПроверяемаяПеременная) = Тип("Строка") Тогда Сообщение.Текст = "Тип проверяемой переменной – строка"; Сообщение.Сообщить(); КонецЕсли; Система типов объекта>Выборка.<имя>), имеют схожую функциональность, схожее поведение и одинаковые приемы работы с ними. Преобразование значений типа «Тип» <вид Значения этого типа могут быть преобразованы только к значениям типа Строка. Такое преобразование может быть выполнено системой неявно, при выводе значения, например, или явно, с использованием встроенной функции Строка(). Результатом такого преобразования будет представление описываемого типа, полученное в соответствии с используемым языком интерфейса платформы (табл. 4.17). Такая организация системы прикладных типов существенно облегчает разработку прикладных решений, поскольку если разработчик освоил работу с выборкой справочника, то он уже без труда, по аналогии, сможет работать и с выборкой регистра сведений, и, например, с выборкой бизнеспроцесса (табл. 4.18). Таблица 4.18. Основные типы для работы с данными объектов конфигурации Таблица 4.17. Преобразование к типу «Строка» Значение Язык интерфейса Представление платформы Тип("Строка") Тип("Строка") Тип("Строка") Тип("СправочникСсылка.Номенклатура") Тип("СправочникСсылка.Номенклатура") Тип("СправочникСсылка.Номенклатура") Русский Украинский Латышский Русский Казахский Грузинский Строка Рядок Rinda Справочник ссылка: Номенклатура Анықтама сілтеме: Номенклатура ცნობარი მინიშნება: Номенклатура Типы, образуемые в прикладном решении В отличие от примитивных типов, которые определены на уровне технологической платформы и поддерживаются в любом прикладном решении, прикладные типы создаются в конкретных прикладных решениях в результате добавления в конфигурацию какого-либо объекта метаданных. Прикладные типы создаются платформой автоматически и позволяют работать с данными, хранящимися в тех структурах, которые описываются данным объектом конфигурации. В зависимости от объекта конфигурации будут добавляться различные типы данных. Например, при добавлении справочника Номенклатура будут созданы такие типы данных, как: СправочникМенеджер.Номенклатура, СправочникСсылка.Номенклатура, СправочникОбъект.Номенклатура, СправочникВыборка.Номенклатура. Если же в конфигурацию добавить, например, регистр сведений КурсыВалют, то станут доступны следующие типы: РегистрСведенийМенеджер.КурсыВалют; РегистрСведенийВыборка.КурсыВалют; РегистрСведенийМенеджерЗаписи.КурсыВалют; РегистрСведенийНаборЗаписей.КурсыВалют; РегистрСведенийЗапись.КурсыВалют; РегистрСведенийКлючЗаписи.КурсыВалют. Как можно заметить из названий, некоторые типы «похожи» (например, СправочникВыборка.Номенклатура и РегистрСведенийВыборка.КурсыВалют), а некоторые нет (например, СправочникОбъект.Номенклатура и РегистрСведенийНаборЗаписей.КурсыВалют). Это действительно так: типы, создаваемые для различных объектов конфигурации и принадлежащие к одной группе прикладных типов (например, Том 1 Объект конфигурации Константа Менеджер Выборка Ссылка Объект Набор Запись записей Ключ записи + + + + + + + + + + + + + + + + + + + + + + + + Критерий отбора Журнал документов Перечисление Справочник Документ План видов характеристик План счетов План видов расчета Бизнес-процесс Задача План обмена Отчет Обработка Последовательность Перерасчет Регистр сведений Регистр накопления Регистр бухгалтерии Регистр расчета + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Для некоторых объектов конфигурации создаются дополнительные типы, реализующие специальную функциональность, присущую только данным объектам конфигурации (табл. 4.19). Таблица 4.19. Дополнительные типы для работы с данными объектов конфигурации Объект конфигурации Константа План счетов План видов расчета Регистр сведений Регистр бухгалтерии Типы КонстантаМенеджерЗначения.<имя> КонстантыНабор ПланСчетовВидыСубконто.<имя> ПланСчетовВидыСубконтоСтрока.<имя> ВедущиеВидыРасчета.<имя> ВедущиеВидыРасчетаСтрока.<имя> ВытесняющиеВидыРасчета.<имя> ВытесняющиеВидыРасчетаСтрока.<имя> БазовыеВидыРасчета.<имя> БазовыеВидыРасчетаСтрока.<имя> РегистрСведенийМенеджерЗаписи.<имя> РегистрБухгалтерииСубконто.<имя> 91 Глава 4. Работа с данными Менеджер объектов Листинг 4.41. Использование менеджера для проверки принадлежности к типам ссылок Для каждого вида объектов конфигурации (справочники, документы и т. д.) в системе определен тип менеджера этих объектов (СправочникиМенеджер, ДокументыМенеджер и т. д.). Эти типы существуют всегда, вне зависимости от того, есть ли в конкретном прикладном решении хоть один такой объект или нет. СсылкиНаВсеСправочники = Справочники.ТипВсеСсылки(); Каждый из этих типов имеет единственное значение в конкретном прикладном решении. Это можно проиллюстрировать на следующем примере (листинг 4.40). Листинг 4.40. Сравнение экземпляров объектов менеджеров МенеджерСправочников1 = Справочники; МенеджерСправочников2 = Справочники; Если МенеджерСправочников1 = МенеджерСправочников2 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объекты равны"; Сообщение.Сообщить(); КонецЕсли; Менеджеры объектов доступны через соответствующие свойства глобального контекста (например, Справочники или Документы). Главная задача этого типа – предоставить доступ к менеджерам конкретных объектов конфигурации (СправочникМенеджер.<имя>, ДокументМенеджер.<имя> и т. д.), рис. 4.33. Сообщение = Новый СообщениеПользователю; Если СсылкиНаВсеСправочники.СодержитТип(ТипЗнч(АнализируемоеЗначение)) Тогда Сообщение.Текст = "Это ссылка на справочник"; Иначе Сообщение.Текст = "Значение не является ссылкой на справочник"; КонецЕсли; Сообщение.Сообщить(); В приведенном примере используется метод ТипВсеСсылки() менеджера справочников для того, чтобы в переменной СсылкиНаВсеСправочники получить объект ОписаниеТипов, содержащий типы ссылок на все справочники прикладного решения. Затем, используя его метод СодержитТип(), проверяется, входит ли тип анализируемого значения в состав этого описания типов или нет. Менеджеры конкретных объектов конфигурации доступны двумя путями. Во-первых, они доступны как свойства менеджера объектов (листинг 4.42). Листинг 4.42. Обращение к менеджеру объекта конфигурации МенеджерСправочников = Справочники; МенеджерСправочникаКонтрагенты = МенеджерСправочников.Контрагенты; Кроме этого, менеджеры объектов можно получить перебором коллекции значений, которой является менеджер объектов. Элементами этой коллекции как раз и являются менеджеры отдельных объектов (листинг 4.43). Листинг 4.43. Обход коллекции менеджеров объектов Сообщение = Новый СообщениеПользователю; МенеджерСправочников = Справочники; Для Каждого МенеджерСправочника Из МенеджерСправочников Цикл Сообщение.Текст = ТипЗнч(МенеджерСправочника); Сообщение.Сообщить(); КонецЦикла; Менеджер Рис. 4.33. Структура типов Кроме этого, менеджер объектов позволяет проверить, является ли тип какого-либо значения типом ссылки на объект этого типа (листинг 4.41). Менеджер прикладного объекта можно назвать «точкой входа» в конкретный объект конфигурации в объектной модели встроенного языка. Объекты этого типа предоставляют доступ к общим действиям, относящимся к конкретному объекту конфигурации (например, к справочнику Контрагенты или к документу Авансовый отчет). В основном это: ■■ получение выборок из данных этого объекта конфигурации; ■■ создание и поиск элементов данных; 92 Профессиональная разработка в системе «1С:Предприятие 8» Система типов ■■ доступ к предопределенным элементам данных; ■■ выполнение общих действий, поддерживаемых данным объектом конфигурации; ■■ получение макетов. Набор записей В конкретном прикладном решении всегда существует только один экземпляр каждого менеджера, в чем можно убедиться на следующем примере (листинг 4.44). Так же как и объект для объектных данных, набор записей является единственным объектом, с помощью которого в конечном счете выполняется модификация необъектных данных. Листинг 4.44. Сравнение экземпляров объектов менеджеров объекта конфигурации Подробнее МенеджерСправочникаКонтрагенты1 = Справочники.Контрагенты; МенеджерСправочникаКонтрагенты2 = Справочники.Контрагенты; Если МенеджерСправочникаКонтрагенты1 = МенеджерСправочникаКонтрагенты2 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объекты равны"; Сообщение.Сообщить(); КонецЕсли; Объект Тип объекта, так же как и ссылка, создается не для всех объектов конфигурации, а только для тех, которые хранят в базе данных объектные данные (справочники, документы, планы счетов и пр.). Только с помощью объекта может быть выполнена модификация данных, хранящихся в базе данных. Другие типы объектных данных позволяют выполнять только чтение данных из базы данных. Подробнее Раздел «Объект», стр. 69. Ссылка Тип ссылки создается не для всех объектов конфигурации, а только для тех, которые хранят данные объектного типа (справочники, документы, планы счетов и пр.). Тип ссылки служит прежде всего для однозначной идентификации объекта данных (как совокупности логически связанных данных) в базе данных. Значением ссылки является фактически уникальный внутренний идентификатор, который хранится в поле Ссылка таблиц, создаваемых системой для объекта конфигурации. Тип набора записей, в отличие от ссылок и объектов, предназначен для работы с необъектными данными, такими как, например, наборы записей различных регистров. Раздел «Необъектные данные», стр. 75. Динамический список Объект ДинамическийСписок предназначен для динамического просмотра данных объекта конфигурации в элементе формы Таблица. Динамический список осуществляет считывание данных из базы данных порциями, в процессе навигации пользователя по списку или в процессе обращения к ним из встроенного языка. С помощью динамического списка построены все формы списка объектов конфигурации, которые содержат основной реквизит типа ДинамическийСписок. Динамический список формируется путем запроса к основной таблице, указанной в соответствующем свойстве реквизита, или путем произвольного запроса к базе данных. Кроме того, объект ДинамическийСписок может быть доступен из встроенного языка. Динамический список использует систему компоновки данных и позволяет задать группировку, отбор, порядок и условное оформление списка путем установки соответствующих свойств реквизита типа ДинамическийСписок (как интерактивно, так и программно) или путем настройки списка в режиме 1С:Предприятие. Для примера рассмотрим форму списка документов Расходная накладная, сформированную конструктором форм. В качестве основного реквизита формы платформа добавила реквизит Список типа ДинамическийСписок и заполнила по умолчанию его свойства ОсновнаяТаблица и ДинамическоеСчитываниеДанных (рис. 4.34). Ссылка позволяет обращаться к свойствам объекта базы данных, а также получать сам объект. Подробнее Раздел «Ссылка», стр. 66. Том 1 93 Глава 4. Работа с данными Обычно далеко не все поля динамического списка используются для отображения в форме. Хотя в списке полей присутствуют все реквизиты документа РасходнаяНакладная, платформа стандартно отображает в форме списка документов только поля Дата и Номер. При необходимости разработчик может перетащить любое поле динамического списка в дерево элементов формы и тем самым отобразить его в форме списка. Особенность использования динамического списка в том, что запросом из базы данных считываются значения только тех реквизитов, которые отображаются в форме. Это сделано для того, чтобы не передавать на клиента лишнюю информацию и не замедлять работу прикладного решения со списками данных. Рис. 4.34. Свойства основного реквизита типа «Динамический список» Если указана основная таблица, то платформа автоматически будет формировать запрос к этой таблице для получения данных динамического списка. С помощью свойства ДинамическоеСчитываниеДанных динамическому списку указывается на необходимость считывания данных небольшими порциями только при необходимости их отображения на экране. Раскрыв реквизит Список, можно увидеть поля динамического списка (стандартные и созданные разработчиком реквизиты документа РасходнаяНакладная), а также его свойства: Отбор, Порядок, УсловноеОформление, Группировка и Параметры, доступные для настройки списка как интерактивно, так и программно (рис. 4.35). Однако если есть необходимость всегда считывать запросом и передавать на клиента значение какого-то поля, то можно включить для него свойство Использовать всегда (см. рис. 4.35) или установить программно признак обязательного использования (Список.УстановитьОбязательноеИспользование("Ссылка", Истина)). В этом случае указанное поле будет считываться из базы данных и передаваться на клиента, даже если оно не отображается в форме. Если у динамического списка установить свойство ПроизвольныйЗапрос, то станет доступным ручное формирование запроса для получения данных из информационной базы. Открыв окно Настройка списка, можно с помощью конструктора запроса либо вручную создать произвольный запрос к базе данных, выбирающий данные из нескольких таблиц, использующий параметры, вычисляемые поля и т. д. (рис. 4.36). Рис. 4.36. Создание произвольного запроса для динамического списка Произвольный запрос для динамического списка можно создать и программным образом. Например, требуется открыть список приходных накладных с отбором по номенклатуре (листинг 4.45). Рис. 4.35. Поля основного реквизита типа «Динамический список» 94 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Листинг 4.45. Создание произвольного запроса для динамического списка &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Свойство("Номенклатура") Тогда Список.ПроизвольныйЗапрос = Истина; Список.ТекстЗапроса = "ВЫБРАТЬ | ДокументРасходнаяНакладная.Номер, | ДокументРасходнаяНакладная.Дата, | ДокументРасходнаяНакладная.Контрагент, | ДокументРасходнаяНакладная.Склад |ИЗ | Документ.РасходнаяНакладная КАК ДокументРасходнаяНакладная |ГДЕ | ДокументРасходнаяНакладная.Товары.Номенклатура = &Номенклатура"; Список.ОсновнаяТаблица = "Документ.РасходнаяНакладная"; Список.Параметры.УстановитьЗначениеПараметра("Номенклатура", Параметры.Номенклатура) КонецЕсли; КонецПроцедуры В обработчике ПриСозданииНаСервере формы списка документов РасходнаяНакладная задается произвольный запрос, показанный на рис. 4.36. Его текст помещается в свойство ТекстЗапроса реквизита Список, содержащего динамический список расходных накладных. Также задается основная таблица списка и устанавливается значение параметра запроса методом УстановитьЗначениеПараметра() коллекции параметров динамического списка (Список.Параметры). Причем произвольный запрос с отбором по номенклатуре выполняется только в том случае, если форма списка расходных накладных открывается с параметром Номенклатура, например, при выполнении параметризированной команды из списка номенклатуры (листинг 4.46). Листинг 4.46. Обработчик параметризированной команды &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ПараметрыФормы = Новый Структура("Номенклатура", ПараметрКоманды); ОткрытьФорму("Документ.РасходнаяНакладная.ФормаСписка", ПараметрыФормы); КонецПроцедуры Если форма списка открывается без параметров, например, при открытии списка расходных накладных из панели навигации, то свойства динамического списка останутся без изменения (см. рис. 4.34) и платформой будет автоматически сгенерирован запрос к основной таблице динамического списка, выбирающий данные всей таблицы расходных накладных. Платформа предоставляет разнообразные и гибкие возможности по настройке динамического списка. Разработчик может настроить группировку, отбор, порядок и условное оформление списка в конфигураторе в окне Настройка списка, нажав в палитре свойств гиперссылку Открыть (рис. 4.37). Том 1 Рис. 4.37. Создание произвольного запроса для динамического списка На приведенном рисунке установлено, что в списке расходных накладных поле Номер документов, содержащих в табличной части в поле Количество значение больше 3, будет выделено пурпурным цветом фона. Аналогичного результата можно добиться программным образом (листинг 4.47). Листинг 4.47. Условное оформление списка &НаКлиенте Процедура УсловноеОформление(Команда) УО = Список.УсловноеОформление.Элементы; ЭлементУО = УО.Добавить(); // Оформление – цвет фона. ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Пурпурный); // Условие – поле "Количество" больше трех. ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"); ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Количество"); ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; ЭлементУсловия.ПравоеЗначение = 3; // Оформляемое поле – "Номер". ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Номер"); КонецПроцедуры Пользователь также может настроить группировку, отбор, порядок и условное оформление динамического списка в режиме 1С:Предприятие, выполнив команду Все действия Настроить список… Диалог настройки списка в пользовательском режиме очень похож на диалог для интерактивной настройки списка в конфигураторе. При этом если разработчик интерактивно или программно уже задал настройки списка, то пользователь увидит эти настройки и сможет их изменить, отключить или удалить. 95 Глава 4. Работа с данными Выборка Выборка предназначена для динамического обхода элементов данных, хранимых в структуре объекта конфигурации. Выборка не считывает данные целиком в память, а получает их блоками, по мере обхода выборки методом Следующий(), листинг 4.48. Листинг 4.48. Пример обхода выборки Сообщение = Новый СообщениеПользователю; ВыборкаВалют = Справочники.Валюты.Выбрать(); Пока ВыборкаВалют.Следующий() Цикл Сообщение.Текст = ВыборкаВалют.Наименование; Сообщение.Сообщить(); КонецЦикла; Благодаря тому, что считывание данных осуществляется порциями, выборку можно использовать для обработки очень больших объемов информации. Каждый блок считываемых данных содержит 25 записей. Для объектных таблиц каждая такая запись содержит все данные объекта, включая все его поля и табличные части. Поэтому, например, при обращении к реквизитам выборки или при получении объекта из выборки не происходит повторного обращения к базе данных. Выборка осуществляет считывание данных в определенном порядке. Этот порядок может задаваться, например, путем указания параметров Отбор и Порядок метода Выбрать(). Отбор может быть выполнен только по одному полю, причем это может быть только то поле, для которого построен индекс. Кроме полей, которые индексируются системой по умолчанию, это может быть также поле, для которого в конфигураторе установлен признак индексирования в значение Индексировать или Индексировать с дополнительным упорядочиванием. Отбор по таким полям позволяет выполнять выборку быстро и эффективно. Например, приведенный ниже пример (листинг 4.49) позволяет выбрать из справочника Номенклатура только те элементы, для которых не задан артикул. Отбор задается структурой, содержащей единственный элемент, у которого ключ соответствует имени поля, а значение – значению отбора. Порядок отбираемых записей также может быть задан с использованием полей, которые либо индексируются по умолчанию, либо имеют примитивный тип и для них построение индекса указано в явном виде в конфигураторе. Например, следующий пример (листинг 4.50) позволяет выбрать элементы справочника Договоры контрагентов в порядке убывания даты договора. Листинг 4.50. Пример использования порядка ВыборкаДоговоров = Справочники.ДоговорыКонтрагентов.Выбрать( , , , "Дата Убыв"); Сообщение = Новый СообщениеПользователю; Пока ВыборкаДоговоров.Следующий() Цикл Сообщение.Текст = ВыборкаДоговоров.Наименование; Сообщение.Сообщить(); КонецЦикла; Для иерархических данных (например, справочников, планов видов характеристик, планов счетов) существует также иерархическая выборка, получаемая методом ВыбратьИерархически(). Такая выборка отличается от обычной тем, что выдает данные путем обхода записей в соответствии с их иерархией. То есть после выдачи элемента выдается подчиненный ему элемент, если такой существует. Если подчиненных не существует, то выдается следующий элемент. Причем каждое считывание подчиненных элементов реализовано как считывание отдельного блока данных. Кроме отбора и порядка, выборка позволяет задать также родителя и владельца считываемых данных. При указании конкретного родителя выборка, получаемая методом Выбрать(), будет содержать те элементы, родитель которых равен указанному (рис. 4.38). Листинг 4.49. Пример использования отбора СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("Артикул", "); Сообщение = Новый СообщениеПользователю; ВыборкаНоменклатуры = Справочники.Номенклатура.Выбрать( , , СтруктураОтбора); Рис. 4.38. Указание родителя в выборке Пока ВыборкаНоменклатуры.Следующий() Цикл Сообщение.Текст = ВыборкаНоменклатуры.Наименование; Сообщение.Сообщить(); КонецЦикла; В то же время выборка, получаемая методом ВыбратьИерархически(), будет содержать все элементы, находящиеся в иерархии указанного родителя, т. е. в первом, втором и последующих уровнях иерархии (рис. 4.39). 96 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Рис. 4.39. Иерархическая выборка Если в методе Выбрать() в качестве родителя указать пустую ссылку, то будут выбраны все элементы первого уровня (рис. 4.40). Рис. 4.41. Считывание данных блоками Особенностью такой схемы работы механизма выборки является то, что разработчик не имеет контроля над актуальностью получаемой информации, даже если выборка инициирована в транзакции. При получении очередной записи нет возможности определить, считывается ли эта запись из уже полученного ранее блока, или же она была только что считана в составе нового блока записей. Рис. 4.40. Выборка элементов верхнего уровня При указании в параметрах выборки конкретного владельца будут отбираться записи подчиненного справочника, владелец которых равен указанному. Например, в следующем примере (листинг 4.51) будут выбраны все договоры контрагента с кодом Ю0004. Листинг 4.51. Выборка подчиненных элементов Владелец = Справочники.Контрагенты.НайтиПоКоду("Ю00000004"); Эта особенность работы механизма выборки может приводить к тому, что в выборку могут попасть данные удаленного объекта, некоторые записи могут попасть дважды или не попасть в выборку вообще. Получение данных удаленного объекта Допустим, после получения записей очередного блока одна из записей, относящихся к этому блоку, была удалена из базы данных. В этом случае к моменту окончания обхода выборки физически эта запись будет отсутствовать в базе данных, хотя в то же время она будет присутствовать в полученной выборке (рис. 4.42). ВыборкаДоговоров = Справочники.ДоговорыКонтрагентов.ВыбратьИерархически( , Владелец); Сообщение = Новый СообщениеПользователю; Пока ВыборкаДоговоров.Следующий() Цикл Сообщение.Текст = ВыборкаДоговоров.Наименование; Сообщение.Сообщить(); КонецЦикла; Особенности использования выборки Как было показано выше, выборка считывает данные в определенной последовательности сортировки. При обходе выборки методом Следующий() выполняется получение очередных блоков данных в соответствии с порядком сортировки и выдачей записей ранее считанного блока. Другими словами, очередной блок считывается как множество записей, которые следуют в указанном порядке после последней полученной записи предыдущего блока (рис. 4.41). Том 1 Рис. 4.42. Получение данных удаленного объекта 97 Глава 4. Работа с данными Множественное попадание записи в выборку Например, в процессе получения выборки справочника в порядке наименования элемент справочника Женские сапоги был переименован в Сапоги женские. В этом случае порядок следования данной записи изменится, и может возникнуть ситуация, когда переименованный элемент справочника в порядке следования окажется среди записей еще не считанного блока. При получении данного блока эта запись будет считана повторно (рис. 4.43). Рис. 4.45. Удаление родителя Таким образом, при использовании обычной выборки может возникнуть ситуация, когда в результате удаления элемента могут быть удалены также и элементы, уже считанные в текущем блоке (рис. 4.46). Рис. 4.43. Множественное попадание записи в выборку Непопадание записи в выборку Ситуация, когда запись может вообще не попасть в выборку, прямо противоположна предыдущей. Например, в процессе выборки справочника в порядке наименования элемент справочника Сапоги женские, находящийся в порядке следования среди записей еще не считанного блока, был переименован в Женские сапоги и в соответствии с порядком следования оказался среди записей уже считанного ранее блока (рис. 4.44). Рис. 4.46. Удаление родителя в процессе выборки В этом случае при попытке выполнения каких-либо действий с полученным из выборки объектом (на рисунке – Подчиненный1) будет выдаваться ошибка, т. к. в базе данных этот объект уже не существует. По этой причине для удаления иерархических данных следует использовать иерархическую выборку. В этом случае все подчиненные элементы будут располагаться в порядке следования в одном или нескольких блоках за родительским элементом, и после удаления родителя (и, соответственно, его подчиненных элементов) просто будет выполнено чтение следующего за ними по порядку блока записей (рис. 4.47). Рис. 4.44. Непопадание записи в выборку Удаление иерархических данных Особенность использования выборки для обхода и удаления иерархических данных связана с тем, что при удалении элемента (родителя) удаляются и все его подчиненные элементы (рис. 4.45). Рис. 4.47. Удаление родителя в процессе иерархической выборки 98 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Обобщая все перечисленные особенности использования выборок, можно сказать, что следует внимательно относиться к изменению объектов в процессе обхода динамической выборки, так как это может повлиять на порядок их включения в выборку. Наряду с этим рекомендуется использовать динамические выборки либо для задач, не требующих ответственного чтения данных, либо для регламентных задач, которые могут выполняться в монопольном режиме. Также использование динамических выборок можно рекомендовать в тех случаях, когда объем данных, выбираемых из базы данных, очень велик, и получение выборки такого объема другими способами (например, запросом) неэффективно. При редактировании объектов конфигурации (например, при указании типа данных реквизита формы) числовой тип данных описывается средствами визуального конструирования (рис. 4.48). Типы данных Тип данных в системе «1С:Предприятие» представляет собой перечень возможных типов значений, которые могут быть использованы тем или иным элементом системы. Типы данных используются при описании таких элементов системы, как: ■■ объекты конфигурации (реквизиты, измерения, ресурсы и др.); ■■ реквизиты формы; ■■ элементы управления, расположенные в форме и в табличном документе; ■■ некоторые объекты встроенного языка (список значений, колонки таблицы значений и дерева значений и др.). Тип данных позволяет перечислить типы значений, которые используются, а также для некоторых примитивных типов значений позволяет задать квалификаторы, описывающие допустимые значения примитивных типов. При визуальном конструировании тип данных может быть описан с помощью палитры свойств или в специальном диалоге редактирования типа данных. Во встроенном языке для описания типа данных используется объект встроенного языка ОписаниеТипов. Числовые типы данных При описании допустимых значений типа Число существует возможность указать: ■■ допустимый знак числа (он может быть любым или неотрицательным); ■■ общую разрядность числа; ■■ разрядность дробной части. Эта возможность часто используется при организации интерфейса системы. Том 1 Рис. 4.48. Редактирование типа данных «Число» Кроме этого, числовой тип данных может быть указан и средствами встроенного языка (например, при создании таблицы значений, которая в дальнейшем будет использована для ввода данных), листинг 4.52. Для этого используется объект КвалификаторыЧисла. Листинг 4.52. Использование квалификаторов числа КвалификаторЧисла = Новый КвалификаторыЧисла(5, 2, ДопустимыйЗнак.Неотрицательный); ОписаниеТипа = Новый ОписаниеТипов("Число", КвалификаторЧисла); ТаблицаСкидок.Колонки.Добавить("Товар", Новый ОписаниеТипов( "СправочникСсылка.Номенклатура")); ТаблицаСкидок.Колонки.Добавить("Скидка", ОписаниеТипа); В этом примере сначала создается новый объект Квалификаустанавливающий общее количество разрядов – 5, количество разрядов дробной части – 2 и допустимый знак числа – неотрицательный. Затем на основании этого объекта создается новый объект ОписаниеТипов, содержащий описание типа Число с указанными ограничениями. Далее при добавлении колонки Скидка в таблицу значений ТаблицаСкидок этот объект указывается в качестве описания типа данной колонки. Таким образом, в колонке Скидка таблицы значений ТаблицаСкидок сможет находиться неотрицательное число, содержащее пять разрядов, из которых два отведены под дробную часть числа. торыЧисла, Строковые типы данных При описании допустимых значений типа Строка существует возможность указать: ■■ какой вариант ограничения длины будет использоваться для строкового значения (фиксированная длина или переменная длина); ■■ длину строкового значения (в случае фиксированной длины). 99 Глава 4. Работа с данными В зависимости от длины строки различают строки ограниченной и неограниченной длины. Если длина строки равна нулю, то такая строка имеет неограниченную длину. В противном случае строка будет иметь ограниченную длину. Отличие строк ограниченной и неограниченной длины можно проиллюстрировать следующим примером. Пусть есть два реквизита: строка длиной 10 (СтрокаОграниченная10) и строка неограниченной длины (СтрокаНеограниченная). Тогда при присвоении этим реквизитам строкового значения, имеющего длину 14 символов, в первом случае оно будет обрезаться до 10 символов, а во втором случае – нет (листинг 4.53). Результатом выполнения приведенного примера будут следующие сообщения: Строка фиксированной длины (10): "новое Строка переменной длины (10): "новое" " При редактировании объектов конфигурации (например, при указании типа данных реквизита формы) строковый тип данных описывается средствами визуального конструирования (рис. 4.49). Листинг 4.53. Использование строк ограниченной и неограниченной длины Сообщение = Новый СообщениеПользователю; СтрокаОграниченная10 = "новое значение"; Сообщение.Текст = "Строка ограниченной длины (10): " + """" + СтрокаОграниченная10 + """"; Сообщение.Сообщить(); СтрокаНеограниченная = "новое значение"; Сообщение.Текст = "Строка неограниченной длины: " + """" + СтрокаНеограниченная + """"; Сообщение.Сообщить(); Результатом выполнения приведенного примера будут следующие сообщения: Строка ограниченной длины (10): "новое знач" Строка неограниченной длины: "новое значение" Строки ограниченной длины могут быть двух видов: фиксированной и переменной длины. Их отличие также лучше всего продемонстрировать на примере. Пусть есть два реквизита: строка фиксированной длины 10 символов (СтрокаФиксированная10) и строка переменной длины 10 символов (СтрокаПеременная10). Тогда при присвоении этим реквизитам строкового значения, имеющего длину 5 символов, в первом случае оно будет дополняться пробелами справа до указанной длины, а во втором случае – нет (листинг 4.54). Листинг 4.54. Использование строк фиксированной и переменной длины Сообщение = Новый СообщениеПользователю; СтрокаФиксированная10 = "новое"; Сообщение.Текст = "Строка фиксированной длины (10): " + """" + СтрокаФиксированная10 + """"; Сообщение.Сообщить(); Рис. 4.49. Редактирование типа данных «Строка» Кроме этого, строковый тип данных может быть указан и средствами встроенного языка. Например, при создании таблицы значений, которая в дальнейшем будет использована для ввода данных (листинг 4.55). Для этого используется объект КвалификаторыСтроки. Листинг 4.55. Использование квалификаторов строки КвалификаторСтроки = Новый КвалификаторыСтроки(5, ДопустимаяДлина.Переменная); ОписаниеТипа = Новый ОписаниеТипов("Строка", КвалификаторСтроки); ТаблицаСкидок.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТаблицаСкидок.Колонки.Добавить("Артикул", ОписаниеТипа); В этом примере сначала создается новый объект КвалификаторыСтроки, устанавливающий переменную длину строки в пять символов, затем на основании этого объекта создается новый объект ОписаниеТипов, содержащий описание типа Строка с указанными ограничениями. Далее при добавлении колонки Артикул в таблицу значений ТаблицаСкидок этот объект указывается в качестве описания типа данной колонки. Таким образом, в колонке Артикул таблицы значений ТаблицаСкидок сможет находиться строка переменной длины, содержащая максимум пять разрядов. СтрокаПеременная10 = "новое"; Сообщение.Текст = "Строка переменной длины (10): "+ """" + СтрокаПеременная10 + """"; Сообщение.Сообщить(); 100 Профессиональная разработка в системе «1С:Предприятие 8» Система типов Типы данных, описывающие значения типа «Дата» Составной тип данных При описании допустимых значений типа Дата существует возможность указать части даты, которые будут использованы: До сих пор мы рассматривали типы данных, содержащие описание только одного типа значений. Однако в общем случае тип данных может содержать перечень нескольких типов значений. Такой тип данных называется составным. ■■ дата и время, ■■ дата, ■■ время. При редактировании объектов конфигурации (например, при указании типа данных реквизита формы) используются средства визуального конструирования (рис. 4.50). Благодаря наличию составного типа в базе данных могут храниться реквизиты, значения которых имеют разный тип в разные моменты времени, однако в один момент времени может храниться значение только одного из перечисленных типов. Например, документ Внутренний заказ может иметь реквизит Заказчик, имеющий составной тип данных: СправочникСсылка.Подразделения, СправочникСсылка.Склады (рис. 4.51). Это значит, что в этом реквизите могут храниться как значения ссылок на справочник Подразделения, так и значения ссылок на справочник Склады. Рис. 4.50. Редактирование типа данных «Дата» Кроме этого, тип данных, описывающий значения типа Дата, может быть указан и средствами встроенного языка. Например, при создании таблицы значений, которая в дальнейшем будет использована для ввода данных (листинг 4.56). Для этого используется объект КвалификаторыДаты. Тип значения такого реквизита в каждый момент времени может быть различным и определяется значением, которое в данный момент хранится в реквизите. Другими словами, если реквизиту присвоить значение ссылки на справочник Подразделения, то тип значения реквизита будет СправочникСсылка.Подразделения; если присвоить ссылку на справочник Склады, то тип значения будет СправочникСсылка.Склады. Листинг 4.56. Использование квалификаторов даты КвалификаторДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата); ОписаниеТипаДата = Новый ОписаниеТипов("Дата", КвалификаторДаты); КвалификаторЧисла = Новый КвалификаторыЧисла(15, 2); ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", КвалификаторЧисла); ТаблицаКурсВалют.Колонки.Добавить("Дата", ОписаниеТипаДата); ТаблицаКурсВалют.Колонки.Добавить("Курс", ОписаниеТипаЧисло); В этом примере сначала создается новый объект КвалификаторыДаты, который устанавливает использование части даты – Дата. Затем на основании этого объекта создается новый объект ОписаниеТипов, содержащий описание типа Дата с указанными ограничениями. Далее при добавлении колонки Дата в таблицу значений ТаблицаКурсВалют этот объект указывается в качестве описания типа создаваемой колонки. Таким образом, в колонке Дата смогут находиться значения типа Дата, для которых возможно изменение только непосредственно самой даты. Время у этих значений всегда будет равно 00 часов 00 минут 00 секунд. Том 1 Рис. 4.51. Реквизит составного типа Описание значений составного типа Описание составного типа данных может быть выполнено как средствами визуального конструирования, так и средствами встроенного языка. В процессе визуального описания объектов конфигурации для этого используется окно редактирования типа данных (рис. 4.52). Разработчик может перечислить типы значений и наборы типов, которые должны входить в составной тип данных, а также, при необходимости, задать квалификаторы для числовых, строковых значений и значений типа Дата. 101 Глава 4. Работа с данными Значение реквизита составного типа по умолчанию Для реквизита составного типа значением по умолчанию является значение Неопределено. По этой причине тип Неопределено всегда входит в составной тип данных наряду с прочими типами. Представлением значения Неопределено является пустая строка. Подробнее Раздел «Значение «Неопределено»», стр. 89. Если значение реквизита составного типа данных по умолчанию отображается в поле ввода, то при нажатии кнопки выбора в этом поле ввода открывается окно для выбора одного из возможных типов значений. После этого можно будет ввести конкретное значение выбранного типа (рис. 4.53). Рис. 4.52. Окно редактирования типа данных Описывать составной тип данных можно также средствами встроенного языка. Например, у формы можно создать реквизит РеквизитСоставногоТипа и задать его составной тип данных следующим образом (листинг 4.57). Рис. 4.53. Отображение значения по умолчанию реквизита составного типа Листинг 4.57. Описание составного типа МассивТипов = Новый Массив; МассивТипов.Добавить(Тип("Строка")); МассивТипов.Добавить(Тип("Число")); МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура")); Преобразование значений, хранящихся в реквизитах составного типа ОписаниеСоставногоТипа = Новый ОписаниеТипов(МассивТипов); При присвоении значений реквизитам, имеющим составной тип данных, могут возникнуть ситуации, когда присваиваемое значение не соответствует текущему типу значения реквизита. В этом случае система будет выполнять неявное преобразование типа присваиваемого значения к одному из доступных типов значений. НовыйРеквизит = Новый РеквизитФормы("РеквизитСоставногоТипа", ОписаниеСоставногоТипа); МассивРеквизитов = Новый Массив; МассивРеквизитов.Добавить(НовыйРеквизит); ИзменитьРеквизиты(МассивРеквизитов); В этом примере сначала создается массив, содержащий все нужные типы значений, а затем на его основании создается новый объект ОписаниеТипов, который описывает составной тип данных. Затем на основе описания этого типа описывается новый реквизит формы РеквизитСоставногоТипа. После этого формируется массив добавляемых реквизитов, и методом управляемой формы ИзменитьРеквизиты() новый реквизит добавляется в форму. 102 Неявное преобразование Если составной тип данных содержит тип присваиваемого значения, то реквизиту будет установлен новый тип значения и новое значение. Например, пусть для реквизита СоставнойРеквизит задан составной тип данных (рис. 4.54) и текущее значение реквизита равно Истина. После выполнения оператора, приведенного в листинге 4.58, значение реквизита станет равным «новая строка». Профессиональная разработка в системе «1С:Предприятие 8» Система типов В результате выполнения этого кода будет выведено следующее сообщение: Номенклатура: Сигареты Рис. 4.54. Состав типов Если несколько видоизменить код и в качестве приводимого значения получить не ссылку на справочник Номенклатура, а объект справочника, то результат будет уже другим: Листинг 4.58. Присвоение нового значения реквизиту составного типа Строка: Сигареты СоставнойРеквизит = "новая строка"; Так происходит потому, что тип СправочникОбъект.Номенклатура не входит в составной тип данных и система приводит его к одному из типов, входящих в составной тип, в данном случае к типу Строка. Если тип присваиваемого значения не соответствует ни одному из типов, входящих в составной тип данных, тогда система попытается привести тип присваиваемого значения к одному из типов составного типа данных. Например, после выполнения оператора (листинг 4.59) значение реквизита СоставнойРеквизит станет равным строке 10, т. е. система приведет значение типа Число к значению типа Строка, который входит в составной тип данных. Листинг 4.59. Присвоение значения реквизиту составного типа СоставнойРеквизит = 10; В случае, если система не сможет выполнить приведение присваиваемого значения ни к одному типу, входящему в составной тип данных, реквизиту будет присвоено значение по умолчанию – Неопределено. Явное преобразование Явное преобразование к значению реквизита составного типа данных может быть выполнено с использованием объекта встроенного языка ОписаниеТипов. Этот объект имеет метод ПривестиЗначение(), который позволяет привести значение произвольного типа к значению, соответствующему составному типу данных (листинг 4.60). Листинг 4.60. Приведение значения МассивТипов = Новый Массив; МассивТипов.Добавить(Тип("Строка")); МассивТипов.Добавить(Тип("Число")); МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура")); ОписаниеСоставногоТипа = Новый ОписаниеТипов(МассивТипов); ПриводимоеЗначение = Справочники.Номенклатура.НайтиПоКоду("000000001"); Результат = ОписаниеСоставногоТипа.ПривестиЗначение(ПриводимоеЗначение); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "" + ТипЗнч(Результат) + ": " + Результат; Сообщение.Сообщить(); Том 1 Наборы типов При выборе типа данных реквизита система, помимо выбора типов, определенных в конкретном прикладном решении, предоставляет разработчику возможность выбирать наборы типов. Наборами типов, например, являются ЛюбаяСсылка, СправочникСсылка, Характеристика.<имя> и др. Наборы типов, так же как и составной тип данных, содержат некий перечень типов, определенных в данном прикладном решении, однако, в отличие от составного типа, этот перечень формируется системой автоматически, в результате анализа объектов конфигурации. Проведем сравнение на примере ссылок на справочники. Допустим, в прикладном решении имеются справочники Номенклатура и Контрагенты. Тогда мы можем определить реквизит составного типа данных, в который входят типы СправочникСсылка.Номенклатура и СправочникСсылка.Контрагенты. Наряду с этим мы можем определить реквизит, содержащий набор типов СправочникСсылка. И в том и в другом случае мы будем иметь возможность хранить в реквизите ссылки как на справочник Номенклатура, так и на справочник Контрагенты. Теперь добавим в конфигурацию новый справочник Цены. В реквизите составного типа мы по-прежнему сможем хранить только ссылки на справочники Номенклатура и Контрагенты, а в реквизите, описанном как набор типов, мы сможем хранить ссылку на любой из справочников, доступных в данной конфигурации, в том числе и на справочник Цены. При запуске прикладного решения набор типов преобразуется системой, как правило, в составной тип, содержащий все типы, которые должны входить в этот набор. Поэтому во втором случае в набор типов попадет и новый справочник Цены. Однако набор типов не всегда преобразуется системой в составной тип данных. Если оказывается, что в набор типов входит единственный тип значений, то набор типов будет преобразован в этот самый тип значений. Такая ситуация возможна, например, когда план видов характеристик 103 Глава 4. Работа с данными (назовем его Свойства) имеет единственный тип значений в свойстве ТипЗначенияХарактеристик. Тогда набор типов Характеристика.Свойства будет преобразован системой не в составной тип данных, содержащий один тип значений, а в тот единственный тип значений, который указан для плана видов характеристик. а часть – нет. С точки зрения системы такая ситуация недопустима и нарушает целостность базы данных, т. к. результатом интерактивной пометки на удаление должна быть установка пометки на удаление самого элемента и всех его подчиненных элементов. То есть должны быть выполнены либо все перечисленные операции, либо ни одна из них. Эта особенность может быть важна, когда, например, выполняется проверка реквизита, тип которого описан как Характеристика.Свойства, на заполненность. В случае, когда Характеристика.Свойства преобразуется системой в составной тип данных, проверять нужно на значение Неопределено, а если Характеристика.Свойства преобразуется в определенный тип значения, то проверять нужно на значение по умолчанию данного типа. Для того чтобы обеспечить именно такое поведение, установка пометки на удаление выполняется системой в транзакции. Если в процессе выполнения этой последовательности операций произойдет ошибка (например, один из подчиненных элементов будет заблокирован другим пользователем), будет выполнен откат транзакции, и изменения, которые к этому моменту произошли в базе данных, будут отменены (рис. 4.55). Транзакции Независимо от выбранного варианта работы (файловый или клиент-серверный) система «1С:Предприятие» обеспечивает работу с информацией, хранящейся в базе данных, с использованием механизма транзакций. Транзакция – это неделимая с точки зрения воздействия на базу данных последовательность операций манипулирования данными, выполняющаяся по принципу «все или ничего» и переводящая базу данных из одного целостного состояния в другое целостное состояние. Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции). Одним из главных свойств транзакции является ее атомарность, то есть неделимость. Рассмотрим простой пример: интерактивная пометка на удаление группы справочника. Фактически это означает, что нужно выполнить целую последовательность операций: 1. Для группы справочника установить значение поля ПометкаУдаления. 2. Записать группу справочника. 3. Выбрать все элементы справочника, находящиеся в иерархии помечаемой группы. 4. Для каждого из них установить значение поля ПометкаУдаления. 5. Выполнить запись каждого из выбранных элементов. В общем случае нет гарантии, что каждая из перечисленных операций будет успешно выполнена. Например, один из подчиненных элементов справочника может редактироваться другим пользователем, и система в этом случае не сможет изменить данные этого элемента справочника. В результате часть элементов справочника окажется помеченной на удаление, 104 Рис. 4.55. Отказ от изменений, выполненных в транзакции Таким образом, перечисленная последовательность операций становится неделимой с точки зрения базы данных: изменения будут зафиксированы в базе данных только в том случае, если транзакция успешно завершена, т. е. выполнены все перечисленные операции (рис. 4.56). Рис. 4.56. Принятие изменений, выполненных в транзакции Транзакции могут использоваться как самой системой, так и разработчиком при написании модулей. Система осуществляет неявный вызов транзакций при выполнении любых действий, связанных с модификацией информации, хранящейся в базе данных. Например, все обработчики событий, расположенные в модулях объектов и наборов записей, связанные с модификацией данных базы данных, вызываются в транзакции. Наряду с этим разработчик может использовать работу с транзакциями в явном виде. Для этого используются процедуры глобального контекста НачатьТранзакцию(), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию(). Профессиональная разработка в системе «1С:Предприятие 8» Транзакции Использование явного вызова транзакций Процедура НачатьТранзакцию() позволяет открыть транзакцию. После этого все изменения информации базы данных, выполняемые последующими операторами, могут быть либо целиком приняты, либо целиком отвергнуты. Для принятия всех выполненных изменений используется процедура ЗафиксироватьТранзакцию(). Рис. 4.58. Принятие изменений Для того чтобы отменить все изменения, выполнявшиеся в открытой транзакции, используется процедура ОтменитьТранзакцию(). Обработка ошибок базы данных в транзакции Например, может использоваться следующая схема работы с транзакцией (листинг 4.61). Листинг 4.61. Пример использования транзакции НачатьТранзакцию(); // Последовательность выполняемых операторов. … // Проверка возможности выполнения операции. Если не <условие> Тогда ОтменитьТранзакцию(); КонецЕсли; Далеко не во всех случаях разработчик заранее может предусмотреть все возможные проверки. По большому счету это и не нужно. Встроенный язык предоставляет разработчику возможность перехватывать и обрабатывать ошибочные ситуации, возникающие в процессе выполнения модуля с помощью конструкции Попытка … Исключение … КонецПопытки. В конструкцию Попытка … КонецПопытки заключаются операторы, при выполнении которых может произойти исключительная ситуация, а после оператора Исключение описывается последовательность действий, которая должна выполняться, если возникает исключительная ситуация (ошибка). Таким образом, схема работы с транзакцией в более общем виде может выглядеть следующим образом (листинг 4.62). // Последовательность выполняемых операторов. … Листинг 4.62. Обработка исключительных ситуаций ЗафиксироватьТранзакцию(); НачатьТранзакцию(); Суть этой схемы заключается в том, что в процессе выполнения связанной последовательности изменений данных базы данных проверяется возможность выполнения некоторых операций. Если операцию выполнить невозможно, осуществляется откат всех произведенных изменений к состоянию, которое существовало перед выполнением оператора НачатьТранзакцию(), рис. 4.57. // Последовательность операторов. … Попытка // Последовательность выполняемых операторов. … Исключение ОтменитьТранзакцию(); КонецПопытки; // Последовательность выполняемых операторов. … ЗафиксироватьТранзакцию(); Рис. 4.57. Отмена изменений Если все операции выполнены успешно, то после выполнения оператора ЗафиксироватьТранзакцию() все произведенные изменения будут зафиксированы в базе данных (рис. 4.58). Том 1 При использовании такой схемы следует помнить о том, что не все ошибки, возникающие при работе с базой данных, обрабатываются системой одинаково. 105 Глава 4. Работа с данными В общем случае все ошибки базы данных можно разделить на две категории: В зависимости от характера произошедшей ошибки возможны различные сценарии обработки этой ситуации. ■■ невосстановимые, ■■ восстановимые. Если произошедшая ошибка не связана с базой данных, то возможно продолжение транзакции и дальнейшей работы модуля. Если разработчик считает это необходимым, он может отменить транзакцию или, наоборот, продолжить выполнение транзакции, если произошедшая ошибка не нарушает атомарность транзакции. Невосстановимые ошибки – это ошибки, при возникновении которых нормальное функционирование «1С:Предприятия» может быть нарушено, например, могут быть испорчены данные. При возникновении невосстановимой ошибки выполнение «1С:Предприятия» прекращается в любом случае. Если невосстановимая ошибка произошла в процессе выполнения транзакции, то все изменения, сделанные в рамках этой транзакции, отменяются системой (рис. 4.59). Если же исключительная ситуация была вызвана ошибкой базы данных, то система фиксирует факт возникновения ошибки в этой транзакции и дальнейшее продолжение транзакции или ее фиксация становятся невозможны. Единственная операция с базой данных, которую разработчик может произвести в данной ситуации, – это отмена транзакции. После этого он может осуществить попытку выполнения этой транзакции еще раз. Например, фрагмент кода, реализующий этот подход при записи некоторых данных в базу данных, может выглядеть следующим образом (листинг 4.63). Листинг 4.63. Обработка исключительных ситуаций // Признак окончания попыток выполнения записи. Записано = Ложь; Рис. 4.59. Невосстановимая ошибка Восстановимые ошибки – это ошибки, не вызывающие серьезных нарушений в работе «1С:Предприятия». В случае возникновения восстановимой ошибки дальнейшая работа системы может быть продолжена. При этом, естественно, сама операция, вызвавшая ошибку, прекращается, и вызывается исключение, которое может быть перехвачено и обработано конструкцией Попытка … Исключение … КонецПопытки. Если восстановимая ошибка произошла в процессе выполнения транзакции, то система автоматически не выполняет отмену транзакции, предоставляя разработчику возможность самостоятельно обработать сложившуюся ситуацию (рис. 4.60). // Попытки записи выполняются в цикле. Пока не Записано Цикл Попытка НачатьТранзакцию(); Данные.Записать(); ЗафиксироватьТранзакцию(); // В случае фиксации транзакциии прекратить попытки записи. Записано = Истина; Исключение // В случае неудачи отменить текущую транзакцию и следующую // попытку начать с новой транзакции. ОтменитьТранзакцию(); КонецПопытки; КонецЦикла; Рис. 4.60. Восстановимая ошибка 106 Профессиональная разработка в системе «1С:Предприятие 8» Транзакции Вложенный вызов транзакций В рамках уже выполняемой транзакции можно обращаться к процедурам НачатьТранзакцию(), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию(). Например, может использоваться следующая схема вызовов (листинг 4.64). Листинг 4.64. Вложенный вызов транзакций НачатьТранзакцию(); … // Вложенный вызов транзакции. НачатьТранзакцию(); … ЗафиксироватьТранзакцию(); … // Вложенный вызов транзакции. НачатьТранзакцию(); … ЗафиксироватьТранзакцию(); … ЗафиксироватьТранзакцию(); Рис. 4.62. Обработка вложенных вызовов транзакций в «1С:Предприятии» Рассмотрим подробнее механику вложенных вызовов транзакций, реализуемую «1С:Предприятием». Когда в рамках выполняемой транзакции происходит вызов процедуры НачатьТранзакцию(), фактически выполняется всего лишь увеличение на единицу внутреннего счетчика транзакций. Процедура НачатьТранзакцию() действительно начинает новую транзакцию, только если значение внутреннего счетчика транзакций равно нулю (рис. 4.63). Однако подобное обращение не означает начала новой транзакции в рамках уже выполняющейся. «1С:Предприятие» не поддерживает вложенных транзакций. Это означает, что всегда действует только транзакция самого верхнего уровня. Все транзакции, вызванные внутри уже открытой транзакции, фактически относятся к той же транзакции, а не образуют вложенную транзакцию. Таким образом, отмена изменений, выполняемая во вложенной транзакции, будет приводить в конечном счете не к отмене изменений самой вложенной транзакции (рис. 4.61), а к отмене всех изменений транзакции верхнего уровня (рис. 4.62). Рис. 4.63. Работа метода «НачатьТранзакцию()» Обращение к методу ЗафиксироватьТранзакцию() приводит к фиксации результата транзакции только в том случае, если значение внутреннего счетчика транзакций равно единице (рис. 4.64). Рис. 4.61. Механика вложенных транзакций Том 1 107 Глава 4. Работа с данными щение к методам ЗафиксироватьТранзакцию() и ОтменитьТранзакцию() действительно завершает транзакцию. По этой причине во многих случаях при возникновении ошибки при выполнении транзакции разумнее выдать сообщение и предоставить пользователю решать: повторить попытку выполнения операции еще раз или перед повторением попытки предпринять какие-то действия по устранению ситуации, приведшей к ошибке. Влияние транзакций на работу программных объектов Рис. 4.64. Работа метода «ЗафиксироватьТранзакцию()» Обращение к методу ОтменитьТранзакцию() при значении счетчика транзакций больше единицы приведет не только к уменьшению значения счетчика, но и к установке признака, не позволяющего зафиксировать результаты выполнения всей транзакции в целом. Последующее обращение к процедуре ЗафиксироватьТранзакцию() при значении счетчика, равном единице, приведет фактически к отмене всей транзакции верхнего уровня (рис. 4.65). Как уже отмечалось выше, механизм транзакций обеспечивает атомарность и согласованность изменений, выполняемых в базе данных. Работа с данными базы данных осуществляется в системе «1С:Предприятие» посредством различных программных объектов, которые используются системой непосредственно, а также доступны во встроенном языке. Результат такого опосредованного взаимодействия не всегда является очевидным и иногда может вызвать непонимание. В общем случае программные объекты, используемые системой «1С:Предприятие», абсолютно прозрачны для транзакций базы данных. Иначе говоря, транзакции базы данных могут вызываться при выполнении различных методов программных объектов, однако, например, действия, выполняемые базой данных при откате транзакции, в общем случае никак не влияют на соответствующие программные объекты. В качестве примера рассмотрим изменение наименования элемента справочника, выполняемое в транзакции, которая затем отменяется. При выполнении метода ПолучитьОбъект() данные объекта будут считаны из базы данных в свойства экземпляра программного объекта СправочникОбъект.Номенклатура (листинг 4.65). Листинг 4.65. Получение объекта справочника Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Таким образом, и в базе данных, и в свойстве программного объекта будет находиться одно и то же значение наименования – Старое наименование (рис. 4.66). После этого вызывается транзакция и изменяется значение свойства Наименование программного объекта на Новое наименование (листинг 4.66). Листинг 4.66. Изменение наименования элемента справочника в транзакции Рис. 4.65. Работа метода «ОтменитьТранзакцию()» Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Таким образом, не всегда можно быть уверенным, что обращение к методу НачатьТранзакцию() действительно начинает новую транзакцию, а обра- НачатьТранзакцию(); Товар.Наименование = "Новое наименование"; 108 Профессиональная разработка в системе «1С:Предприятие 8» Транзакции Рис. 4.66. Получение объекта справочника Теперь наименования в базе данных и в свойстве программного объекта отличаются (рис. 4.67). Рис. 4.68. Успешная запись объекта справочника Листинг 4.68. Отмена транзакции Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); НачатьТранзакцию(); Товар.Наименование = "Новое наименование"; Товар.Записать(); ОтменитьТранзакцию(); В результате того, что изменения, выполненные в базе данных в транзакции, не принимаются, состояние базы данных возвращается в исходное, т. е. то, которое было до начала транзакции. Это значит, что наименование элемента справочника снова принимает значение Старое наименование. Рис. 4.67. Изменение наименования элемента справочника в транзакции Однако эти изменения никоим образом не касаются программного объекта: значение свойства Наименование остается равным Новое наименование (рис. 4.69). После этого выполняется запись программного объекта (листинг 4.67). Листинг 4.67. Запись объекта справочника Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); НачатьТранзакцию(); Товар.Наименование = "Новое наименование"; Товар.Записать(); После успешной записи данных программного объекта в базу данных наименование элемента справочника и в памяти, и в базе данных будет одинаковым: Новое наименование (рис. 4.68). Затем выполняется отмена транзакции (листинг 4.68). Рис. 4.69. Отмена транзакции Для того чтобы сравнить наименования в базе данных и программном объекте, можно выполнить запрос к базе данных (листинг 4.69). Том 1 109 Глава 4. Работа с данными Листинг 4.69. Сравнение наименования элемента справочника в базе данных и программном объекте Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); НачатьТранзакцию(); Товар.Наименование = "Новое наименование"; Товар.Записать(); ОтменитьТранзакцию(); Запрос = Новый Запрос(“ВЫБРАТЬ | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Код = ""000000001"""); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); НаименованиеВБазе = Выборка.Наименование; НаименованиеВПамяти = Товар.Наименование; Из приведенного примера следует важный вывод: при отмене транзакций базы данных разработчик (если в этом есть необходимость) должен самостоятельно обеспечивать адекватное изменение данных соответствующих программных объектов. Это можно выполнять путем перечитывания всех данных объекта или путем изменения некоторых реквизитов программного объекта (если, например, это необходимо для отображения в интерфейсе). Однако, как в любом правиле, здесь тоже есть исключения. В силу значительной прикладной специфики программных объектов «1С:Предприятия» в некоторых случаях откат изменений, выполненных в базе данных, все же может влиять на значения свойств соответствующих программных объектов. Восстановление признака проведенности документа Сообщение = Новый СообщениеПользователю; Сообщение.Текст = НаименованиеВПамяти; Сообщение.Сообщить(); Сообщение.Текст = НаименованиеВБазе; Сообщение.Сообщить(); При отмене транзакции признак проведенности документа восстанавливает значение, которое было до начала транзакции (листинг 4.71). Если теперь заново прочитать данные объекта из базы данных в программный объект, то значение наименования в программном объекте станет таким же, как и в базе данных (листинг 4.70). НачатьТранзакцию(); Накладная = Документы.ПриходнаяНакладная.СоздатьДокумент(); Накладная.Дата = ТекущаяДата(); Накладная.Записать(РежимЗаписиДокумента.Проведение); Проведен = Накладная.Проведен; ОтменитьТранзакцию(); Листинг 4.70. Перечитывание данных объекта Товар = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); НачатьТранзакцию(); Товар.Наименование = "Новое наименование"; Товар.Записать(); ОтменитьТранзакцию(); Запрос = Новый Запрос("ВЫБРАТЬ | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Код = ""000000001"""); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); НаименованиеВБазе = Выборка.Наименование; НаименованиеВПамяти = Товар.Наименование; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = НаименованиеВПамяти; Сообщение.Сообщить(); Сообщение.Текст = НаименованиеВБазе; Сообщение.Сообщить(); Товар.Прочитать(); Сообщение.Текст = Товар.Наименование; Сообщение.Сообщить(); 110 Листинг 4.71. Восстановление признака проведенности документа Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(Накладная.Проведен); Сообщение.Сообщить(); // Нет Сообщение.Текст = Строка(Проведен); Сообщение.Сообщить(); // Да Очистка ссылки Если объект был создан в транзакции, то при ее откате очищается значение ссылки (листинг 4.72). Листинг 4.72. Очистка ссылки НачатьТранзакцию(); Товар = Справочники.Номенклатура.СоздатьЭлемент(); Товар.Записать(); Ссылка = Товар.Ссылка; ОтменитьТранзакцию(); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ?(Товар.Ссылка = Справочники.Номенклатура.ПустаяСсылка(), "Истина", "Ложь"); Сообщение.Сообщить(); // истина Сообщение.Текст = Строка(Ссылка); Сообщение.Сообщить(); // <Объект не найден> (1:9e4b00055d4c7bcf11d934028f79e857) Профессиональная разработка в системе «1С:Предприятие 8» Механизм управляемых блокировок Очистка кода/номера объекта Если объект создавался вне транзакции и при записи его в транзакции использовался код/номер, сгенерированный автоматически, то при отмене транзакции код/номер очищается (листинг 4.73). Листинг 4.73. Очистка кода Товар = Справочники.Номенклатура.СоздатьЭлемент(); НачатьТранзакцию(); Товар.Записать(); Код = Товар.Код; ОтменитьТранзакцию(); которая записала свои изменения последней, поскольку эти изменения заменят собой все изменения, внесенные до этого. Рассмотрим следующий пример. Допустим, Транзакция № 1 обратилась к элементу справочника Номенклатура и решила изменить значение реквизита товара ЦенаПродажи с 420 на 450. Одновременно Транзакция № 2 решила у этого же товара изменить значение реквизита ЕдиницаИзмерения со Штука на Коробка. Распределение по времени описанных действий показано на рис. 4.70. Таким образом, в элементе справочника остались только те изменения, которые сделала Транзакция № 2. Из примера следует вывод: нельзя одновременно изменять одни и те же данные. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Товар.Код; Сообщение.Сообщить(); // "" Сообщение.Текст = Код; Сообщение.Сообщить(); // "000000008" Проблема «грязного» чтения (англ. The Uncommitted Dependency Problem) возникает в случае, если одна транзакция начинает считывать некоторые данные, не дождавшись окончания внесения изменений, вносимых в эти данные другой транзакцией. При этом достаточно вероятен случай, когда прочитанные данные будут содержать неверную информацию. Механизм управляемых блокировок Вернемся к примеру, рассмотренному выше. Допустим, Транзакция № 1 обратилась к элементу справочника Номенклатура и изменила значение реквизита товара ЦенаПродажи с 420 на 450. Не дождавшись фиксации изменений, Транзакция № 2 использовала значение реквизита этого товара для определения суммы продажи. Однако первая транзакция решила не сохранять внесенные изменения (откат транзакции) и восстановила старые данные. Графическое представление действий транзакций показано на рис. 4.71. Таким образом, Транзакция № 2 в своих расчетах использовала данные, не существующие в системе. Возможные проблемы при многопользовательском доступе к одним и тем же данным Работа в многопользовательской среде требует соблюдения определенного компромисса между требованиями предсказуемости, целостности и непротиворечивости данных информационной базы и требованиями параллельности работы. Как известно, при одновременном чтении и изменении одних и тех же данных конкурирующими транзакциями могут возникнуть следующие проблемы одновременного доступа: ■■ проблема потерянного изменения, ■■ проблема «грязного» чтения, ■■ проблема неповторяемого чтения, ■■ проблема чтения фантомов. Рассмотрим проблем. подробнее каждую из этих Проблема потерянного изменения (англ. The Lost Update Problem) возникает в случае, если две транзакции изменяют одни и те же данные, взяв в качестве первоисточника начальное значение этих данных. При этом в системе останутся изменения, внесенные той транзакцией, Том 1 Рис. 4.70. Иллюстрация проблемы потерянного изменения 111 Глава 4. Работа с данными Допустим, в нашем примере Транзакция № 1 два раза подряд обращается к элементу справочника Номенклатура и каждый раз считывает значение реквизита ЦенаПродажи. Если в промежуток между первым и вторым чтением вклинится Транзакция № 2 и изменит значение этого реквизита, то в результате получится, что первая транзакция работает с данными, которые с ее точки зрения самопроизвольно изменяются. Графическое представление данной проблемы показано на рис. 4.72. Из примера следует вывод: нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений. Рис. 4.71. Иллюстрация проблемы «грязного» чтения Проблема чтения фантомов (англ. The Phantom Read Problem) возникает в случае, если первая транзакция считывает данные и потом на их основе осуществляет определенные действия, а вторая транзакция в этот момент добавляет в эти данные новую информацию. При этом, как и в предыдущем случае, это может привести к некорректному результату. Рассмотрим следующий пример. Допустим, компания занимается продажей товаров и состоит из нескольких отделов. Если объем продаж сотрудников одного отдела превышает 1 000 рублей, то каждый сотрудник отдела получает премию 20 % от суммы своих продаж. В противном случае размер премии составляет 10 %. Очевидно, что процесс начисления премии сотрудникам каждого отдела будет состоять из нескольких операций: Из примера следует вывод: нельзя читать уже измененные, но еще не записанные данные. ■■ получения общей суммы продаж по отделу в целом путем суммирования отдельных продаж по каждому из сотрудников; ■■ определения на основании полученных данных процента премии; ■■ расчета суммы премии для каждого из сотрудников отдела. Проблема неповторяемого чтения (англ. The Inconsistent Analysis Problem) возникает в случае, если одна транзакция несколько раз считывает одни и те же данные, а вторая вносит изменения в эти данные между циклами чтения данных первой транзакции. При этом при повторном считывании первая транзакция может получить другой набор данных. Предположим, что данные о продажах вводит Транзакция № 2, а размер премии рассчитывает Транзакция № 1. Тогда при одновременной работе транзакций может возникнуть ситуация, показанная на рис. 4.73. Таким образом, Транзакция № 1 в двух одинаковых выборках строк получила разные результаты. 112 Профессиональная разработка в системе «1С:Предприятие 8» Рис. 4.72. Иллюстрация проблемы неповторяемого чтения Механизм управляемых блокировок ■■ READ COMMITED – обеспечивает запрет «грязного» чтения. Если одна транзакция начала изменять данные, то конкурирующая транзакция не может не только изменить, но даже прочитать их до завершения изменений, вносимых первой транзакцией. После того как эти изменения закончены, конкурирующие транзакции могут читать данные, не дожидаясь окончания первой транзакции в целом. Таким образом, существует проблема неповторяемого чтения; ■■ REPEATABLE READ – обеспечивает повторяемость чтения данных. Если первая транзакция начинает читать данные, то другая транзакция не может их изменить до окончания первой транзакции; ■■ SERIALIZABLE – последовательное выполнение. Этот уровень изоляции является максимальным и обеспечивает полную изоляцию транзакций друг от друга. Решаются все рассмотренные выше проблемы, включая проблему фантомов. Рис. 4.73. Иллюстрация проблемы чтения фантомов Из примера следует вывод: нельзя вводить новые данные (удалять имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении. Строго говоря, список вышеперечисленных проблем не является окончательным. Уровни изоляции транзакций Итак, ради увеличения производительности системы необходимо разрешить параллельное выполнение транзакций. При этом также нужно обеспечить необходимую степень целостности данных (то есть ограничить параллельность транзакций при работе с одними ресурсами). Строгость этих ограничений может быть различной, в зависимости от решаемой задачи. Поэтому платформе необходим механизм гибкой настройки этих ограничений. В современных СУБД такая возможность реализуется путем применения уровней изоляции транзакций. СУБД, с которыми может взаимодействовать «1С:Предприятие», позволяют использовать следующие уровни изоляции транзакции: ■■ READ UNCOMMITED – незавершенное чтение. Низший уровень изоляции, обеспечивает максимальную параллельность выполнения транзакций. Данный уровень защищает данные, изменяемые одной транзакцией, от изменений, которые могут внести конкурирующие транзакции. Если другой транзакции необходимо изменить те же самые данные, то она должна ожидать завершения изменения данных первой транзакцией. Однако чтение данных разрешено. Таким образом, этот уровень изоляции допускает чтение незавершенных изменений данных; Том 1 В зависимости от используемого уровня изоляции СУБД накладывает различные типы блокировок на различные объекты базы данных на различное время. Режим управляемых блокировок Система «1С:Предприятие» стандартно поддерживает управляемый режим блокировок данных в транзакции. При работе в этом режиме используется достаточно низкий уровень изоляции транзакций в СУБД, позволяющий достичь высокой параллельности работы пользователей (табл. 4.20). Таблица 4.20. Блокировки СУБД, используемые в режиме управляемых блокировок в транзакции СУБД Вид блокировок Уровень изоляции транзакций Файловая база данных MS SQL Server Таблиц Serializable Записей Записей Записей Read Committed Read Committed Read Committed IBM DB2 PostgreSQL Однако этот уровень изоляции транзакций СУБД уже не может сам по себе обеспечить целостность и непротиворечивость данных во всех случаях. Поэтому при модификации данных методами встроенного языка (например, методом Записать() у объектных данных) платформа устанавливает собственные управляемые блокировки в транзакции, которые 113 Глава 4. Работа с данными обрабатываются собственным менеджером транзакционных блокировок (рис. 4.74). Установка управляемых блокировок Средствами встроенного языка установка управляемых блокировок внутри явной или скрытой (неявной) транзакции происходит с помощью специального объекта БлокировкаДанных, описание доступных свойств и методов которого можно посмотреть в синтакс-помощнике, в ветви Общие объекты (рис. 4.75). Рис. 4.74. Управляемые блокировки в транзакции «1С:Предприятия» Эти блокировки также могут быть установлены и разработчиком самостоятельно в тех местах кода, где требуется обеспечить неизменность считываемых в транзакции данных (разделяемая блокировка) или запретить чтение данных другими транзакциями (исключительная блокировка). Управляемые блокировки «1С:Предприятия» учитывают логическую структуру прикладного решения, поэтому позволяют максимально точно блокировать необходимые области данных. Таким образом, менеджер управляемых блокировок позволяет максимально избежать возникновения «плохих» (избыточных) блокировок. Блокируются только действительно необходимые области данных. В результате любой запрос к данным прежде всего обрабатывается собственным менеджером транзакционных блокировок «1С:Предприятия» (см. рис. 4.74). Если на уровне «1С:Предприятия» конфликт управляемых блокировок не обнаруживается, то запрос передается далее, на исполнение СУБД. СУБД также использует собственный механизм блокировок для определения конфликтующих транзакций, с низким уровнем изоляции транзакций, указанным в таблице 4.20. Установка режима управления блокировкой данных в конфигурации Режим блокировок в конфигурации устанавливается с помощью свойства Режим управления блокировкой данных. Это свойство имеет как конфигурация в целом, так и каждый прикладной объект конфигурации. Для платформы «1С:Предприятие» стандартным является режим управляемых блокировок. Поэтому свойство конфигурации Режим управления блокировкой данных для новых конфигураций устанавливается в значение Управляемый. 114 Рис. 4.75. Набор свойств и методов объекта «БлокировкаДанных», доступных в синтакс-помощнике Новый экземпляр данного объекта может быть создан с помощью одноименного конструктора и представляет собой коллекцию элементов блокировки данных. Изначально эта коллекция пуста, и задача разработчика состоит в добавлении в эту коллекцию некоторого количества элементов блокировки. При добавлении нового элемента блокировки для него необходимо указать пространство блокировок, которое будет блокировать данный элемент. Пространства блокировок определены в платформе «1С:Предприятие» Профессиональная разработка в системе «1С:Предприятие 8» Механизм управляемых блокировок и соответствуют структуре прикладных объектов конфигурации. Допустимы следующие имена пространств блокировок и имена полей пространств блокировок (табл. 4.21). Таблица 4.21. Имена пространств блокировок и имена полей пространств блокировок Имя пространства блокировки Имя поля пространства блокировки Справочник.<имя> Документ.<имя> ПланОбмена.<имя> ПланСчетов.<имя> БизнеcПроцесс.<имя> Задача.<имя> ПланВидовРасчета.<имя> ПланВидовХарактеристик.<имя> РегистрСведений.<имя>.НаборЗаписей – только для регистра сведений, подчиненного регистратору РегистрСведений.<имя> РегистрНакопления.<имя>.НаборЗаписей РегистрНакопления.<имя> РегистрБухгалтерии.<имя>.НаборЗаписей РегистрБухгалтерии.<имя> Ссылка Ссылка Ссылка Ссылка Ссылка Ссылка Ссылка Ссылка Регистратор РегистрРасчета.<имя>.НаборЗаписей РегистрРасчета.<имя> Перерасчет.<имя>.НаборЗаписей Последовательность.<имя>.НаборЗаписей Последовательность.<имя> Период – если есть; <имя измерения> Регистратор Период; <имя измерения> Регистратор Период; <имя измерения>; <вид движения> – значение системного перечисления ВидДвиженияБухгалтерии; Счет; Субконто<N>; <вид субконто> Регистратор ПериодРегистрации; ПериодДействия; <имя измерения> ОбъектПерерасчета Регистратор <имя измерения> Константа.<имя> Как видно из таблицы, для объектных данных (справочник, документ и др.) определено единственное пространство блокировки – сам объект данных. Для необъектных данных (например, регистры) определено по два пространства блокировок, которые имеют разный логический смысл. Пространство блокировок с суффиксом НаборЗаписей используется в тех случаях, когда необходимо заблокировать сами записи данного объекта (например, при добавлении новых записей). Пространство блокировок без суффикса используется, когда анализируются некоторые данные этого объекта (например, остатки регистра) или когда выполняются какие-либо операции, приводящие к изменению существующих данных объекта (например, восстановление границы последовательности). Том 1 После того как элемент блокировки, соответствующий некоторому пространству блокировок, добавлен, следует установить для этого элемента режим блокировки (разделяемая или исключительная) и определить значения полей блокировки, чтобы указать, какие же именно «записи» будут заблокированы (для каждого пространства блокировок в платформе определены имена полей, значения которых могут задаваться при установке тех или иных блокировок). Следует понимать, что в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных «1С:Предприятия» в СУБД. Это всего лишь записи о том, что заблокировано «нечто». Иногда можно провести аналогию между управляемыми блокировками и реальными записями СУБД. Например, для объектных данных блокировка объекта с указанной ссылкой будет «соответствовать» блокировке всех записей, содержащих указанную ссылку, во всех таблицах этого объекта конфигурации (в основной таблице и в таблицах его табличных частей). Однако в других случаях провести такую аналогию достаточно затруднительно, да и не нужно. Например, блокировка регистра бухгалтерии с указанием значения вида субконто. Достаточно понимать, что, накладывая такую блокировку, мы запрещаем другим транзакциям каким-либо образом изменять «записи» регистра бухгалтерии, у которых значение вида субконто равно указанному нами. Как при этом данное условие «проецируется» на реальную структуру данных регистра бухгалтерии – для нас совершенно не важно. При установке новых блокировок менеджер анализирует имеющиеся блокировки. Если оказывается, что «нечто», что мы пытаемся заблокировать, уже заблокировано ранее, сравниваются режимы существующей и новой блокировок. Если режимы совместимы, новая блокировка устанавливается. Если режимы не совместимы, новая блокировка ожидает снятия существующей блокировки. Условия необходимо ставить именно на те поля, имена которых приведены в списке имен пространств блокировок. Для каждого пространства блокировок количество устанавливаемых условий неограниченно. Условия могут быть заданы или на равенство значения поля какому-либо значению, или на вхождение значения поля в указанный диапазон. Существует два способа задать условия на поля пространств блокировки: ■■ с помощью явного задания имени поля и его значения; ■■ с помощью указания источника данных, содержащего необходимые значения. При явном задании имени поля и его значения необходимо использовать метод УстановитьЗначение() объекта ЭлементБлокировкиДанных. 115 Глава 4. Работа с данными В этом случае имя и значение указывают в качестве параметров метода, например так, как показано в листинге 4.74. Листинг 4.74. Пример установки условия блокировки записей с помощью явного указания имени поля и его значения // Создать объект блокировка данных. БлокировкаДанных = Новый БлокировкаДанных; // Добавить новый элемент блокировки, блокирующий "нечто" в данных регистра // накопления Остатки номенклатуры. ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); // Установить режим блокировки – исключительный. Другие транзакции, устанавливающие // управляемые блокировки, не смогут даже начать чтение этих данных. ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; // Указать, что именно мы блокируем в данных регистра Остатки номенклатуры – все // "записи", у которых значение измерения Склад равно значению, содержащемуся в // переменной Склад. ЭлементБлокировки.УстановитьЗначение("Склад", Склад); Для значений типа Дата или Число в качестве значения может быть задан некоторый диапазон значений. Диапазон значений передается методу с помощью объекта встроенного языка Диапазон. Данный объект позволяет задать верхнюю и нижнюю границы диапазона, причем в диапазон включаются и границы диапазона (листинг 4.75). Листинг 4.75. Пример установки условия блокировки записей с помощью задания диапазона // Создать объект блокировка данных. БлокировкаДанных = Новый БлокировкаДанных; // Добавить новый элемент блокировки, блокирующий "нечто" в данных регистра // накопления Продажи. ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.Продажи"); // Установить режим блокировки – разделяемый. Эти данные гарантированно не будут // изменены другими транзакциями до окончания существующей транзакции. ЭлементБлокировки.Режим = РежимБлокировкиДанных. Разделяемый; // Указать, что именно мы блокируем в данных регистра Продажи – все "записи", у // которых значение измерения Контрагент равно значению, содержащемуся в переменной // Контрагент. ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); // Создать объект Диапазон, описывающий интервал от начала месяца, к которому // принадлежит указанная дата, до указанной даты. Диапазон = Новый Диапазон(НачалоМесяца(Дата), Дата); При указании источника данных сначала необходимо задать свойство ИсточникДанных объекта ЭлементБлокировкиДанных, после чего, используя метод ИспользоватьИзИсточникаДанных(), настроить соответствие полей области блокировки данных полям источника данных (листинг 4.76). Листинг 4.76. Пример установки условия блокировки записей с помощью источника данных // Создать объект блокировка данных. БлокировкаДанных = Новый БлокировкаДанных; // Добавить новый элемент блокировки, блокирующий "нечто" в данных регистра // накопления Остатки номенклатуры. ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); // Установить режим блокировки – исключительный. Другие транзакции, устанавливающие // управляемые блокировки, не смогут даже начать чтение этих данных. ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; // Указать, что именно мы блокируем в данных регистра Остатки номенклатуры – все // "записи", у которых значение измерения Склад равно значению, содержащемуся в // переменной Склад. ЭлементБлокировки.УстановитьЗначение("Склад", Склад); // Указать источник данных, который содержит данные для установки ограничений на // другие поля этого элемента блокировки – в данном случае таблица значений // СписокНоменклатуры. ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; // Указать, что именно мы блокируем в данных регистра Остатки номенклатуры – все // "записи", у которых значение измерения Склад равно значению, содержащемуся в // переменной Склад и у которых значение измерения Номенклатура равно какому-либо // значению, содержащемуся в колонке Номенклатура указанного источника данных. ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); В качестве источника данных можно указывать результат запроса, табличную часть, набор записей или таблицу значений. При установке соответствия полей именами полей источника будут являться имена колонок результата запроса, имена реквизитов табличной части, имена измерений или имена колонок таблицы значений соответственно. Заметим, что объект Диапазон также может являться значением поля источника данных. Для установки всех созданных нами блокировок используется метод объекта БлокировкаДанных – Заблокировать(). На рисунке 4.76 показано действие данного метода в случае использования его внутри транзакции и вне нее. // Указать, что именно мы блокируем в данных регистра Продажи – все "записи", у // которых значение измерения Контрагент равно значению, содержащемуся в переменной // Контрагент, и значение поля Период содержится в указанном диапазоне. ЭлементБлокировки.УстановитьЗначение("Период", Диапазон); 116 Профессиональная разработка в системе «1С:Предприятие 8» Механизм управляемых блокировок Как следует из рисунка, если этот метод выполняется внутри транзакции (явной или неявной), то блокировки устанавливаются в момент вызова метода. При окончании транзакции они будут сняты автоматически. Если же метод Заблокировать() выполняется вне транзакции, то блокировки установлены не будут. Рис. 4.76. Схема вызова метода «Заблокировать()» объекта «БлокировкаДанных» Том 1 117 Глава 4. Работа с данными 118 Профессиональная разработка в системе «1С:Предприятие 8» Общие сведения Глава 5. Клиент-серверный вариант работы Общие сведения Клиент-серверный вариант работы системы «1С:Предприятие» предполагает использование трехуровневой архитектуры: клиент – кластер серверов «1С:Предприятия» – сервер баз данных. В этом варианте работы клиентское приложение, работающее у пользователя (толстый клиент, тонкий клиент или веб-клиент), взаимодействует с кластером серверов «1С:Предприятия», а кластер, при необходимости, обращается к серверу баз данных (Microsoft SQL Server, PostgreSQL, IBM DB2 или Oracle Database), рис. 5.1. Трехуровневая архитектура «1С:Предприятия» разработана таким образом, что пользователю не требуется доступ ни к каким файловым ресурсам, связанным с «1С:Предприятием». Пользователю клиентского приложения «1С:Предприятия» также не требуется доступ к базе данных сервера баз данных. Для доступа к информационной базе клиентское приложение взаимодействует с кластером серверов «1С:Предприятия», который образует промежуточный программный слой между клиентским приложением и сервером баз данных. При этом физически кластер серверов «1С:Предприятия» и сервер баз данных могут располагаться как на одном компьютере, так и на разных. Это позволяет администратору при необходимости распределять нагрузку между разными компьютерами. Наиболее желательным является размещение всех приложений на разных компьютерах. Программные компоненты клиент-серверной архитектуры «1С:Предприятия» В общем случае под клиент-серверным вариантом работы «1С:Предприятия» понимается архитектура, включающая следующие программные уровни (рис. 5.2): ■■ клиентское приложение (толстый клиент, тонкий клиент или веб-клиент); ■■ кластер серверов «1С:Предприятия»; ■■ веб-сервер (для веб-клиента и тонкого клиента, подключенного через веб-сервер); ■■ сервер баз данных. Толстый клиент – это одно из клиентских приложений системы «1С:Предприятие». Исполняемый файл этого приложения – 1cv8.exe. «Толстым» клиент называется потому, что может исполнять практически всю функциональность, предоставляемую встроенным языком, в том числе умеет работать с прикладными типами данных, такими как СправочникОбъект.<имя>, ДокументОбъект.<имя> и т. д. Рис. 5.1. Схема работы в клиент-серверном варианте Том 1 Но по этой же причине он требует значительного количества аппаратных ресурсов на компьютере пользователя и может «общаться» с базой данных или с сервером «1С:Предприятия» только посредством файлового доступа или по локальной сети. 119 Глава 5. Клиент-серверный вариант работы Веб-клиент – это одно из клиентских приложений системы «1С:Предприятие». У веб-клиента нет исполняемого файла. Для начала работы ему не нужно иметь никаких файлов на компьютере пользователя. Веб-клиент, в отличие от толстого и тонкого клиентов, исполняется не в среде операционной системы компьютера, а в среде интернетбраузера (Windows Internet Explorer, Mozilla Firefox, Google Chrome или Safari). Поэтому любому пользователю достаточно всего лишь запустить свой браузер, ввести адрес веб-сервера, на котором опубликована информационная база, и веб-клиент сам «приедет» к нему на компьютер и начнет исполняться. Веб-клиент использует технологии DHTML и HTTPRequest. При работе веб-клиента клиентские модули, разработанные в конфигурации, компилируются автоматически из встроенного языка «1С:Предприятия 8» и непосредственно исполняются на стороне веб-клиента. Рис. 5.2. Общая схема работы в клиент-серверном варианте Веб-клиент может работать с информационными базами через Интернет только через веб-сервер. Помимо работы в пользовательском режиме 1С:Предприятие, толстый клиент может работать в режиме Конфигуратор, в котором выполняется администрирование информационных баз и разработка прикладных решений. Кластер серверов «1С:Предприятия» обеспечивает взаимодействие между клиентскими приложениями и системой управления базами данных. Кластер серверов «1С:Предприятия» представляет собой множество рабочих процессов, агентов сервера и менеджеров кластера, обслуживающих один и тот же набор информационных баз. Толстый клиент поддерживает работу приложения в обычном режиме. Поэтому его можно использовать для работы с прикладными решениями, созданными в старых версиях платформы – 8.0 и 8.1, которые не использовали управляемый интерфейс и управляемые формы. Тонкий клиент – это одно из клиентских приложений системы «1С:Предприятие». Исполняемый файл этого приложения – 1cv8c.exe. Рабочие процессы кластера серверов «1С:Предприятия» могут функционировать как на одном компьютере (в простейшем виде), так и на нескольких компьютерах, работающих под управлением различных операционных систем как Windows, так и Linux. Тонким клиент называется потому, что умеет исполнять ограниченный набор функциональности встроенного языка. В частности, на тонком клиенте недоступны все прикладные типы данных. Вместо этого тонкий клиент оперирует ограниченным набором типов встроенного языка, предназначенным лишь для отображения и изменения данных в памяти. Вся работа с базой данных, объектными данными, исполнение запросов выполняются на стороне сервера. Тонкий клиент только получает готовые данные, подготовленные для отображения. Архитектура системы ориентирована на максимальный перенос выполнения всей функциональности на кластер серверов и максимальное «облегчение» клиента. В кластере серверов выполняется вся работа прикладных объектов, выполняется подготовка к отображению форм (чтение объектов из информационной базы и заполнение данных формы, расположение элементов, запись данных формы после изменения) и командного интерфейса, формируются отчеты. На клиенте выполняется только отображение информации, подготовленной в кластере серверов, выполняется взаимодействие с пользователем и вызовы серверных методов для выполнения необходимых действий. Тонкий клиент гораздо «легче» толстого, поэтому он поддерживает работу приложения только в управляемом режиме (управляемый интерфейс и управляемые формы), реализованном в версии 8.2 и выше. Наличие кластера позволяет обеспечить бесперебойную, отказоустойчивую, конкурентную работу большого количества пользователей с крупными информационными базами. Тонкий клиент может работать с информационными базами через Интернет и по локальной сети, и через веб-сервер. Тонкий клиент обеспечивает работу только в пользовательском режиме 1С:Предприятие. Режим работы Конфигуратор тонким клиентом не поддерживается. Веб-сервер необходим для работы веб-клиента и одного из вариантов работы тонкого клиента. Фактически в случае работы через веб-сервер с кластером серверов взаимодействует именно веб-сервер, а уже веб-сервер взаимодействует с тонким и веб-клиентами. 120 Профессиональная разработка в системе «1С:Предприятие 8» Общие сведения Сервер баз данных обеспечивает хранение данных информационных баз «1С:Предприятия». В качестве сервера баз данных в «1С:Предприятии» могут использоваться различные СУБД: ■■ Microsoft SQL Server, ■■ PostgreSQL, ■■ IBM DB2, ■■ Oracle Database. При умеренной нагрузке на прикладное решение и при небольших объемах вычислений, производимых на сервере «1С:Предприятия», возможно размещение сервера баз данных и кластера серверов «1С:Предприятия» на одном компьютере (рис. 5.4). Варианты использования При использовании клиент-серверного варианта работы допускаются различные варианты взаимного расположения сервера баз данных, кластера серверов «1С:Предприятия» и клиентского приложения на компьютерах. Наиболее желательным является размещение всех приложений на разных компьютерах (рис. 5.3). Рис. 5.4. Размещение сервера баз данных и кластера серверов «1С:Предприятия» на одном компьютере Такой вариант является более дешевым, однако менее эффективным с точки зрения производительности. Работа серверов на одном компьютере предъявляет, в частности, повышенные требования к объему оперативной памяти, которая активно используется как одним, так и другим приложением. Также возможны и другие варианты взаимного размещения приложений, например, на одном и том же компьютере (рис. 5.5). Рис. 5.3. Размещение приложений на разных компьютерах В этом случае как сервер баз данных, так и кластер серверов «1С:Предприятия» смогут полноценно использовать аппаратные ресурсы и работать максимально производительно. Также этот вариант использования предоставляет лучшие возможности для масштабирования системы, поскольку модификацию аппаратных средств можно производить независимо, исходя из реальной загрузки того или иного сервера. Том 1 Рис. 5.5. Размещение сервера баз данных и кластера серверов «1С:Предприятия» на рабочей станции 121 Глава 5. Клиент-серверный вариант работы Этот вариант вряд ли имеет смысл использовать для реальной многопользовательской работы, однако он может часто применяться, например, при разработке прикладных решений одним разработчиком. Работа под управлением различных операционных систем В общем случае архитектура «1С:Предприятия» позволяет смешивать в одной системе элементы, работающие под управлением различных операционных систем, например, в одной системе могут работать тонкий клиент под управлением операционной системы Windows, веб-клиент под управлением Linux в интернет-браузере Mozilla Firefox, веб-клиент под управлением Windows в браузере Internet Explorer и веб-клиент под управлением Mac OS X в браузере Safari (рис. 5.7). Все основные компоненты платформы могут функционировать как под управлением операционной системы Windows, так и под управлением операционной системы Linux (рис. 5.6): ■■ тонкий и толстый клиенты системы «1С:Предприятие» могут работать только на компьютерах под управлением ОС Windows; ■■ веб-клиент может работать в любой операционной системе, где могут работать поддерживаемые веб-браузеры; ■■ веб-серверы, через которые веб-клиент и тонкий клиент общаются с кластером серверов, могут работать как под управлением ОС Windows, так и под управлением ОС Linux; ■■ рабочие серверы, входящие в кластер серверов, могут работать как под управлением ОС Windows, так и под управлением ОС Linux. Все процессы кластера серверов поддерживают работу в этих операционных системах; ■■ если используется СУБД Microsoft SQL Server, то сервер баз данных может работать только под управлением операционной системы Windows. Если же используются другие СУБД (кроме Microsoft SQL Server), то сервер баз данных может работать как под управлением ОС Windows, так и под управлением ОС Linux. Рис. 5.7. Элементы системы «1С:Предприятия», работающие под управлением различных операционных систем Кластер серверов Состав кластера Рис. 5.6. Многоплатформенность системы «1С:Предприятие» 122 Кластер серверов «1С:Предприятия» является логическим понятием и представляет собой совокупность одного или нескольких рабочих процессов, агентов сервера и менеджеров кластера, функционирующих на одном или нескольких компьютерах, и списка информационных баз, с которыми работают данные процессы. Профессиональная разработка в системе «1С:Предприятие 8» Кластер серверов В простейшем виде кластер серверов «1С:Предприятия» может функционировать на одном компьютере (рис. 5.8). Процесс rmngr называется менеджером кластера. Этот процесс управляет функционированием всего кластера. Рабочий сервер, на котором функционирует менеджер кластера и располагается реестр кластера, называется центральным сервером кластера. По умолчанию кластер серверов содержит один менеджер кластера, который называется главным менеджером кластера. Для повышения масштабируемости администратор кластера имеет возможность определить в составе кластера один или несколько дополнительных менеджеров кластера. Дополнительные менеджеры кластеров могут запускаться на рабочих серверах. При этом функциональность кластера может быть распределена между главным и дополнительными менеджерами кластера. Одной из функций главного менеджера кластера является ведение реестра кластера, который содержит следующую информацию: ■■ список информационных баз, зарегистрированных в данном кластере; ■■ список рабочих серверов, входящих в кластер; ■■ список рабочих процессов, входящих в кластер; ■■ список дополнительных менеджеров кластера; ■■ соответствие сервиса кластера и дополнительного менеджера кластера; ■■ список администраторов кластера. Рис. 5.8. Состав простого кластера В работе кластера серверов используются следующие элементы: ■■ процессы кластера серверов: ragent, rmngr, rphost; ■■ хранилища данных: список кластеров, реестр кластера. Процесс ragent, который называется агентом сервера, обеспечивает функционирование компьютера в составе кластера. Соответственно, компьютер, на котором запущен агент сервера, называется рабочим сервером. Одной из функций агента сервера является ведение списка кластеров, расположенных на данном рабочем сервере. Агент сервера и список кластеров не входят в состав кластера серверов, а лишь обеспечивают работу сервера и кластеров, которые расположены на нем. Непосредственно кластер серверов включает в себя следующие элементы: ■■ один или несколько процессов rmngr, ■■ реестр кластера, ■■ один или несколько процессов rphost. Том 1 Процесс rphost называется рабочим процессом. Рабочий процесс обслуживает непосредственно клиентские приложения, взаимодействует с сервером баз данных, и в нем, в частности, могут исполняться процедуры серверных модулей конфигурации. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1. Сеансы и соединения В процессе взаимодействия пользователя с информационной базой посредством кластера серверов используются такие понятия, как сеанс и соединение. Это не одно и то же. Сеанс определяет активного пользователя информационной базы. Соединение обеспечивает доступ сеансов к кластеру серверов «1С:Предприятия» и не отождествляется с активным пользователем. Для обращения клиента к кластеру сеанс назначается соединению. Все время, пока клиент не выполняет обращений к кластеру, сеанс может быть не назначен никакому соединению. Если удаляется сеанс, назначенный соединению, то происходит разрыв этого соединения. 123 Глава 5. Клиент-серверный вариант работы Виды соединений Можно выделить два вида соединений: соединения с информационной базой и служебные соединения с рабочими процессами кластера. Соединения с информационной базой Возможны следующие виды соединений с информационной базой: ■■ Толстый клиент, ■■ Тонкий клиент, ■■ Конфигуратор, ■■ Модуль расширения веб-сервера, ■■ COM-соединение, ■■ WS-соединение, ■■ Фоновое задание. Соединение Толстый клиент представляет собой соединение толстого клиента с информационной базой. Это соединение предназначено для модификации данных информационной базы и выполнения другой функциональности, предоставляемой конфигурацией информационной базы. Соединение создается в результате интерактивного запуска толстого клиента в режиме 1С:Предприятие или в результате подключения к информационной базе с использованием технологии Automation Client/Server, например (листинг 5.1): Листинг 5.1. Установка соединения «Толстый клиент» // Создать Automation сервер 1С:Предприятия. AutomationCервер = Новый COMОбъект("V82.Application"); // Установить соединение с информационной базой // TestBase в кластере 1541 центрального сервера TestSrv. AutomationCервер.Connect("Srvr="TestSrv";Ref="TestBase"); Соединение Тонкий клиент представляет собой соединение тонкого клиента с информационной базой. Это соединение предназначено для модификации данных информационной базы и выполнения другой функциональности, предоставляемой конфигурацией информационной базы. Соединение создается в результате интерактивного запуска тонкого клиента или в результате подключения к информационной базе с использованием технологии Automation Client/Server, например (листинг 5.2): Листинг 5.2. Установка соединения «Тонкий клиент» // Создать Automation сервер 1С:Предприятия. AutomationCервер = Новый COMОбъект("V82c.Application"); // Установить соединение с информационной базой // TestBase в кластере 1541 центрального сервера TestSrv. AutomationCервер.Connect("Srvr="TestSrv";Ref="TestBase"); 124 Соединение Конфигуратор представляет собой соединение конфигуратора с информационной базой. Это соединение предназначено для создания и модификации конфигурации информационной базы и для выполнения административных и регламентных действий. Соединение Модуль расширения веб-сервера представляет собой соединение веб-сервера с рабочим процессом сервера. Это соединение предназначено для работы веб-клиента, Web-сервисов, а также тонкого клиента (по протоколу http). Соединение создается в момент обращения к Web-сервису или при обращении веб-клиента или тонкого клиента (по протоколу http) к серверу «1С:Предприятия». Соединение существует до перезапуска веб-сервера или до тех пор, пока соединение находится в пуле соединений модулей расширений веб-сервера. Соединение COM-соединение представляет собой соединение процесса, использующего функциональность внешнего соединения «1С:Предприятия», с информационной базой. Это соединение предназначено для модификации данных информационной базы и выполнения другой функциональности, предоставляемой конфигурацией информационной базы. COM-соединение создается в результате подключения к информационной базе с использованием технологии COM, например (листинг 5.3): Листинг 5.3. Установка внешнего соединения // Создать Automation сервер 1С:Предприятия. COMСоединитель = Новый COMОбъект("V82.COMConnector"); // Установить соединение с информационной базой // TestBase в кластере 1541 центрального сервера TestSrv. СоединениеСИнформационнойБазой = COMСоединитель.Connect("Srvr="TestSrv";Ref="TestBase"); Соединение WS-соединение представляет собой соединение веб-сервера с информационной базой. Это соединение предназначено для выполнения кода модуля Web-сервиса «1C:Предприятия». WS-соединение возникает в процессе обращения к Web-сервису, опубликованному на веб-сервере. Соединение существует до тех пор, пока соединение находится в пуле WS-соединений (пока не закончится время жизни соединения в пуле или пока данное соединение не будет вытеснено из пула другими соединениями). Подробнее Том 2, глава 18, раздел «Web-сервисы». Соединение Фоновое задание представляет собой соединение рабочего процесса кластера с информационной базой. Это соединение предназначено для выполнения кода процедуры фонового задания. Профессиональная разработка в системе «1С:Предприятие 8» Кластер серверов Соединение фонового задания создается в результате запуска фонового задания на выполнение. Такой запуск может выполняться системой «1С:Предприятие» в результате автоматического запуска регламентного задания (регламентное задание порождает соответствующее фоновое задание) или разработчиком средствами встроенного языка, например (листинг 5.4): Листинг 5.4. Установка соединения «Фоновое задание» // Выполнить фоновое задание, описанное в процедуре // ОбновлениеИндексаПолнотекстовогоПоиска // общего модуля РегламентныеПроцедуры. ФоновоеЗадание = ФоновыеЗадания.Выполнить( "РегламентныеПроцедуры.ОбновлениеИндексаПолнотекстовогоПоиска"); Соединение фонового задания существует до тех пор, пока существует контекст исполняемой процедуры фонового задания. После того как процедура выполнена, соединение фонового задания закрывается. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика». Служебные соединения Возможны следующие виды служебных соединений: ■■ Планировщик заданий, ■■ Отладчик, ■■ Консоль кластера, ■■ COM-администратор. Соединение Планировщик заданий представляет собой соединение планировщика заданий с рабочим процессом. Это соединение предназначено для управления работой фоновых заданий, в том числе для запуска регламентных заданий по расписанию. Соединение Отладчик представляет собой соединение отладчика с рабочим процессом кластера, находящимся в режиме отладки. Это соединение предназначено для управления ходом отладки и поиском предметов отладки, имеющихся в настоящий момент. Соединение создается при подключении предмета отладки или при поиске предметов отладки и существует до тех пор, пока предмет отладки не будет отключен или не завершит свою работу. Соединение Консоль кластера представляет собой соединение утилиты администрирования клиент-серверного варианта с рабочим процессом. Это соединение предназначено для администрирования информационных баз кластера серверов. Соединение консоли кластера создается в момент обращения к данным рабочего процесса (например, при получении параметров информационной Том 1 базы, при получении подробного списка соединений информационной базы и пр.). Соединение COM-администратор представляет собой соединение с рабочим процессом сервера с использованием технологии COM. Это соединение предназначено для администрирования информационных баз кластера серверов. Соединение COM-администратора создается при подключении к выбранному рабочему процессу с использованием технологии COM, например (листинг 5.5): Листинг 5.5. Установка соединения «COM-администратор» // Создать COMСоединитель 1С:Предприятия. COMСоединитель = Новый COMОбъект("V82.COMConnector"); // Установить соединение с рабочим процессом 1562 // в кластере 1541 центрального сервера TestSrv. СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess("tcp://TestSrv:1562"); Виды сеансов Возможны следующие виды сеансов: ■■ Толстый клиент, Тонкий клиент, Веб-клиент – создаются при обращении, соответственно, толстого, тонкого и веб-клиента к информационной базе; ■■ Конфигуратор – создается при обращении конфигуратора к информационной базе; ■■ COM-соединение – создается при обращении к информационной базе через внешнее соединение; ■■ WS-соединение – создается при обращении веб-сервера к информационной базе в результате обращения к Web-сервису, опубликованному на веб-сервере; ■■ Фоновое задание – создается при обращении рабочего процесса кластера к информационной базе. Предназначен для выполнения кода процедуры фонового задания; ■■ Консоль кластера – создается при обращении утилиты администрирования клиент-серверного варианта к рабочему процессу; ■■ COM-администратор – создается при обращении к рабочему процессу через внешнее соединение. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.5. 125 Глава 5. Клиент-серверный вариант работы Масштабируемость и отказоустойчивость Масштабируемость кластера Масштабируемость кластера серверов выражается в перераспределении нагрузки между несколькими менеджерами и рабочими процессами кластера и может осуществляться за счет: ■■ увеличения количества менеджеров кластера и распределения между ними сервисов; ■■ увеличения количества рабочих процессов, функционирующих на конкретном рабочем сервере; ■■ увеличения количества рабочих серверов, входящих в состав кластера. Перераспределение сервисов между менеджерами кластера В платформе «1С:Предприятие» определен состав независимых сервисов кластера серверов, которые заключают в себе всю функциональность менеджера кластера. Три сервиса могут использоваться только на главном менеджере кластера: ■■ сервис конфигурации кластера – хранит все настройки кластера; ■■ сервис блокировок кластера – хранит блокировки информационных баз, сведения об активных процессах и другую динамическую информацию о работе кластера; ■■ сервис управления предметами отладки – управляет подсоединением отладчика к серверным предметам отладки. Другие сервисы могут быть назначены на дополнительные менеджеры кластера: ■■ сервис журналов регистрации – поддерживает доступ к журналу регистрации; ■■ сервис полнотекстового поиска – выполняет полнотекстовый поиск и осуществляет индексирование; ■■ сервис заданий – управляет запуском и отслеживанием времени жизни фоновых и регламентных заданий; ■■ сервис нумерации – обеспечивает генерацию уникальных номеров и кодов объектов; ■■ сервис времени – поддерживает получение оперативной отметки времени и некоторые вспомогательные функции; ■■ сервис пользовательских настроек – обеспечивает доступ к файлам, в которых размещаются некоторые пользовательские настройки; 126 ■■ сервис блокировок объектов – хранит пессимистические (нетранзакционные) блокировки объектов; ■■ сервис транзакционных блокировок – содержит транзакционные блокировки управляемого режима; ■■ сервис сеансовых данных – обеспечивает хранение и кеширование сеансовой информации, например информация форм управляемого приложения. Обеспечивает получение клиентских лицензий. В целях повышения масштабируемости кластера серверов наиболее ресурсоемкие сервисы могут быть назначены различным менеджерам кластера, что позволяет распределить всю нагрузку между несколькими процессами. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.3. Использование нескольких рабочих процессов Использование нескольких рабочих процессов, с одной стороны, позволяет снизить нагрузку на каждый конкретный рабочий процесс. С другой стороны, запуск нескольких рабочих процессов позволяет более эффективно использовать аппаратные ресурсы рабочего сервера. Кроме этого, запуск нескольких рабочих процессов позволяет повысить надежность сервера, изолировав группы клиентов, работающих с разными информационными базами. В кластере, в котором возможен запуск нескольких рабочих процессов, рабочий процесс может быть автоматически перезапущен по истечении времени, установленного администратором кластера. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.10.1. Использование нескольких рабочих серверов Кластер серверов может функционировать как на одном, так и на нескольких рабочих серверах. Разделение кластера серверов по нескольким компьютерам позволяет повысить производительность кластера в целом посредством распределения нагрузки между компьютерами. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.10.2. Профессиональная разработка в системе «1С:Предприятие 8» Масштабируемость и отказоустойчивость Устойчивость клиентских приложений Рассмотрим общие схемы построения системы «1С:Предприятие» в клиент-серверном и в файловом варианте работы с точки зрения устойчивости клиентских соединений. В клиент-серверном варианте работы, кроме собственно компонентов «1С:Предприятия», принимают участие программные продукты других производителей. Это веб-сервер и сервер СУБД (рис. 5.9). Рис. 5.10. Общая схема файлового варианта работы Таким образом, если говорить о системе в целом, то можно сказать, что тонкий клиент и веб-клиент практически нечувствительны к потере соединения. Использование протокола HTTP В «1С:Предприятии» в качестве транспортного протокола используется TCP/IP. Он используется и в файловом варианте работы через веб-сервер, и в клиент-серверном. Он используется при взаимодействии клиентского и серверного приложений. Этот же протокол используется при взаимодействии элементов кластера между собой (рис. 5.11). Рис. 5.9. Общая схема клиент-серверного варианта работы На этой схеме стрелками показано направление вызовов. Прерывистыми линиями показаны те соединения, которые могут обрываться «безболезненно» для пользователя. То есть в случае физического обрыва и последующего его восстановления пользователь в большинстве случаев ничего не заметит. Клиентское приложение само восстановит соединение и продолжит работу «с того места», на котором она была прервана, без повторного запуска клиентского приложения и подключения к информационной базе. Исключение составляет лишь толстый клиент, работающий в режиме обычного приложения. Он далеко не всегда умеет восстанавливать соединение так, как это делают тонкий клиент и веб-клиент. В ряде случаев после разрыва соединения потребуется перезапуск клиентского приложения и повторное соединение с информационной базой. В файловом варианте работы разнообразия меньше. Однако и в этом случае могут присутствовать программные компоненты других производителей – веб-серверы Apache или IIS (рис. 5.10). Том 1 Рис. 5.11. Транспортные протоколы в «1С:Предприятии» 127 Глава 5. Клиент-серверный вариант работы В качестве прикладного протокола при взаимодействии с веб-сервером используется HTTP (рис. 5.12). Последняя стандартная возможность HTTP, о которой следует сказать, это кеширование запросов. Оно существенно снижает трафик и повышает производительность, особенно на тонких каналах. «1С:Предприятие» использует все стандартные возможности кеширования, предоставляемые HTTP. Отказоустойчивость кластера Отказоустойчивость кластера серверов выражается в обеспечении бесперебойной работы пользователей при программных и аппаратных сбоях в кластере серверов и достигается за счет: ■■ резервирования самого кластера, ■■ резервирования рабочих процессов кластера, ■■ устойчивости к обрыву канала связи. Резервирование кластера Рис. 5.12. Прикладные протоколы в «1С:Предприятии» Несколько кластеров могут быть объединены в группу резервирования. Кластеры, перечисленные в списке резервирования и имеющие одинаковые списки резервирования, образуют группу резервирования (рис. 5.13). Протокол HTTP был выбран для унификации взаимодействия клиентов с веб-сервером потому, что он достаточно хорошо проработан и развит. Это открытый протокол, без каких-либо специальных доработок. К тому же данный протокол стандартно поддерживается браузерами, что значительно облегчило реализацию веб-клиента. Протокол HTTP предоставляет достаточно много стандартных возможностей, которые используются в «1С:Предприятии». Например, для того, чтобы клиент сообщил серверу, какой тип данных нужно получить, в каком формате, используются стандартные заголовки HTTP. В этих же стандартных заголовках передается информация о языке содержания и о том, поддерживает ли клиент сжатие данных при передаче. Если поддерживает, то сервер возвращает ему содержимое ответов в сжатом виде. Другая стандартная возможность – механизм Cookie. Он используется как в браузерах, так и в тонком/толстом клиентах. Правда используется он несколько ограниченным образом. В частности, в Cookie хранится идентификатор сеанса, по которому клиента узнают на сервере при каждом сообщении. Также посредством Cookie клиент оповещается, что для него есть некоторое сообщение. Клиент обращается по определенному адресу на сервер и получает те сообщения, которые предназначены ему. 128 Рис. 5.13. Группа резервирования кластеров Профессиональная разработка в системе «1С:Предприятие 8» Масштабируемость и отказоустойчивость Кластеры, находящиеся в одной группе резервирования, синхронизируются автоматически. Пользователей обслуживает только один кластер из группы. Он считается активным. Остальные кластеры группы считаются резервными и обеспечивают синхронизацию наиболее важных данных в актуальном состоянии. При выходе из строя активного кластера активным становится следующий работоспособный кластер группы. При восстановлении работоспособности кластера, который находится в группе раньше активного, активность передается ему после автоматической синхронизации данных. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.7.1. Резервирование рабочих процессов Каждому рабочему процессу можно указать вариант его использования: Использовать, Использовать как резервный или Не использовать (рис. 5.14). Агент центрального сервера запускает все рабочие процессы (свойство Использование = Использовать). Если запуск процесса закончился с ошибкой, то кластер запускает вместо него один из неактивных процессов, помеченных как резервный, при этом попытки запуска используемого процесса продолжаются до тех пор, когда процесс запуска не увенчается успехом. Тогда самый старый процесс, помеченный как резервный, но используемый системой, выключается и будет остановлен после отключения всех соединений или через заданное администратором время. Если у кластера нет резервных рабочих процессов (нет вовсе или все резервные процессы уже используются) и перезапуск неактивного рабочего процесса окончился неудачей, то система попытается перераспределить нагрузку по оставшимся рабочим процессам. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.7.2. Устойчивость к обрыву канала связи Устойчивость к обрыву канала связи реализуется за счет того, что кластер «запоминает» подключившихся пользователей и состояние выполняемых ими действий благодаря тому, что для каждого пользователя создается собственный сеанс. Сеанс является отражением активного пользователя в кластере серверов. Не следует путать сеансы с соединениями. В процессе работы пользователя соединения могут устанавливаться, могут разрываться, но сеанс продолжает существовать (рис. 5.15). Рис. 5.15. Сеансы в кластере серверов Сеанс начинается с момента начала работы конечного пользователя и заканчивается в момент завершения им работы (пользователь закрывает клиентское приложение, или администратор принудительно завершает работу этого сеанса). Рис. 5.14. Варианты использования рабочего процесса Том 1 Данные сеансов сохраняет менеджер кластера. Для этого предусмотрен сервис сеансовых данных. При перезапуске кластера серверов данные сеансов сохраняются. Если активный пользователь не выполнил ни одного обращения к кластеру за 20 минут и сеанс не назначен соединению, то сеанс удаляется вместе с данными сеанса. Для поддержания сеанса тонкий клиент и веб-клиент обеспечивают обращение к кластеру не реже 1 раза в 10 минут. 129 Глава 5. Клиент-серверный вариант работы В случае потери физического соединения кластер будет ожидать восстановления соединения с этим пользователем. В подавляющем большинстве случаев после восстановления соединения пользователь сможет продолжить работу с того «места», на котором она была прекращена. При этом не потребуется повторное подключение к информационной базе. В случае, если текущий рабочий процесс выключен или в кластере серверов появился рабочий процесс с не менее чем в два раза большей доступной производительностью, чем у данного рабочего процесса, происходит переключение клиента на более производительный рабочий процесс. Причем выполняется это совершенно незаметно для пользователя. Подробнее Таким образом, в кластере серверов автоматически происходит динамическая балансировка нагрузки, что способствует более надежной и эффективной работе системы. Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.5. Динамическое перераспределение нагрузки В процессе работы «1С:Предприятия» платформа автоматически анализирует загруженность рабочих процессов кластера серверов. При этом оценивается значение свойства Доступная производительность, которое имеет каждый рабочий процесс. Доступная производительность показывает, насколько быстро данный процесс способен выполнить вызов сервера по сравнению с другими рабочими процессами (рис. 5.16). Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.8. Безопасность Платформа «1С:Предприятие» обеспечивает довольно высокий уровень безопасности работы с данными и защиты их от внешних воздействий. При этом используются два механизма: многоуровневая аутентификация и шифрование передаваемых данных. Многоуровневая аутентификация Многоуровневая аутентификация используется при подключении к базе данных через веб-сервер, то есть при работе «1С:Предприятия» в режиме веб-клиента и в режиме тонкого клиента, подключенного через веб-сервер (рис. 5.17). Первый уровень аутентификации обеспечивается на веб-сервере средствами самого веб-сервера в момент соединения с веб-сервером. При этом пользователь должен пройти процедуру аутентификации. Рис. 5.16. Свойства рабочего процесса Клиенты распределяются между рабочими процессами так, чтобы сделать доступную производительность всех рабочих процессов примерно одинаковой. При установке нового соединения с сервером «1С:Предприятия» выбирается процесс с наибольшей доступной производительностью. При изменении соотношения между доступной производительностью рабочих процессов клиенты динамически перераспределяются между рабочими процессами. 130 Рис. 5.17. Многоуровневая аутентификация Профессиональная разработка в системе «1С:Предприятие 8» Безопасность При подключении к веб-серверу с помощью веб-клиента можно использовать любые виды аутентификации, поддерживаемые браузером пользователя. При подключении с помощью тонкого клиента можно использовать два вида аутентификации: Basic аутентификацию и аутентификацию с помощью пакета Negotiate. Если выполняется Basic аутентификация, то пользователь просто вводит свое имя и пароль. Если выполняется аутентификация с помощью пакета Negotiate, то подключающийся клиент сопоставляется одному из доменных пользователей. При этом если пользователь находится в том же домене, что и веб-сервер, то аутентификация будет выполнена автоматически, незаметно для пользователя. Если же подключающийся пользователь хочет аутентифицироваться на веб-сервере не как текущий пользователь операционной системы, а как пользователь того домена, в котором находится веб-сервер, то нужно, чтобы вместо аутентификации текущего пользователя в операционной системе тонкий клиент использовал диалог для ввода имени и пароля пользователя вручную. Для этого можно использовать настройки информационной базы (рис. 5.18) или параметр WSA- при запуске «1С:Предприятия» из командной строки. Платформа поддерживает два вида аутентификации: аутентификация «1С:Предприятия» и аутентификация операционной системы. В случае аутентификации средствами «1С:Предприятия» пользователь при начале работы с прикладным решением должен указать имя пользователя и соответствующий этому имени пароль. В случае аутентификации средствами операционной системы аутентификация будет «прозрачна» для пользователя. Система анализирует, от имени какого пользователя операционной системы выполняется подключение к прикладному решению, и на основании этого определяет соответствующего пользователя «1С:Предприятия». При этом диалог аутентификации «1С:Предприятия» не отображается, если не указан специальный параметр командной строки. Шифрование передаваемых данных Шифрование передаваемых данных служит для защиты передаваемой информации от несанкционированного доступа к ней извне. В процессе клиент-серверного взаимодействия можно выделить различные области передачи данных, нуждающиеся в защите (рис. 5.19). Рис. 5.18. Установка способа аутентификации в настройках информационной базы Подробнее Информацию о параметрах запуска из командной строки можно посмотреть во встроенной справке – Справка Содержание справки 1С:Предприятие Запуск 1С:Предприятия 8 и параметры запуска Общие параметры запуска. Второй уровень аутентификации выполняется средствами самого «1С:Предприятия» при установке соединения с информационной базой. Том 1 Рис. 5.19. Общая схема безопасности 131 Глава 5. Клиент-серверный вариант работы Безопасность этих участков передачи данных обеспечивается путем применения различных алгоритмов шифрования данных. Для защиты канала передачи данных между веб-клиентом и веб-сервером или между тонким клиентом и веб-сервером используются криптографические протоколы SSL или TLS. Поддержку этих протоколов обеспечивает HTTPS-соединение с веб-сервером. Для этого на сервере должен находиться действительный серверный сертификат, который гарантирует клиенту подлинность открытого ключа сервера, используемого для шифрования данных. При подключении по HTTPS с помощью веб-клиента можно использовать любые возможности этого протокола, поддерживаемые веб-браузером. Например, можно использовать клиентские сертификаты, гарантирующие серверу подлинность клиента. При подключении по HTTPS с помощью тонкого клиента набор возможностей несколько ограничен: ■■ использование клиентских сертификатов не поддерживается; ■■ соединение с веб-сервером может быть установлено только в том случае, если сертификат службы сертификации, подписавшей серверный сертификат, присутствует в списке доверенных служб сертификации тонкого клиента. Если его нет в этом списке, тонкий клиент завершит свою работу, в отличие от браузера, который в этой ситуации предложит пользователю самостоятельно принять или отклонить сертификат, полученный от сервера. Для защиты каналов передачи данных между кластером серверов и клиентами, между кластером серверов и веб-сервером и для защиты каналов внутри самого кластера используются алгоритмы шифрования данных, реализуемые системой «1С:Предприятие»: RSA и Triple DES. При этом может быть выбран один из трех уровней безопасности: Постоянно, Установка соединения или Выключено. Использование уровня безопасности Постоянно позволяет полностью защитить весь поток данных (как пароли, так и непосредственно данные), но при этом возможно значительное снижение производительности системы. Использование уровня безопасности Установка соединения позволяет частично защитить весь поток данных (только пароли). Этот уровень безопасности является компромиссом между безопасностью и производительностью. Уровень безопасности Выключено является самым низким и самым производительным. Практически все данные передаются без использования шифрования. Рассмотрим схему взаимодействия клиента и кластера серверов при использовании уровня безопасности Постоянно (рис. 5.20). 132 Рис. 5.20. Уровень безопасности «Постоянно» Протокол взаимодействия одинаков как для менеджера кластера (rmngr), так и для рабочего процесса (rphost): после установки соединения первый обмен данными выполняется с использованием шифрования по алгоритму RSA, дальнейший обмен данными выполняется с использованием шифрования по алгоритму Triple DES. Уровень безопасности задается при создании информационной базы. Эта информация сохраняется как на клиенте (в списке информационных баз), так и в кластере серверов (в реестре сервера). После создания информационной базы ее параметры, сохраненные в кластере серверов, изменить уже нельзя. Однако можно изменить уровень безопасности, указанный для этой информационной базы на клиенте. Поэтому после установки соединения клиент генерирует приватный и публичный ключи для шифрования RSA и передает в кластер серверов публичный ключ и уровень безопасности, который указан для данной информационной базы на клиенте. Это желаемый уровень безопасности. Кластер серверов выбирает максимальный уровень безопасности из переданного клиентом и указанного для этой информационной базы в реестре кластера. Это фактический уровень безопасности. Кроме этого, кластер серверов генерирует сеансовый ключ для шифрования Triple DES и вместе с фактическим уровнем безопасности передает его клиенту, предварительно зашифровав эти данные с помощью публичного ключа клиента. Профессиональная разработка в системе «1С:Предприятие 8» Безопасность Дальнейший обмен данными выполняется в соответствии с фактическим уровнем безопасности, при этом как клиент, так и сервер шифруют передаваемые данные с использованием сеансового ключа по алгоритму Triple DES. Особенностью защиты передачи данных между кластером и веб-сервером является то, что соединение между кластером и веб-сервером защищается только кластером на основании свойств информационной базы, к которой выполняется подключение. Том 1 Защита канала передачи данных между кластером серверов и СУБД осуществляется средствами той СУБД, которая используется. Все поддерживаемые СУБД позволяют настроить свои клиентские компоненты, находящиеся в кластере, так, чтобы трафик между ними и самой СУБД был зашифрован. Все поддерживаемые СУБД могут использовать протокол SSL. Подробнее Документация «1С:Предприятие 8.2. Клиент-серверный вариант. Руководство администратора», раздел 2.1.12. 133 Глава 5. Клиент-серверный вариант работы 134 Профессиональная разработка в системе «1С:Предприятие 8» Несколько дистрибутивов Глава 6. Установка и администрирование системы Несколько дистрибутивов Для установки системы «1С:Предприятие» существуют два дистрибутива: «1С:Предприятие 8» и «1С:Предприятие 8. Тонкий клиент». Дистрибутив «1С:Предприятие 8» – это полный дистрибутив платформы, который позволяет использовать все ее возможности. Дистрибутив «1С:Предприятие 8. Тонкий клиент» – это только клиентское приложение. Основной сценарий его использования – это работа с клиент-серверной базой по локальной сети или по протоколу HTTP. Возможность работы с файловой информационной базой непосредственно по сети у него отсутствует. Не у тонкого клиента вообще, а у тонкого клиента, установленного из этого дистрибутива. Подробнее Раздел «Программные компоненты клиент-серверной архитектуры «1С:Предприятия»», стр. 119. Появление второго дистрибутива обусловлено тем, что «1С:Предприятие» предоставляет возможность для работы через Интернет по протоколу HTTP. Поэтому к информационной базе могут подключаться клиенты, расположенные в разных странах и разных частях света. низация не хочет «выставлять наружу» веб-сервер, а предпочитает работать с удаленными клиентами через VPN. В этом случае использование веб-клиента также будет невозможным, поскольку он умеет работать с информационной базой только через веб-сервер. Как раз для таких случаев и предназначен дистрибутив «1С:Предприятие 8. Тонкий клиент». Он имеет небольшой размер, что удобно для удаленных пользователей. Он реализует полную функциональность управляемого приложения и предназначен для таких пользователей, у которых есть необходимость лишь в подключении к существующим информационным базам. Установка, обновление и запуск Запуск На одном компьютере могут существовать произвольное количество одновременно установленных версий «1С:Предприятия». Структура каталогов «1С:Предприятия» выглядит следующим образом (рис. 6.1). В общем случае у таких клиентов существуют две возможности: либо использовать веб-клиента, либо использовать тонкого клиента. Для использования веб-клиента не требуется никакая предварительная установка программного обеспечения на компьютер пользователя. И это очень удобно. Однако использование веб-клиента может оказаться возможным не всегда. Например, в силу особенностей самого прикладного решения. Потому что веб-клиент умеет не все то, что умеет тонкий клиент. Количество таких отличий невелико, и большинство прикладных решений общего назначения создаются так, чтобы они одинаково работали и в тонком клиенте, и в веб-клиенте. Однако специализированные прикладные решения могут использовать функциональность, доступную в веб-клиенте частично или недоступную совсем. Например, работа с файловой системой, XML, электронной почтой и др. Также невозможность использования веб-клиента может быть связана с требованиями информационной безопасности. Например, оргаТом 1 Рис. 6.1. Структура файлов «1С:Предприятия» 135 Глава 6. Установка и администрирование системы В корневом каталоге 1С:Предприятия 8.2 (С:\Program Files\1cv82) находится некоторое количество каталогов установленных версий платформы. Каждая из этих версий содержит свои версии клиентских приложений (толстый и тонкий клиенты) и свою версию интерактивной программы запуска (1cv8s.exe). Кроме этого, в корневом каталоге «1С:Предприятия 8.2» находится каталог common, в котором – программа запуска 1CEStart.exe. Запуск с локального компьютера Если система запускается с локального компьютера, то стандартный сценарий запуска такой: ■■ пользователь запускает программу запуска 1CEStart.exe (1). Ссылка на эту программу всегда есть в меню Старт операционной системы. При установке новых версий платформы существующая программа запуска перезаписывается файлом из новой версии; ■■ программа запуска запускает интерактивную программу запуска 1cv8s.exe от последней версии (2). Она предлагает выбрать одну из имеющихся информационных баз и запускает для этой базы нужное клиентское приложение нужной версии платформы (3). Интерактивная программа запуска показывает общий список баз для версий 8.0, 8.1 и 8.2. При первом запуске она может автоматически импортировать списки информационных баз для версий 8.0 и 8.1. Подробнее Том 2, глава 21, раздел «Шаблоны конфигураций». Для каждой информационной базы может быть указана версия платформы, которой нужно запускать эту информационную базу. На основе этой информации интерактивная программа запуска выбирает подходящую версию платформы. Если никакая версия для информационной базы не указана, запускается клиентское приложение последней версии «1С:Предприятия» или версии, указанной по умолчанию. Рис. 6.2. Запуск системы «1С:Предприятие» по сети ■■ программа запуска анализирует состав установленных у пользователя версий платформы и автоматически устанавливает последнюю версию платформы, если ее нет на компьютере пользователя (v. 8.2.9.216); ■■ после этого, как и в ранее описанном сценарии, запускается интерактивная программа запуска последней версии платформы на компьютере пользователя (2), а затем клиентское приложение, соответствующее выбранной информационной базе (3). Запуск по сети В сетевом каталоге также обычно размещается и список общих информационных баз. Таким образом, администратор может полностью управлять и составом информационных баз, доступных пользователям, и информацией о том, какие базы, какими версиями платформы и какими клиентскими приложениями должны запускаться. Если пользователи работают в сети, то стандартный сценарий запуска будет немного другим (рис. 6.2). Различные сценарии установки и запуска ■■ администратор «1С:Предприятия» создает сетевой каталог, в котором размещает программу запуска 1CEStart.exe и структуру каталогов, содержащих дистрибутивы версий платформы; ■■ пользователи запускают программу запуска не со своего локального компьютера, а из сетевого каталога (1). Программа запуска не требует компонентов «1С:Предприятия», поэтому ее можно скопировать в произвольный каталог; Нужно сказать, что описанный стандартный сценарий запуска по сети не является обязательным. Механизм установки и запуска обладает большой гибкостью и настраиваемостью. Он позволяет реализовывать различные сценарии в зависимости от потребностей конкретного внедрения. 136 Профессиональная разработка в системе «1С:Предприятие 8» Во-первых, и программа запуска, и интерактивная программа запуска имеют свои конфигурационные файлы (1CEStart.cfg и 1CESCmn.cfg). Установка, обновление и запуск С помощью этих файлов можно настроить расположение дистрибутивов, перечень компонентов системы, которые должны устанавливаться, версию платформы, которая должна запускаться по умолчанию и т. д. Подробнее Документация «1С:Предприятие 8.2. Руководство администратора», Приложения 3.4 и 3.5 – «Описание и расположение служебных файлов». Во-вторых, и клиентские приложения, и кластер при запуске ищут общие конфигурационные файлы платформы, которые описывают особенности ее функционирования: При необходимости администратор может использовать другие способы работы с конфигурационными файлами. Например: ■■ задать различные конфигурационные файлы для одной или нескольких версий платформы. Такие конфигурационные файлы должны располагаться в каталогах конкретных версий. Они будут найдены первым способом; ■■ задать другие конфигурационные файлы для одного из компонентов платформы (любой версии), работающей от имени некоторого пользователя (например, для кластера). Такие конфигурационные файлы должны располагаться только в каталоге соответствующего пользователя. Они будут найдены вторым способом. ■■ logcfg.xml – конфигурационный файл технологического журнала; ■■ nethasp.ini – конфигурационный файл системы защиты; ■■ adminstall.cfg – конфигурационный файл установки с использованием средств администрирования Windows; ■■ inetcfg.xml – конфигурационный файл прокси по умолчанию; ■■ debugcfg.xml – настройка дополнительного диапазона портов, используемого при отладке; ■■ comcntrcfg.xml – настройка запуска внешнего соединения в отладочном режиме. Конечно, возможны и различные сочетания перечисленных способов. Для каждой версии «1С:Предприятия» существует свой каталог установки. И теоретически различных вариантов использования этих файлов может быть много: все версии используют одни и те же настройки, разные версии используют разные настройки и т. д. В то же время интерактивная программа запуска может самостоятельно установить новую версию платформы на компьютер пользователя. Поэтому клиентские приложения и сервер «1С:Предприятия» при запуске ищут конфигурационные файлы по определенному алгоритму. Подробнее Документация «1С:Предприятие 8.2. Руководство администратора», Приложение 1.3 «Структура каталога установки и назначение каталогов и файлов – Конфигурационные файлы расположение и поиск». При стандартной установке системы используется следующий способ поиска конфигурационных файлов: сами файлы записываются в каталог конфигурационных файлов C:\Program Files\1Cv82\conf, и данный путь записывается в файл conf.cfg устанавливаемой версии. Таким образом, в каталогах конкретных версий платформы конфигурационных файлов нет. В профилях пользователей их тоже нет. А в каждом файле conf.cfg указано, что все они находятся в одном и том же месте. Таким образом, стандартно используются единые конфигурационные файлы для всех версий и компонентов «1С:Предприятия», установленных на данном компьютере. Том 1 Ключи командной строки Обе программы запуска (как и клиентские приложения) поддерживают одни и те же ключи командной строки. В результате, например, программа запуска (кроме стандартного сценария установки новой версии платформы и запуска интерактивной программы запуска) может самостоятельно запустить указанную информационную базу нужным клиентским приложением. Более того, клиентские приложения могут самостоятельно определять версию платформы, необходимой для работы с конкретной информационной базой, и при необходимости устанавливать ее из сетевого каталога дистрибутивов на компьютер пользователя. Поэтому кроме стандартного сценария администратор может создавать собственные сценарии запуска и обновления клиентских приложений. Например, без использования программы запуска, расположенной в сети, и даже без использования интерактивной программы запуска. Установка В результате установки платформы создается структура файлов, показанная ранее на рисунке 6.1. В меню Старт появляется программа и подменю Дополнительно (рис. 6.3). запуска (1С:Предприятие) Таким образом, пользователю при запуске «1С:Предприятия» не нужно выбирать из нескольких пунктов меню. Есть одна команда – 1С Предприятие, ее и нужно нажимать. 137 Глава 6. Установка и администрирование системы ■■ поскольку все пользователи запускают программу запуска, расположенную в сетевом каталоге, то при очередном ее запуске на компьютере пользователя автоматически будет установлена новая версия платформы из дистрибутива, расположенного в сетевом каталоге. Как уже говорилось, такой сценарий не является единственным. Кроме автоматической установки средствами «1С:Предприятия», администратор может использовать и средства операционной системы: ■■ установка с помощью групповых политик Windows, ■■ установка с помощью logon-скрипта. В этих случаях он может полностью управлять всеми деталями и особенностями установки для различных пользователей. Рис. 6.3. Программа запуска в меню «Старт» Обновление Подменю Дополнительно позволяет перейти ко всем версиям платформы «1С:Предприятия», установленным на компьютере (рис. 6.4). Изменение установленной версии В некоторых случаях может возникнуть необходимость самостоятельного изменения уже установленной версии, без участия администратора. Например, могут понадобиться какие-то компоненты платформы, которые не были установлены с самого начала. В этом случае нужно использовать компонент Установка и обновление программ панели управления Windows. Он позволяет изменить уже установленную версию платформы, добавить или удалить компоненты платформы. Если просто запускать файл setup.exe из дистрибутива платформы, будут обновлены только те компоненты платформы, которые уже установлены. Выбор состава компонентов предлагаться не будет. Рис. 6.4. Интерактивная программа запуска в меню «Старт» Для каждой версии верхняя команда (1С:Предприятие) запускает интерактивную программу запуска этой версии. Также здесь сразу можно запустить толстого или тонкого клиента. Если администратор устанавливает платформу в организации, то предполагается следующий стандартный сценарий. ■■ прежде всего, администратор устанавливает платформу локально на один любой компьютер и проверяет работоспособность имеющихся конфигураций на новой платформе; ■■ после этого он копирует с этого компьютера в сетевой каталог новую версию программы запуска (1CEStart.exe), а также размещает в этом сетевом каталоге дистрибутив новой версии платформы; 138 Удаление Для удаления старых версий платформы нужно использовать компонент Установка и удаление программ панели управления Windows. Однако не нужно спешить удалять старые дистрибутивы из сетевого каталога. Если для работы с какой-либо информационной базой пользователю понадобится старая версия платформы, она будет автоматически установлена из дистрибутива, находящегося в сетевом каталоге. Подробнее Документация «1С:Предприятие 8.2. Руководство администратора». Профессиональная разработка в системе «1С:Предприятие 8» Управление кластером серверов Управление кластером серверов Утилита администрирования кластера серверов позволяет управлять кластером серверов и выполнять такие действия, как: ■■ создание, изменение и удаление кластеров серверов; ■■ модификация существующих кластеров: создание, изменение параметров и удаление рабочих серверов, рабочих процессов кластера, информационных баз, входящих в состав кластера; ■■ управление списками администраторов центральных серверов кластеров и списками администраторов кластеров; ■■ мониторинг соединений пользователей с информационными базами и служебных соединений; ■■ отключение пользователей от информационной базы; ■■ мониторинг объектных блокировок «1С:Предприятия» и блокировок клиентского соединения; ■■ оперативный анализ транзакционных блокировок системы управления базами данных; ■■ управление блокировкой установки соединений пользователей с информационной базой; ■■ управление блокировкой выполнения регламентных заданий. Утилита представляет собой подключаемый модуль MMC (Microsoft Management Console) и может быть использована на компьютерах, на которых установлено соответствующее программное обеспечение (для операционных систем Windows 2000/XP/Server 2003 это программное обеспечение является стандартным). Рис. 6.5. Список администраторов кластера серверов Работа со списком кластеров центрального сервера Утилита администрирования предоставляет возможность создать список кластеров центрального сервера (рис. 6.6). Работа со списком резервирования кластеров и рабочих процессов описана в разделе «Отказоустойчивость кластера», стр. 128. Рассмотрим некоторые другие функции по администрированию кластера серверов. Работа со списком администраторов центрального сервера Утилита администрирования предоставляет возможность создать список администраторов центрального сервера для того, чтобы ряд административных действий (например, добавление нового кластера, просмотр списка администраторов центрального сервера) могли выполнять только аутентифицированные пользователи (рис. 6.5). Также можно просмотреть и изменить свойства администраторов центрального сервера или удалить какого-либо администратора. Рис. 6.6. Список кластеров Том 1 139 Глава 6. Установка и администрирование системы Также можно просмотреть и изменить свойства кластеров центрального сервера или удалить какой-либо кластер (в том случае, если он не содержит ни одного активного соединения, ни одного рабочего процесса, ни одного сервера и ни одной зарегистрированной информационной базы). Работа со списком менеджеров кластера Утилита администрирования предоставляет возможность для просмотра и изменения списка менеджеров кластера. По умолчанию существует один менеджер кластера, который является основным и который невозможно удалить. Такой менеджер определен в любом кластере. Имеется возможность добавлять новые менеджеры кластера, переназначать сервисы с менеджера на менеджера, удалять менеджеры кластера. В окне свойств отображается компьютер, на котором работает менеджер кластера, его описание, идентификатор (в терминах операционной системы) процесса rmngr, порт менеджера кластера и номер служебного сетевого порта менеджера кластера (рис. 6.7). Рис. 6.8. Добавить назначение сервиса на другой менеджер кластера Работа со списком администраторов кластера Утилита администрирования предоставляет возможность создать отдельный список администраторов для каждого кластера, зарегистрированного на центральном сервере, для того, чтобы административные действия с кластером могли выполнять только аутентифицированные пользователи (рис. 6.9). Рис. 6.7. Менеджеры кластера Сервис сеансовых данных можно назначать одновременно нескольким менеджерам кластера (рис. 6.8). Рис. 6.9. Список администраторов кластера Также можно просмотреть и изменить свойства администраторов кластера или удалить какого-либо администратора. Таким образом, с целью ограничения круга пользователей, которые могут выполнять административные действия, создаются отдельно списки адми- 140 Профессиональная разработка в системе «1С:Предприятие 8» Управление кластером серверов нистраторов центрального сервера и списки администраторов каждого из кластеров, расположенных на данном сервере. Области действий, на которые распространяются права администраторов центрального сервера и администраторов кластеров, не пересекаются. Аутентификация администратора центрального сервера позволяет пользователю выполнять административные действия с центральным сервером, но для того, чтобы выполнить какие-либо административные действия с конкретным кластером, требуется аутентификация администратора кластера. В то же время для выполнения административных действий с кластером пользователь должен аутентифицироваться как администратор кластера, но дополнительная аутентификация в качестве администратора сервера для этого не требуется. Работа со списком рабочих процессов Утилита администрирования позволяет отобразить список рабочих процессов для всего кластера в целом или для отдельного сервера кластера. Выбрав конкретный сервер кластера, можно добавить рабочий процесс (рис. 6.11). Механизм аутентификации администраторов центрального сервера/ кластера включается системой автоматически, как только в списке администраторов центрального сервера/кластера создается хотя бы один администратор. В этом случае при попытке выполнения действия, требующего аутентификации, системой автоматически будет запрошена аутентификация администратора центрального сервера/кластера. Работа со списком рабочих серверов кластера Утилита администрирования предоставляет возможность добавить рабочий сервер в кластер (рис. 6.10). Рис. 6.11. Список рабочих процессов конкретного рабочего сервера Выбрав конкретный рабочий процесс, можно просмотреть его свойства и изменить некоторые из них (рис. 6.12). Рис. 6.10. Список рабочих серверов Также можно просмотреть и изменить свойства серверов кластера или удалить какой-либо рабочий сервер (в том случае, если он не содержит ни одного активного соединения, ни одного рабочего процесса). Том 1 Рис. 6.12. Свойства рабочего процесса 141 Глава 6. Установка и администрирование системы Также можно отключить какой-либо рабочий процесс, установив его свойство Использование в значение Не использовать. Рабочий процесс будет остановлен после того, как завершится последнее клиентское соединение, обслуживаемое данным рабочим процессом. При повторных запусках кластера серверов неиспользуемые рабочие процессы запускаться не будут. Для запуска неиспользуемого рабочего процесса нужно установить его свойство Использование в значение Использовать. Через некоторое время рабочий процесс будет запущен менеджером кластера. Параметры информационной базы эквивалентны параметрам новой информационной базы, создаваемой с помощью окна запуска «1С:Предприятия». Подробнее Описание этих параметров можно посмотреть в документации «1С:Предприятие 8.2. Руководство администратора». Также можно удалить какой-либо рабочий процесс (в том случае, если он не обслуживает ни одного соединения). Можно также удалить какую-либо информационную базу в различных вариантах: либо удалить базу целиком с сервера, либо только очистить базу данных и удалить ее регистрацию из кластера серверов, либо только удалить регистрацию информационной базы из кластера серверов. Работа со списком информационных баз Работа со списком сеансов Регистрация новой информационной базы в кластере серверов может быть выполнена двумя способами: из клиентского приложения или непосредственно в кластере серверов. Утилита администрирования позволяет отобразить список сеансов для всего кластера в целом или для отдельной информационной базы. Выбрав конкретный сеанс, можно просмотреть (без возможности редактирования) его свойства (рис. 6.14). При добавлении новой информационной базы в клиентском приложении ее регистрация в кластере серверов выполняется системой автоматически. Утилита администрирования позволяет зарегистрировать новую информационную базу в кластере серверов, просмотреть и изменить ее свойства (рис. 6.13). Рис. 6.14. Свойства сеанса Администратор кластера серверов может также удалить сеанс, но в случае активно работающего пользователя с информационной базой это может привести к потере данных. Рис. 6.13. Свойства информационной базы 142 Профессиональная разработка в системе «1С:Предприятие 8» Управление кластером серверов Работа со списком соединений Утилита администрирования позволяет отобразить список соединений для всего кластера в целом, для отдельного рабочего процесса кластера, для отдельной информационной базы или для отдельного рабочего процесса сервера кластера. Выбрав конкретное соединение, можно просмотреть (без возможности редактирования) его свойства (рис. 6.15). Соединение с агентом сервера позволяет выполнять следующие действия: ■■ аутентификация, добавление, удаление, получение списка администраторов центрального сервера и администраторов кластера; ■■ создание, удаление, получение списка кластеров; ■■ создание, удаление, получение списка серверов; ■■ создание, удаление, получение списка рабочих процессов кластера; ■■ получение списка сервисов кластера; ■■ получение списка сеансов информационной базы; ■■ получение списка соединений кластера; ■■ получение списка соединений информационной базы; ■■ получение списка информационных баз, зарегистрированных в кластере; ■■ получение списка блокировок кластера; ■■ получение списка резервирования; ■■ получение другой информации. Соединение с рабочим процессом может быть получено при помощи метода ConnectWorkingProcess() объекта Менеджер COM-соединений (листинг 6.2). Листинг 6.2. Установка соединения с рабочим процессом Рис. 6.15. Свойства соединения Администратор кластера серверов может также разорвать соединение, но в случае активно работающего пользователя с информационной базой это может привести к потере данных. // Создать COMСоединитель 1С:Предприятия. COMСоединитель = Новый COMОбъект("V82.COMConnector"); СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess("TestSrv:1562"); Соединение с рабочим процессом позволяет выполнять следующие действия: Соединение с агентом сервера может быть получено при помощи метода ConnectAgent() объекта Менеджер COM-соединений (листинг 6.1): ■■ аутентификация пользователей информационных баз; ■■ создание, удаление, получение списка информационных баз, зарегистрированных в кластере; ■■ получение списка соединений информационной базы; ■■ разрыв соединения информационной базы; ■■ соединение с информационной базой (COM-соединение); ■■ получение другой информации. Листинг 6.1. Установка соединения с агентом сервера Подробнее Программные средства администрирования кластера серверов Для администрирования кластера серверов используются два объекта: Соединение с агентом сервера и Соединение с рабочим процессом. // Создать COMСоединитель 1С:Предприятия. COMСоединитель = Новый COMОбъект("V82.COMConnector"); СоединениеСАгентомСервера = COMСоединитель.ConnectAgent("TestSrv"); Том 1 Синтакс-помощник: Средства интеграции и администрирования Менеджер COM-соединений – Администрирование кластера серверов. – 143 Глава 6. Установка и администрирование системы 144 Профессиональная разработка в системе «1С:Предприятие 8» Пользователь, интерфейс, команда Глава 7. Командный интерфейс прикладных решений Пользователь, интерфейс, команда Пользователь – лицо (или организация), которое использует действующую систему для выполнения конкретной функции. ■■ навигация между блоками системы; ■■ дизайн экранов программы; ■■ отображаемая информация и форматы отображения; ■■ устройства и технологии ввода данных; ■■ диалоги, взаимодействие и транзакции между пользователем и компьютером; ■■ обратная связь с пользователем. Пользователь автоматизированной системы – лицо, участвующее в функционировании автоматизированной системы или использующее результаты ее функционирования. Составной частью пользовательского интерфейса является командный интерфейс, обеспечивающий доступ пользователей к функциональности компьютерной программы. ПРИМЕЧАНИЕ ПРИМЕЧАНИЕ В книге часто будут встречаться термины «пользователь», «пользовательский интерфейс», «команда» и «командный интерфейс». Давайте определим, что подразумевают под собой эти термины и как они связаны. Определения взяты из свободной интернет-энциклопедии «Википедия»: http://ru.wikipedia.org/wiki/Пользователь. Автоматизированная система создает рабочую среду, взаимодействуя с которой, пользователь решает стоящие перед ним задачи. Для обеспечения удобной и безопасной работы создаются пользовательские интерфейсы. Пользовательский интерфейс – совокупность средств, при помощи которых пользователь общается с различным сложным инструментарием (системой). ПРИМЕЧАНИЕ Определение взято из свободной интернет-энциклопедии «Википедия»: http://ru.wikipedia.org/wiki/Интерфейс_пользователя. К сложному инструментарию с полным правом можно отнести и компьютерные программы. Однако пользовательский интерфейс компьютерной программы часто понимают только как ее внешний вид. В действительности пользовательский интерфейс объединяет в себе все элементы и компоненты программы, которые влияют на взаимодействие пользователя с программным обеспечением. Основными элементами пользовательского интерфейса являются: ■■ набор задач пользователя, которые он решает при помощи системы; ■■ элементы управления системой; Том 1 В дальнейшем мы будем оперировать в основном понятием «командный интерфейс». Однако для режима управляемого приложения «1С:Предприятия» принципы формирования командного интерфейса во многом аналогичны принципам формирования прочих составных частей пользовательского интерфейса, в частности, форм. В общем случае команда – это указание некоему интерфейсу (командный интерфейс пользователя), побуждающее исполнителя (компьютерная программа) выполнить действия для решения задачи. ПРИМЕЧАНИЕ Определение взято из свободной интернет-энциклопедии «Википедия»: http://ru.wikipedia.org/wiki/Команда_(программирование). При этом команда: ■■ может быть отдана только пользователем, имеющим на это право; ■■ не включает в себя подробные разъяснения, как будет происходить исполнение, а предполагает, что исполнитель (программа) знает, что и как необходимо исполнить. Командный интерфейс – совокупность команд, доступных пользователю, при помощи которых он отдает приказание системе на выполнение действий. 145 Глава 7. Командный интерфейс прикладных решений Применительно к компьютерной программе совокупность команд определяет, какие действия она может выполнить, а командный интерфейс определяет, какие команды может отдать конкретный пользователь и как он получит доступ к этим командам. Набор команд интерактивной компьютерной включает в себя несколько категорий команд: программы обычно ■■ команды, которые позволяют перемещаться между функциональными блоками программы, – например, функции настройки программы, функции просмотра данных, функции модификации данных, функции импорта/экспорта данных; ■■ команды, которые позволяют вызывать формы и перемещаться между ними, – например, вызов формы просмотра перечня товаров, вызов формы ввода нового документа; ■■ команды, которые позволяют выполнять те или иные действия с обрабатываемыми данными, – например, изменение элемента справочника, построение отчета. В связи с тем, что различные пользователи выполняют различные задачи, права на использование обрабатываемой системой информации и состав доступных команд для них будут различаться. Для разграничения прав и состава команд в компьютерных программах обычно реализуется система учетных записей. Каждая учетная запись (возможно, защищенная паролем) определяет совокупность ресурсов, доступных пользователю. На основании учетной записи осуществляется идентификация и аутентификация пользователя и предоставление разрешения на работу с ресурсами. Таким образом, при разработке командного интерфейса необходимо решить две основные задачи: ■■ из множества команд, исполняемых программой, выделить подмножество команд, доступных конкретному пользователю; ■■ предоставить возможность пользователю вызывать доступные команды. Командный интерфейс системы В данном разделе мы узнаем о командах системы «1С:Предприятие» и их источниках. Также мы разберемся, как из этих команд формируется глобальный командный интерфейс. В качестве примера мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 1». 146 Команды «1С:Предприятия» Для начала давайте поговорим о том, какие команды бывают. Все команды «1С:Предприятия» можно разделить по источникам и по области видимости (рис. 7.1). Рис. 7.1. Команды «1С:Предприятия» ПРИМЕЧАНИЕ Приведенная классификация не является исчерпывающей. Те же самые команды могут быть классифицированы и по другим критериям. Например, «что команды делают» – изменяют состав отображаемых данных или изменяют сами данные; «необходимость в параметре» – одни команды не требуют для своего исполнения параметров, а другим необходимо передавать параметры. По источникам команды можно разделить на три группы: ■■ системные команды, ■■ стандартные команды объектов и расширений форм, ■■ произвольные команды. Системные команды предопределены на уровне технологической платформы и предоставляются автоматически. Их состав и выполняемые действия одинаковы для любого прикладного решения и не могут быть изменены разработчиком. Стандартные команды предопределены на уровне объекта конфигурации (или расширения формы) и предоставляются автоматически. Состав стандартных команд зависит от того, какие объекты присутствуют в конфигурации и какие значения заданы для свойств этих объектов. Выполняемые действия также предопределены, но разработчик может в какой-то мере повлиять на них. Для этого используется механизм событий. Произвольные команды полностью создаются разработчиком. Для этого предназначен объект конфигурации Команда. Для реализации универсального (в рамках прикладного решения) функционала используются Профессиональная разработка в системе «1С:Предприятие 8» Командный интерфейс системы общие команды. Для реализации функционала, специфического для того или иного объекта, используются команды, подчиненные этому объекту. По области видимости команды делятся: ■■ на глобальные, ■■ локальные команды формы. Глобальные команды предназначены для выбора пользователем той или иной функциональности в рамках приложения в целом. В состав глобальных команд входят системные команды, стандартные команды объектов конфигурации, а также общие и подчиненные произвольные команды. Локальные команды формы предназначены для выполнения действий в форме. В состав локальных входят стандартные команды формы, расширений формы, расширений элементов формы Таблица, а также произвольные команды формы. Эти команды доступны только в контексте той или иной формы. Структура командного интерфейса При запуске прикладного решения для пользователя формируется индивидуальный глобальный командный интерфейс. Его структура, то есть размещение команд, однозначно определяется иерархией подсистем конфигурации и свойствами самих команд. Состав же команд, включенных в командный интерфейс, определяется правами пользователя, значениями функциональных опций и видимостью команд по ролям. Кроме того, если в предыдущих сеансах пользователь выполнял настройку командного интерфейса под себя, эти настройки также будут влиять на размещение и состав команд командного интерфейса этого пользователя. В командном интерфейсе можно выделить несколько структурных элементов, в каждом из которых размещаются определенные команды (рис. 7.2). Глобальные команды формируют глобальный командный интерфейс прикладного решения. Локальные команды формы и, возможно, часть глобальных команд формируют командный интерфейс форм. ПРИМЕЧАНИЕ В дальнейшем изложении, до раздела «Командуем формами» (стр. 210), мы будем рассматривать глобальный командный интерфейс. При этом зачастую прилагательное «глобальный» использовать не будем. А теперь, зная откуда берутся команды, сравним количество объектов конфигурации и форм в демонстрационной базе и количество команд, отображаемых в командном интерфейсе, например, для пользователя Продавец. Из сравнения можно сделать вывод: в командном интерфейсе мы видим не все команды, предоставляемые прикладным решением. Для каждого пользователя предоставлены только те команды, которые ему необходимы для решения своих конкретных задач. Как же «ужимается» командный интерфейс? Чтобы ответить на этот вопрос, давайте разберемся с тем, как система формирует командный интерфейс пользователя. ПРИМЕЧАНИЕ На данном этапе будем считать, что для построения командного интерфейса пользователя система использует все глобальные команды. Управление составом команд, используемых для построения командного интерфейса пользователя, описано в разделе «Настраиваем состав команд» (стр. 154). Том 1 Рис. 7.2. Структура глобального командного интерфейса Подробнее Раздел «Управляемый интерфейс», стр. 15. Все системные команды размещаются в области системных команд основного или вспомогательного окна приложения. Стандартные и произвольные глобальные команды размещаются в панели разделов, панели навигации и панели действий основного окна приложения. ПРИМЕЧАНИЕ Глобальные команды также могут быть размещены в панели навигации вспомогательного окна приложения и в командной панели формы. 147 Глава 7. Командный интерфейс прикладных решений Влияние подсистем Почему же иерархия подсистем однозначно определяет структуру командного интерфейса? Да потому, что это логично. Обычно с помощью подсистем описываются различные виды деятельности, автоматизируемые прикладным решением, то есть с их помощью формируется функциональная структура прикладного решения. В одной подсистеме имеет смысл «собирать» объекты конфигурации, реализующие тесно связанную функциональность. При этом состав подсистем верхнего уровня иерархии отражает наиболее общее разделение функциональности прикладного решения. Например, разработчик может определить подсистему Запасы и собрать в ней функции управления складскими запасами, а в подсистеме Взаиморасчеты объединить функции управления взаиморасчетами с контрагентами и т. д. Для использования же той или иной функциональности предназначены команды. Соответственно, структурирование командного интерфейса по подсистемам представляется наиболее естественным. Для того чтобы командный интерфейс был удобным, не перегруженным и не содержал «лишних» команд, разработку прикладного решения рекомендуется начинать с определения его функциональной структуры. Это значит, что перед реализацией функциональности (создание объектов конфигурации, написания программного кода на встроенном языке) разработчик должен эту функциональность описать иерархией элементов. Корень иерархии будет соответствовать создаваемому прикладному решению (корневому элементу конфигурации), а элементы – объектам конфигурации Подсистема. При этом платформа не накладывает никаких ограничений по количеству и уровням вложенности элементов иерархии. Это обеспечивает необходимую гибкость при описании функциональной структуры прикладного решения. Для пользователей подсистемы верхнего уровня иерархии представляются как разделы глобального командного интерфейса. Команды выбора разделов размещаются в панели разделов основного окна приложения (рис. 7.3). Выбранный раздел определяет состав команд, размещаемых в панели навигации и панели действий, – отображаются команды тех объектов конфигурации, которые принадлежат соответствующей подсистеме верхнего уровня. У подсистемы, для которой был сформирован раздел, могут существовать подчиненные подсистемы. В этом случае для каждой из подчиненных подсистем будет сформирован подраздел, отображаемый группой в панели навигации. В подразделах отображаются команды объектов, включенных в соответствующую подчиненную подсистему. 148 Рис. 7.3. Соответствие подсистем конфигурации и разделов командного интерфейса Например, для раздела Товарные запасы (соответствует подсистеме Товарные запасы) в командном интерфейсе созданы подразделы Характеристики и Цены (соответствуют подчиненным подсистемам), см. рис. 7.3. В панели действий для команд, принадлежащих различным подчиненным подсистемам, подразделы не создаются. В этой панели команды «собираются» в группы, формируемые в соответствии с назначением команд (например, команды создания объектов, команды формирования отчетов, сервисные команды и др.). Отдельно стоит обратить внимание на командный интерфейс раздела Рабочий стол. Этот раздел предназначен для отображения наиболее важной для пользователя информации и наиболее часто используемых команд. Именно рабочий стол открывается по умолчанию при запуске прикладного решения. В связи с тем, что для разных пользователей состав важной информации различен, рабочий стол не связан с какой-либо из подсистем. По той же причине состав отображаемой информации и доступных команд формируется вручную разработчиком. Для наполнения рабочего стола командами используется редактор командного интерфейса рабочего стола. Подробнее Раздел «Система настройки командного интерфейса», стр. 174. Профессиональная разработка в системе «1С:Предприятие 8» Командный интерфейс системы Формирование состава командного интерфейса Разобравшись со структурированием командного интерфейса, перейдем к рассмотрению того, как платформа наполняет его командами. Основной целью, достигаемой при формировании состава команд, является «превращение» полного командного интерфейса в командный интерфейс конкретного пользователя, запустившего прикладное решение. При этом идеология системы «1С:Предприятие» обуславливает выполнение действий по «превращению» на сервере приложений. ВНИМАНИЕ! В «1С:Предприятии» реализована идеология «командный интерфейс формирует сервер». Клиент же показывает то, что ему передал сервер. В соответствии с задачами, решаемыми системой при формировании командного интерфейса, процесс его построения можно условно разбить на несколько этапов. ■■ Обеспечение доступности только тех команд, которые пользователь имеет право выполнять. Для решения этой задачи используется механизм прав доступа – состав команд, доступных конкретному пользователю, автоматически формируется системой на основании прав, устанавливаемых для ролей этого пользователя. ■■ Оптимизация командного интерфейса в соответствии с задачами, решаемыми конкретным пользователем. Для решения этой задачи выполняется настройка пользовательской видимости команд по ролям – для доступных пользователю команд система определяет их видимость по умолчанию. Эта видимость задается разработчиком. При этом платформа обеспечивает возможность задания видимости в разрезе ролей. ■■ Исключение команд, относящихся к отключенным функциональным возможностям. Для решения этой задачи выполняется настройка доступности команд по функциональным опциям – система автоматически ограничивает состав доступных команд только теми функциональными возможностями прикладного решения, которые используются в конкретном случае. ■■ Предоставление пользователю возможности собственной настройки видимости команд. Для решения этой задачи выполняется настройка видимости команд в разрезе пользователей прикладного решения. Давайте кратко рассмотрим каждый из перечисленных этапов. Том 1 ВНИМАНИЕ! В этом разделе речь идет о стандартных командах объектов конфигурации. Настройка доступности команд, созданных разработчиком, описана в разделе «Создаем произвольные команды», стр. 193. Обеспечение доступности команд При формировании командного интерфейса для конкретного пользователя в первую очередь анализируются права этого пользователя на доступ к данным. Это позволяет автоматически согласовать набор команд, предоставляемых пользователю, с набором предоставленных ему прав. Подробнее О системе определения прав рассказано в разделе «Система прав доступа», стр. 161. Доступ пользователя к разделу можно ограничить на уровне функциональной структуры прикладного решения. Для такого ограничения используется право Просмотр объекта конфигурации Подсистема. Из командного интерфейса пользователя исключаются все разделы, соответствующие подсистемам, для которых у роли пользователя право «Просмотр» не установлено. ПРИМЕЧАНИЕ Как мы увидим в дальнейшем (см. раздел «Состав разделов», стр. 155), на доступность раздела также влияет свойство подсистемы Включать в командный интерфейс. Это свойство влияет на всех пользователей. Например, у роли Администратор для подсистемы Закупки право Просмотр установлено. В командном интерфейсе доступна команда выбора соответствующего раздела и доступны команды этого раздела (рис. 7.4). Рис. 7.4. Право на просмотр подсистемы установлено 149 Глава 7. Командный интерфейс прикладных решений У роли Продавец для этой же подсистемы право не установлено. В командном интерфейсе команда перехода к разделу Закупки недоступна, и невозможно использовать команды этого раздела (рис. 7.5). Рис. 7.5. Право на просмотр подсистемы не установлено Если необходимо ограничить доступ пользователя только к командам, связанным с определенным объектом конфигурации, это можно реализовать установкой прав на объект конфигурации, предоставляющий эти команды. Рис. 7.6. Права на объект конфигурации установлены – команды доступны Из командного интерфейса пользователя исключаются стандартные команды тех объектов конфигурации, доступ к которым пользователю запрещен. ПРИМЕЧАНИЕ Как мы увидим в дальнейшем (см. раздел «Стандартные команды», стр. 157), на доступность команд объекта также влияет его свойство Использовать стандартные команды. Это свойство влияет на всех пользователей. Например, у роли Администратор для справочника Контрагенты установлены все права. В командном интерфейсе доступны команды перехода к списку контрагентов и создания нового контрагента (рис. 7.6). У роли Продавец для этого же справочника ни одно право не установлено. В командном интерфейсе команд перехода к списку контрагентов и создания нового контрагента нет (рис. 7.7). Если для пользователя определен ограниченный доступ к объекту конфигурации, то из командного интерфейса исключаются только те команды объекта, которые выполняют недоступные пользователю операции. Например, у роли Администратор для справочника Товары установлены все права. В глобальном командном интерфейсе доступны команды перехода к списку товаров и создания нового товара (рис. 7.8). 150 Рис. 7.7. Права на объект конфигурации сброшены – команды недоступны У роли Продавец для этого же справочника установлены только права, позволяющие просматривать товары. В глобальном командном интерфейсе команда перехода к списку товаров доступна, а команда создания нового товара отсутствует (рис. 7.9). Профессиональная разработка в системе «1С:Предприятие 8» Командный интерфейс системы Оптимизация командного интерфейса Кроме доступности команд в зависимости от прав, система выполняет настройку видимости доступных команд для конкретных ролей пользователей. Связано это с тем, что одна и та же доступная команда в одном разделе пользователю нужна, а в другом она только мешает. ВНИМАНИЕ! Необходимо различать механизм ограничения доступности на основании прав и механизм видимости по ролям. Первый жестко ограничивает пользователя в его возможностях выполнить те или иные действия. Второй позволяет оптимизировать состав видимых команд в соответствии с теми действиями, которые пользователь выполняет наиболее интенсивно. Настройка видимости позволяет предоставить пользователю ту часть функциональности, которая ему требуется при решении тех или иных конкретных задач. Рис. 7.8. Права на объект конфигурации установлены – команды доступны При этом для пользователя оставлена возможность самостоятельно донастроить видимость доступных команд – как удобно ему, а не как думает разработчик. ВНИМАНИЕ! Настройка видимости выполняется только для тех команд, которые оказались доступны пользователю в соответствии с его правами (ролью). Установка видимости для недоступных команд не приведет к их появлению в командном интерфейсе. Подробнее Правила пользовательской видимости команд, автоматически устанавливаемые платформой, приведены в документации «1С:Предприятие 8.2. Руководство разработчика», раздел 6.2.7. Для изменения пользовательской видимости команд по умолчанию необходимо использовать редактор командного интерфейса. Подробнее Раздел «Система настройки командного интерфейса», стр. 174. Рис. 7.9. Права на объект конфигурации установлены частично – команды доступны частично Например, для команды Товар: создать видимость установлена, и эта команда отображается в группе Создать панели действий (рис. 7.10). Для команды же Товар: создать группу видимость сброшена, и эта команда в интерфейсе не отображается. Видимость можно настраивать как общую для всех ролей – колонка Видимость, так и для каждой роли отдельно – колонка Видимость по ролям. Том 1 151 Глава 7. Командный интерфейс прикладных решений Например, в демонстрационной базе реализован функционал учета по складам. Но часть компаний, использующих прикладное решение, не ведут учет в разрезе складов. Для этих компаний из интерфейса необходимо исключить элементы, связанные с функционалом учета по складам. Значение функциональной опции, управляющей учетом по складам, хранится в константе Учет по складам. Функциональная опция связана со справочником Склады. ПРИМЕЧАНИЕ В общем случае в качестве хранилища значений функциональных опций кроме констант могут выступать элементы справочников и записи регистра сведений. Если константа имеет значение Истина, то команды для работы со справочником включены в командный интерфейс (рис. 7.11). Рис. 7.10. Пользовательская видимость команд по умолчанию Например, команда Регистр товарных запасов будет отображаться в командном интерфейсе для всех пользователей, за исключением пользователей с ролью Продавец (см. рис. 7.10). Доступность команд по функциональным опциям Установка доступности команд в зависимости от значений функциональных опций не зависит от роли пользователя, то есть выполняется одинаково для всех ролей. Механизм функциональных опций позволяет определить в прикладном решении ту функциональность, которая может использоваться или не использоваться в зависимости от потребностей конкретной организации. Различным элементам командного интерфейса могут быть назначены функциональные опции. При эксплуатации прикладного решения можно устанавливать значение для функциональных опций. В зависимости от установленного значения система будет автоматически включать/выключать отображение всех элементов командного интерфейса, которым эта функциональная опция назначена. Рис. 7.11. Команды доступны при включенной функциональной опции Если же значение константы Ложь, то эти команды из командного интерфейса исключены (рис. 7.12). Таким образом, при отсутствии учета в разрезе складов мы имеем возможность убрать из прикладного решения «лишнюю» функциональность, в том числе и команды из командного интерфейса. Подробнее Раздел «Механизм функциональных опций», стр. 183. 152 Профессиональная разработка в системе «1С:Предприятие 8» Командный интерфейс системы Пользователь изменил состав отображаемых разделов (рис. 7.14) – из списка выбранных удалены разделы Закупки и Предприятие. Рис. 7.12. Команды недоступны при отключенной функциональной опции Рис. 7.14. Отключены разделы Пользовательская настройка командного интерфейса Затем пользователь изменил состав команд, отображаемых в панели навигации (рис. 7.15), – из списка выбранных удалены команды Корректировка остатков, Регистр товарных запасов, Характеристики товаров, Цены товаров. При формировании видимой части командного интерфейса система осуществляет установку видимости команд в зависимости от персональных настроек пользователя. Этот механизм позволяет пользователям настраивать командный интерфейс в соответствии со своими предпочтениями. Подробнее Раздел «Пользовательская настройка интерфейса», стр. 187. Например, при первом запуске демонстрационной базы от имени пользователя Администратор состав видимых команд соответствует настройкам, выполненным разработчиком (рис. 7.13). Рис. 7.15. Отключены команды в панели навигации Также изменен состав отображаемых команд в панели действий (рис. 7.16) – из списка выбранных удалена команда Корректировка остатка. После применения всех настроек (и при последующих запусках) состав видимых команд соответствует настройкам пользователя Администратор (рис. 7.17) – все скрытые пользователем команды не отображаются. Рис. 7.13. Командный интерфейс при первом запуске Том 1 Важно помнить, что отключенные команды остались доступны – пользователь вновь может включить их отображение. 153 Глава 7. Командный интерфейс прикладных решений ПРИМЕЧАНИЕ На рис. 7.18 величина прямоугольника, представляющего создаваемый глобальный командный интерфейс, отражает его «насыщенность» командами. В общем случае формирование глобального командного интерфейса выполняется в зависимости: Рис. 7.16. Отключены команды в панели действий ■■ от структуры подсистем и их свойств Включать в командный интерфейс – определяют структуру командного интерфейса; ■■ состава объектов конфигурации и их свойств Использовать стандартные команды – определяют состав команд прикладного решения; ■■ прав пользователя, определяющих состав доступных команд; ■■ настройки пользовательской видимости команд по умолчанию (возможно, в разрезе ролей); ■■ установленных значений функциональных опций; ■■ настроек самого пользователя. Настраиваем состав команд Рис. 7.17. Командный интерфейс при последующих запусках Краткие итоги В заключение рассмотрения процесса построения глобального командного интерфейса можно представить изложенный материал в виде схемы (рис. 7.18). В дальнейшем изложении для демонстрации механизмов конструирования командного интерфейса мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 1». В качестве демонстрационного примера мы будем решать практическую задачу по адаптации этой конфигурации. Результат решения этой задачи содержится в демонстрационной базе «Командный интерфейс прикладных решений, пример 2». Постановка задачи На предприятии процесс ценообразования выделен в отдельный функциональный блок, и управлением ценами занимаются специально выделенные сотрудники. В демонстрационной базе операции управления ценами совмещены с операциями управления товарными запасами в подсистеме Товарные запасы. Необходимо выделить функционал управления ценами в отдельную подсистему и создать командный интерфейс для сотрудников, работающих с этой подсистемой. ПРИМЕЧАНИЕ Рис. 7.18. Построение глобального командного интерфейса 154 В данном разделе мы будем рассматривать системные и стандартные команды. Произвольные команды рассматриваются в разделе «Создаем произвольные команды», стр. 193. Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем состав команд Системные команды Начнем мы с самого простого – с главного меню приложения. Главное меню формируется из системных команд, предоставляемых технологической платформой. С точки зрения управления это самая простая группа команд. Системные команды присутствуют в любом прикладном решении, и разработчик прикладного решения не может изменить их состав. Для всех пользователей, вне зависимости от роли, в командном интерфейсе доступен один и тот же набор системных команд. ПРИМЕЧАНИЕ Для простых конфигураций возможна работа без подсистем. В этом случае все команды располагаются на рабочем столе. Раздел «Рабочий стол» формируется всегда. Однако в зависимости от настроек он может быть пустым. Формирование раздела командного интерфейса для подсистемы верхнего уровня иерархии управляется свойством подсистемы Включать в командный интерфейс (рис. 7.20). Все системные команды доступны через главное меню прикладного решения. Часть команд, доступных из главного меню, представлены в области системных команд (рис. 7.19). Рис. 7.20. Управление формированием раздела для подсистемы Рис. 7.19. Системные команды Вызов главного меню осуществляется кнопкой Главное меню, расположенной в области системных команд основного или вспомогательного окна приложения. Подробнее Об основном и вспомогательном окне приложения рассказано в разделе «Управляемый интерфейс», стр. 15. О пользовательской настройке видимости системных команд рассказано в разделе «Настройка области системных команд», стр. 187. Состав разделов Как уже было сказано, состав команд панели разделов определяется составом объектов конфигурации Подсистема верхнего уровня иерархии. Однако создание в дереве конфигурации подсистемы верхнего уровня еще не гарантирует, что для нее при построении командного интерфейса будет создан раздел. Том 1 Данное свойство оказывает влияние на формирование раздела командного интерфейса для всех пользователей прикладного решения, независимо от назначенных им ролей. Доступность же раздела для того или иного пользователя определяется назначенной ему ролью (см. раздел «Обеспечение доступности команд», стр. 149). Если для подсистемы верхнего уровня свойство Включать в командный интерфейс установлено, то для нее будет сформирован отдельный раздел. Стандартные команды объектов конфигурации, включенных в подсистему, будут учитываться при формировании командного интерфейса пользователя. Например, для подсистемы Финансы свойство Включать в командный интерфейс установлено (рис. 7.21). Для этой подсистемы сформирован раздел, и команды включены в командный интерфейс. Если же для подсистемы свойство Включать в командный интерфейс сброшено, то стандартные команды объектов, принадлежащих этой подсистеме, не будут учитываться при формировании командного интерфейса пользователя. Например, для подсистемы Финансы свойство Включать в командный интерфейс сброшено (рис. 7.22). Для этой подсистемы раздел не сформирован, и, следовательно, команды недоступны. 155 Глава 7. Командный интерфейс прикладных решений ВНИМАНИЕ! Для новых подсистем свойство Включать в командный интерфейс устанавливается по умолчанию, то есть предполагается, что подсистемы в первую очередь предназначены для формирования командного интерфейса. Если же выполняется конвертация конфигурации, разработанной для версии 8.1, то у всех подсистем свойство будет сброшено. Теперь мы можем начать решать поставленную задачу. Прежде всего, создадим новую подсистему верхнего уровня иерархии. Для добавления подсистемы используем команду Добавить контекстного меню узла Подсистемы дерева конфигурации (рис. 7.23). Рис. 7.21. В командном интерфейсе раздел формируется для подсистем с установленным свойством «Включать в командный интерфейс» Рис. 7.23. Добавление подсистемы В результате будет добавлен объект конфигурации и откроется окно свойств этого объекта (рис. 7.24). Рис. 7.24. Новая подсистема «Ценообразование» и ее свойства В группе свойств Основные представлены свойства: Рис. 7.22. Свойство «Включать в командный интерфейс» сброшено 156 ■■ Имя – определяет идентификатор объекта для доступа из встроенного языка; зададим имя «Ценообразование»; ■■ Синоним – определяет представление объекта в интерфейсе; оставим автоматически сформированный синоним. Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем состав команд ВНИМАНИЕ! Для свойства Синоним необходимо подбирать значение, которое максимально полно отражает назначение объекта. Особенно это важно для подсистем. У них, в отличие от прикладных объектов, нет других свойств, позволяющих задать представление объекта в интерфейсе, – пользователь увидит именно тот текст, который задан для свойства Синоним. Свойство Включать в командный интерфейс оставим установленным – нам необходимо формировать раздел в командном интерфейсе. Теперь необходимо вспомнить, что доступность раздела для пользователя определяется значением права Просмотр, установленным у роли пользователя для соответствующей подсистемы. Проконтролируем значение этого права для роли Администратор (рис. 7.25) – право должно быть установлено. Стандартные команды Для начала разберемся, какими же командами может быть наполнен раздел командного интерфейса. В раздел командного интерфейса включаются стандартные команды тех объектов конфигурации, которые принадлежат соответствующей подсистеме верхнего уровня (и подсистемам иерархически ей подчиненным). Что же мы подразумеваем под стандартной командой? Каждый объект конфигурации имеет стандартный набор свойств, определяющий его поведение по умолчанию. Для доступа к функциональности объекта платформа предоставляет некоторый набор команд. Вот эти команды и являются стандартными. ВНИМАНИЕ! Для стандартных команд выполняемые действия определены на уровне технологической платформы и не могут быть изменены разработчиком. ПРИМЕЧАНИЕ Непосредственно сами стандартные команды не имеют событий, для которых разработчик мог бы описать собственные алгоритмы. Но в результате выполнения многих стандартных команд вызываются события, связанные с данными, формами или элементами форм. Поэтому разработчик, используя механизм событий, может в некоторой степени влиять на действия, выполняемые стандартными командами. Рис. 7.25. Для роли «Администратор» установлено право «Просмотр» на подсистему «Ценообразование» ПРИМЕЧАНИЕ Контроль значения права осуществляем в редакторе прав. О работе с этим редактором рассказано в разделе «Система прав доступа», стр. 161. Следующей операцией по созданию раздела является его наполнение командами. ВНИМАНИЕ! Например, в демонстрационной базе справочник Товары включен в подсистемы Предприятие, Закупки, Продажи и Товарные запасы (рис. 7.26). Стандартные команды этого объекта доступны в разделах командного интерфейса, сформированных для соответствующих подсистем. А от чего зависит состав стандартных команд? Конечно же, от класса объектов, которому принадлежит объект конфигурации. И это логично, так как различные классы объектов конфигурации предназначены для решения различных прикладных задач. Например, объект-справочник Товары предоставляет команды открытия списка элементов – Товары, создания нового элемента – Товар и создания новой группы – Товар: создать группу, а объект-отчет Остатки товаров только команду открытия формы отчета – Остатки товаров (рис. 7.27). Если в подсистему не включено ни одного объекта конфигурации, раздел в командном интерфейсе не будет сформирован. Том 1 157 Глава 7. Командный интерфейс прикладных решений Рис. 7.26. Справочник «Товары» принадлежит нескольким подсистемам – стандартные команды объекта доступны в соответствующих разделах Подробнее Рис. 7.27. Состав стандартных команд зависит от прототипа объекта конфигурации Полный список командообразующих объектов конфигурации и предоставляемые ими стандартные команды приведены в документации «1С:Предприятие 8.2. Руководство разработчика», раздел 6.1.2.1. Состав предоставляемых стандартных команд мы видим в окне редактора командного интерфейса. О работе с этим редактором рассказано в разделе «Система настройки командного интерфейса», стр. 174. Кроме прототипа, на состав команд объекта конфигурации влияют и значения свойств этого объекта. Например, объект-справочник Товары предоставляет стандартные команды, как для создания элемента, так и для создания группы, а объект-справочник Склады – только команду создания нового элемента (рис. 7.28). Рис. 7.28. Состав стандартных команд зависит от настройки свойств объекта конфигурации 158 Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем состав команд А причина заключается в том, что у справочника Товары установлено свойство Иерархический с иерархией групп и элементов, а у справочника Склады свойство Иерархический сброшено. Таким образом, справочник Склады не может содержать записей-групп, и, следовательно, команда создания группы для этого объекта конфигурации не имеет смысла. Так же как и с подсистемами, наличие объекта в дереве конфигурации еще не гарантирует наличие его команд в командном интерфейсе. Возможность использовать стандартные команды объекта конфигурации при построении командного интерфейса определяется значением свойства Использовать стандартные команды этого объекта. При установленном свойстве команды объекта доступны для включения в командный интерфейс. Например, свойство Использовать стандартные команды для справочника Товары установлено (рис. 7.29). В командном интерфейсе присутствует навигационная команда Товары, которая позволяет открыть форму списка справочника, и команда действия Товар, которая позволяет создать новый элемент справочника. Рис. 7.30. Свойство «Использовать стандартные команды» сброшено ПРИМЕЧАНИЕ Значение свойства Использовать стандартные команды объекта конфигурации не влияет на использование произвольных подчиненных команд объекта (см. раздел «Произвольные команды», стр. 193). Пришло время обеспечить командами подсистему Ценообразование. Для начала определимся, какими прикладными объектами конфигурации реализован функционал управления ценами. В нашей конфигурации их три (рис. 7.31): ■■ справочник Товары – хранит список товаров и услуг, для которых могут назначаться цены; ■■ справочник Виды цен – хранит список видов цен, которые могут быть назначены каждому товару (услуге); ■■ регистр сведений Цены товаров – хранит значения цен, назначенных товарам в разрезе различных видов цен. Рис. 7.29. Свойство «Использовать стандартные команды» установлено Если же для объекта конфигурации свойство Использовать стандартные команды сброшено, то стандартные команды этого объекта в любом случае не будут использоваться при построении командного интерфейса. Например, при сброшенном свойстве для справочника Товары в командном интерфейсе отсутствуют команды открытия списка справочника и создания нового элемента (рис. 7.30). Для вновь созданного объекта конфигурации свойство Использовать стандартные команды установлено. Том 1 Рис. 7.31. Объекты конфигурации, реализующие функционал ценообразования 159 Глава 7. Командный интерфейс прикладных решений ПРИМЕЧАНИЕ На рис. 7.31 представлены только те объекты конфигурации, которые включены в подсистему Товарные запасы. Для этого на дерево объектов установлен фильтр по этой подсистеме. (на примере справочника Товары) у роли Администратор (рис. 7.33) – права должны быть установлены. Контроль прав на справочник Виды цен и регистр сведений Цены товаров выполняем аналогично справочнику Товары. Включим каждый из указанных объектов в нашу подсистему. Для этого необходимо заполнить свойство Состав подсистемы Ценообразование. Откроем окно свойств нашей подсистемы и через гиперссылку Открыть свойства Состав перейдем к окну Выбор объекта. В этом окне отметим требуемые объекты конфигурации (рис. 7.32). Рис. 7.33. Для роли «Администратор» установлены все права на справочник «Товары» Сохраним внесенные изменения, запустим демонстрационную базу в режиме 1С:Предприятие от имени пользователя Администратор и в панели разделов основного окна выберем раздел Ценообразование (рис. 7.34). Рис. 7.32. Включение объектов конфигурации в подсистему Для каждого из включенных объектов проверим свойство Использовать стандартные команды – оно должно быть установлено. Как и для подсистемы, доступность для пользователя объектов и их стандартных команд определяется значением прав, установленных у роли пользователя для этих объектов. Проконтролируем значения права 160 Рис. 7.34. Раздел «Ценообразование» с командами В панели навигации представлены команды открытия списков объектов, принадлежащих подсистеме Ценообразование. Представление стандартных команд объектов сформировано системой на основании значений в свойстве Представление списка. Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем доступность команд по ролям ПРИМЕЧАНИЕ Настройкой представления мы займемся в разделе «Настраиваем представление команд», стр. 190. На данном этапе мы сформировали структуру подсистемы Ценообразование и обеспечили доступ к ней пользователям с ролью Администратор. По условию задачи управлением ценами будут заниматься специально выделенные сотрудники, а никак не администраторы системы. Поэтому нам необходимо для этих сотрудников создать отдельную роль. ПРИМЕЧАНИЕ Этой настройкой мы займемся в разделе «Настраиваем доступность команд по ролям», стр. 161. Основные действия для создания командного интерфейса Система прав доступа Основным механизмом настройки доступности команд в командном интерфейсе является система прав доступа. Операция назначения роли пользователю решает две основные задачи: ■■ во-первых, ограничивает состав пользователей, имеющих доступ к конфиденциальной информации; ■■ во-вторых, предотвращает возможные потери информации путем запрета выполнения пользователем определенных операций (в первую очередь операций удаления и корректировки данных). При проектировании прикладного решения разработчик должен выделить группы пользователей, выполняющих одинаковые и/или логически связанные операции. Для каждой из выделенных групп на основе шаблона Роли создается объект конфигурации (рис. 7.35). Из приведенных примеров видно, что для построения командного интерфейса необходимо и достаточно выполнить следующие действия: ■■ создать иерархию подсистем; ■■ при необходимости установить свойство подсистемы Включать в командный интерфейс; ■■ установить значение права Просмотр на подсистемы для тех ролей, которым должны отображаться соответствующие разделы командного интерфейса; ■■ определить состав объектов каждой подсистемы; ■■ при необходимости установить свойство Использовать стандартные команды для объектов конфигурации, включенных в подсистемы. На основании этой информации «1С:Предприятие» автоматически построит командный интерфейс пользователя. Пользователю будет отображена функциональная структура прикладного решения (разделы и подразделы) и предоставлен доступ к стандартной функциональности прикладных объектов (стандартные команды). Настраиваем доступность команд по ролям В данном разделе мы рассмотрим систему прав доступа и ее влияние на командный интерфейс. В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 1». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 3». Том 1 Рис. 7.35. Объекты конфигурации с шаблоном «Роли» Каждая из ролей определяет независимый (от других ролей) набор прав доступа к обрабатываемой в прикладном решении информации и действий, которые пользователь может выполнять с этой информацией. Разработчик имеет возможность создать любое необходимое количество ролей, обеспечивающих предоставление разным пользователям различных полномочий. Используя механизмы управления пользователями, администратор системы регистрирует пользователей прикладного решения. Каждому пользователю назначается роль (или несколько ролей), которая определяет права пользователя на доступ к данным. Настройка прав выполняется в окне редактирования роли. Для доступа к этому окну можно либо выбрать команду Открыть права из контекстного меню, либо воспользоваться гиперссылкой Открыть в окне свойств роли (рис. 7.36). 161 Глава 7. Командный интерфейс прикладных решений Рис. 7.36. Варианты открытия окна редактирования прав В результате выполнения команды будет открыто окно редактирования прав для выбранной роли (рис. 7.37). Рис. 7.38. Установка прав для группы однотипных объектов конфигурации В этом случае назначаются одинаковые права всем объектам, созданным на основании выбранного шаблона. Права применяются к объектам данных информационной базы, которые описаны объектами конфигурации, созданными на основании выбранного шаблона. Права могут быть установлены и на отдельный объект конфигурации (рис. 7.39). Рис. 7.37. Окно редактирования прав для роли Для настройки прав необходимо в дереве конфигурации выбрать объект (левое поле) и в списке прав (правое верхнее поле) установить или снять отметку рядом с настраиваемым правом. Права можно установить на уровне прототипов платформы. Для этого в дереве конфигурации необходимо выбрать узел, представляющий соответствующий шаблон объектов (рис. 7.38). Рис. 7.39. Установка прав на объект конфигурации В этом случае права применяются к объектам данных информационной базы, которые описаны выбранным объектом конфигурации. Права также могут быть установлены на объекты, подчиненные выбранному (как в целом для всех подчиненных объектов одного типа, так и индивидуально на каждый из подчиненных объектов) – реквизиты, табличные части и команды (рис. 7.40). 162 Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем доступность команд по ролям А теперь давайте создадим роль Менеджер по ценам. Эта роль будет назначена пользователям, которые выполняют операции по управлению ценами. Для добавления роли используем команду Добавить контекстного меню узла Роли дерева конфигурации (рис. 7.42). Рис. 7.40. Установка прав на подчиненный объект конфигурации В этом случае права применяются только к командам, подчиненным объекту, или к данным, хранящимся в подчиненных информационных структурах. Права, установленные на объект конфигурации, имеют приоритет перед правами, установленными на его подчиненные объекты. Рис. 7.42. Добавление роли В результате будет добавлен объект конфигурации и откроется окно свойств и окно редактирования прав (рис. 7.43). Кроме прав, применяемых для объектов конфигурации, существует набор прав, применяемый к конфигурации в целом. Список этих прав отображается при выборе корневого узла дерева конфигурации (рис. 7.41). Рис. 7.41. Набор прав конфигурации Эти права определяют возможность выполнения административных функций, использования внешних отчетов и обработок, доступа к журналу регистрации и др. Том 1 Рис. 7.43. Окно свойств и окно редактирования прав роли 163 Глава 7. Командный интерфейс прикладных решений В группе свойств Основные зададим значения свойств роли: ■■ Имя – «Менеджер по ценам»; ■■ Синоним – оставим автоматически сформированный синоним; ■■ Комментарий – не будем заполнять. По умолчанию для вновь созданной роли все права на все существующие объекты конфигурации сброшены, то есть запрещены любые действия с данными. Давайте настроим права на доступ к объектам, используемым в подсистеме управления ценами. Прежде всего, в правах на конфигурацию установим право Тонкий клиент (рис. 7.44). Установка этого права позволит пользователю запускать тонкий клиент «1С:Предприятия». Рис. 7.45. Установка права «Просмотр» для подсистемы «Ценообразование» у роли «Менеджер по ценам» Рис. 7.44. Право на запуск тонкого клиента Как и для других объектов конфигурации, для подсистем определены права. Доступность раздела в командном интерфейсе настраивается для роли установкой права Просмотр подсистемы, соответствующей разделу. Проверим право Просмотр для подсистемы Ценообразование и при необходимости установим его (рис. 7.45). Установленное право обеспечит доступность раздела Ценообразование в командном интерфейсе пользователя с ролью Менеджер по ценам. Для справочника Товары установим право Просмотр – пользователь должен иметь возможность просматривать и выбирать товары, для которых он будет устанавливать/изменять цены (рис. 7.46). ПРИМЕЧАНИЕ Рис. 7.46. Установка права «Просмотр» для справочника «Товары» у роли «Менеджер по ценам» Для справочника Виды цен установим все права – пользователь должен иметь полный доступ к этому справочнику для формирования используемых видов цен (рис. 7.47). При установке интерактивного права Просмотр автоматически устанавливается основное право Чтение. 164 Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем доступность команд по ролям ПРИМЕЧАНИЕ Перед созданием пользователя необходимо обновить конфигурацию базы данных. Это можно сделать, выбрав команду Конфигурация Обновить конфигурацию базы данных. Система управления пользователями Для регистрации пользователей и назначения для них ролей используется система управления пользователями. Для знакомства с этой системой добавим в наше приложение нового пользователя, который будет осуществлять управление ценами. Командой Администрирование Пользователи откроем список пользователей и воспользуемся командой Добавить контекстного меню этого списка (рис. 7.49). Рис. 7.47. Установка всех прав для справочника «Виды цен» у роли «Менеджер по ценам» Для регистра сведений Цены товаров также установим все права – пользователь должен иметь полный доступ к этому регистру для управления ценами в разрезе товаров и видов цен (рис. 7.48). Рис. 7.49. Добавление нового пользователя В открывшемся окне определим значения свойств учетной записи добавляемого пользователя. На закладке Основные (рис. 7.50) заполним свойства: ■■ Имя – краткое имя пользователя, которое вводится в диалоге аутентификации пользователя (должно быть уникальным среди всех пользователей данного прикладного решения); задаем имя «Менеджер по ценам». Рис. 7.48. Установка всех прав для регистра сведений «Цены товаров» у роли «Менеджер по ценам» Мы определили набор прав для пользователей, выполняющих операции по ценообразованию. Теперь нам необходимо создать пользователя и назначить ему вновь созданную роль. Перейдем к решению этой задачи. Том 1 Рис. 7.50. Назначение пользователю имени 165 Глава 7. Командный интерфейс прикладных решений На закладке Прочие (рис. 7.51) заполним свойства: ■■ Доступные роли – указываются те роли, которые есть у пользователя при работе с прикладным решением; помечаем роль «Менеджер по ценам». Рис. 7.53. Для пользователя «Менеджер по ценам» справочник «Товары» доступен, а справочник «Контрагенты» недоступен Рис. 7.51. Назначение роли пользователю ПРИМЕЧАНИЕ Права складываются по правилам логического ИЛИ – если хотя бы в одной из доступных ролей право на выполнение операции установлено, то пользователь может выполнить операцию. Все дело в том, что для справочника Контрагенты у роли Менеджер по ценам все права сброшены – для вновь создаваемой роли права на существующие объекты по умолчанию не устанавливаются. Чтобы в списке отображался поставщик, достаточно установить у роли основное право Чтение для справочника Контрагенты (рис. 7.54). Сохраним сведения о пользователе, нажав кнопку OK, и запустим наше приложение от имени созданного пользователя (рис. 7.52). Рис. 7.52. Запуск приложения от имени пользователя «Менеджер по ценам» Для менеджера по ценам доступен раздел глобального командного интерфейса Ценообразование и команды этого раздела. Выберем команду Товары для открытия списка товаров – в рабочей области открылась форма списка справочника. Развернем группу товаров Обувь. В колонке Поставщик вместо данных присутствует сообщение Объект не найден… (рис. 7.53). Рис. 7.54. Разрешение пользователю «Менеджер по ценам» читать справочник «Контрагенты» Теперь при открытии списка товаров в колонке Поставщик отображается наименование поставщика (рис. 7.55). 166 Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем доступность команд по ролям ВНИМАНИЕ! При установке прав на объект конфигурации права на его подчиненные команды автоматически не устанавливаются. Исправим ситуацию установкой права Просмотр для подчиненной команды (рис. 7.57). Рис. 7.55. Для пользователя «Менеджер по ценам» доступны справочники «Товары» и «Контрагенты» ПРИМЕЧАНИЕ Для того чтобы форма просмотра товара открывалась, необходимо установить право Чтение для плана видов характеристик Виды характеристик товаров и регистра сведений Характеристики товаров. Для того чтобы в форме присутствовала картинка с изображением товара, нужно установить право Просмотр на справочник Хранимые файлы. Пойдем дальше и откроем форму товара. Пользователь, управляющий ценами, должен иметь возможность распечатать штрихкод товара. Однако в открытой форме нет команды, позволяющей выполнить эту операцию (рис. 7.56). Рис. 7.57. Разрешение пользователю «Менеджер по ценам» использовать подчиненную команду «Печать штрихкода» Сохраним изменения, запустим демонстрационную базу в режиме 1С:Предприятие от имени пользователя Менеджер по ценам и опять откроем форму товара. Теперь за счет установленного права в ней присутствует команда Печать штрихкода (рис. 7.58). Рис. 7.56. В форме товара отсутствует команда печати штрихкода Непосредственно печать штрихкода выполняет команда Печать штрихкода, подчиненная справочнику Товары. А использовать эту команду для роли запрещено – право Просмотр не установлено. Том 1 Рис. 7.58. Данные по контрагентам доступны, данные по файлам недоступны 167 Глава 7. Командный интерфейс прикладных решений Все, мы полностью закончили настройку прав для роли Менеджер по продажам. На текущий момент для управления ценами мы обеспечили формирование отдельного раздела командного интерфейса, формирование набора команд для этого раздела и ролевую настройку прав пользователей, занимающихся ценообразованием. Редактирование командного интерфейса Одним из условий комфортной работы пользователя с командным интерфейсом является «минимализм» последнего – в идеале пользователь должен иметь удобный доступ только к тем командам, которые необходимы для решения его задач. В разделе «Настраиваем доступность команд по ролям» (стр. 161) мы рассмотрели механизм ролевой настройки доступности команд в командном интерфейсе. Этот механизм позволяет эффективно добиться выполнения условия минимализации командного интерфейса – доступны только те команды, которые необходимы пользователю. С другой стороны, хотелось бы обеспечить пользователю максимально комфортные условия для работы. Ведь среди доступных команд есть такие, к которым пользователи обращаются очень часто, и такие, доступ к которым необходим изредка. Хорошо бы иметь возможность не отображать в командном интерфейсе вторую группу команд, оставив пользователю возможность обращаться к ним при необходимости. ■■ настраивается пользователем – в режиме эксплуатации каждый пользователь настраивает видимость команд, исходя из собственных предпочтений. При этом пользователи с одной и той же ролью могут определить различный состав видимых по умолчанию команд. ПРИМЕЧАНИЕ Возможности настройки командного интерфейса пользователем будут рассмотрены в разделе «Пользовательская настройка интерфейса», стр. 187. Сейчас же мы рассмотрим первые два уровня. В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 3». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 4». Автоматическое размещение и видимость команд На данный момент пользователю с ролью Менеджер по ценам в разделе Ценообразование видимы команды открытия форм списков в панели навигации. Панель же действий вообще не содержит видимых команд и не отображается (рис. 7.59). Для решения этой задачи предназначен механизм настройки размещения и видимости команд по ролям. Он позволяет оптимальным образом настроить командный интерфейс для различных ролей пользователей – показать часто используемые команды и скрыть те, которые используются редко. ВНИМАНИЕ! Видимость команды вступает в силу только тогда, когда команда доступна. Недоступные для роли команды не попадут в командный интерфейс независимо от настройки видимости. При редактировании размещения и видимости команд можно выделить три уровня настройки: ■■ не настраивается – система автоматически разместит команды в командном интерфейсе и настроит их видимость; ■■ настраивается разработчиком – в режиме конфигурирования настраивается размещение и видимость команд в разрезе ролей. Эта настройка будет настройкой по умолчанию, используемой для всех пользователей с определенной ролью; 168 Рис. 7.59. Автоматически сформированный набор видимых команд раздела «Ценообразование» А где же команды создания новых объектов? Эти команды «спрятаны». Мы не вмешивались в процесс размещения и установки видимости команд. Система разместила команды командного интерфейса и установила их видимость автоматически. Подробнее Правила, которым следует система при размещении команд командного интерфейса, описаны в разделе «Правила размещения глобальных команд», стр. 173. Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Правила автоматической настройки видимости команд приведены в документации «1С:Предприятие 8.2. Руководство разработчика», раздел 6.2.7. Такая автоматическая видимость команд объясняется достаточно просто. В общем случае просмотр списков требуется многим пользователям, а вот операция создания новых элементов выполняется реже. Поэтому проще настроить видимость команд создания элементов для нескольких пользователей, чем настраивать видимость команд открытия списков для многих пользователей. Как же создавать новые объекты (элементы справочников, документы и т. д.), когда пользователь не видит соответствующих команд? В этом случае можно воспользоваться командами, предоставляемыми формами списков. Например, новый вид цен можно создать из формы списка справочника Виды цен (рис. 7.60). Кроме видимости, следует обратить внимание и на порядок команд. Сейчас команды в панели навигации расположены не очень удачно. Самой важной для пользователя является команда открытия списка цен на товары, а она расположена в самом низу списка. Хотелось бы, чтобы эта команда отображалась первой. Для решения подобных задач система «1С:Предприятие» предоставляет редакторы, позволяющие настраивать размещение и видимость команд в командном интерфейсе в соответствии с требованиями прикладного решения. ВНИМАНИЕ! Редактирование командного интерфейса не позволит добавить или исключить команды. Эта операция позволит лишь оптимизировать командный интерфейс – обеспечить удобство работы для различных групп пользователей. Однако прежде чем заниматься настройкой, давайте познакомимся с автоматическим размещением и видимостью команд. Категории и группы команд На размещение команд командного интерфейса влияет категория команды. По сути, категория – это еще одна классификация команд. В ней команды разделяются по двум признакам: зависимость команды от дополнительных данных и назначение команды. По зависимости от данных команды делятся: ■■ на независимые, ■■ параметризуемые. Рис. 7.60. Работа с видами цен из формы списка При таком доступе к команде создания нового объекта пользователь должен выполнить дополнительное действие – открыть форму списка. Для справочника Виды цен это достаточно удобно – состав видов цен изменяется редко, и, соответственно, пользователь редко обращается к команде создания нового элемента. А вот команда назначения цены на товар нужна часто, и выполнение дополнительного действия может быть неудобно. Для обеспечения более комфортного доступа к команде ее необходимо сделать видимой в командном интерфейсе. Еще одной командой, видимость которой стоит настроить, является команда Товары, открывающая список товаров для просмотра. Том 1 По назначению команды делятся: ■■ на навигационные, ■■ команды действия. Независимые команды не требуют для своего исполнения никаких дополнительных данных. Это значит, что результат выполнения такой команды будет одинаков независимо от того, из какого окна (или формы) вызвана команда, какие данные обрабатываются пользователем в момент вызова команды и т. д. К независимым относятся команды открытия списка справочника, создания нового документа и др. Например, в результате выполнения навигационной команды Товары в рабочей области основного окна приложения открывается форма списка справочника Товары (рис. 7.61). При этом дополнительная информация для открытия списка команде не требуется. 169 Глава 7. Командный интерфейс прикладных решений Различие между независимыми и параметризуемыми командами можно продемонстрировать на следующем примере. Предположим, нам необходимо получить отчет по остаткам товаров на складе Большой. Мы можем выбрать раздел Товарные запасы и воспользоваться независимой командой Остатки товаров (рис. 7.63). Рис. 7.61. Независимая команда не требует параметра Параметризуемые команды для своего выполнения требуют дополнительные данные – параметры выполнения, которые определяют результат исполнения команды. К параметризуемым относятся команды открытия списка подчиненного справочника (параметр – ссылка на элемент справочника владельца), создания нового документа на основании (параметр – объект, на основании которого создается документ) и др. ВНИМАНИЕ! Источником значения для параметра могут служить только данные формы. Поэтому параметризуемые команды должны располагаться в форме. Причем в той, которая содержит данные подходящего для параметра типа. Например, команда Файлы, вызванная из формы элемента справочника Товары, откроет (в том же окне) форму списка элементов справочника Хранимые файлы (рис. 7.62). В списке будут отображены элементы, подчиненные редактируемому элементу справочника Товары. Рис. 7.63. Вызов отчета независимой командой «Остатки товаров» Но в этом случае нам необходимо в настройках отчета выбрать интересующий нас склад. Для исключения этапа выбора склада мы можем вызвать отчет из формы списка складов. Для этого выделяем в списке интересующий нас склад и выбираем параметризуемую команду Остатки по складу (рис. 7.64). В этом случае нет необходимости выбирать склад в настройках отчета – он передан команде как параметр. Навигационные команды предназначены для навигации пользователя по функциональности прикладного решения, то есть для выбора наиболее подходящего контекста для решения текущей задачи. Исполнение навигационной команды обычно приводит к открытию новой формы в окне (основном или вспомогательном), из которого была вызвана команда. Если в рабочей области окна отображалась какая-либо форма, то она замещается на новую. ПРИМЕЧАНИЕ Рис. 7.62. Параметризуемая команда требует параметр 170 Навигационная команда может привести к открытию нового окна, если при выборе команды левой кнопкой мыши удерживать нажатой клавишу Shift. Еще один способ открыть новое окно – вызвать контекстное меню команды. Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Рис. 7.65. Навигационная команда Рис. 7.64. Вызов отчета параметризуемой командой «Остатки по складу» Навигационными могут быть как независимые, так и параметризуемые глобальные команды. К навигационным относится команда перехода к форме списка справочника – независимая; команда перехода к форме списка подчиненного справочника – параметризуемая. Например, навигационная команда Продажи, вызванная из основного окна приложения, откроет форму списка документов Расход товара в рабочей области этого окна (рис. 7.65). Команды действия предназначены для непосредственного выполнения какой-либо задачи по обработке данных. Вследствие «переключения» пользователя на выполнение очередной операции команды действия открывают формы для работы с данными в отдельном вспомогательном окне приложения. К командам действия относится команда создания нового документа – независимая; команда вызова отчета об остатках по складу – параметризуемая. Например, команда Продажа откроет новое вспомогательное окно для ввода нового документа Расход товара, и пользователь перейдет от навигации по приложению к обработке данных документа (рис. 7.66). Том 1 Рис. 7.66. Команда действия Различие между командами навигации и командами действия можно продемонстрировать на следующем примере. Предположим, нам необходимо создать новый вид цен. Мы можем выбрать раздел Товарные запасы и воспользоваться командой действия Вид цен (рис. 7.67). 171 Глава 7. Командный интерфейс прикладных решений Каждая из глобальных команд с точки зрения рассмотренной классификации принадлежит одной из четырех предопределенных категорий: ■■ панель навигации – независимые навигационные команды; ■■ панель действий – независимые команды действий; ■■ панель навигации формы – параметризуемые навигационные команды; ■■ командная панель формы – параметризуемые команды действий. ПРИМЕЧАНИЕ Рис. 7.67. Команда действия – для обработки данных ПРИМЕЧАНИЕ Для команды создания нового вида цен предварительно была выполнена настройка видимости. Но мы не можем сказать с уверенностью, что создаваемый вид цен еще не существует. Чтобы убедиться, что такого вида цен нет, необходимо просмотреть список видов цен, то есть изменить состав отображаемой в окне информации. Это можно сделать навигационной командой Виды цен. Убедившись в отсутствии требуемого вида цен, для его создания можно воспользоваться командой действия Вид цены или командой формы Создать (рис. 7.68). Для категорий отсутствуют специальные названия. Именование категорий команд реализовано по «территориальному» признаку – в качестве имени категории выступает название панели, в которой обычно располагаются команды, принадлежащие этой категории. Команды каждой категории объединены в стандартные группы (табл. 7.1). Таблица 7.1. Стандартные категории и группы команд Категория команд Группы команд Панель навигации Важное, Обычное, См. также Создать, Отчеты, Сервис Важное, Перейти, См. также Важное, Создать на основании Панель действий Панель навигации формы Командная панель формы Группа определяет «вес» команды – ее важность для задач, решаемых пользователем. При необходимости для каждой категории разработчик может расширить состав групп. Для определения произвольных групп предназначены общие объекты конфигурации класса Группы команд. Подробнее Раздел «Произвольные группы», стр. 208. Рис. 7.68. Навигационная команда – для формирования контекста обработки данных 172 Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Правила размещения глобальных команд Для каждой из категорий предопределено место для автоматического размещения команд, принадлежащих этой категории. Правила размещения команд командного интерфейса представлены в табл. 7.2. Таблица 7.2. Размещение команд командного интерфейса Команды Независимые Категория: панель навигации. Навигационные Размещение: панель навигации основного окна Категория: панель действий. Размещение: панель действий Действия основного окна Параметризуемые Категория: панель навигации формы. Размещение: панель навигации вспомогательного окна Категория: командная панель формы. Размещение: командная панель формы Порядок размещения групп соответствует их порядку в табл. 7.1. По умолчанию порядок команд внутри группы определяется их текстовым представлением – команды размещаются в алфавитном порядке. В панели навигации основного окна размещаются независимые навигационные глобальные команды (рис. 7.69). ■■ Обычное – команды перехода к функциональности, имеющей обычный приоритет. Визуально команды группы Важное выделяются жирным начертанием. После всех подразделов выводится третья группа команд См. также. В этой группе обычно размещаются команды перехода к наименее используемой функциональности прикладного решения. Эта группа имеет заголовок и отделена от остальных групп горизонтальной чертой. Особенностью группы См. также является то, что в ней собраны команды как раздела, так и всех его подразделов. Эти команды выводятся единым списком без структурирования по подразделам. Команды также могут быть размещены в произвольных группах. Эти группы образуются объектами конфигурации Группа команд. Произвольные группы не имеют заголовков, а команды, им принадлежащие, размещаются в стандартной группе Обычное и отделены от других команд пустой строкой. В панели действий основного окна глобальные команды действий (рис. 7.70). размещаются независимые Рис. 7.69. Категория команд «Панель навигации» основного окна Рис. 7.70. Категория команд «Панель действий» основного окна В выбранном разделе навигационные команды структурируются по подразделам. Каждый из подразделов, образованный подсистемами второго и следующих уровней иерархии, образует отдельный блок команд и выделяется заголовком. Команды в панели действий могут размещаться в одной из трех стандартных групп: При размещении команд сначала выводятся команды раздела, а ниже – блоки команд каждого из подразделов. Команды раздела и каждого из подразделов могут размещаться в двух стандартных группах: ■■ Важное – команды перехода к наиболее важной или наиболее часто используемой функциональности; Том 1 ■■ Создать – команды открытия окон с формами ввода данных; ■■ Отчеты – команды открытия окон с формами отчетов; ■■ Сервис – команды открытия окон с формами обработок. ПРИМЕЧАНИЕ В панели действий команды по подразделам не структурируются. В группах объединены команды, принадлежащие как подсистеме верхнего уровня иерархии, так и всем подчиненным подсистемам. 173 Глава 7. Командный интерфейс прикладных решений Как и в панели навигации, команды могут быть размещены и в произвольных группах. Эти группы располагаются после стандартных и представлены синонимом соответствующего объекта конфигурации Группа команд. ботка данных, отображаемых в форме. Например, команда проведения документа (рис. 7.72). В панели навигации вспомогательного окна (при наличии этой панели в окне) размещаются параметризуемые навигационные глобальные команды. С использованием этих команд осуществляется навигация по данным, логически связанным с данными, обрабатываемыми в форме. Например, команда перехода к записям регистра, подчиненным редактируемому документу (рис. 7.71). Рис. 7.72. Категория команд «Командная панель формы» вспомогательного окна Команды в командной панели формы могут размещаться в одной из двух стандартных групп: Рис. 7.71. Категория команд «Панель навигации формы» вспомогательного окна ПРИМЕЧАНИЕ Для наглядного представления группировки команд состав групп изменен по сравнению с демонстрационной базой. Команды в панели навигации вспомогательного окна могут размещаться в одной из трех стандартных групп: ■■ Важное – команды перехода к наиболее важным или наиболее часто используемым связанным данным; ■■ Перейти – команды перехода к данным, имеющим обычный приоритет; ■■ См. также – команды перехода к информационным (справочным) данным. Команды также могут быть размещены в произвольных группах. Произвольные группы не имеют заголовков, а команды, им принадлежащие, размещаются в стандартной группе Перейти и ничем не отделяются от команд этой группы. В командной панели формы размещаются параметризуемые глобальные команды действий. С использованием этих команд выполняется обра- 174 ■■ Важное – команды, исполняющие наиболее важные или наиболее часто выполняемые действия; ■■ Создать на основании – команды, выполняющие создание новых объектов на основании того объекта, который обрабатывается в форме. Группа Создать на основании в командной панели формы отображается в виде меню. Команды также могут быть размещены в произвольных группах. Произвольные группы отображаются в виде отдельных меню и могут быть представлены текстом, картинкой или картинкой и текстом (в зависимости от значения свойства Отображение объекта конфигурации Группа команд). Разобравшись с автоматическим размещением команд, перейдем к знакомству со средствами настройки размещения и видимости команд. Система настройки командного интерфейса Для настройки командного интерфейса платформа предоставляет специализированные редакторы и обеспечивает сохранение выполненных настроек. Для хранения настроек командного интерфейса конфигурации используется свойство Командный интерфейс корневого объекта конфигурации (рис. 7.73). Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Рис. 7.73. Свойство конфигурации «Командный интерфейс» В этом свойстве сохраняются: ■■ настройка порядка следования разделов; ■■ настройка видимости разделов, в том числе в разрезе ролей. Для хранения настроек командного интерфейса раздела используется свойство Командный интерфейс соответствующей подсистемы (рис. 7.74). Рис. 7.75. Свойство конфигурации «Командный интерфейс рабочего стола» Для редактирования командного интерфейса система предоставляет специализированные инструменты: ■■ редактор командного интерфейса, ■■ редактор командного интерфейса конфигурации, ■■ редактор командного интерфейса рабочего стола, ■■ редактор «Все подсистемы». Основные приемы работы во всех редакторах совпадают. Мы их подробно рассмотрим применительно к редактору командного интерфейса. Редактор командного интерфейса Редактор командного интерфейса предназначен для редактирования командного интерфейса конкретного раздела (подсистемы). Рис. 7.74. Свойство подсистемы «Командный интерфейс» Редактор можно открыть либо гиперссылкой Открыть свойства подсистемы Командный интерфейс, либо из контекстного меню выбрать команду Открыть командный интерфейс (рис. 7.76). В этом свойстве сохраняются: ■■ настройка расположения команд в группах команд; ■■ настройка порядка следования команд; ■■ настройка видимости команд, в том числе в разрезе ролей. Хранение настроек в свойстве подсистемы позволяет независимо настраивать каждый из разделов (подразделов) командного интерфейса. Для раздела Рабочий стол настройки сохраняются в свойстве Командный интерфейс рабочего стола корневого объекта конфигурации (рис. 7.75). При работе со свойством Командный интерфейс необходимо помнить, что оно будет непустым (то есть будет хранить настройки) только в том случае, когда разработчик выполнил настройку размещения и видимости команд, отличающуюся от автоматически используемой системой. Том 1 Рис. 7.76. Доступ к редактору командного интерфейса подсистемы 175 Глава 7. Командный интерфейс прикладных решений В результате выполнения команды откроется окно редактора. В окне редактора отображается дерево команд, доступных в той подсистеме, для которой вызван редактор (рис. 7.77). Рис. 7.77. Окно редактора командного интерфейса подсистемы Для настройки размещения команд в глобальном командном интерфейсе редактор предоставляет следующие возможности: ■■ можно изменить порядок следования команд внутри группы; ■■ можно изменить группу, в которой будет отображаться команда. Группу, в которой будет отображаться команда, можно изменить командой Переместить команду (вызвав ее из контекстного меню или из командной панели) или перетащить команду в нужную группу мышью (рис. 7.79). Рис. 7.79. Настройка принадлежности команды к группе ПРИМЕЧАНИЕ Переместить команду в группу, принадлежащую другой панели (имеющую другую категорию), редактор не позволит. Порядок следования команды внутри группы можно изменять командами Вверх и Вниз (вызвав их из контекстного меню или из командной панели) или перетаскивая команду на нужную позицию мышью (рис. 7.78). При установке порядка следования команд, отличающегося от автоматического, рядом с группой будет отображаться текст Ручной порядок (рис. 7.80). Рис. 7.78. Настройка порядка следования команд Рис. 7.80. Признак ручного изменения порядка следования команд 176 Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Например, перетащили команду Товары в первую позицию группы ПанельНавигации.Обычное (см. рис. 7.80). В результате рядом с этой группой появился текст Ручной порядок. Если необходимо вернуться к автоматическому порядку следования команд внутри группы, то это можно сделать командой Восстановить автоматический порядок команд из контекстного меню группы (рис. 7.81). Рис. 7.82. Настройка общей видимости команд Рис. 7.81. Восстановление автоматического размещения команд Например, для группы ПанельНавигации.Обычное выполнено восстановление автоматического порядка команд (см. рис. 7.81). В результате в этой группе команды упорядочились по алфавиту. Для настройки видимости по умолчанию команд в командном интерфейсе редактор предоставляет следующие возможности: ■■ можно настроить общую видимость команды, ■■ можно настроить видимость команды в разрезе ролей. Общая видимость команды используется для тех ролей, у которых не выполняется индивидуальная настройка видимости этой команды. Для изменения общей видимости команды необходимо установить или снять флажок в колонке Видимость для требуемой команды (рис. 7.82). Для общей видимости может быть задано только два значения: ■■ команда видима – флажок установлен; ■■ команда невидима – флажок сброшен. При необходимости редактор позволяет задать видимость по ролям – отдельно для каждой роли, определенной в конфигурации. Для изменения видимости команды для роли необходимо установить или снять флажок в соответствующей колонке группы Видимость по ролям (рис. 7.83). Том 1 Рис. 7.83. Настройка видимости команд по ролям Для видимости по ролям может быть задано три значения: ■■ команда видима – белый фон, флажок установлен; ■■ команда невидима – белый фон, флажок сброшен; ■■ использовать общую видимость – серый фон, флажок установлен. Значения устанавливаются щелчком левой клавиши мыши и перебираются последовательно в цикле. В командном интерфейсе пользователя команда будет видима, если хотя бы для одной из ролей, назначенных этому пользователю, видимость для данной команды установлена. 177 Глава 7. Командный интерфейс прикладных решений При необходимости вернуться к автоматическим размещению и видимости команд можно воспользоваться командой контекстного меню Установить свойства по умолчанию или одноименной кнопкой командной панели (рис. 7.84). Рис. 7.85. Установка фильтра на видимые команды Рис. 7.84. Установка свойств команды по умолчанию Редактор командного интерфейса поддерживает групповую настройку размещения с помощью множественного выделения команд в списке. Для выделения диапазона команд необходимо выделить первую команду из диапазона, а затем, удерживая нажатой клавишу Shift, выделить последнюю команду из диапазона. В результате будут выбраны все команды, расположенные между первой и последней (включая граничные). Для выделения нескольких команд, следующих не подряд, необходимо выделить первую команду, а затем, удерживая нажатой клавишу Ctrl, отмечать необходимые команды. В результате будут выделены все отмеченные команды. С группой команд можно выполнять те же операции, что и с отдельной командой. При необходимости разработчик может настроить состав отображаемых команд и колонки списка, в котором команды отображаются. Для того чтобы в списке команд отобразить только видимые по умолчанию команды, следует нажать кнопку командной панели Скрыть невидимые по умолчанию (рис. 7.85). При этом также будут скрыты группы без команд. Для того чтобы в списке команд отобразить только команды, доступные некоторым ролям (возможно, одной), следует задать эти роли в поле Отбор по ролям (рис. 7.86). 178 Рис. 7.86. Установка фильтра на команды, доступные роли В списке будут отображаться только те команды, которые доступны хотя бы одной из выбранных ролей (рис. 7.87). Если при отборе по ролям установлен отбор только видимых команд, то будут отображены только те команды, которые по умолчанию видимы хотя бы одной роли. Для отключения отбора по ролям в поле отбора нужно выбрать значение Не установлен. Список выбора позволяет быстро включать один из нескольких последних установленных отборов (рис. 7.88). Для настройки колонок списка команд необходимо вызвать команду контекстного меню Настройка списка (рис. 7.89). Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса Редактор командного интерфейса конфигурации Редактор командного интерфейса конфигурации предназначен для редактирования порядка следования и видимости разделов в панели разделов. Редактор можно открыть либо гиперссылкой Открыть свойства конфигурации Командный интерфейс, либо из контекстного меню выбрать команду Открыть командный интерфейс (рис. 7.90). Рис. 7.87. Команды, доступные роли «Менеджер по ценам» Рис. 7.90. Доступ к редактору командного интерфейса конфигурации В результате выполнения команды откроется окно редактора (рис. 7.91). В этом окне отображается список разделов командного интерфейса, соответствующих подсистемам первого уровня иерархии с установленным свойством Включать в командный интерфейс. Рис. 7.88. История отбора и отключение отбора команд Рис. 7.91. Окно редактора командного интерфейса конфигурации Редактор позволяет: Рис. 7.89. Окно настройки отображения колонок редактора В открывшемся окне можно настроить состав, размер и положение колонок списка команд. Том 1 ■■ упорядочить разделы – в установленном порядке разделы будут показаны в панели разделов; ■■ установить общую видимость раздела и его видимость по ролям. 179 Глава 7. Командный интерфейс прикладных решений Приемы работы при настройке командного интерфейса конфигурации совпадают с приемами работы при настройке командного интерфейса подсистемы. Редактор командного интерфейса рабочего стола Редактор командного интерфейса рабочего стола предназначен для редактирования порядка следования и видимости команд рабочего стола. Редактор можно открыть либо гиперссылкой Открыть свойства конфигурации Командный интерфейс рабочего стола, либо из контекстного меню выбрать команду Открыть командный интерфейс рабочего стола (рис. 7.92). При редактировании командного интерфейса рабочего стола в окне редактора отображается дополнительное табличное поле (слева). Это поле содержит иерархический список команд конфигурации, которые могут быть добавлены в командный интерфейс рабочего стола. ПРИМЕЧАНИЕ Если в конфигурации отсутствуют подсистемы или у всех подсистем свойство Включать в командный интерфейс сброшено, иерархический список команд не отображается. В список доступных команд включаются: ■■ общие команды без параметров, для которых в свойстве Группа указана панель и группа команд этой панели; ■■ стандартные команды объектов конфигурации, для которых установлено свойство Использовать стандартные команды; ■■ команды объектов конфигурации, определенные в подчиненной группе Команды. Редактирование командного интерфейса выполняется в правом табличном поле редактора. Возможности и приемы редактирования командного интерфейса рабочего стола полностью аналогичны возможностям и приемам редактирования командного интерфейса подсистемы. Рис. 7.92. Доступ к редактору командного интерфейса рабочего стола Редактор «Все подсистемы» В результате выполнения команды откроется окно редактора (рис. 7.93). Редактор «Все подсистемы» предназначен для управления подсистемами конфигурации, в том числе и их командными интерфейсами. Для вызова редактора необходимо спозиционироваться на узле Подсистемы ветки Общие и из контекстного меню выбрать команду Все подсистемы (рис. 7.94). Рис. 7.93. Окно редактора командного интерфейса рабочего стола Рис. 7.94. Вызов редактора подсистем 180 Профессиональная разработка в системе «1С:Предприятие 8» Редактирование командного интерфейса В результате выполнения команды откроется окно редактора (рис. 7.95). Рис. 7.97. Управление составом подсистемы Рис. 7.95. Окно редактора подсистем Редактор Все подсистемы визуально отличается от редактора командного интерфейса подсистемы наличием дополнительных табличных полей: Подсистемы и Состав (слева, сверху вниз). В списке подсистем отображается дерево подсистем конфигурации. Используя командную панель этого списка (или контекстное меню), можно управлять подсистемами – добавлять, удалять, редактировать свойства, изменять порядок следования и иерархию (рис. 7.96). Командный интерфейс подсистемы, выбранной в дереве подсистем, редактируется в табличном поле Командный интерфейс (правое поле). При необходимости, используя команду контекстного меню списка подсистем, из редактора подсистем можно открыть отдельный редактор командного интерфейса подсистемы. Приемы редактирования командного интерфейса одинаковы в обоих редакторах. В редакторе Все подсистемы присутствует возможность перехода от команды к ее источнику в дереве объектов конфигурации. Для этого из контекстного меню списка команд нужно выбрать пункт Найти в дереве (рис. 7.98). В результате в дереве конфигурации окна Конфигурация будет выделен объект, предоставивший команду. Рис. 7.96. Управление подсистемами В списке Состав отображаются объекты конфигурации, включенные в подсистему, выбранную в дереве подсистем. Используя командную панель этого списка, можно управлять составом объектов, включенных в подсистему (рис. 7.97). Том 1 Рис. 7.98. Переход к источнику команды 181 Глава 7. Командный интерфейс прикладных решений Ручное размещение и видимость команд А теперь вернемся к нашей задаче и настроим расположение и видимость команд в разделе Ценообразование. Для решения этой задачи воспользуемся настройкой видимости в разрезе ролей. Для команды Товары снимем флажок не в колонке Видимость, а в колонке Менеджер по ценам (рис. 7.100). Первое, что мы сделаем, это отобразим в командном интерфейсе команду назначения цены на товар. Назначение цены – это создание записи в регистре сведений Цены товаров. Откроем редактор командного интерфейса подсистемы. В колонке Видимость для команды Цена на дату: создать установим флажок (рис. 7.99). Рис. 7.100. Установка ролевой видимости по умолчанию для команды «Товары» В результате для пользователя Администратор команда Товары включена в командный интерфейс, а для пользователя Менеджер по ценам команда не включена. Рис. 7.99. Установка общей видимости по умолчанию для команды «Цена на дату: создать» Теперь эта команда включена в командный интерфейс, причем для всех ролей (на рис. 7.99 показаны командные интерфейсы пользователей с ролями Администратор и Менеджер по ценам). Далее необходимо скрыть команду открытия списка товаров для пользователей с ролью Менеджер по ценам. Для остальных ролей команда должна остаться доступной. 182 И последней настройкой мы изменим порядок следования команд в панели навигации. Сейчас все команды панели навигации расположены в группе ПанльНавигации.Обычное в алфавитном порядке. Нас такое расположение не устраивает. Команду Цены товаров переместим в группу ПанельНавигации.Важное (рис. 7.101). В отличие от видимости, порядок размещения команд в разрезе ролей не настраивается. И для пользователя Администратор, и для пользователя Менеджер по ценам команда Цены товаров располагается в одном и том же месте (рис. 7.102). Профессиональная разработка в системе «1С:Предприятие 8» Влияние функциональных опций на командный интерфейс ВНИМАНИЕ! В отличие от настройки доступности команд по ролям, настройка по функциональным опциям является единой для всех ролей. Механизм функциональных опций Использование функциональных опций предполагает, что в прикладном решении присутствуют возможности, которые могут использоваться или не использоваться в зависимости от конкретных условий. Для каждой из таких возможностей разработчик создает в конфигурации функциональные опции и связывает с ними объекты, реализующие этот функционал. Рис. 7.101. Изменение группы для команды «Цены товаров» Влияние же функциональных опций на командный интерфейс выражается в том, что система не включает в него команды тех объектов, которые относятся к выключенным опциям. Для описания функциональных опций используются объекты конфигурации Функциональные опции и Параметры функциональных опций. Эти объекты располагаются в узлах ветки Общие дерева конфигурации (рис. 7.103). Рис. 7.102. Размещение команды «Цены товаров» в командном интерфейсе для пользователей с ролями «Администратор» и «Менеджер по ценам» Влияние функциональных опций на командный интерфейс Механизм функциональных опций позволяет на этапе эксплуатации прикладного решения подключать или отключать функциональные возможности конфигурации. Для того чтобы пользователь не видел команд, относящихся к неиспользуемым возможностям, система автоматически формирует состав доступных команд в зависимости от значений функциональных опций. Том 1 Рис. 7.103. Объекты конфигурации «Функциональные опции» и «Параметры функциональных опций» Каждая функциональная опция в свойстве Состав хранит состав объектов конфигурации, реализующих вариабельные возможности, и в свойстве Хранение содержит объект, являющийся источником значения опции (рис. 7.104). В зависимости от установленного для функциональной опции значения система включает (или исключает) в командный интерфейс команды объектов конфигурации, относящихся к этой опции. 183 Глава 7. Командный интерфейс прикладных решений Если значение функциональной опции хранится в константе, то затруднений в получении этого значения не возникает – система обращается к соответствующей константе. Если же значение функциональной опции хранится в реквизите справочника или ресурсе регистра сведений, системе необходимо «рассказать», из какого элемента справочника или записи регистра сведений получать значения. То есть функциональную опцию необходимо параметризовать. Фактически параметры функциональных опций задают систему координат, в которой хранятся значения функциональных опций. Рис. 7.104. Свойства объекта «Функциональная опция» Состав объектов конфигурации, относящихся к функциональной опции, можно указать, воспользовавшись гиперссылкой Открыть свойства Состав. Подробнее Список объектов, которым можно назначить функциональные опции, приведен в документации «1С:Предприятие 8.2. Руководство разработчика», раздел 5.5.9.4. В качестве источника значения функциональной опции могут использоваться: ■■ константа, ■■ реквизит справочника, ■■ ресурс регистра сведений. Важно понимать, что значения функциональных опций не изменяют структуру конфигурации. Состав объектов конфигурации и соответствующих им информационных структур в базе данных остается неизменным при любых значениях функциональных опций. В связи с тем, что функциональные опции отвечают на вопрос «Использовать объект конфигурации или нет?», их значения чаще всего имеют тип данных Булево. ПРИМЕЧАНИЕ В общем случае тип данных хранилища значения функциональной опции системой не ограничивается. Однако для автоматического управления командным интерфейсом используются только функциональные опции с булевым типом значений. Значения функциональных опций с другими типами доступны только для анализа из встроенного языка. 184 Для параметризации функциональных опций используется объект конфигурации Параметр функциональной опции. Каждый из параметров определяет отдельную «координату» хранения значений функциональных опций. При этом один и тот же параметр может одновременно использоваться для параметризации нескольких функциональных опций. Основываясь на значении параметра, система будет выбирать соответствующий элемент справочника или запись регистра сведений для получения значения функциональной опции. Отключаем неиспользуемые команды А теперь, познакомившись с функциональными опциями, вернемся к нашей задаче. В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 4». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 5». Нам требуется предоставить пользователям возможность самостоятельно настроить вариант задания цен на товары – либо в целом на товар, либо на товар в разрезе различных видов цен. Для решения этой задачи в первую очередь создадим хранилище значения функциональной опции, значение которой будет управлять вариантом ценообразования. В качестве хранилища будем использовать константу Ценообразование по видам цен с типом данных Булево. Если значение константы Истина, то в подсистеме ценообразования используются виды цен, иначе виды цен не используются. Используя контекстное меню узла Константы дерева конфигурации, добавим новую константу. В окне свойств установим значения для свойств добавленной константы (рис. 7.105): ■■ Имя – «ЦенообразованиеПоВидамЦен»; ■■ Синоним – оставляем автоматически сформированный «Ценообразование по видам цен»; ■■ Тип – константа имеет тип данных Булево; Профессиональная разработка в системе «1С:Предприятие 8» Влияние функциональных опций на командный интерфейс ■■ Использовать стандартные команды – нет. Рис. 7.105. Заполнение свойств константы Обеспечим возможность редактирования значения константы. Для этого командой контекстного меню Открыть форму откроем форму констант Общие настройки из ветки Общие формы (рис. 7.106). Рис. 7.107. Добавление новой константы в форму Рис. 7.108. Обработчик «ПослеЗаписи()» в модуле формы Подробнее Раздел «Редактирование формы», стр. 240. Рис. 7.106. Открытие формы констант для редактирования Теперь создадим саму функциональную опцию. Для этого откроем контекстное меню узла Функциональные опции и выберем команду Добавить (рис. 7.109). В дерево элементов формы добавим поле Ценообразование по видам цен, связанное с реквизитом формы Ценообразование по видам цен. Для этого захватим мышью реквизит ЦенообразованиеПоВидамЦен (в правом верхнем списке) и перетащим его в левый верхний список (рис. 7.107). Мы обеспечили возможность хранения и редактирования значения функциональной опции. А теперь давайте представим, что мы изменили значение константы. Что хотелось бы увидеть в командном интерфейсе? Правильно, хочется увидеть обновленный командный интерфейс (панель разделов, панель навигации, рабочий стол и т. д.), построенный с учетом нового значения функциональной опции. Для этого в модуле формы реализован обработчик события ПослеЗаписи(), в котором функцией ОбновитьИнтерфейс() выполняется обновление интерфейса пользователя (рис. 7.108). Том 1 Рис. 7.109. Добавление функциональной опции 185 Глава 7. Командный интерфейс прикладных решений В окне свойств установим значения для свойств добавленной функциональной опции (рис. 7.110): ■■ Имя – «ЦенообразованиеПоВидамЦен»; ■■ Синоним – оставляем автоматически сформированный «Ценообразование по видам цен»; ■■ Хранение – указываем константу «Ценообразование по видам цен», хранящую значение функциональной опции. Рис. 7.110. Заполнение свойств функциональной опции Следующим шагом будет выбор объектов конфигурации, зависящих от созданной функциональной опции. Для этого гиперссылкой Открыть свойства Состав открываем окно выбора объектов (рис. 7.111). В дереве объектов устанавливаем пометки рядом со справочником Виды цен и измерением Вид цен регистра сведений Цены товаров. Если ценообразование в разрезе видов цен не используется, то все команды для работы с этим справочником будут «лишними». Поэтому зависимость настраиваем для справочника в целом. Рис. 7.111. Заполнение состава функциональной опции Обновим конфигурацию базы данных и запустим демонстрационную базу в режиме 1С:Предприятие от имени пользователя Администратор. В панели разделов основного окна выберем раздел Ценообразование. Команды обращения к списку справочника Виды цен в командном интерфейсе нет. Эта команда отключена вследствие того, что константа Ценообразование по видам цен имеет значение Ложь (рис. 7.112). С регистром сведений ситуация другая. Нам в любом случае необходимо выполнять ценообразование в разрезе товаров. А вот в разрезе видов цен ценообразование выполняется не всегда. Поэтому зависимость настраиваем не в целом для регистра сведений, а для подчиненного ему объекта измерения. В общем случае одни и те же объекты конфигурации могут входить в состав нескольких функциональных опций. В такой ситуации доступность их команд определятся по правилу логического ИЛИ – если хотя бы одна функциональная опция имеет логическое значение Истина, команды будут доступны. Если же объект конфигурации не входит в состав ни одной из функциональных опций, то и доступность его команд от опций не зависит. 186 Рис. 7.112. При отключенной функциональной опции команда «Виды цен» в командном интерфейсе отсутствует Профессиональная разработка в системе «1С:Предприятие 8» Влияние функциональных опций на командный интерфейс Выберем команду Цены товаров, открывающую список регистра сведений Цены товаров (рис. 7.113). Пользовательская настройка интерфейса Мы уже говорили о том, что пользователь имеет возможность настроить глобальный командный интерфейс под собственные предпочтения. Каждый пользователь прикладного решения может настроить состав команд в области системных команд, команды главного меню и команды в панелях основного окна приложения. Настройки, выполненные пользователем, сохраняются между сеансами его работы с прикладным решением. Настройка области системных команд Состав команд, отображаемый в области системных команд основного окна приложения, настраивается вызовом подменю Добавить или удалить кнопки системного меню Другие кнопки (рис. 7.115). Рис. 7.113. Список регистра сведений «Цены товаров» при отключенной функциональной опции В списке отсутствует измерение Вид цен регистра сведений Цены товаров. Теперь у константы Ценообразование по видам цен установим значение Истина и посмотрим, как изменился состав команд панели навигации и вид формы списка регистра сведений (рис. 7.114). Рис. 7.115. Меню настройки состава командных панелей главного меню Рис. 7.114. Командный интерфейс и список регистра сведений «Цены товаров» при включенной функциональной опции В панели навигации появилась команда Виды цен, открывающая форму списка справочника, а в форме списка регистра сведений отображается колонка Вид цен. Таким образом, при отсутствии учета цен в разрезе их видов мы имеем возможность убрать из командного интерфейса «лишние» команды. Том 1 Пользователь отмечает в списке те команды, которые он хочет видеть в области системных команд. Для возврата к настройкам по умолчанию необходимо выбрать в подменю команду Сброс панели (см. рис. 7.115). Аналогично настраивается область системных команд и вспомогательного неблокирующего окна приложения. Для блокирующего вспомогательного окна приложения настройка области системных команд недоступна. 187 Глава 7. Командный интерфейс прикладных решений Настройка командного интерфейса В основном окне приложения пользователь может настраивать состав отображаемых команд и их расположение в панели разделов, панели навигации и панели действий. Пользовательская настройка командного интерфейса выполняется в диалогах, вызываемых из подменю Сервис Настройка интерфейса главного меню системы (рис. 7.116). Доступность команд определяется ролью пользователя и функциональными опциями. В диалоге отображаются только те команды, которые связаны с доступными пользователю элементами командного интерфейса, и эти элементы не относятся к отключенным функциональным опциям. В командном интерфейсе отображаются только те команды, которые пользователь поместил в список выбранных. Команды отображаются в тех группах и в том порядке, которые установлены в этом списке. Перемещение выбранной команды между списками выполняется кнопками Добавить >, Добавить все >>, Удалить > и Удалить все >>. Для помещения команды в группу, отличающуюся от стандартной, используются кнопки Добавить в группу… и Переместить в группу… Порядок команд в группах устанавливается кнопками перемещения вверх и вниз (кнопки со стрелками в командной панели списка Выбранные команды). В диалоге настройки поддерживается множественное выделение команд и перетаскивание команд с помощью мыши. Применение выполненной настройки происходит с помощью кнопки OK. При этом сделанные настройки сохраняются в информационной базе и окно настроек закрывается. Для отмены выполненной настройки необходимо выбрать кнопку Отмена. Рис. 7.116. Команды открытия окон настройки интерфейса ПРИМЕЧАНИЕ Диалог настройки также может быть вызван из контекстного меню соответствующей панели. При последующем отображении командного интерфейса к нему применяются последние сохраненные настройки. Для возврата к стандартным (заданным в конфигурации) настройкам необходимо в меню Все действия выбрать команду Установить стандартные настройки (рис. 7.118). Диалог настройки любой командной панели содержит два списка – доступные команды и выбранные команды (рис. 7.117). Рис. 7.118. Восстановление стандартных настроек Рис. 7.117. Диалог настройки командной панели 188 Для применения стандартных настроек их также необходимо подтвердить кнопкой OK. Профессиональная разработка в системе «1С:Предприятие 8» Пользовательская настройка интерфейса Настройка панели разделов В диалоге настройки панели разделов отображаются только доступные пользователю команды выбора раздела. Для панели разделов можно настроить (рис. 7.119): ■■ видимость и порядок команд, ■■ способ отображения команд. Рис. 7.121. Основное окно с неотображаемой панелью разделов Настройка панели навигации В диалоге настройки панели навигации отображаются доступные пользователю навигационные команды. Для панели навигации настраиваются видимость и расположение этих команд (рис. 7.122). Рис. 7.119. Настройка панели разделов Видимость и порядок команд настраиваются аналогично общему порядку, описанному ранее. Для настройки способа отображения команды необходимо в поле выбора Показывать указать один из режимов: ■■ Картинка – каждый раздел показывается только картинкой; ■■ Текст – каждый раздел показывается только текстом (название раздела); ■■ Картинка и текст – каждый раздел показывается картинкой и текстом. После закрытия диалога настройки кнопкой OK панель разделов будет изменена в соответствии с настройками (рис. 7.120). Рис. 7.122. Настройка панели навигации В списке Выбранные команды команды отображаются с учетом иерархии подсистем выбранного раздела и иерархии групп. Видимость и порядок команд настраиваются аналогично общему порядку, описанному ранее. Рис. 7.120. Настроенная панель разделов Если пользователем скрыты все разделы (в диалоге настройки список Выбранные разделы пустой), то панель разделов также скрывается. Если при этом в разделе Рабочий стол есть команды в панели навигации, то в эту панель помещается команда Рабочий стол (рис. 7.121). Том 1 Перемещение команд между подчиненными подсистемами (и подсистемой верхнего уровня иерархии, соответствующей разделу) невозможно. В предопределенную группу См. также можно перемещать любые команды, так как эта группа является общей для всех вложенных подсистем. Однако из нее команду можно переместить только в группу той подсистемы, к которой команда относится. 189 Глава 7. Командный интерфейс прикладных решений Настройка панели действий В диалоге настройки панели действий отображаются доступные пользователю команды действий. Для панели действий настраиваются видимость и расположение команд (рис. 7.123): ■■ открытия форм новых объектов в стандартной группе Создать, ■■ открытия отчетов в стандартной группе Отчеты, ■■ вызова обработок в стандартной группе Сервис. Для задания различных представлений у многих объектов реализованы специальные свойства. Состав этих свойств определяется прототипом объекта конфигурации. Свойства отображаются в палитре свойств на закладке (или в группе, в зависимости от способа отображения свойств) Представление (рис. 7.124). Рис. 7.124. Интерфейсные свойства объектов конфигурации Рис. 7.123. Настройка панели действий Видимость и порядок команд настраиваются аналогично общему порядку, описанному ранее. В панели действий вложенные подсистемы не отображаются, так как все группы являются общими. Команды раздела и всех его подразделов отображаются в одном списке. Настраиваем представление команд Кроме настройки размещения и видимости команд, необходимо обратить внимание и на пользовательское представление команд. Они должны быть представлены в командном интерфейсе говорящими названиями – представление команды должно помочь пользователю быстро вспомнить ее назначение. Если разработчик специально не настраивает представление, то при формировании командного интерфейса система автоматически формирует представление для команд. Подробнее Правила автоматического формирования представления приведены в документации «1С:Предприятие 8.2. Руководство разработчика, Приложение 3 «Правила формирования текстов стандартных команд и автоматических заголовков форм». 190 Задавая значения свойствам из этой группы, разработчик может формировать представления для заголовков форм объекта, представления для стандартных команд объекта и представления для подсказок к командам. ВНИМАНИЕ! Заполнение свойств, связанных с представлением, необходимо только в тех случаях, когда синоним не может представить объект требуемым образом или есть необходимость в уточнении информации, отображаемой по умолчанию. Если не заданы все свойства объекта конфигурации, используемые в формировании представления, то используется его системное текстовое представление – в большинстве случаев это значение его свойства Синоним. Это свойство должно быть заполнено (по умолчанию свойство заполняется исходя из имени объекта), и значение свойства должно осмысленно и максимально лаконично описывать объект конфигурации. ПРИМЕЧАНИЕ Если синоним не задан, то для представления объекта конфигурации используется значение его свойства Имя. В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 5». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 6». Профессиональная разработка в системе «1С:Предприятие 8» Настраиваем представление команд Например, в демонстрационной базе для справочника Товары заполнены свойства: ■■ Представление объекта – значение «Товар», представляет объект данных; ■■ Представление списка – значение «Товары», представляет множество (список) объектов данных. Команды открытия списка, создания объекта и создания группы представлены в интерфейсе в соответствии с заданным представлением (рис. 7.125). ПРИМЕЧАНИЕ Для всех стандартных команд объекта используется один и тот же текст пояснения. Для демонстрации влияния свойств, связанных с представлением стандартных команд, на командный интерфейс изменим свойства следующим образом: ■■ Представление объекта – зададим значение «Номенклатурная позиция»; ■■ Представление списка – зададим значение «Номенклатура товаров»; ■■ Пояснение – зададим значение «Номенклатура товаров, продаваемых компанией». ПРИМЕЧАНИЕ Свойства изменены в демонстрационных целях. В подавляющем большинстве случаев представление Товар для объекта и представление Товары для списка являются вполне приемлемыми. Представление команд в интерфейсе изменилось в соответствии с новыми значениями (рис. 7.126). Рис. 7.125. Представление команд справочника «Товары», первый вариант Нас будут интересовать свойства, влияющие на представление стандартных команд объектов. К этим свойствам относятся: ■■ Представление объекта – определяет представление стандартной команды создания объекта; ■■ Представление списка – определяет представление стандартной команды открытия списка объектов; ■■ Пояснение – определяет подсказку к стандартным командам. Том 1 Рис. 7.126. Представление команд справочника «Товары», второй вариант 191 Глава 7. Командный интерфейс прикладных решений Текст, заданный в «представительских» свойствах, представляет не только команды, но и формы. Например, для справочника в заголовке формы списка используется значение свойства Представление списка (см. рис. 7.126), а в заголовке формы элемента, помимо текстового представления самого объекта, еще и значение свойства Представление объекта (рис. 7.127). ■■ в свойстве Картинка выберем картинку «ПодсистемаЦенообразование». Рис. 7.127. Представление заголовка формы элемента, второй вариант Таким образом, при заполнении свойств, связанных с формированием представления объектов и команд в интерфейсе, необходимо выбирать для них такие значения, которые были бы и информативны, и одинаково читались как в представлении команд, так и в заголовках форм. Для подсистем также определены свойства, позволяющие настроить их представление в интерфейсе. Настроим представление созданной нами подсистемы Ценообразование. На данный момент раздел, соответствующий подсистеме, представлен картинкой по умолчанию (желтый диск) и значением свойства Синоним подсистемы (рис. 7.128). Рис. 7.129. Настройка представления раздела В результате представление раздела изменилось в соответствии со значениями, заданными для свойств подсистемы. Модель разработки глобального командного интерфейса Рис. 7.128. Представление раздела по умолчанию Хотелось бы назначить разделу собственную картинку и вместо текста Ценообразование выводить текст Управление ценами. Для настройки представления обратимся к свойствам подсистемы Ценообразование и зададим значения для свойств, определяющих представление подсистемы (рис. 7.129): ■■ для свойства Синоним зададим значение «Управление ценами»; ■■ в свойстве Пояснение введем текст «Выполнение задач по назначению и редактированию цен на товары»; 192 Мы видели, как многообразны средства разработки и управления глобальным командным интерфейсом, предоставляемые системой «1С:Предприятие». Это многообразие и сложность требуют вдумчивого и тщательного подхода к разработке командного интерфейса. В общем случае перечень задач, которые необходимо решить при реализации одной итерации цикла разработки, состоит из следующей последовательности: 1. Проектирование состава подсистем – структура подсистем имеет одно из важнейших значений, так как именно по ней система будет строить командный интерфейс пользователя, а пользователь «видеть» прикладное решение. 2. Формирование состава ролей пользователей – для пользователей, решающих разные задачи, командный интерфейс должен предоставлять набор команд, соответствующий этой задаче. Профессиональная разработка в системе «1С:Предприятие 8» Модель разработки глобального командного интерфейса 3. Проектирование и настройка функциональных опций – начиная разработку, следует продумать, какие части функционала должны быть настраиваемыми при внедрении. 4. Настройка свойств объектов конфигурации – для объектов конфигурации следует задать свойства, определяющие их принадлежность к подсистемам, функциональным опциям, и состав команд объекта; назначить права доступа по ролям. 5. Установка интерактивных свойств конфигурации – для объектов конфигурации следует задать свойства, определяющие их представление в интерфейсе. Уже эти минимальные действия приведут к тому, что система построит командный интерфейс по умолчанию. В разделах глобального командного интерфейса появятся стандартные команды открытия форм списков объектов, создания новых объектов, вызова отчетов и др. Стандартные команды объектов, если это определено в их свойствах, также появятся в формах других объектов – команды ввода на основании, перехода к списку по регистратору, перехода к списку по владельцу и т. д. Если стандартных команд недостаточно для реализации функциональных возможностей прикладного решения, разработчик может расширить состав команд путем создания произвольных команд. Если не устраивает автоматическое расположение и видимость команд, то можно отредактировать фрагменты глобального командного интерфейса и состав команд тех форм, в которых автоматически размещены параметризованные команды объектов (перехода к подчиненному списку и ввода на основании). При редактировании командного интерфейса необходимо обращать внимание на следующее: ■■ Подбор состава команд – следует определить команды, которые будут отображаться по умолчанию; ■■ Настройку размещения команд – следует организовать размещение команд таким образом, чтобы наиболее важные и востребованные команды были всегда под рукой; ■■ Настройку видимости по ролям – следует продумать, для каких ролей откорректировать видимость по умолчанию, чтобы интерфейс системы не оказался перегружен. После завершения итерации разработки выполняется оценка работы интерфейса – полезно посмотреть, как выглядит интерфейс для типичных пользователей, а также посмотреть, как выглядит интерфейс с выключенными функциональными опциями. Том 1 Создаем произвольные команды В данном разделе мы рассмотрим возможности, предоставляемые разработчику системой «1С:Предприятия» для создания собственных команд – механизм произвольных команд. Произвольные команды Технологическая платформа «1С:Предприятие» используется для автоматизации решения широкого круга управленческих и учетных задач на самых разных предприятиях. При такой обширной сфере применения, естественно, могут возникать ситуации, когда функциональности стандартных команд недостаточно. Для реализации дополнительной функциональности используется встроенный язык «1С:Предприятия». В основном эта функциональность реализована в обработчиках событий. Однако возникает и необходимость предоставить пользователям возможность интерактивного обращения к части реализованных функций из интерфейса. Для решения этих задач в «1С:Предприятии» существует возможность создавать произвольную команду. В конфигурации произвольные команды представлены новым объектом конфигурации Команда. Объект конфигурации Команда предназначен для реализации в прикладном решении нестандартных функций с возможностью использования стандартных механизмов включения реализованного функционала в командный интерфейс. Технологическая платформа ничем не ограничивает состав произвольных команд и реализуемые ими функции. Все определяется требованиями к конкретному прикладному решению. При создании произвольной команды разработчик должен установить ее свойства, определяющие правила включения команды в интерфейс, и написать программный код, определяющий выполняемые командой действия. Этим произвольные команды отличаются от стандартных. Для последних и свойства, и выполняемые действия определены самой платформой. В конфигурации произвольные команды могут быть реализованы или как независимые объекты – общие команды, или как подчиненные другим объектам. Подробнее Список объектов, для которых разработчик может создать подчиненные произвольные команды, приведен в документации «1С:Предприятие 8.2. Руководство разработчика», раздел 6.2.2. 193 Глава 7. Командный интерфейс прикладных решений Общие произвольные команды позволяют реализовать нестандартную функциональность, относящуюся в целом к прикладному решению. В этом случае произвольная команда создается как независимый объект конфигурации, принадлежащий классу Общие команды (рис. 7.130). На торговых предприятиях часто требуется автоматизировать процесс регистрации продаваемого товара. Для этого используются сканеры штрихкода. Однако технологическая платформа ничего «не знает» об этих устройствах и не имеет средств работы с ними. Следовательно, для работы со сканером штрихкода требуется подключать специальную программу – драйвер. В демонстрационной базе для подключения такого драйвера реализована общая произвольная команда Установить сканер штрихкодов. Установив определенные значения свойств этой команды, разработчик обеспечил ее доступность пользователям (рис. 7.132). Рис. 7.130. Произвольные общие команды Подчиненные произвольные команды позволяют реализовать нестандартную функциональность какого-либо объекта конфигурации. В этом случае произвольная команда создается как подчиненный объект конфигурации (рис. 7.131). Рис. 7.132. Произвольная общая команда «Установить сканер штрихкодов» Функции работы со сканером являются общими для всего прикладного решения, то есть не относятся к какому-то конкретному объекту конфигурации, поэтому произвольная команда реализована как общая. Рис. 7.131. Произвольная подчиненная команда Чтобы иметь представление о том, какие задачи решаются с использованием произвольных команд, давайте посмотрим на демонстрационную базу «Командный интерфейс прикладных решений, пример 6». 194 Команда выполняет действие – подключает к прикладному решению драйвер для работы со сканером штрихкодов. Поэтому она расположена в панели действий основного окна приложения. Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды Еще одной распространенной задачей является получение печатных копий электронных документов. Состав документов, их структура определяются автоматизируемой прикладной задачей. Естественно, в платформе невозможно предусмотреть все многообразие документов и варианты их печатных форм. Для того чтобы «научить» документ «переносить» себя на бумагу, можно воспользоваться произвольной командой. В демонстрационной базе для получения печатной формы документа РасходТовара создана подчиненная команда ПечатьРасходнойНакладной (рис. 7.133). Еще одним, достаточно специфическим вариантом использования произвольных команд является расширение или переопределение стандартной функциональности стандартной команды. Такие задачи возникают, например, вследствие требования сократить количество ручных операций или изменить стандартное поведение объектов. Например, в демонстрационной базе реализован объект-обработка Административный сервис. Команду открытия основной формы необходимо было расположить в панели навигации, а саму форму открывать в рабочей области основного окна приложения. Но стандартная функциональность этого объекта отличается от требуемой – команда открытия формы располагается в панели действий, а форма открывается в новом вспомогательном окне. Для обеспечения требуемой функциональности у обработки снято свойство Использовать стандартные команды (рис. 7.134) – стандартные команды нас не устраивают. Рис. 7.134. Стандартные команды обработки не используются Рис. 7.133. Произвольная подчиненная команда «Печать расходной накладной» Значения свойств команды Группа и Тип параметра команды определили расположение команды в командном интерфейсе – меню Печать командной панели формы документа, а процедура на встроенном языке обеспечила формирование печатной формы конкретного документа, ссылка на который передается в параметре команды. Доступ же к обработке обеспечивает произвольная подчиненная команда Административный сервис, для которой задано расположение в группе Обычное панели навигации основного окна приложения (рис. 7.135). В результате выбора этой команды в рабочей области основного окна отображается форма обработки. Подобных задач в конкретных прикладных решениях возникает великое множество, и для их решения наиболее подходящими являются произвольные команды. Подробнее Раздел «Особенности размещения», стр. 196. Том 1 195 Глава 7. Командный интерфейс прикладных решений Размещение по умолчанию в командном интерфейсе для произвольных команд определяется: ■■ категорией и группой, назначенными команде; ■■ принадлежностью команды к подсистеме конфигурации (для независимых команд); ■■ типом параметра команды (для параметризуемых команд). Категория команды и ее группа устанавливаются в свойстве Группа этой команды (рис. 7.132, 7.133, 7.135). ВНИМАНИЕ! Свойство команды Группа обязательно должно быть заполнено. В противном случае возникнет ошибка при обновлении конфигурации базы данных, и обновление не выполнится. При выборе группы для команды следует обращать внимание на необходимость в передаче параметров команде и на действия, выполняемые командой. В качестве общего критерия можно предложить придерживаться тех же правил, которые используются для стандартных команд. подробнее Раздел «Правила размещения глобальных команд», стр. 173. Рис. 7.135. Произвольная подчиненная команда «Административный сервис» Особенности размещения Особенностью произвольных команд, по сравнению со стандартными, является необходимость описания места их размещения по умолчанию (см. раздел «Категории и группы команд», стр. 169) в командном интерфейсе. Место размещения произвольной команды задает разработчик при конфигурировании прикладного решения. ПРИМЕЧАНИЕ Остальные аспекты управления произвольными командами – доступность по ролям (см. раздел «Система прав доступа», стр. 161), управление видимостью команды (см. раздел «Ручное размещение и видимость команд», стр. 182), настройка зависимости от функциональных опций (см. раздел «Отключаем неиспользуемые команды», стр. 184) и т. д. – аналогичны управлению стандартными командами. 196 ■■ Если команда для своего исполнения не требует параметров, то для нее выбирают группу с категорией Панель навигации или с категорией Панели действий. ■■ Если команда для своего исполнения требует передачи параметра, то для нее необходимо выбрать группу с категорией Панель навигации формы или с категорией Командная панель формы. ■■ Для команд, выполнение которых приводит к изменению информации, отображаемой в рабочей области того же окна, следует выбирать категорию Панель навигации для независимых команд или Панель навигации формы для параметризуемых команд. ■■ Для команд, выполнение которых приводит к изменению данных в информационной базе, следует выбирать категорию Панель действий для независимых команд или Командная панель формы для параметризуемых команд. Также эту категорию рекомендуется выбирать для команд, которые приведут к открытию нового окна для отображения форм выбора, форм отчетов, форм обработок. Для включения общей независимой команды в тот или иной раздел командного интерфейса необходимо указать ее принадлежность к соответствующим подсистемам. Включение команды в подсистемы выполняется путем ее отметки в свойстве Состав требуемых подсистем (см. раздел «Стандартные команды», стр. 157). Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды Подчиненную же команду непосредственно включить в подсистему невозможно. Поэтому подчиненные независимые команды автоматически включаются в командный интерфейс тех подсистем, в которые включен объект-владелец команды. А вот параметризуемые произвольные команды, как общие, так и подчиненные, включаются в командный интерфейс иначе. Связано это с тем, что фактическое значение своего параметра команда может получить только из данных формы. Развитие функциональности ценообразования Вернемся к решению нашей задачи по выделению функционала работы с ценами в отдельную подсистему. Кроме назначения цен, нам потребуется и возможность распечатывать ценники на товары. При этом необходимо реализовать два режима: ■■ печать ценников на все товары по всем существующим видам цен, ■■ печать ценников на все товары по одному виду цен. Именно поэтому параметризуемые команды можно размещать только в панели навигации формы или в командной панели формы. Стандартные команды объектов конфигурации не могут обеспечить нас этими возможностями. Следовательно, нам необходимо реализовать дополнительную функциональность. Для этого будем использовать произвольные команды. Причем это значение должно иметь тип данных, допустимый для параметра. Состав допустимых типов параметра устанавливается в свойстве Тип параметра команды (рис. 7.136). В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 6». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 7». ПРИМЕЧАНИЕ Общая независимая команда Функционал печати всех ценников на первый взгляд должен расширять возможности справочника Товары. Однако этот объект конфигурации описывает множество объектов данных информационной базы. Если мы реализуем команду как подчиненную справочнику, то мы «научим» каждый из объектов данных печатать ценники на все товары. А это уже лишнее. Объект данных должен быть ответственен только за себя. Поэтому команда будет общей. Для добавления произвольной общей команды используем пункт Добавить контекстного меню узла Общие команды дерева конфигурации (рис. 7.137). Рис. 7.136. Состав допустимых типов параметров для параметризуемой команды определяется ее свойством «Тип параметра команды» Сравнивая состав типов, заданных в свойстве команды, с типами реквизитов формы, система принимает решение о включении команды в ту или иную форму. Параметризуемая произвольная команда включается в форму только тогда, когда форма имеет хотя бы один реквизит с типом, входящим в состав допустимых. При проверке учитываются и реквизиты, подчиненные основному реквизиту формы. Состав проверяемых подчиненных реквизитов ограничен первым уровнем подчинения. Том 1 Рис. 7.137. Добавление произвольной общей команды 197 Глава 7. Командный интерфейс прикладных решений В результате будет добавлена общая команда, и для нее откроется окно свойств и окно редактирования модуля команды (рис. 7.138). Рис. 7.139. Задание места размещения произвольной общей команды Созданная нами команда является независимой. Следовательно, необходимо определить, в каких разделах командного интерфейса она будет доступна. Команда должна быть доступна в тех же разделах, в которых можно выполнять действия по управлению ценами. Рис. 7.138. Свойства и модуль общей произвольной команды В группе свойств Основные зададим значения свойств команды: ■■ Имя – «ПечатьЦенниковТовары»; ■■ Синоним – оставим автоматически сформированный синоним; ■■ Комментарий – заполнять не будем. Следующий шаг – выбор категории команды и группы для ее размещения по умолчанию. В нашем случае созданная команда должна принадлежать трем подсистемам – Ценообразование, Цены, Предприятие. Таким образом, нам требуется отредактировать свойство Состав трех подсистем. Для сокращения количества выполняемых действий из контекстного меню созданной команды выберем пункт Дополнительно. В результате откроется окно, в котором на закладке Подсистемы можно указать все подсистемы, которым принадлежит команда (рис. 7.140). Наша команда для своего исполнения не требует параметров – она независимая. Команда выполняет действия по обработке данных, хранимых в информационной базе, с целью получения набора ценников, а не изменяет контекст решения какой-либо задачи. Следовательно, для команды установим категорию Панель действий. А в какой группе она будет отображаться? Логичнее всего поместить ее в группу Сервис. Поэтому для свойства Группа открываем окно со списком групп и выбираем элемент ПанельДействий.Сервис (рис. 7.139). ПРИМЕЧАНИЕ Обратите внимание на свойства Тип параметра команды, Режим использования параметра и Изменяет данные – они недоступны для заполнения. Свойства предназначены для описания параметризуемой команды и становятся доступны только при выборе группы с категориями Панель навигации формы или Командная панель формы. 198 Рис. 7.140. Включение произвольной общей команды в подсистемы Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды Следующая задача – назначение прав на использование команды. Наша команда доступна пользователям с ролью Администратор за счет установленного свойства роли Устанавливать права для новых объектов. От нас требуется обеспечить ее доступность и для роли Менеджер по ценам. Как и для других объектов конфигурации, для общей команды настройку доступности можно выполнить в окне редактирования роли (см. раздел «Система прав доступа», стр. 161). А можно – в уже открытом окне Дополнительно на закладке Права. В списке Роли выбираем настраиваемую роль и в списке Права устанавливаем право Просмотр для созданной команды (рис. 7.141). Рис. 7.142. Настройка видимости произвольной общей команды Рис. 7.141. Настройка доступности команды для роли «Менеджер по ценам» Настройка видимости команды по ролям для произвольной независимой команды выполняется аналогично настройке для стандартных команд – в редакторе командного интерфейса. Подробнее Раздел «Система настройки командного интерфейса», стр. 174. Наша команда по умолчанию должна быть видима пользователю с ролью Менеджер по ценам, а от пользователя с ролью Администратор ее необходимо скрыть. Для этого в редакторе командного интерфейса подсистемы Ценообразование снимем флажок общей видимости в колонке Видимость. Это обеспечит нам невидимость команды для всех ролей, в том числе и вновь создаваемых. А для роли Менеджер по ценам явным образом установим флажок в соответствующей колонке (рис. 7.142). Сохраним конфигурацию, запустим приложение от имени пользователя Менеджер по ценам и выберем раздел Управление ценами. Том 1 В командном интерфейсе (рис. 7.143) команда Печать ценников товары доступна в разделе Управление ценами (за счет указания принадлежности к подсистеме Ценообразование). Команда размещена в группе Сервис панели действий (за счет указания соответствующего значения свойства Группа). Таким образом, для произвольной общей независимой команды: ■■ размещение в командном интерфейсе по умолчанию определяется значением свойства Группа; ■■ включение в раздел командного интерфейса определяется принадлежностью к соответствующей подсистеме; ■■ доступность для пользователя определяется значением права Просмотр. Команду мы создали. А как рассказать пользователю о том, какие действия выполняет произвольная команда? Ответ очевиден – описать назначение команды в документации к прикладному решению. Также назначение команды можно описать во встроенной электронной справке. Для работы со справочной информацией предназначены свойства общей команды из группы Справочная информация (рис. 7.144). 199 Глава 7. Командный интерфейс прикладных решений Рис. 7.144. Справочная информация по произвольной общей команде Рис. 7.143. Размещение произвольной общей независимой команды в командном интерфейсе Однако поиск описания команды в документации или встроенной справке – процесс длительный. Можно помочь пользователю быстро вспомнить назначение команды, выбрав для нее говорящее представление. Произвольная общая команда в командном интерфейсе представляется своим свойством Синоним. Сейчас команда представлена текстом «Печать ценников товары», и это представление достаточно информативно. Но в дальнейшем мы добавим в прикладное решение еще одну команду печати ценников – по виду цен. Поэтому стоит подумать над таким представлением команды, которое подскажет пользователю, какой вариант печати ценников будет выполнен. Скажем, это будет «Печать всех ценников». Еще одним способом напоминания пользователю о назначении команды является использование свойства Подсказка. Текст, заданный в этом свойстве, отображается во всплывающей подсказке при наведении указателя мыши на команду. Для свойства Подсказка зададим текст «Печать ценников на все товары по всем видам цен». В результате изменения значений свойств Синоним и Подсказка представление команды в командном интерфейсе изменилось (рис. 7.145). 200 Рис. 7.145. Измененное представление команды Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды На данный момент мы создали команду, настроили ее расположение, доступность и представление. Нам осталось реализовать функциональность команды, то есть те действия, которые должна выполнять команда. Для определения выполняемых действий разработчику необходимо реализовать процедуру на встроенном языке. Процедура должна размещаться в модуле команды, доступ к которому можно получить через гиперссылку Открыть свойства Модуль команды (рис. 7.146). Мы не будем реализовывать требуемую функциональность команды. Для нас достаточно просто увидеть реакцию системы на выбор команды. Поэтому в модуле команды просто выведем сообщение. При выборе команды в режиме эксплуатации в окне сообщений будет выведен текст нашего сообщения (рис. 7.147). Подчиненная параметризуемая команда Теперь реализуем функциональность печати ценников по одному виду цен. Для этого также будем использовать произвольную команду. В отличие от предыдущей, эта команда расширяет функциональные возможности справочника Виды цен – любой из элементов справочника (объектов, хранимых в информационной базе) должен знать, как распечатать «свои» ценники (по виду цены). Поэтому команду реализуем как подчиненный справочнику Виды цен объект Команда. Для добавления произвольной подчиненной команды выберем пункт Добавить контекстного меню узла Команды справочника Виды цен (рис. 7.148). Рис. 7.146. Процедура, реализующая функциональность произвольной команды Рис. 7.148. Создание произвольной подчиненной команды В результате будет добавлен подчиненный справочнику объект Команда, и для него откроется окно свойств и окно редактирования модуля команды (рис. 7.149). Состав свойств подчиненной произвольной команды практически полностью совпадает со свойствами общей. Особенностью является отсутствие у подчиненной команды группы свойств Справочная информация – описание команды включается в справку самого объекта-владельца. Рис. 7.147. Результат исполнения произвольной общей команды Том 1 201 Глава 7. Командный интерфейс прикладных решений Рис. 7.150. Принадлежность к подсистеме для произвольной подчиненной команды определяется объектом-владельцем ПРИМЕЧАНИЕ Рис. 7.149. Свойства и модуль произвольной подчиненной команды В группе свойств Основные заполним следующие свойства: ■■ Имя – «ПечатьЦенниковВидЦены»; ■■ Синоним – оставим автоматически сформированный синоним; ■■ Комментарий – заполнять не будем. Обратите внимание, что стали доступны для заполнения свойства Тип параметра команды, Режим использования параметра и Изменяет данные. В качестве параметра наша команда принимает ссылку на тот вид цен (элемент справочника Виды цен), для которого необходимо распечатать ценники. Поэтому в качестве значения свойства Тип параметра команды зададим тип данных СправочникСсылка.ВидыЦен (рис. 7.151). Для свойства Группа пока установим значение ПанельДействий.Сервис – этим мы определили произвольную подчиненную независимую команду действия. Подчиненная команда включается в те же разделы интерфейса, что и объект-владелец. Следовательно, созданная команда включена в раздел Предприятие, раздел Управление ценами и подраздел Цены раздела Товарные запасы за счет принадлежности справочника Виды цен соответствующим подсистемам (рис. 7.150). Теперь давайте вспомним, что команда выполняет действия по печати ценников только для выбранного вида цен. Этот вид цены команда принимает как управляющий параметр, то есть команда параметризуемая. Поэтому, ориентируясь на общий критерий выбора категории, изменим у команды значение свойства Группа на Командная панель формы.Важное – команда по умолчанию располагается в группе Важное командной панели формы. 202 Рис. 7.151. Группа и тип параметра определяют расположение произвольной параметризуемой команды Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды ПРИМЕЧАНИЕ В случае, если параметр может принимать значения разных типов, для свойства Тип параметра команды необходимо выбрать составной тип данных. Исходя из типа параметра, наша команда будет доступна как минимум в двух формах: ■■ в форме списка справочника Виды цен, где параметром будет ссылка из текущей строки списка; ■■ в форме элемента того же справочника, параметром будет ссылка на редактируемый объект. А если команде потребуется передать не одно значение параметра, а несколько? В этом случае необходимо воспользоваться свойством Режим использования параметра. Это свойство предназначено для определения количества значений, которые будут переданы в качестве параметра (рис. 7.152). выделения строк табличного поля). Порядок элементов после первого не определен. Если же текущая строка не входит в выделение, то первый элемент в массиве невозможно предсказать однозначно. Массив значений будет передан и в том случае, если в таблице выделена только одна строка. Такой массив будет содержать только одни элемент. Еще одним свойством, которое определено для параметризуемых команд, является свойство Изменяет данные. Если это свойство установлено, то система пытается заблокировать данные формы для редактирования. В случае успеха для формы устанавливается признак модифицированности. Такое поведение позволяет сымитировать интерактивное изменение данных в форме. Как и для команды печати всех ценников, для нашей команды необходимо выполнить назначение прав на ее использование. Команда должна быть доступна пользователям с ролью Менеджер по ценам. Для настройки доступности воспользуемся возможностью «1С:Предприятия» – установкой прав на подчиненные объекты. Подробнее Раздел «Система прав доступа», стр. 161. Для этого в контекстном меню подчиненной команды выберем пункт Дополнительно. В открывшемся окне на закладке Права установим право Просмотр для роли Менеджер по ценам (рис. 7.153). Рис. 7.152. Возможность использования многозначного параметра определяется свойством «Режим использования параметра» Если свойство установлено в значение Одиночный, то в команду передается одно значение указанного типа. Если свойство установлено в значение Множественный, то в команду всегда передается массив значений указанного типа. Этот режим имеет смысл выбирать тогда, когда источником параметра является таблица с установленным режимом множественного выделения. Если в таблице выделено несколько строк, то первым элементом массива будет выступать текущая строка (вне зависимости от последовательности Том 1 Рис. 7.153. Ролевая доступность произвольной подчиненной команды определяется ее правом «Просмотр» 203 Глава 7. Командный интерфейс прикладных решений Если право Просмотр будет сброшено, система не включит подчиненную команду в командный интерфейс пользователя. Даже в том случае, когда роль обладает полными правами на объект-владелец (установлены все права на этот объект). Настройка видимости параметризуемой команды по ролям для произвольной параметризуемой команды выполняется в редакторе формы. Подробнее Об этом мы поговорим в разделе «Командуем формами», стр. 210. В результате выполненных настроек команда печати ценников для вида цены доступна в командных панелях формы списка справочника Виды цен и в форме элемента того же справочника для пользователей с ролью Менеджер по ценам (рис. 7.154). Рис. 7.155. Размещение произвольной параметризуемой подчиненной команды в командном интерфейсе Нам осталось настроить представление команды в интерфейсе и реализовать процедуру исполнения команды. Рис. 7.154. Произвольная параметризуемая команда доступна в форме списка и в форме элемента Таким образом, для произвольной подчиненной параметризуемой команды: ■■ размещение в командном интерфейсе определяется значением свойства Группа; ■■ состав форм, в которых будет доступна команда, определяется значением свойства Тип параметра команды; ■■ доступность для пользователя определяется значением права Просмотр, устанавливаемого для подчиненной команды. Сохраним конфигурацию, запустим приложение от имени пользователя Менеджер по ценам, выберем раздел Управление ценами и откроем форму списка справочника Виды цен. Созданная нами команда действительно расположена в группе Важное командной панели формы (рис. 7.155). 204 Для настройки представления заполним свойство Синоним текстом «Печать ценников для вида цены», свойство Подсказка – текстом «Печать ценников на товары по выбранному виду цены», а для того чтобы видеть реакцию на выбор команды, в модуле команды реализуем вывод сообщения (рис. 7.156). При выборе команды в режиме эксплуатации в окне сообщений будет выведен текст нашего сообщения (рис. 7.157). Помимо свойств Синоним и Подсказка, на представление команды в командном интерфейсе также влияют свойства Картинка и Отображение. ПРИМЕЧАНИЕ Свойства Картинка и Отображение определены и для общих произвольных команд. Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды фейсе. В качестве пиктограммы может быть выбрана любая стандартная или общая картинка. Давайте для команды зададим стандартную картинку Печать (рис. 7.158). Рис. 7.156. Настройка представления и функциональности произвольной подчиненной команды Рис. 7.158. Назначение картинки для произвольной подчиненной команды Свойство Отображение задает способ отображения команды: Рис. 7.157. Результат исполнения произвольной подчиненной команды На данный момент свойство Картинка не заполнено, а свойство Отображение имеет значение Авто. В этом случае команда представлена значением своего свойства Синоним (см. рис. 7.157). ■■ Текст – в представлении команды присутствует только текст; ■■ Картинка – в представлении команды присутствует только пиктограмма; ■■ Картинка и текст – в представлении команды присутствует и текст, и пиктограмма; ■■ Авто – решение о представлении команды принимает система (в командных панелях, связанных с интерфейсными элементами, присутствует пиктограмма; в пунктах меню присутствует текст и пиктограмма). Установим для свойства значение Картинка и текст. В результате команда представлена и пиктограммой, и текстом (рис. 7.159). Свойство Картинка содержит пиктограмму, которая, в зависимости от значения свойства Отображение, может представлять команду в интерТом 1 205 Глава 7. Командный интерфейс прикладных решений Рис. 7.160. Произвольная подчиненная команда с назначенной клавиатурной комбинацией Рис. 7.159. Измененное представление произвольной подчиненной команды ПРИМЕЧАНИЕ Свойства Картинка и Отображение используются только для команд, размещенных в командной панели формы. При размещении в других панелях (навигации, действий, навигации формы) команды представляются своим синонимом (или именем, если синоним не заполнен). У произвольных команд есть еще свойство, которое мы не рассмотрели, – Сочетание клавиш. Это свойство позволяет назначить команде клавиатурную комбинацию для ее быстрого вызова. Для назначения клавиатурной комбинации необходимо выбрать свойство Сочетание клавиш и нажать на клавиатуре требуемую комбинацию клавиш. Назначим нашей команде печати ценников по виду цен комбинацию клавиш Ctrl + P (рис. 7.160). Зависимость от функциональных опций А теперь вспомним о том, что ценообразование в разрезе видов цен является опциональным. Если цены назначаются только в разрезе товаров, то печать ценников в разрезе видов цен не потребуется. Поэтому доступность команды печати ценников по виду цен поставим в зависимость от значения функциональной опции. Для настройки зависимости произвольной команды от функциональной опции необходимо эту команду включить в свойство Состав управляющей функциональной опции. Подробнее Раздел «Отключаем неиспользуемые команды», стр. 184. Как и для включения в подсистемы, для включения команды в функциональные опции воспользуемся окном Дополнительно, вызванным из контекстного меню для подчиненной команды (рис. 7.161). ПРИМЕЧАНИЕ Аналогично можно настроить зависимость от функциональных опций и для общей произвольной команды. 206 Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды Рис. 7.161. Настройка зависимости произвольной команды от функциональной опции Также для нашей команды в свойстве Отображение установим значение Картинка. Рис. 7.163. При истинном значении функциональной опции произвольная команда доступна Сохраним конфигурацию, запустим приложение от имени пользователя Администратор и установим значение константы Ценообразование по видам цен в Истина (рис. 7.162). Изменим значение константы Ценообразование по видам цен на Ложь, перезапустим приложение от имени пользователя с ролью Менеджер по ценам и откроем форму списка справочника Виды цен. Команда печати недоступна (рис. 7.164). Рис. 7.162. Установка ценообразования в разрезе видов цен Рис. 7.164. При ложном значении функциональной опции произвольная команда недоступна Теперь запустим приложение от имени пользователя Менеджер по ценам и откроем форму списка справочника Виды цен. Команда печати доступна в командной панели формы и отображается только пиктограммой (рис. 7.163). Том 1 ПРИМЕЧАНИЕ В случае с отключенной функциональной опцией форма списка справочника Виды цен открыта через пункт Все функции… главного меню. 207 Глава 7. Командный интерфейс прикладных решений Произвольные группы В разделе «Автоматическое размещение и видимость команд» (стр. 168) мы говорили о том, что команды располагаются в стандартных группах и что при необходимости разработчик может расширить стандартный состав групп. Для этого используются объекты конфигурации Группа команд, расположенные в ветке Общие дерева конфигурации. Для группы команд Печать установлена категория Командная панель формы. Это значит, что в интерфейсе произвольная группа размещена в командной панели формы (рис. 7.166). Произвольная группа команд используется для логического объединения команд, выполняющих похожие действия. Например, в демонстрационной базе создана произвольная группа команд Печать (рис. 7.165), предназначенная для объединения команд, которые формируют различные печатные формы. Рис. 7.165. Произвольная группа команд «Печать» Как и для других объектов конфигурации, для объекта Группа команд определены универсальные свойства Имя, Синоним, Комментарий. Рис. 7.166. Свойство «Категория» определяет размещение произвольной группы Для определения места размещения группы используется свойство Категория. Давайте включим произвольную команду печати ценников по виду цен в группу Печать. Для этого в свойстве Группа нашей подчиненной команды установим произвольную группу Командная панель формы.Печать. ВНИМАНИЕ! Кроме того, для свойства Отображение установим значение Авто (рис. 7.167). Свойство группы Категория обязательно должно быть заполнено. Если значение для свойства не выбрано, система установит значение по умолчанию Панель навигации. Выбранная категория определяет, где будет размещена группа, и, следовательно, команды, принадлежащие этой группе. В качестве значения может быть выбрана только одна из стандартных категорий команд. Подробнее Теперь в форме списка и форме элемента справочника Виды цен команда печати ценников располагается уже не в группе Важное, а в группе Печать. ПРИМЕЧАНИЕ В командной панели формы кнопками отображаются команды из группы Важное. Команды остальных групп отображаются в виде подменю. Раздел «Категории и группы команд», стр. 169. 208 Профессиональная разработка в системе «1С:Предприятие 8» Создаем произвольные команды В результате наших настроек представление группы команд изменилось (рис. 7.168) – она представлена назначенной картинкой и текстом, заданным в свойстве Синоним. Рис. 7.167. Включение произвольной команды в произвольную группу Для формирования представления группы в командном интерфейсе используются свойства Синоним, Отображение, Подсказка и Картинка. Свойство Синоним содержит текст, представляющий произвольную группу в командном интерфейсе. Для синонима зададим значение «Печатные формы». Свойство Отображение содержит вариант отображения группы команд. Для отображения оставим вариант Авто. Свойство Подсказка содержит текст всплывающей подсказки при кратковременной задержке курсора над командой. Для подсказки зададим значение «Получение печатных форм». Свойство Картинка содержит картинку, которая будет представлять группу в интерфейсе. Для картинки зададим (аналогично произвольной команде) значение Печать. Том 1 Рис. 7.168. Настройка представления произвольной группы команд Из особенностей объекта Группа команд необходимо отметить, что для него не назначаются права, не определяется принадлежность к подсистемам и зависимость от функциональных опций. Произвольная группа будет представлена в командном интерфейсе пользователя только в том случае, когда в нем доступна хотя бы одна из команд, включенных в группу. В противном случае группа в командный интерфейс не включается. В нашем приложении доступ к справочнику Виды цен разрешен и для роли Менеджер по продажам. Но для этой роли сброшено право Просмотр для произвольной подчиненной команды (рис. 7.169). В результате такой настройки прав произвольная группа команд Печать для менеджера по продажам оказалась пустая, и она не представлена в командной панели формы списка справочника Виды цен. 209 Глава 7. Командный интерфейс прикладных решений Однако наличие команды в форме еще не дает возможности использовать ее функциональность. Аналогично и реквизиты сами по себе не обеспечивают возможности отображения и редактирования данных. Для использования команд, для отображения и редактирования данных, хранимых в реквизитах, служат элементы формы, связанные с соответствующими командами и реквизитами. Не вдаваясь в детали, связь между командами, реквизитами и элементами формы можно представить схемой (рис. 7.170). Рис. 7.170. Связь между командами, реквизитами и элементами формы Подробнее Раздел «Конструирование форм», стр. 233. Рис. 7.169. Ролям со сброшенным свойством «Просмотр» произвольная команда недоступна «Командуем» формами В предыдущих разделах мы познакомились с глобальным командным интерфейсом «1С:Предприятия», принципами его построения и глобальными командами. В данном разделе мы рассмотрим формирование набора команд, доступных для использования в контексте формы. Здесь же изложены основные сведения о форме, необходимые для понимания этого механизма. Необходимые сведения о формах Формы, существующие в «1С:Предприятии», предназначены для интерактивной работы пользователя с данными информационной базы. Для обеспечения этой возможности форма «наполняется» необходимой функциональностью. Функциональность формы определяется составом ее реквизитов и команд. Реквизиты формы – это данные, с которыми работает форма. Команды формы – это действия, которые может выполнить форма над данными. 210 Можно отметить следующие ключевые особенности форм. Во-первых, новая форма не прорисовывается детально разработчиком, а строится системой автоматически. Разработчик же в режиме конфигурирования: ■■ определяет состав формы в виде дерева элементов; ■■ описывает поведение формы, задавая значения для ее свойств и/или реализуя процедуры на встроенном языке. При построении интерфейса для того или иного пользователя система использует это декларативное описание для создания формы и размещения ее элементов. Во-вторых, при создании формы используется новая модель управления доступностью и видимостью элементов формы. При этом учитываются: ■■ настройки прав в разрезе ролей пользователей; ■■ зависимость элементов формы от функциональных опций; ■■ настройка формы, выполненная разработчиком на этапе конфигурирования прикладного решения; ■■ настройка формы, выполненная пользователем на этапе эксплуатации прикладного решения. Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Функциональность по умолчанию Команды формы В «1С:Предприятии» можно не создавать формы для представления и обработки объектов данных. В этом случае при выполнении команд открытия форм система самостоятельно на лету создаст необходимую форму. Созданная форма будет обладать функциональностью и представлением по умолчанию. Что же определяет представление и функциональность формы? Для знакомства с командами формы создадим еще одну форму для документа Расход товара. Из контекстного меню узла Формы этого документа выберем пункт Добавить (рис. 7.171). Стандартное представление и функциональность формы определяют интерфейсный объект «Управляемая форма» (например, способность формы закрываться) и расширение формы (например, способность записывать данные формы в информационную базу). Расширение формы – это дополнительные свойства, методы, параметры и команды, которые появляются у объекта Форма, когда ей назначен основной реквизит. ВНИМАНИЕ! В качестве основного может быть выбран только один реквизит из состава реквизитов формы. Важно понимать, что: ■■ дополнительно предоставляемая функциональность включается в объект Управляемая форма, то есть становится ее неотъемлемой частью; ■■ состав дополнительных возможностей определяется типом основного реквизита формы, то есть типом тех данных, для редактирования которых предназначена форма. Рис. 7.171. Добавление подчиненной формы В результате откроется окно конструктора форм (рис. 7.172). В окне конструктора выберем тип формы – Форма документа, установим флажок Назначить форму основной и зададим имя ОсновнаяФорма. Нажмем кнопку Готово. Расширения могут присутствовать и у элементов формы. Как и для самой формы, состав расширения, то есть дополнительные свойства, методы и т. д., элемента формы определяется типом реквизита, с которым элемент связан. При необходимости реализовать нестандартное представление данных или нестандартную функциональность разработчик может самостоятельно создать форму в конфигураторе. Для создания форм используется редактор форм. С помощью этого редактора разработчик создает для формы необходимый набор реквизитов и команд, а также элементы формы, которыми они отображаются. Подробнее Раздел «Редактирование формы», стр. 240. В качестве отправной точки мы будем использовать демонстрационную базу «Командный интерфейс прикладных решений, пример 7». Результат выполняемых действий можно посмотреть в демонстрационной базе «Командный интерфейс прикладных решений, пример 8». Том 1 Рис. 7.172. Окно конструктора формы В результате работы конструктора создана форма документа, эта форма назначена основной, то есть она используется по умолчанию для работы с документом. После завершения работы конструктора для созданной формы откроется окно редактора форм (рис. 7.173). 211 Глава 7. Командный интерфейс прикладных решений Элементы, обеспечивающие доступ к командам, расположены в командных панелях. В нашем случае система сформировала командную панель формы и командную панель таблицы товаров. Выбор любой из доступных команд можно осуществить из меню Все действия соответствующей командной панели. Для ускорения доступа к командам часть из них (наиболее важные или часто используемые) представлена кнопками непосредственно в командных панелях. Чем «руководствуется» система при формировании состава команд формы? Какие команды должны быть в форме? Для ответа на эти вопросы нужно вспомнить основное назначение формы – интерактивная обработка данных. Следовательно, в форме должны присутствовать команды, предоставляющие пользователю возможность обработать данные формы и возможность обратиться к данным, связанным с обрабатываемыми. Для обработки данных формы – стандартные команды формы Рис. 7.173. Редактор формы с автоматически созданной формой документа ПРИМЕЧАНИЕ В редакторе форм основной реквизит формы выделяется жирным шрифтом. Если открыть документ Расход товара в режиме 1С:Предприятие, мы увидим, что для работы с документом используется созданная нами форма (рис. 7.174). В форме должны присутствовать команды для обработки данных и для управления формой. Эти возможности обеспечивают стандартные локальные команды формы. В редакторе форм они представлены на закладке Стандартные команды редактора команд (рис. 7.175). Эти команды предоставлены формой и расширением формы. Состав команд, предоставляемых формой, является стандартным и не зависит от данных формы – это команды Справка, Изменить форму…, Закрыть, Сохранить параметры…, Восстановить параметры… Состав команд, предоставляемых расширением, зависит от типа основного реквизита формы. В нашем случае основным реквизитом формы назначен реквизит Объект с типом данных ДокументОбъект.РасходТовара (см. рис. 7.175). Расширение, соответствующее этому типу данных, предоставило команды Провести и закрыть, Записать, Перечитать, Скопировать, Пометить на удаление/Снять пометку, Удалить, Провести и Отмена проведения. ВНИМАНИЕ! Необходимо различать стандартные команды объекта конфигурации и стандартные команды формы. Первые используются в глобальном командном интерфейсе и предоставляются объектом конфигурации. Вторые же используются в форме и предоставляются самой формой, ее расширением и расширениями элементов формы, имеющих тип Таблица. Рис. 7.174. Форма редактирования документа «Расход товара» 212 Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами в форме используется элемент Товары, имеющий тип Таблица. В состав стандартных локальных команд формы включены команды обработки табличных данных – узел Товары в редакторе команд (рис. 7.176). Рис. 7.175. Стандартные команды формы в редакторе и интерфейсе Для облегчения разработки алгоритмов управления формами в стандартные команды формы включены команды Да, Нет, OK, Отмена, Прервать, Пропустить, Повторить. Если такая команда добавлена в форму, то при ее выборе пользователем выполняются следующие действия: ■■ для формы, открытой в модальном режиме, выполняется закрытие формы, и возвращается соответствующее выбранной команде значение типа КодВозвратаДиалога; ■■ для формы, открытой в немодальном режиме, выполняется только закрытие формы. Если в составе элементов формы присутствуют таблицы, то в состав стандартных локальных команд формы добавляются команды, обеспечивающие обработку данных, отображаемых в этих элементах. У документа Расход товара есть табличная часть, которая в данных формы представлена реквизитом Товары. Для отображения списка товаров Том 1 Рис. 7.176. Стандартные команды таблицы в редакторе и интерфейсе Для работы со связанными данными – глобальные параметризованные команды При обработке данных формы может возникнуть необходимость просмотреть данные, связанные с обрабатываемыми. Это может быть, например, набор записей в регистре взаиморасчетов с контрагентами, подчиненный обрабатываемому документу, или список цен на продаваемый товар и др. Также может потребоваться выполнить какую-либо обработку связанных данных, например, ввести документ оплаты на основании документа продажи или напечатать штрихкоды продаваемого товара и др. 213 Глава 7. Командный интерфейс прикладных решений Доступ к связанным данным обеспечивают глобальные параметризуемые навигационные команды, а обработку связанных данных – глобальные параметризуемые команды действий. В редакторе форм они представлены на закладке Глобальные команды редактора команд (рис. 7.177). Если для команды в форме существует несколько источников, то команда представлена как узел дерева, а список источников – как элементы этого узла. В состав команд формы такую команду можно включить с любым из источников (или несколько экземпляров одной команды с разными источниками). Для работы с функциональностью приложения – глобальные независимые команды При обработке данных формы может возникнуть необходимость воспользоваться функциональностью приложения, не связанной напрямую с обрабатываемыми данными. Например, при обработке данных документа нам необходимо выполнить поиск в данных или ввести новый вид цен. Выполнить эти операции помогут глобальные независимые команды. В редакторе форм они представлены на закладке Глобальные команды редактора команд (рис. 7.178). Рис. 7.177. Глобальные параметризуемые команды в редакторе и интерфейсе Эти команды предоставлены глобальным командным интерфейсом прикладного решения. Состав команд, доступный в форме, зависит от типа параметра параметризованной команды (см. раздел «Произвольные команды», стр. 193). В форме доступны те глобальные параметризованные команды, для которых в контексте формы можно получить значения параметра требуемого типа. В редакторе команд источник параметра для команды указывается в скобках после команды. Например, для команды открытия списка регистра продажи параметром выступает ссылка на редактируемый документ. 214 Рис. 7.178. Глобальные независимые команды в редакторе и интерфейсе Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Глобальные независимые команды предоставлены глобальным командным интерфейсом. В редакторе команд глобальные независимые команды сгруппированы по разделам глобального командного интерфейса. Команда будет доступна из всех разделов глобального командного интерфейса, в которые она включена. Способы формирования состава команд формы Познакомившись с источниками команд формы, давайте посмотрим, какие варианты предоставляет нам система для формирования состава команд формы. ПРИМЕЧАНИЕ Для формы есть еще один источник команд – разработчик, который может создавать произвольные локальные команды формы. Об этих командах мы поговорим немного позже (см. раздел «Если не хватает стандартных команд», стр. 230). В самом общем случае существует три варианта: ■■ автоматический – состав команд формы определяется системой полностью автоматически; ■■ комбинированный – состав команд формы определяется системой автоматически, а разработчик, используя редактор форм, корректирует его; ■■ ручной – состав команд формы определяется полностью разработчиком. Автоматическое формирование состава команд формы При автоматическом формировании состава команд система включает в форму: ■■ стандартные команды формы; ■■ глобальные параметризуемые команды, для параметров которых в форме есть значения подходящего типа. ВНИМАНИЕ! Глобальные независимые команды автоматически в форму не включаются. Для команд из различных источников система использует разные правила видимости по умолчанию: ■■ все стандартные команды формы видимы, ■■ все глобальные параметризуемые команды действия видимы, ■■ все глобальные параметризуемые навигационные команды невидимы. Для автоматического размещения команд система использует командную панель формы и панель навигации того вспомогательного окна (рис. 7.179), в котором форма отображается (в дальнейшем изложении – панель навигации формы). Автоматический вариант является самым быстрым и наименее затратным с точки зрения разработки прикладного решения – система все делает самостоятельно. Комбинированный вариант, вероятно, используется чаще всего. При таком подходе разработчик вмешивается в работу системы только тогда, когда набор команд, сформированный системой, не обеспечивает требуемых функциональных возможностей по обработке данных формы. В подавляющем большинстве случаев вмешательство выражается в простом расширении состава команд формы. Ручной же вариант предоставляет максимум возможностей по управлению составом команд формы и их размещением. Однако он требует от разработчика выполнения значительного объема кропотливой работы. Том 1 Рис. 7.179. Вспомогательное окно с формой документа «Расход товара» 215 Глава 7. Командный интерфейс прикладных решений Стандартные команды формы Стандартные команды формы автоматически размещаются в командной панели формы. В нее всегда включаются все команды, предоставленные расширением формы, а также команда Справка, предоставленная формой (рис. 7.180). Рис. 7.181. Команда настройки формы Включение в командную панель команд Сохранить параметры… и Восстановить параметры… определяется значением свойства формы Сохранение данных в настройках. По умолчанию это свойство имеет значение Не использовать, и команды не включаются в командную панель (рис. 7.182). Рис. 7.180. Командная панель формы заполнена автоматически Включение в командную панель команды Изменить форму… определяется значением свойства формы Разрешить изменять форму. По умолчанию свойство имеет значение Истина, и команда включается в командную панель (рис. 7.181). 216 Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Рис. 7.182. Команды сохранения и восстановления параметров ПРИМЕЧАНИЕ Часть команд отображается непосредственно в командной панели и в меню Все действия, а часть – только в меню Все действия. Если в составе элементов формы присутствуют таблицы, то для размещения команд обработки табличных данных также используется командная панель. В дереве элементов формы она располагается сразу под соответствующим табличным элементом (рис. 7.183). Рис. 7.183. Команды обработки табличных данных ПРИМЕЧАНИЕ При автоматическом формировании набора команд формы списка форма имеет объединенную командную панель, в которой размещены как команды формы, так и команды таблицы. Глобальные параметризуемые команды При автоматическом формировании состава команд в форму включаются только те глобальные параметризуемые команды, которые в качестве параметра могут принимать ссылку на основной реквизит формы или на реквизиты основного реквизита формы. Размещение по умолчанию глобальных параметризуемых команд определяется их категорией и группой. Том 1 217 Глава 7. Командный интерфейс прикладных решений Категории стандартных команд предопределены и не могут быть изменены. А вот группу (внутри категории), в которой будет размещена команда, разработчик может изменить. Для включения произвольной глобальной параметризуемой команды в командную панель формы в свойстве Группа этой команды должна быть выбрана группа команд с категорией Командная панель формы. Категория и группа произвольных (как общих, так и подчиненных) команд определяются разработчиком путем выбора значения в свойстве Группа этой команды (см. раздел «Особенности размещения», стр. 196). Например, в созданной нами форме в командную панель формы включена команда Поступление денег, которая создает соответствующий документ на основании обрабатываемого документа расхода (см. рис. 7.184). Для команды в качестве параметра передается ссылка на обрабатываемый документ (из свойства Ссылка основного реквизита формы). Разработчик может настроить видимость автоматически включенных в форму глобальных параметризуемых команд. А вот удалить их система не позволит. Глобальные параметризуемые команды действий размещаются в командной панели формы. В редакторе формы эти команды отображаются на закладке Командный интерфейс редактора команд (рис. 7.184). Глобальные параметризуемые навигационные команды размещаются в панели навигации формы. В редакторе формы эти команды отображаются на закладке Командный интерфейс редактора команд (рис. 7.185). Рис. 7.185. Глобальная параметризуемая навигационная команда в форме Для включения произвольной глобальной параметризуемой команды в панель навигации формы в свойстве Группа этой команды должна быть выбрана группа команд с категорией Панель навигации формы. ПРИМЕЧАНИЕ Рис. 7.184. Глобальная параметризуемая команда действий в форме 218 По умолчанию эти команды невидимы и панель навигации не отображается. Отображение панели навигации формы мы настроили в пользовательском режиме. Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Например, в созданной нами форме в панель навигации формы включена команда Регистр продаж, которая открывает список записей регистра продаж, сформированных обрабатываемым документом (см. рис. 7.185). Для команды в качестве параметра передается ссылка на обрабатываемый документ (из свойства Ссылка основного реквизита формы). ВНИМАНИЕ! Если форма (например, форма списка документов) открывается в основном окне приложения, то панель навигации формы не отображается (независимо от настройки видимости навигационных команд), и команды, размещенные в ней, недоступны. ПРИМЕЧАНИЕ Для исключения ошибок времени выполнения менеджеру по ценам установим право Чтение на справочники Склады, Организации и Валюты. Для пользователя Администратор установлены все права на документ Расход товара. При построении формы документа (и формы списка документов) в состав доступных включены все стандартные команды формы, включенные в нее на этапе разработки (рис. 7.186). Доступность команд формы для пользователя При создании формы для пользователя прикладного решения система учитывает его права, определяемые ролью, и значения функциональных опций. Из этого следует, что набор команд формы, доступный конкретному пользователю, может отличаться от состава команд, включенных в форму на этапе разработки. Как и в случае с видимостью, для команд из разных источников система использует разные правила для автоматического определения их доступности: ■■ доступность стандартных команд, предоставленных формой, не зависит от ролевой настройки прав и значений функциональных опций; ■■ доступность стандартных команд, предоставленных расширением основного реквизита формы, зависит от ролевой настройки прав пользователя, а значения функциональных опций на доступность команд не влияют; ■■ доступность глобальных команд зависит от ролевой настройки прав пользователя и значений функциональных опций. Для демонстрации влияния ролевой настройки прав на доступный пользователю набор команд включим документ Расход товара в подсистему Ценообразование. Подробнее Механизм включения описан в разделе «Стандартные команды», стр. 157. Для роли Менеджер по ценам установим права Чтение и Просмотр на документ. Для подчиненной документу произвольной команды Печать расходной накладной право Просмотр снимем. Подробнее Механизм установки прав описан в разделе «Система прав доступа», стр. 161. Том 1 Рис. 7.186. Стандартные команды, доступные пользователям с разными ролями Для пользователя же с ролью Менеджер по ценам разрешен только просмотр документов Расход товара. При построении формы документа (и формы списка документов) для этого пользователя система исключила из состава доступных команды расширения основного реквизита, выполняющие запрещенные пользователю операции с документом – создания, удаления, проведения документа и т. д. (см. рис. 7.186). Доступность глобальных команд в форме определяется их доступностью в глобальном командном интерфейсе, который формируется при запуске системы от имени того или иного пользователя. 219 Глава 7. Командный интерфейс прикладных решений Это значит, что команды, недоступные пользователю в глобальном командном интерфейсе, также недоступны ему в форме. Например, для пользователя Администратор установлено право на использование команды печати документа Расход товара. При построении формы документа (и формы списка документов) в состав доступных включена эта глобальная команда (рис. 7.187). Для демонстрации их влияния на доступность команд формы добавим подчиненную справочнику Виды цен произвольную команду Печать ценников для вида цены в группу печатные формы командной панели. Для этой команды установлена зависимость от функциональной опции Ценообразование по видам цен. В случае, когда эта функциональная опция имеет значение Истина, команда печати ценников для вида цен включена в состав доступных команд формы (рис. 7.188). Рис. 7.187. Глобальные команды, доступные пользователям с разными ролями В отличие от администратора, пользователь Менеджер по ценам не имеет права на печать документа Расход товара. При построении формы документа (и формы списка документов) для этого пользователя система исключила из состава доступных команду печати расходной накладной (см. рис. 7.187). Помимо набора прав, на состав глобальных команд, доступных пользователю в форме, влияют значения функциональных опций. Рис. 7.188. При истинном значении функциональной опции команда печати ценников доступна Подробнее Раздел «Управляем командами формы», стр. 221. 220 Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами В случае же, когда функциональная опция имеет значение Ложь, команда в форме недоступна, хотя в редакторе она включена в состав команд формы (рис. 7.189). Управляем командами формы Начнем с настройки командной панели формы. Ее отображением для пользователя (и ее положением) может управлять разработчик. Вариант размещения командной панели в форме определяется значением свойства формы Положение командной панели. По умолчанию значением свойства является Авто и командная панель присутствует в форме. Если же для свойства установить значение Нет, то в форме командной панели не будет (рис. 7.190). Рис. 7.189. При ложном значении функциональной опции команда печати ценников недоступна Рис. 7.190. Управление наличием командной панели в форме Естественно, в этом случае будут недоступны все команды, размещаемые в командной панели формы. Том 1 221 Глава 7. Командный интерфейс прикладных решений Кроме возможности полного отключения командной панели, разработчик может управлять вариантом ее «наполнения» командами. Для этого используется свойство Автозаполнение. Мы не будем формировать набор команд полностью в ручном режиме. Нам достаточно разобраться в том, как этот набор изменить (по сравнению с автоматическим режимом). В случае, когда флажок Автозаполнение сброшен (рис. 7.191), состав команд панели формируется разработчиком вручную. Комбинируя возможность автозаполнения командной панели и возможность ручного управления составом команд, можно с минимальными затратами времени и сил сформировать требуемый состав команд формы. Стандартные команды формы Состав используемых стандартных команд формы можно определить в свойстве формы (и в свойстве таблицы) Состав команд. Настройка выполняется в окне Состав, вызываемом через гиперссылку Открыть (рис. 7.192). Рис. 7.191. Автозаполнение у командных панелей отключено При установленном флажке состав команд формируется автоматически – так, как было описано ранее. Рис. 7.192. Настройка состава доступных стандартных команд формы Но и в случае автозаполнения система позволяет разработчику повлиять на состав команд, включаемых в командную панель формы (и в командную панель таблицы). Для исключения команды необходимо снять флажок рядом с соответствующей командой. Снимем флажки у команд Перечитать и Скопировать. Эти команды исключены и из состава доступных пользователю, и из состава команд формы в редакторе команд, то есть они становятся недоступными и разработчику (рис. 7.193). 222 Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами В результате в дереве элементов появился новый элемент формы с типом Кнопка, подчиненный элементу Командная панель, и открылось окно свойств добавленного элемента. Свойство Команда автоматически заполнено значением Закрыть – командой, которую мы перетащили в командную панель (рис. 7.194). Рис. 7.193. «Выключенные» стандартные команды в интерфейсе отсутствуют ПРИМЕЧАНИЕ При формировании состава командной панели свойство Состав команд имеет более высокий приоритет, чем свойства Разрешить изменять форму и Сохранение данных в настройках. Для добавления команды в форму необходимо создать элемент формы Кнопка, который позволяет вызвать выполнение команды, и связать с этим элементом добавляемую команду. Обычно кнопка располагается в командной панели – подчинена узлу Командная панель в дереве элементов формы. Команда, вызываемая кнопкой, задается в свойстве кнопки Имя команды. Проще всего перетащить команду из окна редактора команд на командную панель или на форму в дереве элементов. В этом случае связывание кнопки и команды выполняется автоматически. Перетащим команду Закрыть на командную панель формы. Том 1 Рис. 7.194. Форма с добавленной вручную командой «Закрыть» Для добавленной вручную команды разработчик может настроить доступность и видимость команды, ее расположение и представление, вариант отображения команды и другие аспекты ее поведения. Настройка выполняется путем задания значений свойствам того элемента формы, с которым команда связана. 223 Глава 7. Командный интерфейс прикладных решений ВНИМАНИЕ! Фактически выполняется настройка не самой команды, а элемента формы, с которым команда связана. Место отображения добавленной команды в командной панели можно настроить. Для этого используется свойство кнопки Только во всех действиях: ■■ Да – команда размещается только в меню Все действия; ■■ Нет – команда размещается и в меню Все действия, и в командной панели; ■■ Авто – решение о месте размещения команды принимается системой. Для кнопки Закрыть оставим значение по умолчанию Авто (рис. 7.195) – команда будет доступна и непосредственно в командной панели, и в меню Все действия. Рис. 7.195. Выбор варианта размещения команды в командной панели ВНИМАНИЕ! Если все доступные команды отображаются кнопками в командной панели, меню Все действия в командной панели отсутствует. Для настройки представления команды используются свойства Заголовок, Отображение. 224 Свойство Заголовок позволяет задать текст, представляющий команду. Для кнопки Закрыть зададим текст «Закрыть форму». Свойство Отображение позволяет задать вариант представления команды: ■■ Текст – в представлении команды присутствует только текст; ■■ Картинка – в представлении команды присутствует только пиктограмма; ■■ Картинка и текст – в представлении команды присутствует и текст, и пиктограмма; ■■ Авто – решение о представлении команды принимает система. Для кнопки Закрыть зададим значение Текст. В результате наших настроек представление команды Закрыть изменилось (рис. 7.196). Рис. 7.196. Измененное представление команды «Закрыть» ПРИМЕЧАНИЕ Если для кнопки определена пиктограмма, то в меню Все действия в любом случае отображается и текст, и пиктограмма. Кроме размещения, может потребоваться настроить доступность команды (без удаления ее из командной панели). Для этого используется свойство Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Доступность кнопки, с которой связана команда. Если для команды Закрыть снять флажок в свойстве Доступность, то команда станет недоступной для выбора пользователем. В интерфейсе недоступные команды имеют «бледный» вид – отображаются серым цветом (рис. 7.197). Рис. 7.198. Свойства, управляющие видимостью команды При настройке видимости можно: Рис. 7.197. Командная панель с недоступной командой «Закрыть» Кроме доступности, разработчик может управлять и видимостью команды. Для этого используются свойства кнопки Видимость и Пользовательская видимость (рис. 7.198). Свойство Видимость предназначено для настройки видимости команды в соответствии с реализуемой разработчиком логикой работы прикладного решения. Настройка видимости выполняется установкой (команда видима) или снятием (команда невидима) флажка у свойства. При эксплуатации прикладного решения пользователь не может изменить значение свойства Видимость. Свойство Пользовательская видимость определяет, какие команды в форме будут видимы по умолчанию, а какие по умолчанию скрыты. Состав видимых по умолчанию команд можно настроить в разрезе ролей. Настройка пользовательской видимости выполняется в окне Настройка видимости, вызываемом через гиперссылку Открыть свойства (см. рис. 7.198). Том 1 ■■ установить общую видимость по умолчанию – флажок Видимость; определяет видимость для тех ролей, у которых флажок установлен в «третье» значение (серый фон); ■■ установить видимость по умолчанию в разрезе ролей – элементы списка Видимость по ролям; определяет видимость по умолчанию для конкретной роли. При определении видимости по умолчанию для конкретного пользователя значения, установленные для его ролей, складываются по логическому ИЛИ. При эксплуатации прикладного решения пользователь имеет возможность изменить значение свойства Пользовательская видимость. ПРИМЕЧАНИЕ Для вызова окна настройки используется команда Настроить форму… Если пользователь перенастроил видимость команд по умолчанию, то система при создании формы для определения видимости команд будет учитывать и настройки разработчика, и настройки пользователя. ВНИМАНИЕ! Для пользователя будут видимы только те команды, у которых установлено и свойство Видимость, и свойство Пользовательская видимость. 225 Глава 7. Командный интерфейс прикладных решений Давайте для команды Закрыть свойство Видимость установим, а пользовательскую видимость определим следующим образом (см. рис. 7.198): ■■ общая видимость установлена, ■■ для роли Менеджер по ценам видимость сброшена, ■■ для остальных ролей видимость имеет «третье» значение. Теперь при запуске системы от имени менеджера по закупкам команда Закрыть по умолчанию невидима, а для остальных ролей она видима (рис. 7.199). Рис. 7.200. Добавление элемента формы «Группа – Группа кнопок» Рис. 7.199. Ограничение видимости команды по умолчанию для роли При настройке размещения команды в командной панели можно объединять в логические группы. Для этого используется элемент формы с типом Группа. Давайте выделим в отдельную группу команду Закрыть. Сначала добавим в командную панель подчиненный элемент с типом Группа – группа кнопок (рис. 7.200). В дереве элементов появится новый, и для него откроется окно свойств (рис. 7.201). Заполним свойства элемента формы: ■■ Имя – «ГруппаЗакрыть»; ■■ Заголовок – «Группа закрыть» (используется, когда группа имеет вид Подменю); ■■ Подсказка – «Команды закрытия формы». 226 Рис. 7.201. Группа с командой «Закрыть» Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Теперь перетащим на группу кнопку Закрыть. В результате нашей настройки команды, принадлежащие группе, в интерфейсе визуально выделены разделителями (см. рис. 7.201). Как и для кнопки, для группы кнопок можно настраивать доступность и видимость. Настройки, сделанные для группы, будут применены ко всем командам, включенным в эту группу. Помимо командной панели, кнопку можно расположить и непосредственно на форме – подчинить узлу Форма в дереве элементов формы. Это можно сделать так же, как и при заполнении командной панели – перетаскиванием команды. Однако перетащить команду необходимо не на узел Командная панель, а на узел Форма в дереве элементов формы. Также можно воспользоваться командой Добавить (аналогично тому, как мы добавляли группу) и выбрать добавляемый элемент формы с типом Кнопка. ВНИМАНИЕ! В случае использования команды Добавить не происходит автоматического связывания элемента формы Кнопка с командой. Разработчик должен настроить связь самостоятельно в свойстве кнопки Команда. Добавим новую кнопку командой. В результате в дереве элементов появится новый элемент с типом Кнопка, подчиненный элементу Форма, и откроется окно свойств добавленного элемента (рис. 7.202). Переместим кнопку под командную панель формы. Для этого используем команды перемещения Вверх/Вниз (или клавиатурные сокращения Ctrl + Shift + Up и Ctrl + Shift + Down). ПРИМЕЧАНИЕ Для кнопок, автоматически размещенных системой в командной панели, изменить порядок их следования невозможно. Заполним свойства кнопки (см. рис. 7.202): ■■ Имя – «ОтменаПроведения»; ■■ Заголовок – «Отмена проведения»; ■■ Отображение – «Картинка и текст»; ■■ Картинка – «Отмена проведения». Для свойства Имя команды выберем в диалоге выбора команд вызываемую команду Отмена проведения. В диалоге выбора команды можно выбрать не только стандартные команды формы, а вообще все команды, доступные в контексте формы. Для выбора команд служат соответствующие закладки диалога – Команды формы, Стандартные команды и Глобальные команды. В результате выполненных действий в форме появилась новая кнопка, расположенная под командной панелью формы (рис. 7.203). Рис. 7.203. Добавленная команда в интерфейсе ПРИМЕЧАНИЕ Если кнопка добавляется в командную панель и с ней связывается команда, уже автоматически размещенная системой в этой командной панели, добавляемая команда замещает существующую. Рис. 7.202. Кнопка на форме, связанная с командой «Отмена проведения» Том 1 227 Глава 7. Командный интерфейс прикладных решений Для кнопки, расположенной на форме, применимы те же настройки, что и для кнопки командной панели. ПРИМЕЧАНИЕ Команды, связанные с кнопками формы, недоступны в меню Все действия командной панели формы. На этом мы закончим рассмотрение стандартных локальных команд формы и займемся глобальными командами. Глобальные команды Разработчик может расширить (по сравнению с автоматически размещенными) состав глобальных команд, доступных в форме. При этом система не ограничивает разработчика в выборе места размещения добавляемой команды. Однако следует учитывать, что в панели навигации рекомендуется располагать «безопасные» команды – те, которые не приводят к модификации данных, не запускают обработки и т. д. Основное назначение команд в панели навигации – сформировать контекст выполнения каких-либо действий по обработке данных. Соответственно, в командной панели формы рекомендуется размещать команды, которые обрабатывают данные – заполняют, пересчитывают, печатают, записывают в информационную базу и т. д. С другой стороны, система не позволит удалить из формы автоматически включенные глобальные команды. Она позволит лишь настроить их видимость и размещение. Как и для стандартных, добавление глобальных команд проще всего выполнить перетаскиванием требуемой команды из редактора команд (закладка Глобальные команды) в редактор командного интерфейса (закладка Командный интерфейс), в узел Панель навигации или в узел Командная панель. Например, добавим в форму глобальную параметризованную команду действия Печать штрихкода, которая подчинена справочнику Товары. Команда является командой действия, поэтому добавим ее в группу Печатные формы командной панели формы (рис. 7.204). Рис. 7.204. Глобальная команда, добавленная вручную При необходимости разработчик может настроить видимость и размещение глобальных параметризованных команд. При этом для команд, помещенных в форму автоматически, необходимо сбросить соответствующие признаки – Автовидимость и Автоположение. В противном случае будет использована видимость и размещение команд, формируемые системой по умолчанию. ПРИМЕЧАНИЕ Для команд, добавленных вручную, система не определяет признаки Автовидимость и Автозаполнение, то есть разработчик самостоятельно размещает команды и устанавливает их видимость. Настройку размещения можно выполнить перетаскиванием команды мышью в нужную группу. Настройка видимости выполняется в окне Настройка видимости по правилам, совпадающим с настройкой видимости элементов формы Кнопка. 228 Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Давайте переместим команду Печать расходной в группу Важное и сделаем ее невидимой по умолчанию для роли Менеджер по ценам (рис. 7.205). Теперь добавим в форму глобальную параметризованную навигационную команду Цены товаров. Эта команда не предназначена для обработки данных, поэтому добавим ее в панель навигации формы, в группу См. также (рис. 7.207). Рис. 7.205. Настройка размещения и видимости добавленной глобальной команды В результате выполненной настройки для пользователя с ролью Менеджер по ценам команда печати невидима, а для остальных ролей – видима (рис. 7.206). Рис. 7.207. Добавлена глобальная навигационная команда «Цены товаров» Настройка видимости и размещения команд в панели навигации выполняется аналогично настройке команд в командной панели. Видимость по умолчанию для команды изменять не будем – она будет видима всем ролям. Обратите внимание: для роли Менеджер по ценам появилась доступная навигационная команда, причем она видима по умолчанию. Вследствие этого во вспомогательном окне с формой документа Расход товара отобразилась панель навигации с добавленной командой (см. рис. 7.207). Теперь мы знаем, как сформировать набор команд формы, используя стандартные команды формы и глобальные команды командного интерфейса. Рис. 7.206. Для разных ролей у команды «Печать расходной» различная видимость по умолчанию Том 1 А что делать, если функциональности этих команд не хватает? Об этом мы поговорим в следующем разделе. 229 Глава 7. Командный интерфейс прикладных решений Если не хватает стандартных команд В случае, когда для реализации функциональных возможностей формы стандартных команд не хватает, разработчик может создать необходимое количество произвольных команд формы. Такие команды создаются в редакторе команд на закладке Команды формы. Давайте создадим произвольную команду подбора товаров в документе Расход товара. Для создания произвольной команды воспользуемся командой Добавить на закладке Команды формы в редакторе команд. В результате в список произвольных команд формы будет добавлена новая команда и для нее откроется окно свойств (рис. 7.208). Рис. 7.209. Произвольная команда формы добавлена в интерфейс ПРИМЕЧАНИЕ Как и для произвольных глобальных команд, сам функционал команды мы реализовывать не будем. Рис. 7.208. Добавление произвольной команды формы Заполним для команды свойства: ■■ Имя – «ПодборТовара»; ■■ Заголовок – «Подбор товара»; ■■ Подсказка – «Подбор товара для продажи». Для произвольной команды формы необходимо написать программный код исполнения. 230 Процедура исполнения команды располагается в модуле формы. Используя свойство Действие произвольной команды, необходимо связать команду с процедурой исполнения. Также можно выбрать команду Открыть (кнопка с лупой справа от поля выбора свойства Действия). В этом случае в модуле формы будет объявлена процедура исполнения команды, и эта процедура автоматически будет выбрана в свойстве Действия (см. рис. 7.208). Разработчику останется только написать программный код исполнения команды. Для предоставления пользователю доступа к созданной команде последнюю необходимо связать с элементом формы типа Кнопка, аналогично стандартным командам формы. Профессиональная разработка в системе «1С:Предприятие 8» «Командуем» формами Перетащим команду в редактор элементов на командную панель таблицы Товары. В результате пользователь получил возможность выбора команды Подбор товара из командной панели таблицы товаров (рис. 7.209). Настройка размещения и видимости произвольных команд выполняется аналогично настройке стандартных команд – и стандартная, и произвольная команды связываются с элементом формы одного и того же типа Кнопка. А доступность и видимость фактически настраиваются уже для этого элемента. Кроме настройки доступности элемента формы, для произвольной команды разработчик может настроить ее доступность в разрезе ролей с помощью свойства Использование самой команды. Настройка выполняется в диалоговом окне Настройка использования (рис. 7.210). ■■ доступность команды для конкретной роли пользователя – если рядом с ролью в списке Использование по ролям флажок установлен, то команда доступна для роли; если сброшен, то недоступна; если же флажок установлен в «третье» значение (на сером фоне), то для роли используется значение общей доступности. Например, для пользователя с ролью Менеджер по ценам команда Подбор товара недоступна (флажок сброшен), см. рис. 7.210. Для этого пользователя в командной панели таблицы Товары команды нет. Доступность произвольных команд также можно поставить в зависимость от значений функциональных опций. Для такой настройки используется свойство команды Функциональные опции. Например, зададим зависимость команды Подбор товара от значения функциональной опции Работа с торговым оборудованием (рис. 7.211). Рис. 7.211. Настройка доступности произвольной команды от функциональной опции Рис. 7.210. Настройка доступности произвольной команды в разрезе ролей При этом разработчик может определить: ■■ общую доступность команды – если флажок Использование в диалоговом окне установлен, то команда доступна всем ролям с «третьим» значением флажка; Том 1 Для одного и того же пользователя при истинном значении функциональной опции команда доступна, а при ложном – недоступна (рис. 7.212). ВНИМАНИЕ! Свойства команды Доступность и Функциональные опции имеют приоритет перед свойствами элемента управления Кнопка. 231 Глава 7. Командный интерфейс прикладных решений В состав команд формы входят: ■■ стандартные команды формы – обеспечивают работу с формой; ■■ стандартные команды расширения основного реквизита формы – обеспечивают обработку данных формы; ■■ стандартные команды расширений табличных элементов формы – обеспечивают обработку данных формы; ■■ произвольные команды формы – назначение команды определяется разработчиком; Глобальные команды, доступные в форме, включают в себя: ■■ независимые глобальные команды; ■■ часть параметризованных глобальных команд – те, для которых в форме существует источник параметра требуемого типа. При разработке командного интерфейса формы разработчик должен ответить на вопросы: Рис. 7.212. Зависимость доступности команды от значения функциональной опции Краткие итоги Все команды, которые могут присутствовать в форме, можно разделить на два класса (рис. 7.213): ■■ локальные команды формы – обеспечивают доступ к функциональности формы; ■■ глобальные команды – обеспечивают доступ к функциональности приложения. ■■ какие действия нужно будет выполнять с данными – для обработки данных используются команды формы; ■■ какие дополнительные данные (помимо данных формы) должны быть доступны и какие дополнительные действия (помимо обработки данных формы) необходимо выполнять – для обеспечения этой функциональности используется подмножество глобальных команд; ■■ каким пользователям будут доступны команды – выполнить ролевую настройку доступности; ■■ как должна выглядеть форма – настроить размещение и видимость команд. Для редактирования состава команд формы, их расположения и видимости используется редактор формы. В редакторе формы описывается состав команд командной панели формы и состав команд панели навигации вспомогательного окна приложения, в котором форма отображается. Часть команд в командную панель и в панель навигации помещается системой автоматически. В редакторе форм разработчик эти команды удалить не может, но он может настроить видимость этих команд в разрезе ролей пользователей. Для того чтобы пользователь смог вызвать команду, она должна быть связана с элементом формы Кнопка (закладка Элементы редактора форм) или помещена в командный интерфейс (закладка Командный интерфейс редактора форм). Рис. 7.213. Классификация команд формы 232 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Глава 8. Разработка форм Конструирование форм Форма «1С:Предприятия» Концепция построения форм В данном разделе будет освещаться вопрос создания и конструирования управляемых форм в режиме Конфигуратор. Форма является важнейшим связующим звеном в цепи «пользователь – данные». Именно в формах мы редактируем данные, вводим новую информацию, видим результаты работы. Формы «1С:Предприятия» наделены различными возможностями, как построения, так и отображения данных. В большинстве случаев от разработчика не требуется заботиться о том, как на экране будет выглядеть тот или иной элемент, система сама сможет позаботиться об этом. От разработчика требуется правильно настроить интерфейсные свойства объекта конфигурации, на основании которых и будет построено нужное представление. Управляя размещением элементов в форме, разработчик должен «посоветовать» системе те или иные способы группировки элементов, порядок их размещения. Естественно, платформа предоставляет возможности взять под контроль некоторые этапы разработки формы, но данное действие не является приоритетным. Задача разработчика состоит не в детальном, «попиксельном», размещении элементов на форме, не в описании сложных привязок, а в логическом описании состава формы. Необходимо описать состав формы в виде дерева элементов, которые будут отображать данные, добавить в описание необходимые реквизиты и команды. Скомпоновать элементы в логические группы, определить порядок обхода элементов формы. Существует возможность перенастройки командных панелей формы, дополнительных кнопок у элементов формы, объединения элементов в группы, распределения их по страницам, настройки колонок списков. Однако все эти возможности призваны лишь помочь системе в построении формы, а не полностью заменить это построение ручным способом. Помимо простого открытия форм для просмотра или редактирования данных, существует возможность открытия с установленным отбором, с выделением каких-либо конкретных данных из общего числа. Помочь в этом может, например, программная установка отборов и параметризированные команды. При построении форм системой учитываются не только настройки самой формы, сделанные разработчиком. Влияние на поведение формы и ее элементов оказывают настройки прав пользователей, ролей, доступных пользователю, применяемые к сеансу работы приложения функциональные опции – тоже новшество управляемого приложения, настройки, которые делал сам пользователь в сеансе своей работы. Отдельно стоит упомянуть о возможностях форм сообщать пользователю об ошибках, возникающих в процессе работы. Например, это может быть сообщение о незаполненном поле, данные в которое должны быть внесены обязательно. Система сообщит о таком типе ошибки, выделив и активизировав именно этот элемент. Формы как элемент общения программы с пользователем Помимо «стандартных» форм различных объектов конфигурации (справочников, документов, регистров и пр.), существует одна особенная форма – рабочий стол. Именно с него и начинается работа пользователя с системой. Полученное от разработчика описание формы, другие факторы, влияющие на внешний вид и функциональность формы, помогут системе построить форму на экране и тем самым освободить ресурсы разработчика не для «рисования», а для разработки функциональности конкретного прикладного решения. Можно сказать, что рабочий стол призван быть лицом разрабатываемого приложения, его визитной карточкой. Именно на рабочий стол необходимо при проектировании интерфейса приложения выносить всю необходимую в первую очередь информацию. Это могут быть списки наиболее часто используемых документов, справочников, данные отчетов, формы обработок. Разработчик может влиять на расположение и внешний вид элементов формы. Для этого у него в руках инструмент свойств элементов формы. Сказать, что на рабочем столе отображаются просто данные, неверно. На рабочем столе отображаются формы других объектов конфигурации. Том 1 233 Глава 8. Разработка форм И, как уже было сказано ранее, на рабочий стол оказывает влияние все то, что способно повлиять на любую форму прикладного решения – права доступа, функциональные опции, настройки пользователя. Именно отображение других форм и выделяет рабочий стол из всех форм конфигурации. Подробнее Раздел «Рабочий стол», стр. 279. Формы «1С:Предприятия» являются независимыми от объектов конфигурации. Это означает, что форма может быть подчинена какому-либо объекту конфигурации, например справочнику, но отображать данные совсем другого объекта, например, документа. Для формы может быть назначен основной реквизит, который частично определяет поведение формы, то, какие данные в такой форме можно просматривать, редактировать, как будет вести себя форма в той или иной ситуации. Процесс создания и открытия формы, отображающей объектные данные (у формы определен основной реквизит), выглядит так: ■■ объект считывается из базы данных на сервере; ■■ объект конвертируется в данные формы (создание формы на сервере); ■■ объект удаляется из памяти; ■■ данные формы передаются на клиента (создание формы на клиенте). Запись данных формы в информационную базу происходит только на сервере: ■■ данные формы получаются с клиента, ■■ данные формы конвертируются в объект, ■■ объект записывается в базу данных, ■■ объект удаляется из памяти. Графически все вышесказанное можно изобразить в виде схемы (рис. 8.1). Некоторые формы открываются не в окне основного приложения, а в отдельном вспомогательном окне. Таким образом, переключаться между формами в некоторых случаях можно с помощью панели задач операционной системы. Для навигации по прикладному решению существует основное окно. Для решения задач, не связанных с навигацией по приложению, например, создание новых элементов справочников, добавление документов, подготовка отчетности, используются вспомогательные окна. Количество вспомогательных окон платформой не ограничивается. Модальные окна применяются для вспомогательных задач, например, ввод и выбор каких-либо данных. «1С:Предприятие» позволяет вообще не описывать форму в конфигураторе. При обращении к объекту в пользовательском режиме система сгенерирует необходимую форму самостоятельно. Если разработчиком прикладного решения не планируется вносить изменения в работу и поведение формы, например, менять порядок обхода элементов, добавлять команды, описывать с помощью встроенного языка алгоритмы заполнения, то создавать форму в режиме Конфигуратор необязательно. Рис. 8.1. Взаимодействие формы и базы данных Среда существования формы В процессе своего создания форма проходит через определенный фильтр различных факторов (рис. 8.2), влияющих на ее внешний вид. Это совокупность ролей (прав доступа), назначенных пользователю разработчиком прикладного решения, функциональные опции приложения, настройки, сделанные пользователем в предыдущем и текущем сеансе работы. Форма существует одновременно и на сервере, и на клиенте. Связь элементов формы с данными информационной базы осуществляется с помощью реквизитов формы (данные формы). Все данные, которые планируется отображать или редактировать в форме, должны быть обязательно описаны в виде реквизитов. Между клиентом и сервером происходит обмен не только данными формы, но и ее оформительскими свойствами. К оформительским относятся все свойства формы, влияющие на ее внешний вид. Таким образом, достигается полное соответствие внешнего вида формы и на клиенте, и на сервере. 234 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Рис. 8.3. Выбор типа общей формы Рис. 8.2. Процесс открытия формы Создание формы Создание формы с помощью конструктора Флажок Использовать стандартные команды позволяет автоматически добавить в интерфейс подсистемы, в состав которой будет входить форма, команды ее открытия. Существует несколько способов создать форму, подчиненную какомулибо объекту конфигурации: ■■ воспользоваться кнопкой Открыть (рис. 8.4) в палитре свойств объекта конфигурации, у нужного типа формы; Создание новой формы начинается с конструктора форм. Модификация формы, созданной конструктором, осуществляется в редакторе формы. Подробнее Раздел «Редактирование формы», стр. 240. В конфигурации могут существовать формы, подчиненные объектам конфигурации, и общие формы. Общие формы располагаются в дереве конфигурации, в ветке Общие – Общие формы. Конструктор форм различает, какая форма будет создаваться – подчиненная объекту или общая. При создании общей формы конструктор предлагает выбрать тип формы из двух возможных (рис. 8.3): ■■ Произвольная форма – данные, с которыми будет взаимодействовать форма, будут определены разработчиком в дальнейшем, в процессе разработки; ■■ Форма констант – форма, с помощью которой будет осуществляться взаимодействие с константами конфигурации. По умолчанию конструктор общих форм предлагает создать произвольную форму. Связано это с тем, что, как правило, форма редактирования констант в прикладном решении одна, и в подавляющем большинстве случаев разработчик будет создавать именно произвольные общие формы. Рис. 8.4. Создание формы кнопкой «Открыть» ■■ выделить в дереве конфигурации ветвь Формы объекта, для которого будет создаваться форма, и воспользоваться либо контекстным меню, либо кнопкой Добавить на панели дерева конфигурации (рис. 8.5); Рис. 8.5. Создание формы кнопкой «Добавить» Том 1 235 Глава 8. Разработка форм ■■ открыть окно редактирования объекта конфигурации, перейти на закладку Формы и воспользоваться либо кнопкой Открыть у необходимого типа формы, либо кнопкой командной панели этого окна Добавить, либо контекстным меню в списке форм (рис. 8.6). ■■ для объекта Журнал документов – это форма журнала (рис. 8.9); Рис. 8.9. Типы форм объекта «Журнал документов» ■■ для объекта Отчет – это форма отчета, варианта, настроек (рис. 8.10); Рис. 8.6. Создание формы из окна редактирования объекта При использовании любого из вышеперечисленных способов будет открыто окно конструктора формы объекта конфигурации. В зависимости от вида объекта, его свойств конструктором будут предложены характерные для текущего режима создания типы форм: ■■ для объекта Справочник это будет форма списка, выбора, элемента. Если справочник иерархический, то возможно создание формы группы и выбора группы (рис. 8.7); Рис. 8.10. Типы форм объекта «Отчет» ■■ для объекта Обработка это форма обработки (рис. 8.11); Рис. 8.11. Типы форм объекта «Обработка» ■■ для объекта План видов характеристик – это форма списка, выбора, вида. Если план видов характеристик иерархический, то возможно создание формы группы и выбора группы. Если объект неиерархический, то создание форм группы недоступно (рис. 8.12); Рис. 8.7. Типы форм объекта «Справочник» ■■ для объекта Документ – это форма списка, выбора, документа (рис. 8.8); Рис. 8.12. Типы форм объекта «План видов характеристик» ■■ для объекта План счетов – это форма списка, выбора, счета (рис. 8.13); Рис. 8.8. Типы форм объекта «Документ» Рис. 8.13. Типы форм объекта «План счетов» 236 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ■■ для объекта План видов расчета – это форма списка, выбора, вида (рис. 8.14); Рис. 8.14. Типы форм объекта «План видов расчета» ■■ для объекта Регистр сведений – это форма списка, записи, набора записей (рис. 8.15); Рис. 8.15. Типы форм объекта «Регистр сведений» ■■ для объекта Регистр накопления – это форма списка и набора записей (рис. 8.16). Рис. 8.16. Типы форм объекта «Регистр накопления» ■■ для объекта Регистр бухгалтерии – это форма списка и набора записей (рис. 8.17); ■■ для объекта Бизнес-процесс – это форма списка, выбора, бизнеспроцесса (рис. 8.19); Рис. 8.19. Типы форм объекта «Бизнес-процесс» ■■ для объекта Задача – это форма списка, выбора, задачи (рис. 8.20); Рис. 8.20. Типы форм объекта «Задача» ■■ для объекта Критерий отбора – это форма критерия отбора (рис. 8.21); Рис. 8.21. Типы форм объекта «Критерий отбора» ■■ для объекта План обмена – это форма списка, выбора и узла (рис. 8.22). Рис. 8.17. Типы форм объекта «Регистр бухгалтерии» ■■ для объекта Регистр расчета – это форма списка и форма набора записей (рис. 8.18); Рис. 8.22. Типы форм объекта «План обмена» Кроме всех перечисленных форм, для любого из объектов конфигурации можно создать тип формы Произвольная. Такая форма после создания не связана ни с какими данными конфигурации. Действия, которые можно будет выполнять в такой форме, целиком и полностью будут зависеть от желания и способностей разработчика формы. Рис. 8.18. Типы форм объекта «Регистр расчета» Том 1 237 Глава 8. Разработка форм Формы, связанные через свой основной реквизит с объектами конфигурации, уже наделены определенными свойствами, характеристиками, методами. Состав таких свойств, характеристик, методов зависит от объекта конфигурации. конфигурации создаваемый тип форм еще не создавался (нет формы создаваемого типа), то флажок Назначить форму основной устанавливается автоматически. Например, форму редактирования констант можно создать с помощью контекстного меню ветви конфигурации Константы (рис. 8.23). Созданная таким образом форма будет размещаться в ветви конфигурации Общие формы. Рис. 8.23. Создание формы констант При выборе того или иного типа создаваемой формы конструктор форм автоматически формирует Имя и Синоним формы. При формировании учитывается наличие у объекта конфигурации формы с таким именем. Если такая форма существует, то к имени создаваемой формы добавится числовой показатель (рис. 8.24). Рис. 8.25. Создание основной формы В дальнейшем основную форму объекта можно переопределить. Как это сделать, будет рассказано в разделе, посвященном редактору форм. Для некоторых типов форм конструктор предоставляет возможность использовать их одновременно в качестве формы элемента и формы группы (рис. 8.26). Рис. 8.24. Формирование имени формы Если разработчика не устраивает имя формы, которое предлагает конструктор, то его можно изменить. При этом возможно автоматическое формирование и нового синонима формы. Синоним формы – имя, под которым форма может фигурировать в интерфейсе пользователей прикладного решения. Синоним формы также можно изменить. При необходимости можно определить создаваемую форму в качестве основной формы для объекта конфигурации. Для этого необходимо установить флажок Назначить форму основной (рис. 8.25). Если для объекта 238 Рис. 8.26. Назначение формы в качестве нескольких основных форм На этом работу с конструктором форм можно закончить (кнопка Готово) или перейти к следующему шагу (кнопка Далее), который позволит продолжить конструирование формы. На этом шаге разработчик дает указания конструктору форм на необходимость использования реквизитов объекта (или состава констант для формы констант) в создаваемой форме. Делается это с помощью установки соответствующего флажка. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Здесь же можно определить, сколько колонок с элементами формы будет применяться для отображения данных (рис. 8.27). Рис. 8.28. Сообщения об ошибках при копировании форм Кроме копирования с использованием буфера обмена операционной системы, также доступен метод перетаскивания форм с помощью мыши. Необходимо лишь захватить нужную форму и перетащить в новое место. Копируемые формы можно подчинять другим объектам конфигурации. Так, например, мы можем скопировать форму некоего объекта в другой объект. Если в объекте, куда осуществляется копирование, уже существует форма с таким именем, то новой форме будет присвоено имя, к которому добавится порядковый номер (рис. 8.29). Рис. 8.27. Определение состава формы в конструкторе форм ВНИМАНИЕ! Управлять порядком следования элементов разрабатываемой формы в данном окне конструктора формы разработчик не может. Это можно сделать либо предварительно (определив порядок реквизитов объекта), либо после окончания работы конструктора (в окне редактора формы). ПРИМЕЧАНИЕ Все настройки, сделанные на втором шаге в конструкторе форм, можно потом изменить, поэтому сильно задумываться, например, о количестве колонок элементов, если вы еще не представляете в уме внешнего вида формы, не следует. Отказаться от создания новой формы можно на любом этапе работы конструктора форм. Для этого необходимо или закрыть окно стандартным для всех окон операционной системы способом, или нажать кнопку Отмена. Рис. 8.29. Формирование имени формы при копировании ВНИМАНИЕ! При копировании формы происходит только лишь ее переподчинение в дереве конфигурации. Назначение формы, данные, с которыми она взаимодействует, при копировании не изменяются. Это означает, что, например, если скопировать форму справочника в другой справочник, то форма по-прежнему будет работать с данными первого справочника. Создание формы методом копирования Кроме создания форм с помощью конструктора, разработчику прикладного решения доступен вариант создания формы с помощью метода копирования. Через буфер обмена операционной системы можно скопировать формы как текущей, так и любой произвольной конфигурации. При этом если платформа не может правильно сопоставить какие-либо свойства формы, свойства ее реквизитов, типы значений и прочее, разработчик будет об этом немедленно уведомлен (рис. 8.28). Том 1 239 Глава 8. Разработка форм Редактирование формы Описание редактора формы Для редактирования формы в конфигураторе используется специализированный редактор форм. Окно редактора форм разбито на несколько областей (рис. 8.30), каждая из которых отвечает за ту или иную функциональность будущей формы. Рис. 8.31. Модуль формы Рис. 8.30. Окно редактора формы 1. Описывается состав и порядок элементов, из которых состоит форма, команды интерфейса, которые могут выполняться в форме. 2. Описывается состав реквизитов формы, а также команды, выполняемые внутри формы. 3. Представлен внешний вид формы, как она может выглядеть на экране пользователя, с учетом описанных реквизитов, элементов, команд формы. При изменении каких-либо настроек в окнах редактора они тут же применяются и изменяют вид формы. Рис. 8.32. Редактор модуля формы С помощью закладки Параметры редактора формы можно попасть в окно редактирования параметров формы (рис. 8.33). Программный модуль описывает работу формы на встроенном языке. Для редактирования модуля формы можно воспользоваться закладкой Модуль, которая расположена внизу редактора форм. В модуле формы располагаются обработчики событий формы, элементов формы, команд формы. Помимо предопределенных обработчиков событий разработчик прикладного решения может создавать в модуле формы свои процедуры и функции (рис. 8.31). Модуль формы, так же как и другие модули конфигурации, редактируется в специализированном редакторе, в котором для удобства работы разработчика предусмотрены различные интерфейсные команды и меню (рис. 8.32). Рис. 8.33. Редактирование параметров формы 240 Профессиональная разработка в системе «1С:Предприятие 8» С помощью параметров формы организовано управление функциональностью формы при ее открытии в пользовательском режиме работы Конструирование форм приложения. Если это имеет смысл, разработчик может изменить параметры формы уже в процессе ее работы. Кроме параметров, описанных разработчиком формы, при ее вызове и работе доступны параметры, автоматически предоставляемые расширением формы. Для разных объектов конфигурации, определяющих основной реквизит формы, набор параметров различается. Иерархия элементов формы Форма описывается разработчиком прикладного решения в виде иерархического дерева (рис. 8.36). На состав параметров формы, предоставляемых основным реквизитом формы, влияет окружение объекта конфигурации, его свойства. Примером может служить параметр Основание, если это форма документа и этот документ может вводиться на основании какого-либо объекта. Подробнее Раздел «Параметры и реквизиты формы», стр. 284. Раздел «Открытие форм», стр. 285. Создание, изменение и удаление элементов формы, команд, реквизитов и прочее осуществляются с помощью кнопок командных панелей соответствующих областей редактора формы (рис. 8.34). Рис. 8.36. Иерархия элементов формы Все элементы формы подчинены корневому элементу Форма. Свойства элементов дерева зависят от свойств, которыми наделены элементы вышестоящего уровня. При этом каждый из элементов обладает своими уникальными свойствами, характерными только для него. Влияние свойств элементов дерева друг на друга (имеются в виду одинаковые свойства, например Ширина) является обоюдным. Таким образом, свойства нижнего уровня могут оказывать влияние на свойства верхнего уровня иерархии, и наоборот. Подробнее Примеры влияния свойств элементов дерева друг на друга рассматриваются в разделе «Примеры конструирования форм», стр. 269. Рис. 8.34. Командные панели редактора формы Кроме того, для осуществления ряда действий доступны контекстные меню и перетаскивание с помощью мыши (рис. 8.35). Свойства элементов верхнего уровня иерархии оказывают влияние на подчиненные элементы не только в процессе работы приложения, но и на этапе разработки. Такая зависимость достаточно хорошо видна при добавлении новых элементов формы. Так, например, свойство Вид элемента формы зависит от расположения элемента в иерархии элементов формы. Свойства формы Форма обладает рядом свойств, которые присущи ей всегда. Ряд свойств формы определяется ее основным реквизитом. Именно основной реквизит формы определяет ее поведение, вид, состав команд, другие дополнительные возможности, предоставляемые разработчику формы и ее пользователю. Рис. 8.35. Контекстное меню редактора формы Том 1 Для редактирования свойств формы необходимо воспользоваться контекстным меню формы (пункт меню Свойства) в дереве объектов конфигурации либо контекстным меню (пункт меню Свойства) ветви Форма в области редактирования элементов формы редактора формы (рис. 8.37). 241 Глава 8. Разработка форм Подробнее Раздел «Влияние объектов конфигурации на форму», стр. 253. Положение командной панели Рис. 8.37. Открытие окна «Свойства» формы Свойство ПоложениеКоманднойПанели определяет положение командной панели формы. Свойство может принимать одно из четырех значений: Нет, Авто, Верх (рис. 8.40), Низ (рис. 8.41). По умолчанию системой устанавливается значение Авто. Это означает, что командная панель располагается вверху. Рассмотрим основные свойства формы (рис. 8.38). Рис. 8.40. Расположение командной панели формы сверху Рис. 8.38. Основные свойства формы Заголовок Свойство Заголовок определяет заголовок формы (рис. 8.39), как его будет видеть разработчик в окне предварительного просмотра формы и пользователь во время работы с формой. Заголовок формы может быть дополнен системной информацией, полученной из свойств объекта конфигурации, связанных с расширенным представлением объектов, списков. Такое влияние на свойство Заголовок возможно, если установлено свойство АвтоЗаголовок. Рис. 8.41. Расположение командной панели формы снизу Доступность Доступность. Снятие флажка у этого свойства означает, что все элементы формы недоступны (рис. 8.42). для редактирования пользователем формы Рис. 8.42. Управление доступностью формы Режим открытия окна Рис. 8.39. Заголовок формы 242 Свойство РежимОткрытияОкна определяет, в каком окне будет открываться форма. Возможны значения Независимый и Блокировать окно владельца. Режим Блокировать окно владельца похож на модальный режим, однако, в отличие от модального режима, при открытии формы из встроенного языка работа модуля не останавливается. При открытии происходит блокировка только «родительского» окна, другие окна приложения остаются доступными. В режиме Независимый окно формы не препятствует возможности переключения между окнами приложения. В таком режиме форма живет своей, не мешающей остальным формам жизнью. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Ширина, высота Условное оформление Ширина, Высота. Свойства позволяют задать размеры формы. При этом Гиперссылка Открыть позволяет открыть окно Настройка условного оформления. В данном окне можно настроить, например, выделение цветом некоторого элемента в зависимости от значений других элементов формы. дочерние элементы формы будут отмасштабированы так, чтобы все они уместились на форме. Если это невозможно, у формы появятся горизонтальные и вертикальные полосы прокрутки. Значения свойств задаются числом условных символов. Значение по умолчанию 0 означает автоматический подбор свойства. При автоматическом подборе свойств системой будет сделана попытка размещения элементов формы таким образом, чтобы полосы прокрутки не были задействованы. Там, где это возможно, элементы формы будут отмасштабированы. Группировка Возможные значения свойства Вертикальная или Горизонтальная. Свойство определяет режим группировки подчиненных элементов формы. При значении Вертикальная элементы формы располагаются сверху вниз. При значении Горизонтальная элементы будут располагаться слева направо. Настройка влияет только на элементы верхнего уровня иерархии подчиненных элементов. Порядок расположения элементов формы, находящихся внутри групп, определяется свойством Группировка соответствующей группы элементов. Ширина подчиненных элементов Свойство ШиринаПодчиненныхЭлементов позволяет автоматически формировать ширину элементов формы. Применять данное свойство имеет смысл только при горизонтальной группировке элементов формы. Подробнее Пример влияния свойства рассматривается в разделе «Примеры конструирования форм», стр. 269. Проверять заполнение автоматически Установленный флажок ПроверятьЗаполнениеАвтоматически означает автоматическую проверку заполнения реквизитов формы при работе пользователя. Подробнее Механизм проверки заполнения реквизитов формы рассматривается в разделе «Окно сообщений формы», стр. 268, и в разделе «Проверка заполнения», стр. 310. Подробнее Примеры рассматриваются в разделе «Как настроить условное оформление динамического списка», стр. 278, и в разделе «Оформление списков», стр. 332. Разрешить изменять форму Флажок РазрешитьИзменятьФорму определяет возможность изменения формы в пользовательском режиме работы. ВНИМАНИЕ! Настройка форм в пользовательском режиме работы является стандартной возможностью, предоставляемой платформой. Это означает, что пользователь может изменить порядок элементов формы, перегруппировать их, изменить их видимость. С помощью свойства РазрешитьИзменятьФорму такую возможность можно пресечь. Вместо запрещения изменения всей формы разработчик может применять «точечные» запреты для конкретных элементов формы. Свойства, с помощью которых можно запрещать изменения элементов формы, рассматриваются ниже в разделах, посвященных элементам формы. Примеры настройки свойств рассматриваются в разделе «Как и зачем объединять элементы формы в группы», стр. 269. Виды элементов формы В форме используются пять элементов: ■■ Группа: □□ Обычная группа; □□ Группа – Страницы; □□ Группа – Командная панель; ■■ Поле; ■■ Кнопка; ■■ Таблица; ■■ Декорация: □□ Декорация – Надпись; □□ Декорация – Картинка. Для того чтобы добавить в состав формы новый элемент определенного вида, необходимо воспользоваться одним из этих пяти элементов. Том 1 243 Глава 8. Разработка форм Для отображения различных данных прикладного решения необходимо изменять свойство элемента формы Вид. ■■ Поле картинки. Поле, отображающее картинку (рис. 8.47); При добавлении нового элемента редактором формы будет проанализировано свойство Данные (с каким реквизитом будет связан элемент формы). В зависимости от этого платформа позволит выбрать один из нескольких возможных видов этого элемента. Открытие свойств элементов формы ничем не отличается от рассматриваемого ранее открытия свойств формы. Поле Элемент формы Поле предназначен для отображения примитивных типов данных, текстовых, табличных, HTML-документов, диаграмм, календарей, индикаторов. Тип данных, которые отображает элемент Поле, влияет на то, какие значения может принимать его свойство Вид. ■■ Поле надписи. Поле, недоступное для непосредственного редактирования (рис. 8.43) в пользовательском режиме работы; Рис. 8.47. Элемент формы «Поле картинки» ■■ Поле текстового документа. Поле для редактирования и просмотра текстовых данных (рис. 8.48); Рис. 8.43. Элемент формы «Поле надписи» ■■ Поле ввода. Поле, допускающее редактирование данных (рис. 8.44); Рис. 8.44. Элемент формы «Поле ввода» ■■ Поле переключателя. Поле, позволяющее выбрать один из нескольких вариантов значения с помощью отметки нужного (рис. 8.45); Рис. 8.45. Элемент формы «Поле переключателя» Рис. 8.48. Элемент формы «Поле текстового документа» ■■ Индикатор. Поле, предназначенное для графического отображения текущего состояния реквизита формы (рис. 8.49). Данные поля должны иметь числовой тип данных; Рис. 8.49. Элемент формы «Индикатор» ■■ Поле полосы регулирования. Поле, предназначенное для ввода числовых данных с помощью шкалы (рис. 8.50); ■■ Поле HTML-документа. Поле для редактирования и просмотра HTMLресурсов (рис. 8.46); Рис. 8.50. Элемент формы «Поле полосы регулирования» ■■ Флажок. Поле, предназначенное для отображения или установки одного из значений (рис. 8.51). Применяются флажки с двумя состояниями (включен, выключен) или с тремя (включен, выключен, не определен); Рис. 8.46. Элемент формы «Поле HTML-документа» 244 Рис. 8.51. Элемент формы «Флажок» Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ■■ Поле календаря. Поле, предназначенное для выбора и отображения даты в виде календаря (рис. 8.52). Для добавления на форму элемента Поле календаря необходим реквизит типа Дата; ■■ Поле диаграммы. Поле, отображающее различные виды диаграмм (рис. 8.55). Для добавления элемента формы Поле диаграммы необходимо добавить форме реквизит типа Диаграмма; Рис. 8.52. Элемент формы «Поле календаря» ■■ Поле графической схемы. Поле для просмотра и редактирования графических схем (рис. 8.53), созданных в специализированном редакторе, входящем в состав «1С:Предприятия». Для добавления элемента Поле графической схемы необходимо добавить форме реквизит типа Графическая схема (рис. 8.54); Рис. 8.55. Элемент формы «Поле диаграммы» ■■ Поле диаграммы Ганта. Поле, отображающее диаграмму Ганта (рис. 8.56). Для добавления элемента формы Поле диаграммы Ганта необходимо добавить форме реквизит типа ДиаграммаГанта; Рис. 8.56. Элемент формы «Поле диаграммы Ганта» Рис. 8.53. Элемент формы «Поле графической схемы» ■■ Поле дендрограммы. Поле, отображающее связи объектов; ■■ Поле табличного документа. Поле, в котором отображаются и редактируются данные. Как правило, используется для отображения результатов работы отчетов (рис. 8.57), печатных форм. Может использоваться для ввода данных. Для добавления элемента формы Поле табличного документа необходимо добавить форме реквизит типа Табличный документ. Рис. 8.57. Элемент формы «Поле табличного документа» Рис. 8.54. Тип реквизита «Графическая схема» Том 1 245 Глава 8. Разработка форм Группа Элемент формы Группа предназначен для группировки других элементов формы, их выделения, для создания командных панелей, подменю, групп кнопок, страниц. Свойство Вид элемента формы Группа может принимать значения: ■■ Обычная группа. Элемент формы, предназначенный для логической группировки других элементов формы (рис. 8.58). Элемент Обычная группа может не отображаться на форме, выполняя при этом функции группировки других элементов. Может отображаться в виде Рамка группы, Линия, Отступ; Рис. 8.58. Элемент формы «Обычная группа» ■■ Командная панель. Элемент формы, предназначенный для группировки кнопок и команд (рис. 8.59); ■■ Группа кнопок. Элемент формы, подчиненный элементу Командная панель, позволяющий сгруппировать кнопки в логические группы. Сам элемент не отображается на форме, но кнопки одной группы отделяются от кнопок другой группы вертикальными линиями; ■■ Страницы. Элемент формы, представляющий собой набор страниц (рис. 8.61); Рис. 8.61. Элемент формы «Страницы» ■■ Страница. Элемент формы, который может быть создан только как подчиненный элементу Страницы. Представляет собой отдельную страницу с данными (рис. 8.62). В пользовательском режиме работы страницы, на которых отсутствуют данные, не отображаются. Рис. 8.59. Элемент формы «Командная панель» ■■ Подменю. Элемент формы, подчиненный элементу Командная панель и представляющий собой выпадающее меню (рис. 8.60); Рис. 8.62. Элемент формы «Страница» Рис. 8.60. Элемент формы «Подменю» 246 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Таблица Элемент формы Таблица (рис. 8.63) предназначен для отображения и редактирования различных табличных данных. У Таблицы могут быть свои командные панели, контекстные меню. Поля колонок элемента Таблица могут принимать различные виды. ■■ Кнопка формы. Элемент формы (рис. 8.66), представляет собой кнопку, расположенную не на командной панели формы. Если для кнопки не назначена команда, которая будет выполняться при нажатии, то кнопка в пользовательском режиме не отображается. Рис. 8.63. Элемент формы «Таблица» Кнопка Элемент формы Кнопка предназначен для создания кнопок, гиперссылок. Свойство Вид элемента формы Кнопка может принимать значения: ■■ Кнопка командной панели. Элемент представляет собой обыкновенную кнопку (рис. 8.64). Если для кнопки не назначена команда, которая будет выполняться при нажатии, то кнопка в пользовательском режиме не отображается. Рис. 8.64. Элемент формы «Кнопка командной панели» Рис. 8.66. Элемент формы «Кнопка формы» Для всех элементов формы характерно наличие контекстного меню, вызываемого с помощью мыши или клавиатуры. В большинстве случаев во время работы приложения контекстные меню формируются платформой автоматически. Однако для повышения уровня работы пользователей с формами разработчик может вмешаться в этот процесс и повлиять на состав контекстного меню. Получить доступ к контекстному меню элемента формы можно через контекстное меню элемента формы в редакторе форм (рис. 8.67). ■■ Гиперссылка. Элемент формы (рис. 8.65). Если для гиперссылки не назначена команда, которая будет выполняться при нажатии, то гиперссылка в пользовательском режиме не отображается. Рис. 8.65. Элемент формы «Гиперссылка» Рис. 8.67. Доступ к контекстному меню элемента формы Том 1 247 Глава 8. Разработка форм После включения пункта контекстного меню элемента формы Показать контекстное меню для текущего элемента появится возможность доступа к его контекстному меню. Если разработчик желает модифицировать автоматически формируемое контекстное меню элемента формы, то флажок Автозаполнение в свойствах Контекстное меню элемента снимать не следует (рис. 8.68). В случае необходимости формирования полностью своего контекстного меню флажок следует снять. Рис. 8.68. Автозаполнение контекстного меню Свойства элементов формы Свойства элементов формы оказывают влияние как на внешний вид элементов в пользовательском режиме работы, так и на функциональность этих элементов. Перечень и описание всех свойств элементов формы не входят в задачи книги. В рамках текущего раздела будут рассмотрены лишь некоторые из них. Подробнее Свойства, связанные с проверкой заполнения элементов формы, рассматриваются в разделе «Окно сообщений формы», стр. 268. Рис. 8.69. Свойство элемента формы «Положение заголовка» Активизировать элемент формы при ее открытии можно, установив свойство Активизировать по умолчанию. Это поможет избавить пользователя от лишних действий по переходу на нужный элемент формы и обратит его внимание на самый важный (с точки зрения работы приложения) элемент. Свойства группы Давайте ознакомимся с некоторыми свойствами элемента формы Группа вида Обычная группа (рис. 8.70), каковым и является элемент формы с именем Шапка. Свойства, оказывающие влияние на видимость элементов формы, рассматриваются в разделе «Примеры конструирования форм», стр. 269. Свойство элемента формы Имя предназначено для задания уникального имени элемента в пределах формы. По имени можно обращаться к элементам формы из встроенного языка. Свойство Заголовок позволяет системе сформировать понятную для пользователя подпись элемента формы. Для многих элементов формы доступно свойство Положение заголовка, которое позволяет управлять расположением подписи элемента формы (рис. 8.69). Через свойство Данные определяется связь элемента формы с теми данными, которые будут отображаться и редактироваться. При установленном свойстве Пропускать при вводе элемент будет пропускаться при обходе элементов формы клавишей Enter. Рис. 8.70. Свойства элемента формы «Группа» 248 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ■■ Ширина, Высота – свойства позволяют управлять шириной и высотой группы. Значения задаются в символах. При значении 0 действует автоматический расчет. Значения, введенные в поля, влияют не только на саму группу, но и на ее подчиненные элементы; ■■ Разрешить изменение состава – определяет возможность редактирования состава группы в пользовательском режиме работы; ■■ Группировка – свойство может принимать два значения: Горизонтальная и Вертикальная. Определяет, как будут группироваться подчиненные элементы. Примером вертикальной группировки (рис. 8.71) служат элементы групп Предприятия и Организации. Обе эти группы объединены горизонтальной группировкой Настройки. ■■ Ширина подчиненных элементов – свойство, позволяющее управлять шириной подчиненных элементов группы. Возможны значения Авто, Одинаковая (рис. 8.72), Левый широкий, Левый очень широкий, Левый узкий, Левый очень узкий. Рис. 8.71. Группировка элементов формы ■■ Отображение – свойство, оказывающее влияние на внешний вид элемента формы Группа. Так, группа Предприятия имеет свойство Отображение – Линия (рис. 8.71), а группа Организации – Рамка группы. ВНИМАНИЕ! На практике применять различное отображение элементов формы Группа в одной форме не стоит. Для демонстрации всех возможных вариантов оформления элементов формы лучше создать специализированную демонстрационную форму и ловить восхищенные взгляды пользователей, демонстрируя именно ее. Рис. 8.72. Управление свойством «Ширина подчиненных элементов» ■■ Для элемента формы Группа вида Страницы интерес представляет свойство Отображение страниц (рис. 8.73). Данное свойство управляет положением закладок страницы. Если используется вариант свойства Нет, то при наличии нескольких страниц их переключение можно осуществлять только средствами встроенного языка. Рис. 8.73. Свойство «Отображение страниц» Том 1 249 Глава 8. Разработка форм ■■ Свойство Горизонтальное положение элемента формы Группа вида Командная панель позволяет управлять положением кнопок на панели (рис. 8.74). ■■ Свойство Маска позволяет задать маску для ввода символов (рис. 8.76). Рис. 8.74. Свойство «Горизонтальное положение» Свойства поля ■■ Свойства Ширина, Высота управляют размерами элемента Поле при формировании внешнего вида формы. ■■ Свойство Горизонтальное положение позволяет управлять расположением элемента на форме. Рис. 8.76. Свойство «Маска» ■■ Свойство Режим пароля при установке значения Да будет заменять вводимые символы специализированным символом (рис. 8.77). Наибольший интерес (в плане разнообразия свойств и частоты использования) представляет элемент формы Поле с видом Поле ввода. ■■ Свойство Выбирать тип влияет на поведение системы при выборе типа данных реквизита, который обслуживает поле ввода. Проявляется это в случае использования реквизита составного типа данных (рис. 8.75). Рис. 8.77. Свойство «Режим пароля» ■■ Свойства Список выбора (рис. 8.78, позволяет задать список, из которого можно выбирать значения в поле ввода); Кнопка списка выбора (позволяет явно указать наличие у Поля ввода кнопки); Высота списка выбора и Ширина списка выбора (управляют шириной и высотой выпадающего списка) позволяют управлять выпадающим списком для выбора значения. Рис. 8.75. Свойство «Выбирать тип» 250 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ■■ Свойства Минимальное значение и Максимальное значение позволяют ограничить ввод числовых значений. При этом системой будет контролироваться соответствие вводимого числа заданным критериям. ■■ Свойство Быстрый выбор позволяет выбирать значения ссылочных типов из списка, а не из формы выбора. Свойством имеет смысл пользоваться, если у реквизита, отображаемого элементом, это свойство не установлено или его действие необходимо переопределить. ■■ Свойство Выбор групп и элементов позволяет ограничить выборку данных, например, только элементами иерархического справочника. ■■ Свойство Связи параметров выбора позволяет задать значение отбора для возможных вариантов выбора (рис. 8.80). Если источником данных для таблицы является динамический список, то значение свойства Связи параметров выбора участвует в формировании отбора системы компоновки данных. Рис. 8.78. Свойство «Список выбора» ■■ Свойство Расширенное редактирование позволяет использовать в поле дополнительные символы (табуляция) и поиск. ■■ Свойство Формат редактирования позволяет задать с помощью Конструктора форматной строки формат вводимых данных (рис. 8.79). Рис. 8.79. Свойство «Формат редактирования» Том 1 Рис. 8.80. Свойство «Связи параметров выбора» 251 Глава 8. Разработка форм ■■ Свойство Автоотметка незаполненного предназначено для информирования пользователя о незаполненном обязательном поле. Такое поле будет выделяться с помощью красной линии (рис. 8.81). Свойства таблицы ■■ Свойство Положение командной панели определяет расположение командной панели таблицы. ■■ Свойство Отображение позволяет установить вариант отображения данных. Возможны значения: □□ Список. Данные отображаются в виде обычного (плоского) списка (рис. 8.83); Рис. 8.81. Свойство «Автоотметка незаполненного» ■■ Свойство Автовыбор незаполненного позволяет значительно повысить качество работы пользователя с элементом управления. При его установке в значение Да, в случае редактирования данных ссылочного типа, при активизации элемента окно выбора значения будет открываться системой автоматически. ■■ Свойство Связь по типу позволяет указать элемент формы, которым будет определяться тип значения выбираемых в поле данных (рис. 8.82). Рис. 8.83. Отображение таблицы в виде списка □□ Иерархический список. Данные отображаются в виде списка с учетом иерархии групп и элементов (рис. 8.84); Рис. 8.84. Отображение таблицы в виде иерархического списка □□ Дерево. Данные отображаются в виде дерева (рис. 8.85). Рис. 8.82. Свойство «Связь по типу» 252 Рис. 8.85. Отображение таблицы в виде дерева Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ■■ Свойство Вывод управляет возможностями сохранения, печати и копирования данных, отображаемых элементом формы Таблица. ■■ Свойства Автообновление и Период автообновления позволяют управлять возможностями автоматического обновления данных таблицы. Свойства кнопки ■■ Свойство Только во всех действиях определяет, будет ли отображаться кнопка еще где-нибудь (в местах, определенных разработчиком формы), кроме подменю Все действия. ■■ Свойство Отображение определяет вариант отображения кнопки на экране (Авто, Текст, Картинка, Картинка и текст). Как добавить новые элементы формы Для того чтобы добавить новый элемент формы, необходимо воспользоваться одним из способов, предоставляемых редактором формы: ■■ воспользоваться конструктором формы. Работа конструктора рассматривается в разделе «Создание формы с помощью конструктора», стр. 235. При таком способе будет создана новая форма, однако если объекту конфигурации в процессе разработки после создания формы был добавлен новый реквизит или табличная часть, то эти изменения можно будет учесть; ■■ воспользоваться кнопкой командной панели области Элементы редактора формы (рис. 8.86); Рис. 8.87. Кнопка контекстного меню для добавления элементов формы Влияние объектов конфигурации на форму Объекты конфигурации определяют не только функциональность будущей формы через ее основной реквизит, но и оказывают влияние на внешний вид формы, на поведение ее элементов. На форму влияют как свойства самого объекта конфигурации, так и свойства его реквизитов. С помощью свойств объектов конфигурации в управляемом приложении формируется заголовок формы. Однако такое влияние на заголовок формы оказывается не всегда. У разработчика приложения остается возможность ручного формирования заголовка формы. Заголовок формы Рассмотрим небольшой пример, в котором будут задействованы свойства объекта конфигурации, оказывающие влияние на формирование заголовка формы объекта (формы элемента справочника, формы документа, формы задачи). По умолчанию для вновь созданной формы ее заголовок формируется полностью в автоматическом режиме. Это означает, что свойство формы Заголовок не заполнено, а флажок АвтоЗаголовок установлен. При такой установке свойств на автоматически формируемый заголовок формы оказывает влияние свойство объекта конфигурации Имя (рис. 8.88). Рис. 8.86. Кнопка командной панели для добавления элементов формы ■■ воспользоваться контекстным меню области Элементы редактора формы (рис. 8.87); ■■ использовать возможности перетаскивания из других окон с помощью мыши; ■■ непосредственно перед добавлением нового элемента формы можно спозиционироваться на элементе верхнего уровня, в подчинение которому планируется поместить новый элемент. Перемещать элементы формы по дереву иерархии можно с помощью мыши (перетаскивание) или кнопок Переместить вверх, Переместить вниз. Том 1 Рис. 8.88. Формирование заголовка формы по свойству «Имя» 253 Глава 8. Разработка форм После записи такого элемента в информационную базу в формировании заголовка формы участвует еще и свойство объекта Основное представление (рис. 8.89). Организация для справочника Организации, Договор для справочника Договоры. Свойство участвует в формировании названия команды в управляемом интерфейсе приложения. ПРИМЕЧАНИЕ Согласно методикам разработки фирмы «1С» свойство Представление объекта заполняется в том случае, если Синоним объекта не представляет собой краткое и четкое описание объекта в единственном числе. Рис. 8.89. Заголовок формы после записи элемента Если у объекта конфигурации заполнено свойство Синоним, то в формировании заголовка участвует уже оно, а свойство Имя игнорируется (рис. 8.90). ПРИМЕЧАНИЕ Согласно методикам разработки фирмы «1С» свойство Синоним объекта конфигурации подлежит обязательному заполнению и должно содержать четкое, краткое, всеобъемлющее описание объекта. Рис. 8.91. Формирование заголовка формы по свойству «Представление объекта» В случае использования свойства Расширенное представление объекта в заголовке формы отображается именно оно (рис. 8.92). Остальные рассмотренные свойства (ПредставлениеОбъекта, Синоним) могут использоваться платформой только в том случае, если расширенное представление объекта не задано. ПРИМЕЧАНИЕ Согласно методикам разработки фирмы «1С» свойство Расширенное представление объекта используется в том случае, если Представление объекта или его Синоним не дают полного представления о наименовании объекта. Свойство заполняется в единственном числе. Рис. 8.90. Формирование заголовка формы по свойству «Синоним» У объектов конфигурации существует ряд интерфейсных свойств, влияющих на заголовок формы в пользовательском режиме работы. Нами будут рассмотрены свойства Представление объекта и Расширенное представление объекта. При формировании заголовка формы, если свойство Представление объекта заполнено, приоритет отдается именно ему (рис. 8.91). Свойство задается в единственном числе и показывается как название одного объекта, например, Контрагент для справочника Контрагенты, 254 Рис. 8.92. Формирование заголовка формы по свойству «Расширенное представление объекта» Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Если возникает необходимость задания собственного заголовка формы, то возможности автоматического формирования заголовка можно совмещать с текстом, введенным вручную. Для этого необходимо оставить флажок АвтоЗаголовок и применить свой Заголовок формы (рис. 8.93). При создании нового документа используется его расширенное представление (если оно задано), рис. 8.95. Рис. 8.95. Заголовок формы нового документа После записи документа в базу данных заголовок формируется по правилу Имя или Синоним объекта конфигурации плюс представление ссылки на документ (рис. 8.96). Рис. 8.96. Заголовок формы записанного документа Рис. 8.93. Свойства «АвтоЗаголовок» и «Заголовок» формы При формировании формы объекта конфигурации Задача система руководствуется наименованием задачи, ее номером, датой и одним из свойств объекта конфигурации, отвечающих за представление объекта (рис. 8.97). Если для формы необходимо применять только собственный заголовок, то свойство АвтоЗаголовок необходимо снять (рис. 8.94). Рис. 8.94. Использование свойства формы «Заголовок» Немного по другим правилам в управляемом приложении формируются заголовки форм документа и задачи. Том 1 Рис. 8.97. Формирование заголовка формы задачи 255 Глава 8. Разработка форм ПРИМЕЧАНИЕ Свойства объектов конфигурации, отвечающие за представление объектов и списков, влияют не только на формы, но и на интерфейс всего приложения. По каким правилам формируется интерфейс пользователя, рассказано в главе 7 «Командный интерфейс прикладных решений», стр. 145. Интерфейсные свойства реквизитов объектов конфигурации В управляемом приложении некоторые интерфейсные свойства существуют не только у элементов формы, но и у реквизитов объектов конфигурации. Это означает, что при установке такого свойства для реквизита оно автоматически действует на все формы, в которых данный реквизит отображается (при условии использования объекта в качестве основного реквизита формы). Если у элемента формы есть аналогичное свойство, то оно позволяет переопределить для данной конкретной формы действие свойства. Выбор групп и элементов В случае организации выбора в элемент формы данных иерархических объектов базы данных (групп, элементов), например справочников, выборку можно ограничить с помощью настройки свойства Выбор групп и элементов. Таким образом, если по логике работы формы пользователю необходимо предоставить для выбора только группы справочника, то, установив свойство в значение Группы, разработчик ограничит варианты выбора данных информационной базы. Быстрый выбор Часто для повышения производительности действий пользователей и удобства их работы выбор элементов удобно делать не в отдельном окне формы выбора, а в списке. Реализовать подобную настройку выбора элементов можно с помощью установки свойства Быстрый выбор (рис. 8.99). ВНИМАНИЕ! Если свойство существует у реквизита объекта и у элемента формы, который отображает данный реквизит, то использовать рекомендуется свойство реквизита. Аналогичным свойством элемента формы необходимо пользоваться только для переопределения значения свойства. Большинство свойств реквизита, которые влияют на поведение элемента формы, находятся в разделе Представление его свойств (рис. 8.98). Рис. 8.99. Быстрый выбор значений Проверка заполнения Свойство Проверка заполнения отвечает за автоматическую проверку заполнения реквизита (обязательный реквизит). При установке свойства у элемента формы изменится визуальное представление – элемент будет подчеркнут красной линией. В случае необходимости переопределения свойства нужно будет воспользоваться обработчиком ПроверкаЗаполнения данного объекта. Рис. 8.98. Раздел «Представление» свойств реквизитов Подробнее Пример использования данного свойства рассматривается в разделе «Окно сообщений формы», стр. 268. 256 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Значение заполнения Свойство Значение заполнения позволяет указать начальное значение реквизита. Для выбора доступны значения, созданные разработчиком в режиме Конфигуратор (перечисления, предопределенные элементы). Примером использования свойства может служить установка вида номенклатуры при создании нового элемента справочника. По умолчанию реквизит устанавливается в значение Товар (рис. 8.100). Программно объект можно заполнить, вызвав его метод Заполнить(). У метода существует параметр Данные заполнения, исходя из которого и происходит заполнение реквизитов объекта. Еще одним из способов заполнения реквизитов формы первоначальными данными является вызов глобального метода ОткрытьФорму(). Если в метод передать параметр формы ЗначенияЗаполнения, то форма будет открываться с учетом переданных в параметре значений. Связи параметров выбора В ряде задач, решаемых пользователями с помощью элементов формы, необходимо ограничивать количество предлагаемых для выбора данных. Так, например, после выбора в документе поставщика товаров, при выборе договора желательно видеть только те из них, которые заключены именно с этим поставщиком, а не все договоры, которые есть в соответствующем справочнике. Сделать это можно с помощью настройки свойства Связи параметров выбора (рис. 8.101). В окне Связи параметров выбора существует возможность отказаться от параметра открываемой формы, который был предложен системой, и выбрать другой. Рис. 8.100. Свойство «Значение заполнения» Заполнять из данных заполнения Не менее интересным является флажок Заполнять из данных заполнения. При определенных обстоятельствах данный флажок может отменять значение свойства Значение заполнения. Для некоторых реквизитов флажок Заполнять из данных заполнения устанавливается автоматически. Если разработчик заинтересован в том, чтобы его данные из свойства Значение заполнения использовались всегда, флажок Заполнять из данных заполнения должен быть снят. Если флажок Заполнять из данных заполнения установлен и происходит интерактивное создание нового объекта, то реквизит будет заполняться с учетом установленного отбора. Подробнее Пример такого заполнения рассматривается в разделе «Примеры конструирования форм», стр. 269. При интерактивном вводе на основании в структуру данных заполнения формы передается ссылка на объект-основание, и реквизиты создаваемого объекта заполняются исходя из значений реквизитов основания. Том 1 Рис. 8.101. Использование свойства «Связи параметров выбора» подробнее Пример использования свойства рассматривается в разделе «Примеры конструирования форм», стр. 269. 257 Глава 8. Разработка форм Связь по типу Свойство Связь по типу позволяет указать реквизит объекта, который будет поставлять тип значения для текущего реквизита. Указание такой связи используется в том случае, если необходимо, например, дать возможность пользователям самим определять дополнительные свойства тех или иных объектов базы данных. Например, для реквизита Родитель справочника Контрагенты настроено свойство Синоним (рис. 8.103), и в формах реквизит Родитель фигурирует уже как Группа. Форма выбора В свойстве Форма выбора можно указать, какая из форм объекта будет использоваться в качестве основной формы выбора значения реквизита. Стандартные реквизиты объектов конфигурации У каждого из видов объектов конфигурации набор стандартных реквизитов различается. Например, у документов это Номер, Дата, Пометка удаления, Ссылка, Проведен. Разработчик имеет возможность редактирования свойств стандартных реквизитов объектов в специальном окне. Состав свойств каждого из этих реквизитов различается и зависит от типа данных реквизита. Большинство свойств стандартных реквизитов совпадают со свойствами реквизитов объектов и свойствами элементов формы, и нами уже рассмотрены. Влияние, которое стандартные реквизиты оказывают на формы, ничем не отличается от влияния любых других свойств (обычных реквизитов, элементов формы). Рис. 8.103. Синоним стандартного реквизита Реквизиты формы Достаточно часто при разработке прикладных решений перед разработчиками стоит задача размещения на форме различных данных, не связанных с каким-либо определенным объектом. Это могут быть данные подчиненных справочников, регистров, таблицы, полученные в результате работы операторов встроенного языка. ВНИМАНИЕ! В формах все данные, предназначенные для изменения, должны быть описаны в редакторе формы в виде реквизитов. Во многих разделах главы уже неоднократно упоминался основной реквизит формы. Такой реквизит автоматически добавляется конструктором формы, если форма создается подчиненной объекту конфигурации и выбирается вид формы этого объекта, а не произвольная форма. По умолчанию у такой формы после ее создания есть только один реквизит, который и является основным (рис. 8.104). Рис. 8.102. Открытие списка стандартных реквизитов 258 Флажок Использовать всегда позволяет влиять на передачу данных формы в процессе ее работы между клиентской частью и серверной. Флажок оказывает влияние на внутреннее наполнение формы и не влияет на пользовательское представление. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Со свойством Проверка заполнения можно познакомиться в разделе «Окно сообщений формы», стр. 268. Добавление нового реквизита формы выполняется способом – с помощью кнопки командной панели. стандартным Важнейшим свойством, которое определяет не только то, что за данные будет поставлять форме реквизит, но и как будет выглядеть элемент формы, отображающий эти данные, является Тип (рис. 8.106). Рис. 8.104. Основной реквизит формы К снятию данного флажка разработчиком формы необходимо относиться весьма осмотрительно. С одной стороны, можно получить экономию ресурсов (трафика) при передаче данных формы между клиентской и серверной частью (это если пользователь скрыл элемент формы в настройках); с другой стороны, такой элемент может быть задействован в коде, а он скрыт пользователем, и в данных формы его нет. По умолчанию флажок установлен, и снимать его нужно только при полной уверенности в его ненужности. Реквизиты формы обладают набором свойств (рис. 8.105), позволяющих влиять на их поведение. Рис. 8.106. Установка свойства «Тип» подробнее Пример расширения состава редактируемых данных с помощью модификации формы путем добавления новых реквизитов формы рассматривается в разделе «Примеры конструирования форм», стр. 269. Командный интерфейс формы Панель навигации Командный интерфейс формы формируется системой автоматически, на основании анализа объектов конфигурации. Рис. 8.105. Свойства реквизита формы подробнее Функциональные и интерфейсные свойства реквизитов формы (Функциональные опции, Просмотр, Редактирование) рассматриваются в разделе «Управление видимостью элементов формы», стр. 261. Том 1 Так, например, после добавления в дерево конфигурации подчиненного справочника или регистра сведений, у которого тип значения измерения является ссылкой на текущий справочник и при этом установлен признак свойства измерения Ведущее (рис. 8.107), в форме текущего справочника системой автоматически будут сформированы команды для открытия форм объектов конфигурации, содержащих зависимые данные. 259 Глава 8. Разработка форм При этом у разработчика формы есть возможность повлиять на видимость таких команд в пользовательском режиме работы (рис. 8.110). Рис. 8.110. Управление видимостью команд «Панели навигации» формы Рис. 8.107. Свойство измерения «Ведущее» Такие команды будут доступны в окне самой формы, в пользовательском режиме работы (рис. 8.108), в панели навигации формы. Одновременно с разработчиком влиять на состав команд пользовательского режима работы может и платформа, анализируя права доступа пользователей. Вернее, сперва платформа (анализ прав пользователя), а уже потом разработчик. Командная панель Если на основании какого-либо объекта информационной базы можно вводить новые данные, например, на основании элемента справочника Контрагенты можно ввести документ Доверенность (рис. 8.111), то в форме элемента основания системой формируется предопределенное подменю Создать на основании. Рис. 8.108. Команды «Панели навигации» формы В режиме разработки формы такие команды можно увидеть и отредактировать в редакторе форм. Они будут находиться среди глобальных параметризуемых команд (рис. 8.109). Рис. 8.111. Объект-основание для текущего объекта Рис. 8.109. Редактирование командного интерфейса формы 260 В пользовательском режиме работы такое подменю формируется в командной панели формы (рис. 8.112). Такой способ ввода новых объектов базы данных позволяет значительно повысить производительность работы пользователей, уменьшить количество допущенных в работе Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм ошибок, избавить от постоянного нудного и однообразного ввода одних и тех же данных. При этом для удобства работы разработчика все команды разделены на три категории: Рис. 8.112. Подменю «Создать на основании» ■■ Команды формы. Именно в данном окне с помощью кнопки Добавить можно создавать новые команды формы. При этом все создаваемые команды являются «программируемыми». Описание алгоритма работы команд выполняется разработчиком в модуле формы, с помощью встроенного языка; ■■ Стандартные команды. В данном разделе сгруппированы все команды, которые предоставляются основным реквизитом формы. Если на форме есть элементы, отображающие списки (наборы записей, динамические списки, табличные части объектов и так далее), то команды таких элементов также присутствуют в данной категории команд (рис. 8.115). Управлять видимостью подменю Создать на основании, а также его составом можно в процессе разработки формы (рис. 8.113). Рис. 8.115. Стандартные команды формы ■■ Глобальные команды. Команды этой группы могут являться параметризованными и непараметризованными. Это команды глобального командного интерфейса. Параметризованные команды отображаются в форме, только если для них в форме существует источник параметров с соответствующим типом данных. Рис. 8.113. Управление видимостью команд командной панели формы Команды формы Помимо заполнения каких-либо элементов формы пользователю достаточно часто приходится командовать форме, что сделать в том или ином случае. Все команды, которые могут быть назначены кнопкам и использованы в форме, сгруппированы в окне команд (рис. 8.114). Рис. 8.114. Команды формы Том 1 Управление видимостью элементов формы Влияние прав и ролей пользователя на элементы формы Для ограничения доступа к данным информационной базы в пользовательском режиме работы в среде «1С:Предприятия» применяются объекты конфигурации Роли. Каждая роль, присутствующая в том или ином прикладном решении, описывает набор прав доступа к объектам информационной базы. Так как работа пользователя с объектами информационной базы происходит в формах, права доступа к таким объектам законным образом влияют на внешний вид формы. В форме права доступа и роли пользователей оказывают влияние на все элементы формы, на реквизиты формы, на состав ее команд и системных командных панелей. Кроме того, оказывается косвенное влияние через объекты конфигурации и их реквизиты. 261 Глава 8. Разработка форм Однако ограничение доступа к данным и удобство пользования теми данными, к которым имеется доступ, – это два разных вопроса. И для решения второго вопроса существует ряд свойств, помогающих разработчику настроить доступ к разрешенным данным удобным для пользователя образом. Эти свойства носят вполне понятные названия и не требуют уточнения. Например, для элементов формы это свойство Пользовательвидимость (рис. 8.116); для реквизитов формы доступны два свойства – Просмотр и Редактирование (рис. 8.117); для командного интерфейса формы – это Видимость (рис. 8.118). ская Как видно из приведенных рисунков, разработчик может либо полностью запретить видимость (просмотр, редактирование) того или иного элемента формы (реквизита, команды), либо применять запрет для конкретной роли. Для элементов формы полное выключение свойства Видимость у родительского элемента, например Группы, означает исключение из пользовательского интерфейса формы всех дочерних элементов. Рассмотрим несколько примеров. Для этого будем использовать демонстрационную базу «Разработка форм, пример 1». В демонстрационной базе определены несколько ролей. Для каждой из ролей настроены те или иные права доступа на объекты конфигурации. Кроме того, как уже было сказано в начале раздела, платформа предоставляет возможность настройки прав доступа на реквизиты объектов, на табличные части, на стандартные реквизиты, на состав команд формы, на командный интерфейс формы, на реквизиты формы и ее элементы. Пример 1 Роли Полные права конфигурации на справочник Номенклатура даны все возможные права (рис. 8.119). Рис. 8.116. Свойство «Пользовательская видимость» элементов формы Рис. 8.117. Свойство «Просмотр» реквизита формы Рис. 8.119. Справочник «Номенклатура». Права «Полные права» С помощью команд командной панели формы списка номенклатуры (ФормаСписка1) пользователь с ролью Полные права может делать с элементами и группами справочника все что угодно (рис. 8.120). Рис. 8.118. Свойство «Видимость» командного интерфейса формы 262 Роли Полные права доступно право Интерактивное добавление, и в пользовательском интерфейсе формы списка справочника есть команды создания и копирования. Право Интерактивная пометка на удаление дает возможность помечать объекты, предназначенные к удалению, и соответствующая кнопка командной панели доступна. Право Редактирование дает возможность изменять данные объекта информационной базы и сохранять эти изменения. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Рис. 8.122. Командная панель формы. Менеджер по продажам Из командной панели формы исчезли команды, связанные с созданием, копированием, удалением новых объектов базы данных. Рис. 8.120. Командная панель формы. Полные права Если разработчику прикладного решения необходимо ограничить пользователя в его возможностях по интерактивному редактированию состава информационной базы, то следует прибегнуть к настройке ролей. Ограничение по составу возможностей редактирования данных представлено для роли Менеджер по продажам (рис. 8.121). Пример 2 В демонстрационной базе роли Полные права установлены права доступа на регистр сведений Контактная информация, и состав кнопок подменю Перейти формы элемента справочника Контрагенты (ФормаЭлемента2) выглядит так, как это задумал разработчик (рис. 8.123). Рис. 8.123. Состав подменю «Перейти». Полные права Роли Менеджер по продажам на регистр сведений Контактная информация никакие права не назначены, и потому платформа ограничила состав определенного разработчиком подменю (рис. 8.124). Рис. 8.121. Справочник «Номенклатура». Права «Менеджер по продажам» Как видно из рисунка, пользователю с такими правами разрешено просматривать и редактировать данные базы данных. Результат влияния прав доступа пользователя на состав командных панелей формы можно увидеть, осуществив запуск прикладного решения под пользователем с правами Менеджер по продажам (рис. 8.122). Том 1 Таким образом, разработчик прикладного решения имеет возможность изменять состав командных панелей формы, не прибегая к созданию «индивидуальных» форм, для всех определенных в конфигурации ролей. Для достижения нужного эффекта достаточно лишь правильно раздать роли и настроить права доступа. 263 Глава 8. Разработка форм Рис. 8.124. Состав подменю «Перейти». Менеджер по продажам Рис. 8.126. Форма элемента. Полные права Пример 3 Настройки ролей и прав доступа влияют не только на состав командных панелей формы. Точно такому же воздействию подвергаются и все дочерние элементы формы, связанные с реквизитами объекта конфигурации или его табличными частями. Такое влияние прав доступа можно увидеть на примере формы элемента справочника Номенклатура (ФормаЭлемента2). Так, для роли Полные права установлены полные права доступа к табличной части справочника Поставщики, а для роли Менеджер по продажам такие права не установлены (рис. 8.125). Рис. 8.127. Форма элемента. Менеджер по продажам Если внимательно рассмотреть форму, представленную на рис. 8.127, то можно заметить, что вместе с табличной частью Поставщики исчезла и страница, на которой разработчик поместил эту табличную часть в редакторе формы. Произошло это потому, что при проектировании подчиненных элементов страницы формы на ней ничего, кроме табличной части, размещено не было (рис. 8.128). Таким образом, определив состав страницы панели, платформа скрыла от пользователя и бесполезную для него страницу формы. Рис. 8.125. Права доступа к табличной части В пользовательском режиме работы тем пользователям, которым доступна роль Полные права, форма элемента справочника будет представлена в полном виде (рис. 8.126), а вот пользователям с ролью Менеджер по продажам придется только мечтать о возможности просматривать и редактировать табличную часть Поставщики (рис. 8.127). 264 Рис. 8.128. Состав страницы формы Скрытие платформой в пользовательском режиме работы других элементов формы (поля ввода, флажки и другие) происходит по точно такому же принципу, который был продемонстрирован выше. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Пример 4 Возможности изменения форм в зависимости от настройки прав доступа не ограничиваются только управлением видимостью элементов. В зависимости от предоставленных прав доступа платформа может просто запретить редактирование данных, оставив их при этом на экране пользователя. Запретим роли Менеджер по продажам редактировать реквизит Комментарий документа ПоступлениеТоваров (рис. 8.129). с этими реквизитами, и на команды формы, а значит, на кнопки формы, кнопки командных панелей. В демонстрационной базе определена одна функциональная опция Учет НДС. Как ясно из названия опции, она отвечает за возможность ведения учета НДС в прикладном решении. Реквизиты объектов конфигурации, табличные части и прочие элементы формы связываются с определенными функциональными опциями в соответствующем редакторе. Пример 1 Рассмотрим влияние функциональных опций на форму на примере документа Реализация товаров. Свяжем функциональную опцию Учет НДС с реквизитами табличной части Товары: Ставка НДС, Сумма НДС. Для этого необходимо открыть состав функциональной опции и отметить флажком те реквизиты объекта (рис. 8.131), которые, по мнению разработчика (или по требованию заказчика), должны быть связаны с функциональной опцией. Рис. 8.129. Отключение права «Редактирование» В пользовательском режиме работы элемент формы Комментарий (ФормаДокумента1) будет присутствовать на форме, однако отредактировать его значение невозможно (рис. 8.130). Рис. 8.130. Доступность реквизитов объекта Влияние функциональных опций на элементы формы Функциональные опции предназначены для оперативного управления функционалом прикладного решения в процессе его внедрения или работы без изменения конфигурации. Создание функциональных опций разработчиком осуществляется на этапе разработки конфигурации. В форме функциональные опции могут влиять на ее реквизиты, а значит, и на элементы формы (поля ввода, таблицы, страницы и прочие), связанные Том 1 Рис. 8.131. Назначение функциональных опций реквизитам Кроме этого, в нашей демонстрационной базе функциональная опция Учет НДС связана со справочником Ставки НДС, что, впрочем, вполне логично для прикладного решения. Таким образом, управление функциональной опцией Учет НДС будет оказывать влияние не только на формы приложения, но и на его интерфейс, о чем рассказывается в разделе «Влияние функциональных опций на командный интерфейс», стр. 183. 265 Глава 8. Разработка форм Чтобы увидеть влияние функциональных опций на команды, выполняемые в форме, разместим кнопку Открыть ставки НДС на командной панели табличной части Товары. В качестве выполняемой нажатием кнопки команды выберем глобальную команду СтавкиНДС (рис. 8.132). Рис. 8.134. Состояние функциональной опции «Учет НДС» Рис. 8.132. Косвенная связь кнопки с функциональной опцией Проделав все вышеописанное, мы с вами осуществили косвенную связь кнопки командной панели формы с функциональной опцией. Несмотря на то, что связь косвенная, функциональная опция окажет свое влияние на видимость кнопки. Установив флажок Вести учет НДС и записав изменения в информационную базу, мы тем самым включим функциональную опцию Учет НДС, и функционал, связанный с ней, будет доступен пользователям прикладного решения (рис. 8.135). По умолчанию в пользовательском режиме работы мы не увидим ни кнопки, которую только что создали, ни колонок табличной части, которые связали с функциональной опцией Учет НДС (рис. 8.133). Рис. 8.135. Документ «Реализация товаров» Пример 2 Рис. 8.133. Документ «Реализация товаров по умолчанию» Отсутствие элементов формы, связанных с функциональной опцией Учет НДС, связано с тем, что соответствующая функциональная опция в прикладном решении неактивна (рис. 8.134). 266 Связывать между собой кнопки формы (командных панелей) и функциональные опции можно не только косвенно. Как уже можно было заметить, связь осуществляется не с самой кнопкой, а с командой, которая будет выполняться при ее нажатии. Для реализации примера скопируем существующую форму элемента справочника Номенклатура (ФормаЭлемента3). Добавим команду формы ЗаполнитьСтавкуНДС. Свойству команды Функциональная опция присвоим значение Учет НДС. Таким образом, мы определим участие функционала команды только при включенном учете НДС. В модуле формы необходимо Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм создать обработчик команды. Сделать это можно с помощью соответствующей кнопки свойства команды Действие (рис. 8.136). Рис. 8.138. Кнопка формы Рис. 8.136. Связь команды с функциональной опцией Для создания элемента управления командой воспользуемся методом перетаскивания. Захватим мышью команду Заполнить ставку НДС и перетащим ее в корень элементов формы, на ветку Форма (рис. 8.137). Рис. 8.137. Создание элемента формы перетаскиванием В результате этих нехитрых действий редактор формы создаст кнопку, которая и будет управлять нашей командой (рис. 8.138). Для того чтобы кнопка превратилась в гиперссылку, достаточно изменить ее свойство Вид с Кнопка формы на Гиперссылка (рис. 8.139). Результат преобразования можно сразу же оценить в окне предварительного просмотра формы. Так как команда, выполняемая при нажатии гиперссылки Заполнить ставку НДС, связана с функциональной опцией, то, естественно, гиперссылка будет доступна только при включенной функциональной опции Учет НДС. Том 1 Рис. 8.139. Изменение кнопки на гиперссылку ВНИМАНИЕ! Для того чтобы увидеть новую форму элемента справочника Номенклатура в пользовательском режиме работы, не забудьте назначить ее как форму элемента справочника по умолчанию. 267 Глава 8. Разработка форм Окно сообщений формы Окно сообщений формы предназначено для информирования пользователя о различных событиях. В процессе работы прикладного решения окно появляется в двух случаях: ■■ сообщения сгенерированы программным способом. Вся работа по созданию таких сообщений целиком и полностью лежит на разработчике прикладного решения. Для вывода сообщений используются команды встроенного языка (см. раздел «Сообщения пользователю», стр. 321); ■■ сообщения возникли вследствие попытки сохранить объект, не заполнив при этом обязательный для заполнения реквизит. Такие сообщения генерируются системой автоматически, на основании настроек, сделанных разработчиком прикладного решения в процессе редактирования свойств формы или ее дочерних элементов. В этом разделе рассматривается второй случай появления окна сообщений, так как именно такой вариант возникновения окна сообщений настраивается средствами визуального конструирования форм. Рис. 8.141. Поле, обязательное для заполнения При попытке сохранения объекта системой генерируется сообщение об ошибке, которое показывается в окне сообщений. Одновременно с окном сообщений открывается окно с указателем на поле, в котором допущена ошибка (рис. 8.142). В случае наличия нескольких ошибок переход по окнам с указателями на ошибочные поля осуществляется с помощью стрелок навигации. Для того чтобы сделать реквизит объекта обязательным для заполнения, необходимо изменить его свойство Проверка заполнения со значения Не проверять, устанавливаемого платформой по умолчанию, на значение Выдавать ошибку (рис. 8.140). Рис. 8.142. Сообщение об ошибке В случае попытки повторного сохранения или проведения объекта окно сообщений будет очищено и сообщения об ошибках будут сгенерированы снова. Рис. 8.140. Настройка проверки заполнения реквизита В пользовательском режиме работы поле, обязательное для заполнения, выделяется с помощью красной линии подчеркивания (рис. 8.141). Обязательным для заполнения можно сделать не только реквизит объекта, но и его табличную часть. В этом случае системой контролируется наличие хотя бы одной строки в проверяемой табличной части. 268 Если сообщение связано с каким-либо реквизитом другого объекта информационной базы, то системой будет открыта форма этого объекта, и сообщение с указателем на ошибочное поле будет отображено уже в этом окне. Таким образом, система сама контролирует правильность заполнения обязательных данных и препятствует возникновению ошибок в базе данных, освобождая при этом разработчика прикладного решения от программирования реакции на ошибочные действия пользователя. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Примеры конструирования форм Рассмотрение вопроса построения и модификации форм будет производиться на сквозном примере. В разделе будет рассмотрен пример создания нового документа «Расходный кассовый ордер 1» и его основных форм. В качестве эталона нами будет использован документ «Расходный кассовый ордер», который присутствует в демонстрационной базе «Разработка форм, пример 1». Снимем флажок Отображать заголовок, так как в данном случае выводить название группы на форму не имеет ни малейшего смысла. Свойство Отображение установим в Нет. Подчиним группе элементы формы Номер и Дата и поместим ее под командной панелью формы (рис. 8.144). Как и зачем объединять элементы формы в группы По умолчанию форма, созданная конструктором форм для нашего демонстрационного документа (рис. 8.143), вряд ли может являться образцом изыска и удобства работы. Это и не входит в задачи конструктора форм. Его задача – сгенерировать форму, пригодную для ввода, редактирования, просмотра данных. С этой задачей конструктор справился блестяще. Рис. 8.144. Группировка элементов «Номер» и «Дата» Итак, форма стала более приятной на вид. Все ли на этом? Нет. Например, мы хотим, чтобы состав группы НомерДата не изменялся пользователем в процессе настройки. Рис. 8.143. Форма документа Итак, чем же может помочь объединение элементов в группы? Сделать форму более читаемой, более удобной для просмотра и работы. Сгруппировать элементы формы в логические группы, объединив в них близкие, согласно логике работы приложения и формы, связанные данные. Это позволит рассматривать форму как некий каталог, в котором каждая группа (в нашем случае группа элементов) объединяет в себе близкие по характеристикам и назначению данные. Добавим в форму элемент Группа – Обычная группа. Свойству Имя присвоим значение НомерДата. Свойство Группировка установим в значение Горизонтальная. Том 1 ПРИМЕЧАНИЕ Вполне возможно, что вы считаете иначе и не согласны с мнением автора по поводу группы НомерДата. В таком случае рассматривайте этот пример лишь в качестве учебного (что так и есть на самом деле), а на практике поступайте так, как велит вам сердце, или разум, или что-то еще, присущее только вам, ну или логика работы вашего приложения. Пользователь в режиме 1С:Предприятие может изменять внешний вид этой формы по своему усмотрению. Например, мой труд может выглядеть, как на рис. 8.145 или как на рис. 8.146, а то и вообще как на рис. 8.147. 269 Глава 8. Разработка форм Может, некоторым разработчикам это и придется по нраву, но лично автор такого бы не пережил, и потому поступим вот так: для группы НомерДата свойство РазрешитьИзменениеСостава установим в Ложь (снимем флажок). Это не позволит пользователю добавлять в группу новые элементы или удалять существующие. Как изменить состав кнопок элементов формы Представим себя на месте пользователя нашей формы. Ему (пользователю) по неизвестным нам причинам необходимо очистить поле, в котором уже выбран контрагент. Рис. 8.145. Пользовательская настройка группы элементов 1 Наш пользователь не читает документацию (то ли из-за отсутствия времени, то ли из-за лени, а может, еще и другие причины есть) и о горячих клавишах ничего не слышал. Кроме этого, он не знает о наличии у элемента формы контекстного меню, в котором есть команда очистки. Пользователь просто привык очищать поле кнопкой очистки (в виде крестика). Но эта кнопка не добавляется по умолчанию в управляемую форму. К счастью, выход есть. Необходимо лишь указать платформе на обязательное присутствие кнопки в элементе формы (рис. 8.148). Рис. 8.146. Пользовательская настройка группы 2 Рис. 8.148. Изменение состава кнопок элемента формы Рис. 8.147. Пользовательская настройка формы 3 270 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Как добавить поле «Договор» и связать его с контрагентом Менеджеры вашего предприятия удачно приобрели несколько партий товаров, и руководство пришло к выводу, что оплаты поставщикам необходимо привязывать не только к контрагентам, но и договорам с ними (ибо товар приобретали каждый раз по разным условиям). Однако воспользоваться этим свойством элемента формы – значит, допустить методологическую ошибку. Если вы так и поступили, то вам стоит перечитать теоретические разделы этой главы («Редактирование формы», стр. 240, «Влияние объектов конфигурации на форму», стр. 253). Дело в том, что часть свойств элементов формы есть и у реквизитов объектов, а значит, более правильно настраивать это там (рис. 8.151). Задача вам ясна, с теорией модификации формы вы уже знакомы по разделу «Редактирование формы» (стр. 240), так что вперед. Добавим в метаданные документа реквизит ДоговорКонтрагента, разместим его на форме и ограничим пользователя в выборе договоров. После добавления реквизита в метаданные документа (рис. 8.149) он доступен для формы в списке реквизитов (рис. 8.150). Рис. 8.149. Реквизиты документа Рис. 8.151. Настройка отбора договоров по контрагенту Как же все это работает? Да очень просто. Список договоров строится с помощью системы компоновки данных, на отбор которой и влияет свойство Связи параметров выбора. Вполне очевидно, что во всех формах нашего документа нам будет необходим отбор договоров по текущему контрагенту. Вот поэтому мы и настроили его на уровне не одной формы, а реквизита объекта. Как добавить в форму табличную часть Рис. 8.150. Где искать новый реквизит объекта Для получения положительного результата доработки осталось лишь добавить отбор договоров по контрагенту, и премия в кармане. Для создания такого отбора нужно использовать свойство Связи параметров выбора. Том 1 Поработав некоторое время с нашим документом, бухгалтерия вносит предложение: дать возможность закрывать одним документом несколько сделок, по нескольким договорам. Способов решения поставленной задачи существует немало. Мы рассмотрим классический вариант с использованием табличной части документа. 271 Глава 8. Разработка форм В табличной части должны быть реквизиты Договор, ПриходныйДокумент, Сумма. Тип значения реквизита ПриходныйДокумент установим в ДокументСсылка.ПоступлениеТоваров. Табличную часть назовем Оплаты. ВНИМАНИЕ! Если вы для реквизита Договор не заполнили свойство Связи параметров выбора, то сейчас самое время сделать это. Для чего это делается, рассказано в предыдущем разделе. Как добавить в форму панель со страницами Прежде всего, необходимо уточнить: в управляемом приложении нет элемента формы Панель, а есть элемент Группа, свойство Вид которого имеет значение Страницы. Добавим в дерево элементов формы новую группу, определив свойство Вид в Страницы (рис. 8.153). Самый простой способ добавления табличной части в форму – это перетаскивание из раздела редактора формы Реквизиты. Зацепим мышью табличную часть Оплаты и бросим в раздел Элементы. Если вы не промахнулись, то платформа предложит вам автоматически создать колонки будущей таблицы. Можете соглашаться с этим. Исправить созданное можно всегда. Вот собственно и все с точки зрения конструирования формы. Форма несколько непривычна (много реквизитов, таблица, а что к чему непонятно), и неопытный пользователь наверняка в ней запутается (рис. 8.152). Как немного поправить ситуацию, расскажем далее. Рис. 8.153. Элемент «Группа» вида «Страницы» Чтобы сделать форму более привлекательной и понятной для непосвященного в способы работы с нашим приложением пользователя, добавим на форму несколько страниц, в которых разместим элементы формы. Добавим в подчинение группе Страницы группы, свойство Вид которых будет иметь значение Страница (рис. 8.154). Рис. 8.152. Таблица, отображающая табличную часть документа Рис. 8.154. Страницы формы 272 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Для того чтобы страницы стали видны в форме, перегруппируем элементы формы так, чтобы элементы ДоговорКонтрагента и Сумма размещались на странице ПлатежПоСделке, а таблица Оплаты – на странице ПлатежПоСделкам (рис. 8.155). Рис. 8.156. Тип реквизита «ДинамическийСписок» Рис. 8.155. Распределение элементов по страницам Как добавить в форму таблицу, отображающую произвольные данные Согласно регламенту работы компании, деятельность которой мы с вами взялись автоматизировать, после оплаты поставленных товаров (оплата в программе, а значит и в банке) принято уведомлять об этом поставщиков. Таким образом, перед нами стоит задача добавления на форму документа контактных данных поставщика. Раз перечень контактных данных жестко не определен, например, только рабочий телефон менеджера, то наиболее оптимальным для вывода заранее неизвестного количества данных является таблица. Как нам уже известно, для того чтобы что-то отображалось на форме, это что-то должно быть описано в виде реквизита формы. Добавим форме новый реквизит КонтактнаяИнформация. Тип значения реквизита ДинамическийСписок (рис. 8.156). Динамический список может получать данные из таблиц базы данных. Это может быть, например, список справочника, список документов, список значений регистра сведений. Для того чтобы динамический список работал с такими данными, необходимо указать их в свойстве ОсновнаяТаблица (рис. 8.157). Том 1 Рис. 8.157. Свойство «ОсновнаяТаблица» С помощью свойства НастройкаСписка можно произвести необходимые настройки отбора, группировки, сортировки отображаемых данных. Динамический список может получать данные из результата произвольного запроса, который необходимо определить в свойстве НастройкаСписка. Для того чтобы использовать произвольный запрос, необходимо установить флажок ПроизвольныйЗапрос (рис. 8.158). 273 Глава 8. Разработка форм В некоторых случаях использовать дополнительные страницы, таблицы и динамические списки вовсе не обязательно. Платформа позволяет выводить связанную с неким реквизитом информацию в эту же форму и осуществлять переключение между такими данными с помощью панели навигации формы. Если открыть в редакторе формы Глобальные команды, то можно увидеть, что нам доступна параметризуемая команда открытия контактной информации, связанной с реквизитом Контрагент (рис. 8.160). Рис. 8.158. Свойство «ПроизвольныйЗапрос» Свойство Динамическое считывание данных отвечает за считывание данных из базы данных порциями, что позволяет экономить ресурсы системы. Для решения поставленной перед нами задачи мы воспользуемся первым способом (задание основной таблицы) и выберем таблицу регистра сведений Контактная информация. Добавим форме еще одну страницу и разместим на ней таблицу с контактной информацией (рис. 8.159). Рис. 8.160. Дополнительные команды формы Такую команду достаточно перетащить в панель навигации формы. Всю остальную работу за нас сделает система при построении и отображении формы на экране (рис. 8.161). Рис. 8.161. Отображение контактной информации Рис. 8.159. Отображение контактной информации Отбор (рис. 8.162), который был при этом установлен системой, не потребовал от разработчика ни строчки кода. 274 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Исправить сложившуюся ситуацию достаточно просто. Необходимо лишь создать аналог старой кнопки Перейти. Первое, что необходимо сделать, это отключить возможность формирования команд перехода к регистрам платформой (если Видимость кто-то включил). Сделать это можно в окне редактирования командного интерфейса формы, рассматриваемого в разделе «Редактирование командного интерфейса», стр. 168 (рис. 8.164). Рис. 8.162. Установленный системой отбор Если рассматривать наш пример с контактной информацией, то второй способ (с помощью команды панели навигации формы) является наиболее предпочтительным и рекомендуемым. Создание подменю «Перейти» старого образца Рис. 8.164. Отключение команд панели навигации формы Практически для любого документа прикладного решения характерно наличие движений по тем или иным регистрам. Документ, рассматриваемый нами, не является исключением. В командную панель формы необходимо добавить элемент формы Группа с видом Подменю. Имя группы – Перейти (рис. 8.165). По умолчанию платформа располагает команды перехода к регистрам, по которым документ может делать движения, в панели навигации формы (рис. 8.163), если включена видимость соответствующей команды. Это может быть не совсем удобно пользователю, особенно если он работал с приложениями, разработанными для старых версий платформы. Рис. 8.165. Создание подменю «Перейти» Чтобы создать кнопки подменю Перейти, можно воспользоваться возможностями перетаскивания команд в раздел элементов формы. Интересующая нас команда находится в разделе Глобальные команды редактора формы. После добавления кнопки в подменю Перейти оно автоматически становится видимым в окне предварительного просмотра формы и в пользовательском режиме работы (рис. 8.166). Рис. 8.163. Кнопки перехода к движениям документа Том 1 275 Глава 8. Разработка форм Рис. 8.168. Установленный пользователем отбор Рис. 8.166. Кнопка перехода к движениям документа Мы уже говорили о том, что сложная структура нашего документа не позволяет нам эффективно использовать методы копирования или ввода на основании (если это предусмотрено) документа. Пользователю необходимо лишь автоматизировать заполнение нескольких реквизитов. Как создать и заполнить объект с учетом установленного отбора списка Этого легко добиться, если установить у нужного реквизита документа свойство Заполнять из данных заполнения. Установим этот флажок у реквизита документа Контрагент (рис. 8.169). Достаточно часто у пользователя возникает необходимость проанализировать некие данные, например, существующие документы определенного контрагента, и, обнаружив расхождения, создать еще один документ. При этом часто копирование документа или ввод на основании не дают положительного эффекта – необходимо изменять достаточно большое количество реквизитов, и что-то можно просто оставить по ошибке, хотя нужно бы поменять. Выходом из сложившейся ситуации может быть использование отборов в списке и установка флажка Заполнять из данных заполнения у нужных реквизитов объекта. Итак, наш пользователь, получив от контрагента список оплат, просматривает тот же список в своей информационной базе (рис. 8.167). Рис. 8.169. Установка свойства «Заполнять из данных заполнения» После такой настройки новый объект конфигурации (наш документ) будет при создании заполнять свои реквизиты (у которых установлен флажок Заполнять из данных заполнения) исходя из установленных пользователем отборов списка (рис. 8.170). ВНИМАНИЕ! Рис. 8.167. Форма списка документов Для лучшего восприятия данных пользователем устанавливается отбор по нужному контрагенту (рис. 8.168). 276 Заполнение будет происходить только при интерактивном создании документа (кнопка Создать). В списке должен быть установлен именно отбор. Если, например, пользователь применял поиск по полю Контрагент, то отбор в списке не устанавливается (рис. 8.171) и реквизит заполнен не будет. Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Для осуществления задуманного необходимо лишь перетащить реквизит ИНН в элемент формы Список. Все остальное платформа сделает за нас сама (рис. 8.172). Рис. 8.170. Заполнение документа с учетом установленного отбора Рис. 8.172. Отображение «ИНН» в списке документов Данные, которые отображаются в колонке таблицы ИНН, будут получены через точку (рис. 8.173). Рис. 8.171. Результат поиска в списке Рис. 8.173. Свойство «ПутьКДанным» Как отобразить в списке реквизиты реквизитов Как сгруппировать данные в списке Динамический список позволяет без каких-либо трудностей расширить перечень информации, отображаемой элементом формы Таблица. Причем эта задача легко решается с помощью средств визуального конструирования. Существуют два пути решения поставленной задачи. Первый – в конфигураторе, во время разработки формы. Этот путь следует применять, если подобная группировка будет необходима максимальному количеству пользователей формы. Второй путь – в пользовательском режиме работы. Итак, у контрагента существует реквизит ИНН, который необходимо видеть в списке документов наряду с другими реквизитами документа. Сразу оговоримся, что речь пойдет о настройке динамических списков. Обычные таблицы значений, списки значений подобной настройке не поддаются. Том 1 277 Глава 8. Разработка форм Рассмотрим форму списка документа Расходный кассовый ордер 1. Элемент формы с именем Список отображает данные, имеющие тип Динамический список (рис. 8.174). Это как раз то, что нам необходимо. Рис. 8.174. Тип «Динамический список» Чтобы настроить группировку, необходимо открыть свойства реквизита формы Список и нажать на гиперссылку свойства Настройка списка (рис. 8.175). Рис. 8.176. Настройка группировок Рис. 8.177. Группировки списка Как настроить условное оформление динамического списка Условное оформление динамических списков, так же как и группировки, настраивается в окне настройки динамического списка (см. предыдущий раздел). Рис. 8.175. Открытие настроек динамического списка Настройки производятся на закладке Условное оформление (рис. 8.178). На закладке Группировка окна Динамический список (рис. 8.176) можно настроить необходимые группировки. В пользовательском режиме список документов будет выглядеть так, как мы его настроили (рис. 8.177). ПРИМЕЧАНИЕ Несмотря на то, что Динамический список формируется с помощью системы компоновки данных, получить итоги по группировкам нельзя. 278 Рис. 8.178. Настройка условного оформления В поле Оформление (рис. 8.179). настраивается способ оформления данных Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Результат в пользовательском режиме будет выглядеть вот так (рис. 8.182). Рис. 8.179. Настройка оформления В поле Условие настраиваются условия отбора данных, которые необходимо оформлять (рис. 8.180). Рис. 8.182. Условное оформление списка Аналогичным образом в конфигурации может быть настроено условное оформление и самой формы. Для этого используется гиперссылка Условное оформление в палитре свойств формы. Рабочий стол Рис. 8.180. Настройка условия В поле Оформляемые поля настраивается список полей, которые будут выделены. Если необходимо выделить всю строку, то выбор полей осуществлять не нужно (рис. 8.181). Рис. 8.181. Настройка оформляемых полей Том 1 Рабочий стол не является формой управляемого приложения в прямом смысле этого слова. Можно сказать, что рабочий стол строится разработчиком прикладного решения из уже имеющихся в конфигурации форм и команд. При этом форма обязательно должна быть создана и включена в состав конфигурации. Использовать автоматически генерируемые формы рабочий стол не умеет. В прикладном решении рабочий стол представлен в единственном экземпляре. Добраться до рабочего стола при разработке прикладного решения можно через свойства разрабатываемой конфигурации или контекстное меню (рис. 8.183). Рис. 8.183. Открытие рабочего стола в режиме «Конфигуратор» 279 Глава 8. Разработка форм Создание и редактирование рабочего стола происходят в специализированном редакторе (рис. 8.184). ■■ Две колонки одинаковой ширины. Формы будут располагаться в две колонки. Переносить форму из одной колонки в другую можно с помощью кнопок, расположенных между колонками редактора рабочего стола. Горизонтальный размер форм в разных колонках будет одинаковым (рис. 8.186). Рис. 8.184. Редактор «Рабочая область рабочего стола» Формы, отображаемые на рабочем столе в пользовательском режиме работы, могут располагаться в одну или две колонки. Настройка количества колонок с формами осуществляется с помощью выбора одного из предопределенных значений поля Шаблон рабочего стола. При этом доступны следующие значения: ■■ Одна колонка. Формы будут располагаться вертикально, одна под другой (рис. 8.185). Управлять последовательностью форм можно с помощью кнопок Переместить вверх, Переместить вниз. Рис. 8.186. Шаблон «Две колонки одинаковой ширины» ■■ Две колонки разной ширины (2:1). Формы будут располагаться, как и в предыдущем примере, однако ширина форм первой колонки будет в два раза больше ширины форм второй колонки рабочего стола (рис. 8.187). Рис. 8.185. Шаблон «Одна колонка» Рис. 8.187. Шаблон «Две колонки разной ширины» 280 Профессиональная разработка в системе «1С:Предприятие 8» Конструирование форм Добавление форм в состав рабочего стола производится стандартным способом – с помощью кнопки командной панели. При этом разработчику необходимо выбрать конкретную форму, указав ее в списке (рис. 8.188). Если видимая часть, отведенная форме в рабочем столе, меньше, чем высота формы, то у последней появляется вертикальная полоса прокрутки (рис. 8.190). Рис. 8.190. Полосы прокрутки формы рабочего стола Рис. 8.188. Добавить форму Разработчик прикладного решения может влиять на состав рабочего стола, отображаемого в пользовательском режиме работы, с помощью настройки видимости форм (рис. 8.191). Кроме управления шириной форм рабочего стола с помощью ширины колонок, возможно управление их высотой. Высота форм задается в строках, и для каждой из форм она своя (рис. 8.189). Рис. 8.191. Настройка видимости форм рабочего стола Рис. 8.189. Задание высоты форм Том 1 Настройка видимости форм является особенно важной для тех категорий пользователей, которые обладают наиболее полными правами на объекты конфигурации или совмещают несколько ролей прикладного решения. Только таким образом можно будет избежать «каши» на рабочем столе такого пользователя. 281 Глава 8. Разработка форм Состав рабочего стола приложения зависит от прав доступа, которыми обладает пользователь прикладного решения. Так, если совокупность ролей пользователя не дает прав на просмотр некой формы объекта конфигурации, то такая форма не будет отображаться на рабочем столе (рис. 8.192). Рис. 8.193. Влияние функциональных опций на рабочий стол Рис. 8.192. Влияние прав доступа на рабочий стол Функциональные опции, реализованные в прикладном решении, также оказывают влияние на отображение форм, населяющих рабочий стол пользователя (рис. 8.193). Пользовательские настройки, которые могут повлиять на состав рабочего стола, можно вызвать с помощью контекстного меню панели навигации (рис. 8.194). 282 Рис. 8.194. Пользовательская настройка рабочего стола Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Программирование форм Форма как элемент клиент-серверного взаимодействия Прежде чем рассматривать конкретные примеры программирования в формах, нужно иметь четкое представление о том, что представляет собой форма. В предыдущих разделах главы уже давались общие сведения о ее устройстве и функционировании, сейчас же мы рассмотрим форму более подробно и именно с точки зрения ее внутреннего, «программного» устройства. Форма – это программный объект, который создается в процессе работы прикладного решения в режиме 1С:Предприятие. Форма может быть создана платформой, без участия разработчика. Либо она может быть создана по инициативе разработчика в результате выполнения алгоритма, описанного разработчиком на встроенном языке. В «1С:Предприятии» нет «единого пространства» для выполнения кода на встроенном языке. Каждый фрагмент кода выполняется в некотором контексте. Рис. 8.195. Формы, созданные разработчиком По большому счету, не углубляясь в детали, таких контекстов два: это контекст клиента и контекст сервера. С одной стороны, контекст определяет «программное окружение», в котором исполняется код: доступные свойства, методы, набор объектов встроенного языка, которые можно использовать. С другой стороны, контекст определяет физическое место (конкретный компьютер), на котором выполняется этот код. Подробнее Раздел «Контекст исполнения модулей», стр. 47. Раздел «Программные компоненты клиент-серверной архитектуры», стр. 119. Раз мы говорим о «программировании форм», то это значит, что программный объект формы создается платформой на основе того описания, которое существует в дереве объектов конфигурации, то есть на основе объекта конфигурации Форма (рис. 8.195). Потому что в «1С:Предприятии» могут существовать формы, не описанные в конфигурации. Формы, которые платформа генерирует автоматически. Но в такие формы разработчик не может добавить свой код. Каждый такой объект конфигурации Форма, описанный в дереве объектов конфигурации, имеет модуль, в котором разработчик располагает собственные процедуры на встроенном языке (рис. 8.196). Эти процедуры вызываются в определенные, заранее известные моменты работы формы (программного объекта) и определяют ее нестандартное, отличное от других форм поведение и возможности. Том 1 Рис. 8.196. Модуль формы Так вот, основная особенность формы как программного объекта заключается в том, что она существует одновременно и на клиенте, и на сервере. Соответственно модуль формы, процедуры, написанные в этом модуле, исполняются не в каком-то одном определенном контексте (только в контексте клиента или только в контексте сервера). Для каждой процедуры в модуле формы разработчик в явном виде указывает контекст ее исполнения: на сервере или на клиенте. Для этого используются директивы компиляции. 283 Глава 8. Разработка форм Подробнее Раздел «Модуль управляемой формы», стр. 53. Раздел «Исполнение модуля формы на клиенте и на сервере», стр. 54. Общий подход к программированию форм Работа системы «1С:Предприятие» всегда начинается на компьютере пользователя – пользователь запускает приложение и соединяется с информационной базой. Уже в этот момент в работу вступает серверная часть «1С:Предприятия» – выполняется соединение с кластером серверов, аутентификация подключающегося пользователя в информационной базе, формирование основного окна системы, рабочего стола и передача его назад, на клиента. В дальнейшем этот процесс повторяется неоднократно: выполнение каких-либо действий начинается в клиентском приложении, затем управление передается на сервер, он выполняет некоторые действия и возвращает управление на клиента. То есть клиентское приложение вызывает сервер для выполнения каких-либо действий, сервер выполняет их и возвращает управление и результат этих действий обратно, клиентскому приложению. Механизмы платформы, отвечающие за это взаимодействие, оптимизированы для того, чтобы обеспечивать приемлемую скорость работы системы даже на низкоскоростных каналах связи. Однако кроме платформы такое взаимодействие может вызвать и сам разработчик в результате работы своего алгоритма на встроенном языке. Например, когда из процедуры, исполняющейся на клиенте, он вызывает процедуру, которая должна исполняться на сервере. В этом случае также происходит вызов сервера, управление передается на него, выполняется требуемая процедура, и управление возвращается обратно на клиента, в ту процедуру, из которой был осуществлен вызов. Поскольку заранее неизвестно, каким именно образом клиент подключен к серверу, такой серверный вызов может быть «совсем незаметным» для системы или, наоборот, очень «затратным». Например, в том случае, когда используются мобильные каналы связи. Поэтому к вызовам сервера разработчик должен относиться очень внимательно. В противном случае быстродействие и производительность разрабатываемой системы могут оказаться очень низкими. Из этого следуют несколько важных тезисов, определяющих общий подход к программированию форм. Разработчик должен понимать, что он не просто кодирует некий прикладной алгоритм, а в явном виде программирует отдельно клиентскую и отдельно серверную части приложения. 284 Разработчик должен управлять частотой вызовов сервера и объемом передаваемой информации. В разрабатываемой конфигурации код, реализующий бизнес-логику, должен быть четко отделен от кода, реализующего интерфейс. Структура кода должна определяться не прикладной логикой решаемой задачи, а логикой клиент-серверного взаимодействия. Клиентский код пишется не как последовательность действий, которую нужно выполнить. Прежде всего, он продумывается как сценарий передачи управления с клиента на сервер и обратно. Несмотря на то, что форма существует одновременно и на клиенте, и на сервере, клиент и сервер нужно рассматривать не как единое пространство выполнения приложения, а скорее как два взаимодействующих приложения. Полезно мысленно представить вызов сервера как «непростой процесс»: ■■ система формирует обращение к серверу, передает его по каналу связи, потом выполняет его на сервере, возвращает ответ по каналу связи… ■■ если тонкий клиент работает, например, через GPRS, то каждый вызов – это примерно 1,5 секунды! ■■ хочется, чтобы с прикладным решением работали удаленные пользователи? Тогда нужно думать о каждом вызове сервера! На протяжении последующих разделов эти рекомендации будут неоднократно повторяться и объясняться более подробно. Сейчас же важно усвоить следующее: программирование форм – это отдельное непростое занятие, требующее взвешенного и методически грамотного использования имеющихся возможностей платформы. Подробнее Раздел «Общие рекомендации по оптимизации клиент-серверного взаимодействия», стр. 391. Параметры и реквизиты формы Вы уже знаете, что форма, как правило, содержит некоторое количество реквизитов и некоторое количество параметров. И те и другие позволяют хранить некоторые данные, доступны в редакторе формы на соответствующих закладках, и те и другие разработчик может добавить самостоятельно, по своему желанию. Для этого в редакторе формы существуют две закладки: Реквизиты и Параметры (рис. 8.197). В чем же различие между параметрами и реквизитами формы? Для каких задач нужно использовать реквизиты, а для каких – параметры? Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Параметры Параметры формы, в отличие от реквизитов, предназначены для управления функциональностью формы при ее открытии и, грубо говоря, существуют лишь в момент создания и открытия формы. После создания или открытия формы все параметры, кроме ключевых параметров, удаляются, т. к. для дальнейшей работы формы они уже не нужны. Ключевые параметры – это особый вид параметров, значения которых могут потребоваться и после того, как форма создана. Например, для того, чтобы найти именно этот экземпляр формы среди других открытых форм. Выводы Рис. 8.197. Реквизиты и параметры формы Реквизиты Реквизиты формы предназначены для хранения данных, с которыми работает форма. В реквизитах хранятся те данные, которые отображаются и редактируются в элементах формы, а также те данные, которые не отображаются, но используются формой в процессе ее работы. Вся совокупность данных, хранящихся в реквизитах формы, называется данные формы. Этот термин мы будем использовать в дальнейшем. Каждый элемент формы, позволяющий изменять данные, связан с некоторым реквизитом формы. Когда пользователь изменяет данные в элементе формы, аналогичные изменения происходят и в связанном с ним реквизите. Верно и обратное. Когда реквизит формы изменяется программно, изменяется и значение, отображаемое в связанном с ним элементе формы. Не все реквизиты формы обязательно должны отображаться в форме. Часть реквизитов может быть не связана с элементами формы, а данные, хранящиеся в таких реквизитах, предназначены не для отображения или интерактивного редактирования, а для обеспечения внутренних алгоритмов работы формы или для программного взаимодействия с этой формой из встроенного языка. Можно сказать, что реквизиты формы составляют часть программного интерфейса формы, с помощью которого строится взаимодействие с этой формой «извне» – из других форм или из фрагментов программного кода. Важным моментом является то, что реквизиты формы существуют на протяжении всего времени существования самой формы. Том 1 Итак, подытоживая сказанное, можно отметить, что для хранения, отображения, изменения данных, для взаимодействия с формой извне, для хранения служебных данных нужно использовать реквизиты формы. Для того чтобы создать и открыть форму в том виде и в том состоянии, в котором хочется, нужно использовать параметры формы. Следующая глава как раз будет посвящена имеющимся способам открытия форм, и в ней мы будем оперировать различными параметрами формы. Открытие форм Самый первый, наверное, вопрос, который возникает у разработчиков, начинающих знакомиться с формами: а как открыть форму? В этой главе мы рассмотрим общий подход и несколько конкретных примеров открытия форм в типичных ситуациях. Последовательность событий при открытии формы При открытии формы нового объекта (элемента справочника, документа) и при открытии формы существующего объекта возникает различная последовательность событий. Если открывается форма нового объекта, то сначала происходит начальное заполнение объекта данными (событие Обработка заполнения в модуле объекта, форма которого открывается), а затем вызываются два события формы: сначала на сервере (При создании на сервере) и затем на клиенте (При открытии). Эти два события позволяют подготовить форму к открытию (рис. 8.198). 285 Глава 8. Разработка форм форму, которая «сама по себе» не существует, а существует, только если открыта родительская форма. Потому что обработчик При открытии – последний перед открытием формы, в котором можно отказаться от ее открытия. И если не происходит отказа от открытия родительской формы, то, значит, она наверняка будет открыта. Подробнее Что касается других событий, то, например, о событии Обработка заполнения и механизме начального заполнения объектов мы поговорим подробно в разделе «Начальное заполнение», стр. 305. Рис. 8.198. Последовательность событий при открытии формы нового объекта Слева показан клиентский контекст, в котором вызываются события формы. Посередине и справа – серверный контекст, в котором вызываются как события формы, так и события самого прикладного объекта, форма которого открывается. Если открывается форма существующего объекта, то последовательность событий будет иной (рис. 8.199). Сначала на сервере вызываются два события формы. Одно (При чтении на сервере) – чтобы подготовить дополнительные данные, которые зависят от данных объекта. Другое (При создании на сервере) – чтобы максимально подготовить форму к открытию. И наконец, на клиенте вызывается еще одно событие формы (При открытии), чтобы выполнить действия, связанные с открытием формы, которые на сервере выполнить невозможно. А о событии При чтении на сервере мы поговорим в разделе, описывающем преобразование данных объекта в данные формы и обратно, «Преобразование прикладных данных в данные формы», стр. 294. Общая методика открытия форм Общий подход к открытию форм следующий. Для открытия формы используется метод глобального контекста ОткрытьФорму(). Он доступен только в контексте клиентов: толстого клиента, тонкого клиента и веб-клиента. На сервере открыть форму нельзя. Этот метод содержит ряд параметров, которые позволяют указать, какая именно форма должна быть открыта, и задать некоторые свойства открываемой формы. Значения передаваемых параметров либо применяются платформой автоматически, либо разработчик может применить их самостоятельно в обработчике события формы При создании на сервере. Рассмотрим наиболее типичные случаи. Основная форма нового объекта Подробнее Рис. 8.199. Последовательность событий при открытии формы существующего объекта Из всех перечисленных событий нас прежде всего будут интересовать два события формы: При создании на сервере и При открытии. Все, что можно сделать на сервере для подготовки формы к открытию, нужно делать в обработчике события При создании на сервере. Примеры можно посмотреть в демонстрационной базе «Разработка форм, пример 2», панель действий, группа команд Открыть основную форму, глобальные команды Объекта, Группы, Списка, Выбора, Выбора группы. Открыть основную форму справочника Товары можно следующим образом (листинг 8.1): Листинг 8.1. Открытие основной формы нового объекта В обработчике события При открытии нужно делать только то, что на сервере сделать невозможно. Например, выдать предупреждение, задать вопрос. Или же выполнить те действия, которые выполняются именно тогда, когда форма наверняка открывается. Например, открыть связанную ОткрытьФорму("Справочник.Товары.ФормаОбъекта"); 286 Профессиональная разработка в системе «1С:Предприятие 8» Первым параметром метода передается имя той формы, которую нужно открыть. Оно образуется по определенным правилам. Сначала Программирование форм указывается полное имя объекта конфигурации (в данном случае Справочник.Товары), а после него, через точку, стандартное имя основной формы (ФормаОбъекта). Все стандартные имена основных форм перечислены в синтакс-помощнике в описании метода ОткрытьФорму() (рис. 8.200). Таким образом можно открыть как автогенерируемые формы, так и формы, которые созданы разработчиком в конфигурации и назначены основными для объектов конфигурации. Однако существуют две особенности, связанные с открытием стандартных форм, о которых будет сказано далее. Форма констант Первая особенность связана с формой констант. Нет возможности из встроенного языка открыть автогенерируемую форму констант. Можно открыть только форму констант, созданную в конфигурации (листинг 8.3). Листинг 8.3. Открытие формы констант, созданной в конфигурации ОткрытьФорму("ОбщаяФорма.ФормаКонстант"); Здесь ФормаКонстант – это имя созданной формы. Аналогичным образом можно открыть и другие общие формы конфигурации. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», панель действий, группа команд Сервис, глобальная команда Открыть форму констант. Рис. 8.200. Метод «ОткрытьФорму()» в синтакс-помощнике Форма группы Единственной сложностью тут является то, что имя формы указывается как строка, и поэтому писать его нужно внимательно, не забывая о том, что имя класса объектов конфигурации указывается в единственном числе: Справочник, Документ и т. д.). Вторая особенность связана с формой группы иерархического справочника или иерархического плана видов характеристик. Поскольку кроме имени формы никаких других параметров не указывается, в случае формы объекта будет создан новый объект и открыта его форма. Подробнее Как открыть форму существующего объекта, рассказано в разделе «Форма существующего объекта», стр. 289. В случае же форм списка и выбора просто будут открыты соответствующие формы (листинг 8.2). Листинг 8.2. Открытие основных форм списка и выбора ОткрытьФорму("Справочник.Товары.ФормаСписка"); ОткрытьФорму("Справочник.Товары.ФормаВыбора"); ОткрытьФорму("Справочник.Товары.ФормаВыбораГруппы"); Том 1 Указывая имя формы в методе ОткрытьФорму(), мы лишь определяем, какая форма должна быть открыта. Но не определяем особенности элемента данных, который будет отображаться в этой форме. В случае с документами или линейными справочниками никакой проблемы не возникнет. Все элементы данных в таких структурах равнозначны. Однако если справочник не линейный, а иерархический, то он содержит как «обычные» элементы, так и элементы, являющиеся группами. Если при открытии формы не делать специальных указаний, платформа стандартно будет создавать именно новый элемент, а не группу. Поэтому если мы хотим открыть форму новой группы, то помимо указания имени открываемой формы нужно еще указать, что должна создаваться именно новая группа, а не элемент. Для этого используются параметры формы. Некоторый стандартный набор параметров существует у самого объекта встроенного языка Форма. В режиме 1С:Предприятие к этим параметрам, 287 Глава 8. Разработка форм которые существуют у любой формы, добавляется еще некоторое количество параметров, поставляемых расширением формы. Параметры формы описаны в синтакс-помощнике (рис. 8.201). Рис. 8.202. Расширения формы в синтакс-помощнике Подробнее Рис. 8.201. Параметры формы в синтакс-помощнике Все возможные расширения также перечислены в синтакс-помощнике. У каждого из них свой состав параметров, которые они добавляют к параметрам формы (рис. 8.202). Какое именно расширение будет добавлено к конкретной форме, зависит от типа основного реквизита формы. Например, если форма отображает данные элемента справочника, то основной реквизит такой формы будет иметь тип СправочникОбъект.<имя>, а к форме будет добавлено расширение справочника. У расширения справочника есть параметр ЭтоГруппа. Если в этот параметр передать значение Истина, то будет создана именно новая группа, а не новый элемент. Параметры формы можно передать вторым параметром метода ОткрытьФорму(). Так как может быть указано сразу несколько параметров, то они передаются в виде структуры. Каждый элемент этой структуры содержит имя параметра и его значение (листинг 8.4). Листинг 8.4. Открытие основной формы новой группы ПараметрыФормы = Новый Структура("ЭтоГруппа", Истина); ОткрытьФорму("Справочник.Товары.ФормаГруппы", ПараметрыФормы); 288 Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», панель действий, группа команд Открыть основную форму, глобальная команда Группы. Произвольная форма Открыть форму, не назначенную основной для справочника Товары, можно следующим оператором (листинг 8.5): Листинг 8.5. Открытие произвольной формы ОткрытьФорму("Справочник.Товары.Форма.ПроизвольнаяФормаТовара"); Здесь первым параметром метода также передается полное имя той формы, которую нужно открыть. Но поскольку открываемая форма не назначена основной, то после полного имени объекта конфигурации (Справочник.Товары) нужно указать слово Форма, а затем – имя нужной формы (ПроизвольнаяФормаТовара), как она названа в конфигураторе. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», панель действий, группа команд Сервис, глобальная команда Открыть произвольную форму. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Форма существующего объекта Чтобы открыть форму существующего элемента, нужно указать, какой именно элемент нас интересует. Для этого также используются параметры формы. У расширения справочника есть параметр Ключ. Если в этот параметр передать ссылку на существующий элемент справочника, то будет открыта форма именно этого элемента, а не нового. Например, если из формы списка организаций нужно открыть форму той организации, на которой находится курсор, сделать это можно следующим способом (листинг 8.6): Листинг 8.6. Открытие основной формы существующего объекта СсылкаНаЭлементСправочника = Элементы.Список.ТекущаяСтрока; ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника); ОткрытьФорму("Справочник.Организации.ФормаОбъекта", ПараметрыФормы); Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», список организаций, команда Открыть форму элемента. Это локальная команда формы списка справочника Организации. к серверу, например когда нужно открыть форму элемента иерархического справочника. Платформа будет выполнять дополнительное обращение к серверу для того, чтобы определить, является ли элемент группой или нет, так как для элемента и для группы нужно открывать разные формы. В то же время эта информация может быть заранее известна разработчику внутри его алгоритма, и, используя метод ОткрытьФорму(), разработчик может открывать нужную форму без дополнительных обращений к серверу. Подробнее Пример, подробно описывающий эту ситуацию, можно посмотреть в разделе «Использование стандартных полей запроса в динамических списках на клиенте», стр. 414. Открыть список, чтобы курсор был на нужном элементе Одна из типичных задач при работе с формами списков – это открытие формы с одновременным позиционированием на конкретном элементе списка. Для решения такой задачи можно использовать параметр ТекущаяСтрока, который поставляется расширением динамического списка (рис. 8.203). Чтобы получить ссылку на выделенный элемент списка, мы обращаемся к элементу формы Список и получаем его свойство ТекущаяСтрока. Затем мы создаем структуру ПараметрыФормы для передачи параметров в открываемую форму. В этой структуре будет единственный элемент с ключом Ключ и значением полученной ссылки. После этого открывается форма объекта в соответствии с переданной структурой параметров. В заключение следует заметить, что в том случае, когда кроме ссылки на объект никакие параметры в открываемую форму передавать не нужно и нужна именно основная форма существующего объекта, можно использовать более простой способ – с помощью функции глобального контекста ОткрытьЗначение(), листинг 8.7. Листинг 8.7. Использование метода «ОткрытьЗначение()» ОткрытьЗначение(Элементы.Список.ТекущаяСтрока); Такой способ обладает меньшей универсальностью, но в некоторых случаях он экономит много времени и сил. Например, в рассмотренном нами случае одна такая строка может заменить всю написанную нами ранее процедуру из трех строк. Однако нужно внимательно относиться к использованию этого метода. В некоторых случаях он может вызывать дополнительные обращения Том 1 Рис. 8.203. Параметр «ТекущаяСтрока» в синтакс-помощнике 289 Глава 8. Разработка форм Например, для того чтобы сразу увидеть открытый элемент в списке товаров, нужно, находясь в форме элемента справочника Товары, открыть форму списка товаров так, чтобы курсор находился на этом элементе. Для этого можно создать локальную команду формы элемента, которая будет выполнять следующий код (листинг 8.8). Листинг 8.8. Открытие формы списка с позиционированием на некотором элементе ПараметрыФормы = Новый Структура("ТекущаяСтрока", Объект.Ссылка); ОткрытьФорму("Справочник.Товары.ФормаСписка", ПараметрыФормы); Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», форма элемента справочника Товары, команда Найти в списке. Это локальная команда формы элемента справочника Товары. Список подчиненного справочника с отбором по владельцу Другая типичная задача – открытие списка подчиненного справочника. Для ее реализации можно использовать параметр Отбор, который также поставляется расширением динамического списка. В этот параметр нужно передать условие на отбор элементов подчиненного справочника по некоторому владельцу. Например, это может выглядеть следующим образом. Справочник РасчетныеСчета подчинен справочнику Организации. В форме элемента справочника Организации (ссылка на этот элемент доступна как Объект.Ссылка) можно выполнить следующий код (листинг 8.9). Листинг 8.9. Открытие формы подчиненного справочника с отбором по владельцу УсловияОтбора = Новый Структура("Владелец", Объект.Ссылка) ПараметрыФормы = Новый Структура("Отбор", УсловияОтбора); ОткрытьФорму("Справочник.РасчетныеСчета.ФормаСписка", ПараметрыФормы); Сначала создается структура, содержащая условия отбора (УсловияОтбора). В нашем случае условие будет одно, но, вообще говоря, их может быть несколько. Затем эта структура устанавливается как значение параметра Отбор формы. И в заключение открывается форма списка подчиненного справочника, в которую передается структура параметров формы. 290 Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», форма элемента справочника Организации, команда Показать расчетные счета. Это локальная команда формы элемента справочника Организации. Передача параметров в произвольный запрос динамического списка Еще одна задача, которая может возникать при открытии формы, заключается в том, что динамический список, содержащийся в форме, может содержать произвольный запрос с параметрами. И при открытии формы нужно передавать в этот список конкретные значения этих параметров. Эта задача тоже решается с помощью параметров формы. Только это будут уже не стандартные параметры формы, предоставляемые платформой, а параметры формы, созданные разработчиком в конфигураторе. В эти параметры нужно передать требуемые значения, а в обработчике события формы При создании на сервере установить эти значения параметрам запроса в динамическом списке. Рассмотрим эту задачу на примере списка регистра ЦеныТоваров. В форме списка этого регистра содержится динамический список с произвольным запросом (листинг 8.10). Листинг 8.10. Запрос динамического списка ВЫБРАТЬ РегистрСведенийЦеныТоваров.Период, РегистрСведенийЦеныТоваров.Товар, РегистрСведенийЦеныТоваров.Цена ИЗ РегистрСведений.ЦеныТоваров КАК РегистрСведенийЦеныТоваров ГДЕ РегистрСведенийЦеныТоваров.Товар = &Товар И РегистрСведенийЦеныТоваров.Период >= &НачалоПериода И РегистрСведенийЦеныТоваров.Период <= &КонецПериода У этого запроса есть три параметра: Товар, НачалоПериода и КонецПериода. Для нормального функционирования формы значения этих параметров должны быть заданы при открытии формы, иначе в результате открытия формы будет получена ошибка. В форме элемента справочника Товары есть команда Цены в декабре, которая показывает цены на этот товар, установленные только в декабре 2009 года. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», форма элемента справочника Товары, команда Цены в декабре. Это локальная команда формы элемента справочника Товары, она открывает список регистра ЦеныТоваров. Чтобы передать собственные параметры в форму, желательно создать их в редакторе формы. Листинг 8.12. Обработчик события «При создании на сервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("НачалоПериода", Параметры.НачалоПериода); Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", Параметры.КонецПериода); Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.Товар); Вообще говоря, делать это не обязательно. Любые параметры, переданные в метод ОткрытьФорму(), будут доступны в обработчике события формы При создании на сервере. Но все же лучше создать их у формы в явном виде. КонецПроцедуры Тогда, во-первых, в модуле формы не придется проверять, существуют такие параметры или нет. А во-вторых, явное создание параметров формы облегчает поддержку прикладного решения теми разработчиками, которые не участвовали в его создании. Кроме метода ОткрытьФорму() существует и другой метод глобального контекста, который может быть использован для открытия форм, – ПолучитьФорму(). Итак, создадим у формы списка регистра сведений три параметра: НачалоПериода, КонецПериода (тип Дата) и Товар (тип СправочникСсылка.Товары), рис. 8.204. Метод «ПолучитьФорму()» По составу параметров этот метод очень похож на ОткрытьФорму(). Разница заключается в том, что ПолучитьФорму() лишь возвращает форму, не открывая ее. В дальнейшем эта форма может быть открыта с помощью своего метода Открыть(). Такой способ открытия формы можно использовать в тех случаях, когда должны выполняться различные сложные действия в зависимости от того, из какого фрагмента кода открывается форма. В этом случае после получения формы может быть, например, вызвана ее экспортная процедура, выполняющая настройку формы в зависимости от «контекста» ее вызова (листинг 8.13). Листинг 8.13. Получение и открытие формы Рис. 8.204. Параметры формы Перем СсылкаНаТаблицуСтилей; Теперь в форме элемента справочника Товары создадим команду ЦеныВДекабре со следующим текстом (8.11). ФормаРедактора = ПолучитьФорму("Обработка.УниверсальныйРедактор.Форма"); ФормаРедактора.РедактироватьHTMLТекст("Пример HTML-текста", СсылкаНаТаблицуСтилей); ФормаРедактора.Открыть(); Листинг 8.11. Текст команды «ЦеныВДекабре» ПараметрыФормы = Новый Структура("НачалоПериода, КонецПериода, Товар", '20091201000000', '20091231235959', Объект.Ссылка); ОткрытьФорму("РегистрСведений.ЦеныТоваров.Форма.ФормаСписка", ПараметрыФормы); Этой командой мы открываем форму списка регистра сведений и передаем ей значения трех параметров. В самой форме регистра сведений, в обработчике события формы При создании на сервере, установим переданные значения в качестве параметров произвольного запроса динамического списка следующим образом (листинг 8.12). Том 1 Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», панель действий, группа команд Сервис, глобальная команда Открыть текст в редакторе. В данном примере используется форма обработки УниверсальныйРедактор. Подразумевается, что обработка может редактировать как обычный текст, так и HTML-текст. Также подразумевается, что в зависимости от того, какой текст передается для редактирования, в самой обработке он определенным образом оформляется и подготавливается для редактирования. 291 Глава 8. Разработка форм Так как эта подготовка текста к редактированию не зависит от контекста, в котором вызван редактор, а определяется лишь видом редактируемого текста, в модуле формы этой обработки существуют две экспортируемые процедуры, позволяющие получить и подготовить к редактированию обычный текст (РедактироватьОбычныйТекст()) и HTML-текст (РедактироватьHTMLТекст()). Для этого кроме основной формы обработки (Форма) создадим форму ПараметрыЗаполнения. Эта форма будет открываться модально из основной формы и возвращать коды стандартных команд. В приведенном примере как раз получается форма этой обработки, и с помощью экспортируемой процедуры РедактироватьHTMLТекст() ей передается текст, который нужно подготовить к редактированию. После этого форма обработки открывается. В обработчике этой команды откроем форму ПараметрыЗаполнения модально (листинг 8.14). Чтобы открыть модально форму ПараметрыЗаполнения, в основной форме обработки создадим команду ЗадатьПараметрыЗаполнения и расположим ее в подгруппе Дополнительно в командной панели формы. Листинг 8.14. Обработчик команды «ЗадатьПараметрыЗаполнения» Модальное открытие формы Результат = ОткрытьФормуМодально( "Обработка.ЗаполнениеДанных.Форма.ПараметрыЗаполнения"); Во многих случаях форма открывается для того, чтобы пользователь обязательно выполнил какие-то действия или ввел какие-то данные, без которых дальнейшая работа программы будет невозможна. Теперь в форме ПараметрыЗаполнения в командную панель формы перенесем три стандартные команды: ОК, Пропустить, Отмена (рис. 8.205). В таких случаях используется открытие формы в модальном режиме. В этом случае дальнейшее выполнение программного кода будет остановлено до тех пор, пока пользователь не закроет модальную форму. При этом все другие открытые формы прикладного решения будут недоступны. Для этого используется метод глобального контекста ОткрытьФормуМодально(). Модальная форма может быть закрыта с помощью стандартных интерактивных команд формы либо из встроенного языка методом Закрыть(). Если форма закрывается с помощью стандартных интерактивных команд, то метод ОткрытьФормуМодально() возвращает код возврата диалога, соответствующий команде, с помощью которой модальная форма была закрыта. Если форма закрывается из встроенного языка методом Закрыть(), то в параметр этого метода разработчик может передать произвольное значение, которое будет возвращено в вызывающий код. Рассмотрим эти возможности на примере обработки, которая из своей основной формы открывает две другие формы для получения дополнительных данных. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», обработка ЗаполнениеДанных. Рис. 8.205. Кнопки стандартных команд в командной панели Форма ПараметрыЗаполнения после своего закрытия одной из этих стандартных команд вернет в переменную Результат код возврата диалога, значения которого описаны в системном перечислении КодВозвратаДиалога. Поэтому вернемся в основную форму обработки и проанализируем возвращаемый результат, выведя в форму обработки сообщение, соответствующее нажатой кнопке в форме ПараметрыЗаполнения (листинг 8.15). Сначала рассмотрим, как возвращать результаты выполнения стандартных интерактивных команд формы. 292 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.15. Обработчик команды «ЗадатьПараметрыЗаполнения» Результат = ОткрытьФормуМодально("Обработка.ЗаполнениеДанных.Форма.ПараметрыЗаполнения"); Сообщение = Новый СообщениеПользователю; Если Результат = КодВозвратаДиалога.ОК Тогда Сообщение.Текст = "В форме нажата стандартная кнопка ОК"; ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда Сообщение.Текст = "В форме нажата стандартная кнопка Пропустить"; ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда Сообщение.Текст = "В форме нажата стандартная кнопка Отмена"; Иначе Сообщение.Текст = "Обработка этой команды в форме не предусмотрена"; КонецЕсли; Сообщение.Сообщить(); Теперь рассмотрим вторую возможность – возврат произвольного значения из формы, открытой модально. Для этого создадим еще одну форму обработки – ДобавлениеТекста. В ней создадим строковый реквизит (Текст) и поле для его редактирования. Добавим команду ЗакончитьВводТекста, по которой будем возвращать введенный пользователем текст (рис. 8.206). А в основной форме обработки добавим команду ДобавитьТекст, которая будет модально открывать форму ДобавлениеТекста и показывать текст, введенный в ней пользователем (листинг 8.17). Листинг 8.17. Обработчик команды «ДобавитьТекст» Результат = ОткрытьФормуМодально("Обработка.ЗаполнениеДанных.Форма.ДобавлениеТекста"); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В форме введен текст: " + Результат; Сообщение.Сообщить(); Открытие и запуск отчета Последняя задача, которую мы рассмотрим в этой главе, это открытие формы отчета и выполнение этого отчета без дополнительных действий со стороны пользователя. Например, есть отчет ЦеныТоваров. Он показывает последние цены, установленные на товары. Задача в том, чтобы по команде в форме товаров сразу запускать этот отчет с отбором, установленным по тому товару, на котором находится курсор в списке. Выполнить эту задачу помогут два параметра, которые поставляются расширением отчета: Отбор и СформироватьПриОткрытии. Параметр Отбор позволяет установить отбор в отчете, задав значения полей или параметров отчета. А параметр СформироватьПриОткрытии позволяет сразу же выполнить отчет, после того как его форма будет получена на сервере. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 2», форма списка справочника Товары, команда ЦенаТовара. Это локальная команда формы списка справочника Товары. Итак, создадим форму списка справочника Товары и добавим в нее команду ЦенаТовара. Текст этой команды будет выглядеть следующим образом (листинг 8.18). Рис. 8.206. Команда «ЗакончитьВводТекста» в форме «ДобавлениеТекста» Листинг 8.18. Обработчик команды «ЦенаТовара» Обработчик команды ЗакончитьВводТекста будет выглядеть совсем просто (листинг 8.16). УсловияОтбора = Новый Структура("Товар", Элементы.Список.ТекущаяСтрока); ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", УсловияОтбора, Истина); ОткрытьФорму("Отчет.ЦеныТоваров.ФормаОбъекта", ПараметрыФормы); Листинг 8.16. Обработчик команды «ЗакончитьВводТекста» Закрыть(Текст); Том 1 Сначала создаем структуру УсловияОтбора, которая задаст единственное условие отбора – по тому товару, на котором установлен курсор в списке (Элементы.Список.ТекущаяСтрока). 293 Глава 8. Разработка форм Затем сформируем структуру для параметров формы (ПараметрыФормы), описав в ней значения двух параметров – Отбор и СформироватьПриОткрытии. В заключение, как и раньше, открываем форму отчета (ОткрытьФорму()), указав имя формы и параметры, предназначенные для открываемой формы. Преобразование прикладных данных в данные формы Встроенный язык содержит целый ряд объектов, предназначенных для чтения и модификации объектных данных, хранящихся в базе данных. Это такие типы, как СправочникОбъект.<имя>, ДокументОбъект.<имя> и т. д. Однако работа с этими типами данных возможна только в контексте сервера. Форма же и на клиенте, и на сервере для отображения таких объектных данных использует специальные универсальные типы. Рис. 8.208. Преобразование данных объекта в данные формы После того как форма полностью подготовлена, она передается с сервера на клиента (рис. 8.209). Поэтому при открытии форм объектов платформа выполняет автоматическое преобразование данных из типов объектов в типы, поддерживаемые формой. При записи данных объектов из формы происходит обратное преобразование. Рассмотрим эти процессы подробнее. Когда открывается форма существующего объекта, платформа читает его данные из базы данных и создает в памяти соответствующий этим данным объект встроенного языка (рис. 8.207). Например, СправочникОбъект.<имя>. Рис. 8.209. Передача формы на клиента Обратное преобразование выполняется аналогичным образом. Сначала форма передается с клиента на сервер (рис. 8.210). Рис. 8.207. Чтение данных существующего объекта После этого данные объекта преобразуются в данные основного реквизита формы. Как правило, основной реквизит формы имеет имя Объект (рис. 8.208). 294 Рис. 8.210. Передача формы на сервер После этого основной реквизит формы преобразуется в соответствующий объект встроенного языка, позволяющий модифицировать данные в базе данных. Например, СправочникОбъект.<имя> (рис. 8.211). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Рис. 8.211. Преобразование данных формы в прикладной объект Затем данные объекта записываются в базу данных (рис. 8.212). Рис. 8.213. Преобразование данных элемента справочника в «ДанныеФормыСтруктура» Никаких специфических методов ДанныеФормыСтруктура иметь не будет. Это касается и стандартных методов объекта справочника (например, Записать()), и методов, описанных разработчиком в модуле объекта (например, экспортируемая процедура ПересчитатьЦены()). Рис. 8.212. Запись данных прикладного объекта в базу данных Существуют четыре типа универсальных данных формы, в которые преобразуются типы, доступные только на сервере: ■■ ДанныеФормыСтруктура, ■■ ДанныеФормыКоллекция, ■■ ДанныеФормыДерево, ■■ ДанныеФормыСтруктураСКоллекцией. Это простые типы данных в том смысле, что они по сути представляют собой определенным образом организованные структуры данных и не содержат никакого специфического поведения, зависящего от данных. В какой именно тип будут преобразованы серверные данные, зависит от самих этих данных. Преобразование выполняется в те универсальные типы, которые наиболее хорошо подходят для описания исходного типа данных. Например, данные типа СправочникОбъект.Товары будут преобразованы в тип ДанныеФормыСтруктура (рис. 8.213). Элементы этой структуры будут содержать значения реквизитов справочника Товары. Реквизиты примитивных типов в форме будут иметь тот же тип, что и у серверного объекта. Например, Код и Наименование будут иметь тип Строка. Том 1 Реквизиты ссылочного типа, например СсылкаНаПоставщика типа СправочникСсылка.Поставщики, будут иметь такой же тип, как и на сервере – СправочникСсылка.<имя>. Однако программный объект ссылки в форме, в контексте клиента очень сильно ограничен в своих возможностях. Практически единственное, что можно сделать со ссылкой на клиенте, – это получить ее значение. Ну и еще проверить, является ли эта ссылка пустой. Создание объектов от ссылки, получение значений через точку от ссылки на клиенте недоступны. Это возможно только на сервере. Как уже говорилось выше, для системных процессов, таких как запись, проведение объекта из формы, подобное преобразование выполняется платформой автоматически. Однако встроенный язык при необходимости позволяет разработчику выполнять такие преобразования самостоятельно. Для этого используются процедуры глобального контекста ДанныеФормыВЗначение() и ЗначениеВДанныеФормы(). ПРИМЕЧАНИЕ Аналогичные методы существуют и у формы: РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы(). Подробнее они будут рассмотрены в разделе «Работа с данными объекта в форме», стр. 297, в разделе «Запись данных объекта в единой транзакции за один серверный вызов», стр. 421, и в разделе «Реализация пересчета данных объекта в модуле объекта или в модуле формы в зависимости от логики объекта», стр. 432. 295 Глава 8. Разработка форм Контекстные и внеконтекстные серверные вызовы Теперь рассмотрим подробнее, что происходит при контекстных и при внеконтекстных серверных вызовах в форме. Для упрощения рассказа мы опустим тонкости оптимизации и кеширования, которые выполняет при этом платформа, так как на суть описываемых действий это не влияет. Когда из клиентской процедуры/функции вызывается серверная (с директивой компиляции &НаСервере) процедура/функция, происходит передача всей формы на сервер. Сначала контекст формы (реквизиты формы, элементы формы, параметры формы) специальным образом упаковываются и подготавливаются к передаче на сервер (рис. 8.214). Рис. 8.216. Выполнение кода на встроенном языке из модуля формы На рисунке темным цветом выделены те данные, которые, возможно, были изменены на сервере в процессе выполнения серверной процедуры. После того как исполнение кода на сервере будет закончено, происходит обратное действие. Контекст формы упаковывается и передается обратно на клиента, в клиентскую часть формы (рис. 8.217). Рис. 8.214. Подготовка контекста формы и передача его на сервер На рисунке темным цветом выделены те данные, которые, возможно, были изменены на клиенте. На сервере создается серверная часть формы, полученный контекст разворачивается в данные, элементы и реквизиты формы, после чего инициализируется модуль формы (рис. 8.215). Рис. 8.217. Упаковка контекста формы и передача его на клиента На клиенте происходит синхронизация контекста формы: имеющийся контекст заменяется контекстом, полученным с сервера. А на сервере происходит уничтожение серверной части формы (рис. 8.218). Рис. 8.218. Замена контекста на клиенте и уничтожение серверной части формы Рис. 8.215. Получение контекста формы и инициализация серверной части модуля формы После того как программный объект формы будет полностью подготовлен к работе, выполняется код той процедуры/функции, которая была вызвана с клиента (рис. 8.216). 296 Таким образом, контекстный вызов формы – довольно затратный и непростой процесс. Использовать все время только контекстные вызовы сервера было бы расточительно и непроизводительно. Поэтому контекстные вызовы сервера рекомендуется использовать тогда, когда обойтись без них очень трудно или невозможно вообще. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В то же время есть масса ситуаций, когда нужно выполнять некоторые действия на сервере, но контекст формы при этом не нужен. Для этого используются внеконтекстные серверные вызовы, когда из клиентской процедуры вызывается серверная процедура с директивой компиляции &НаСервереБезКонтекста. Подробнее В этом случае из модуля клиентской части формы выполнение кода сразу же передается на сервер, во внеконтекстную процедуру. После ее выполнения осуществляется возврат на клиента (рис. 8.219). Работа с данными объекта в форме Пример, подробно описывающий эту ситуацию, можно посмотреть в разделе «Использование контекстных серверных процедур для пересчета данных коллекций форм», стр. 406. В этом разделе мы рассмотрим несколько простых примеров работы с данными объекта в форме. Они помогут понять общие подходы к основным действиям. Пример 1 В качестве первого примера рассмотрим ситуацию, когда мы находимся в форме документа и нам нужно получить какой-либо его реквизит. Например, номер документа или значение реквизита Поставщик. Подробнее Рис. 8.219. Неконтекстный вызов серверной процедуры/функции Внеконтекстный вызов проще, эффективнее и производительнее. Именно его рекомендуется использовать в большинстве случаев. Однако не стоит увлекаться фанатичной погоней за производительностью, осуществляя только внеконтекстные вызовы и передавая контекст формы в параметрах вызываемой процедуры. Во-первых, всегда следует искать золотую середину между «читабельностью» программы и ее производительностью. Можно так «заоптимизировать» прикладное решение, что разобраться в нем через некоторое время не сможет уже никто, включая самого автора. Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 3», форма документа Накладная, группа команд Примеры, команда Значение реквизита. Это локальная команда формы документа Накладная. Данные объекта, которые отображаются в форме (в нашем случае данные документа), находятся всегда в основном реквизите формы. В подавляющем большинстве случаев этот реквизит имеет имя Объект. По крайней мере именно такое имя дает ему платформа, когда с помощью конструктора создает форму объекта. В нашем случае это именно так (рис. 8.220). Во-вторых, контекстные вызовы сервера мы рассматривали упрощенно. На самом деле платформа очень серьезно оптимизирует объем данных, передаваемых между клиентом и сервером. Например, при открытии формы на клиента передается только часть данных, которую видит в данный момент пользователь. С клиента на сервер передаются не все данные, а только те, которые были изменены на клиенте. При изменении данных на сервере на клиента также передаются не все данные, а только те, которые были изменены. Поэтому если на сервере требуется обращаться к большому массиву данных, которые хранятся в данных формы, то выгоднее выполнить именно контекстный серверный вызов. Потому что в этом случае платформа эффективно выполнит передачу данных формы на сторону сервера, там сконструирует соответствующий контекст и обратно перешлет данные на клиента. Том 1 Рис. 8.220. Стандартное имя основного реквизита формы объекта Основной реквизит формы содержит набор подчиненных реквизитов, соответствующих реквизитам прикладного объекта. Поэтому для того, чтобы обратиться, например, к номеру документа, нужно указать имя реквизита формы и через точку – имя подчиненного реквизита, хранящего номер документа. 297 Глава 8. Разработка форм В нашем случае, для того чтобы сообщить номер документа и поставщика, нужно будет выполнить следующий код (листинг 8.19). Листинг 8.19. Получение значения реквизита формы Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Объект.Номер + Символы.ПС + Строка(Объект.Поставщик); Сообщение.Сообщить(); Номер документа имеет тип Строка, поэтому мы выводим его просто как Объект.Номер, а значение реквизита Поставщик имеет тип ссылки. Поэтому для того, чтобы включить его в текстовую строку, мы получаем строковое представление этого ссылочного значения, преобразуя его к типу Строка: Строка(Объект.Поставщик). Пример 2 Второй пример, который мы рассмотрим, будет заключаться в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Как раз у документа Накладная есть реквизит ссылочного типа – Поставщик. Мы будем получать ИНН этого поставщика. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 3», форма документа Накладная, группа команд Примеры, команда Реквизит от ссылки. Это локальная команда формы документа Накладная. Мы, как и в предыдущем примере, по-прежнему находимся в модуле формы на клиенте. В контексте клиента, как мы уже упоминали выше, ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера. Поэтому для решения нашей задачи мы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента. Локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом (листинг 8.20). Листинг 8.20. Обработчик локальной команды формы &НаКлиенте Процедура РеквизитОтСсылки(Команда) Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ПолучитьИННПоставщика(Объект.Поставщик); Сообщение.Сообщить(); КонецПроцедуры 298 Здесь в текст сообщения мы помещаем то, что вернет нам серверная функция ПолучитьИННПоставщика(). Эту функцию мы опишем в модуле формы следующим образом (листинг 8.21). Листинг 8.21. Серверная функция для получения реквизита от ссылочного значения &НаСервереБезКонтекста Функция ПолучитьИННПоставщика(Поставщик) Возврат Поставщик.ИНН; КонецФункции То есть на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки. Обратите внимание еще раз. Эта функция не использует контекст формы. Потому что все, что нам нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и «гонять» на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, было бы слишком расточительно. Пример 3 Третий пример, который мы рассмотрим, будет заключаться в вызове экспортируемой процедуры объекта. Наш документ как раз имеет одну такую процедуру, которая позволяет пересчитать все цены, содержащиеся в табличной части документа, и применить к ним скидку в 10 %. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 3», форма документа Накладная, группа команд Примеры, команда Метод объекта. Это локальная команда формы документа Накладная. Поскольку для вызова такой процедуры необходимо прежде всего иметь сам объект, мы поступим следующим образом. Выполним контекстный серверный вызов. На сервере преобразуем основной реквизит формы в прикладной объект, выполним экспортируемую функцию этого объекта и преобразуем объект обратно в основной реквизит формы. В результате выполненные на сервере изменения данных формы будут автоматически переданы на клиента, когда на него вернется выполнение программного кода. Локальная команда формы, вызывающая серверную процедуру, будет выглядеть следующим образом (листинг 8.22). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.22. Обработчик локальной команды формы &НаКлиенте Процедура МетодОбъекта(Команда) ПересчитатьЦеныНаСервере(); КонецПроцедуры Контекстная серверная функция ПересчитатьЦеныНаСервере() будет выглядеть следующим образом (листинг 8.23). Листинг 8.23. Серверная функция для вызова экспортируемой функции объекта &НаСервере Процедура ПересчитатьЦеныНаСервере() ОбъектДокумента = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.Накладная")); ОбъектДокумента.НачислитьСкидку(10); ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект"); Рис. 8.221. Последовательность событий при открытии формы существующего объекта Теперь же мы можем представить ее более подробно (рис. 8.222). КонецПроцедуры В этой функции сначала мы преобразуем данные реквизита формы Объект в прикладной объект типа ДокументОбъект.Накладная. После этого мы вызываем экспортируемую процедуру этого прикладного объекта – НачислитьСкидку(). В результате ее работы все цены, содержащиеся в табличной части объекта, будут уменьшены на 10 %. Затем мы преобразуем данные прикладного объекта обратно в реквизит формы Объект. То есть новые цены в табличной части теперь будут и в форме, которая пока находится на сервере. Когда выполнение всех серверных процедур, которые мы вызвали, будет закончено, контекст формы на сервере будет собран, отправлен на клиента и там автоматически обновлен. В результате мы увидим в открытом документе на клиенте уже новые цены в табличной части документа. Последовательность событий при открытии формы объекта Теперь, когда мы знакомы с тем, как открыть нужную нам форму, и понимаем, как в принципе форма функционирует, рассмотрим подробно последовательность событий, которые возникают при открытии формы существующего объекта. Этот пример мы рассмотрим как наиболее сложный и типичный. Ранее, на рис. 8.199, мы уже видели эту последовательность событий. Напомним ее (рис. 8.221). Рис. 8.222. Последовательность действий и событий при открытии формы существующего объекта Том 1 299 Глава 8. Разработка форм Чтение данных прикладного объекта Когда платформа получает интерактивную или программную команду открыть форму объекта, прежде всего на сервере создается программный объект формы. После этого создается программный объект, соответствующий типу основного реквизита формы, и из базы данных читаются данные этого объекта. На схеме (рис. 8.222) объект отмечен темным цветом. Это означает, что он содержит данные, прочитанные из базы данных. Затем платформа выполняет преобразование данных объекта в данные формы. Об этом мы говорили в разделе «Преобразование прикладных данных в данные формы», стр. 294. Событие «При чтении на сервере» После этого вызывается первое событие формы – При чтении на сервере. В чем особенность этого события? Зачем именно в этот момент нам предлагается вмешаться в «процесс»? Посмотрим. Событие вызывается у формы. Причем поставляется это событие не самой формой, а ее расширением, определяемым типом основного реквизита формы. То есть это какая-то особенная ситуация, связанная с тем, что открывается не просто форма, а именно форма этого объекта. Сам прикладной объект удаляется из памяти сервера, т. к. для дальнейших действий он уже не нужен. И вызывается второе и последнее событие формы на сервере – При создании на сервере. Событие «При создании на сервере» Что изменилось по сравнению с предыдущим событием? Нет прикладного объекта. Это последнее событие перед тем, как форма отправится на клиента. Это событие формы, то есть оно не зависит от того, какие данные форма отображает, и существует у всех форм. Значит, в этом событии нужно полностью подготовить саму форму к открытию. Именно форму, ее внешнее представление. Данные мы уже полностью подготовили в предыдущем обработчике события. Ранее мы уже использовали это событие, когда изучали различные способы открытия форм. Например, для того, чтобы установить значения параметров произвольного запроса в динамическом списке (стр. 290). Также в этом событии можно отказаться от открытия формы, если по каким-либо причинам она не должна быть открыта (листинг 8.25). Для этого параметр Отказ нужно установить в значение Истина. Листинг 8.25. Объявление обработчика события «При создании на сервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Данные формы уже заполнены данными объекта, в то же время сам объект все еще существует в памяти сервера и доступен в обработчике этого события через параметр ТекущийОбъект (листинг 8.24). Также здесь можно отказаться от стандартной обработки события, выполняемой платформой (СтандартнаяОбработка = Ложь). Стандартная обработка, выполняемая платформой, зависит от типа основного реквизита открываемой формы. Листинг 8.24. Объявление обработчика события «При чтении на сервере» Например, для формы списка это будет передача в динамический список параметров, указанных при открытии формы. Если в примере «Открыть список, чтобы курсор был на нужном элементе» (стр. 289) в форме списка справочника Товары отменить стандартную обработку, то не будет выполняться позиционирование курсора на нужную строку в списке. &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) Очевидно, что здесь мы можем подготовить дополнительные данные формы, которые зависят от данных объекта. Существование самого объекта полезно тем, что мы можем воспользоваться всей его функциональностью, например вызвать какую-либо его экспортируемую процедуру или получить значение через точку от его реквизита ссылочного типа. Это избавляет нас от необходимости преобразовывать данные формы в объект. После обработки события При чтении на сервере данные формы, вообще говоря, могут уже отличаться от тех данных, которые содержатся в прикладном объекте. Поэтому на схеме форма отмечена темным цветом. Это означает, что она содержит измененные данные. 300 Аналогично если в примере «Список подчиненного справочника с отбором по владельцу» (стр. 290) в форме списка справочника РасчетныеСчета отменить стандартную обработку, то не будет выполняться отбор списка по владельцу. Для форм отчетов стандартная обработка заключается в загрузке варианта и пользовательских настроек отчета. Кроме этого, стандартная обработка передает в отчет параметры отбора и выполняет автоматический запуск отчета. Например, если в примере «Открытие и запуск отчета» (стр. 293) в форме отчета ЦеныТоваров отменить стандартную обработку, то в отчет не будет передаваться отбор и не будет выполняться автоматическое формирование отчета. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Событие «При открытии» После обработки события При создании на сервере форма передается на клиента, и программный объект формы удаляется из памяти сервера. На клиенте вызывается последнее событие формы – При открытии. Для чего может понадобиться событие При открытии, обрабатываемое на клиенте? Во-первых, это последнее событие, в котором можно отказаться от открытия формы (Отказ = Истина), листинг 8.26. Листинг 8.26. Объявление обработчика события «При открытии» &НаКлиенте Процедура ПриОткрытии(Отказ) Если отказа не происходит, это значит, что форма точно будет открыта. И значит, можно выполнить какие-то действия, которые должны выполняться только тогда, когда форма гарантированно открывается. Например, открыть связанную форму, которая сама по себе не существует, а существует только в том случае, если открыта основная форма. Во-вторых, в этом событии можно выполнить те действия, которые невозможно выполнить на сервере. Например, выдать предупреждение пользователю или настроить COM-объект HTML-документа, содержащийся в поле HTML-документа. После обработки события При открытии форма открывается на клиенте и становится видима пользователю. Последовательность событий при записи объекта из формы Последовательность событий, возникающих при записи объекта из формы, значительно больше и сложнее. Мы рассмотрим ее на примере команды Записать и закрыть, когда данные объекта записываются и после этого форма закрывается. Поскольку схема получается довольно большой, разделим ее на три части: ■■ до записи данных в базу данных, ■■ запись данных, ■■ после записи. Первая часть будет выглядеть следующим образом (рис. 8.223). Рис. 8.223. Последовательность действий и событий при записи объекта. Начало Событие «Перед записью» Когда в форме вызывается запись объекта, прежде всего в форме на клиенте вызывается событие Перед записью. Синтаксис вызова этого обработчика выглядит следующим образом (листинг 8.27). Листинг 8.27. Объявление обработчика события «Перед записью» &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) В этом обработчике можно проанализировать, что все вспомогательные данные, необходимые для записи объекта, подготовлены. И если это не так, отказаться от записи, установив параметр Отказ в значение Истина. Дело в том, что на клиенте могут существовать объекты, недоступные на сервере, например, СОМ-объект HTML-документа. Поэтому проверки, связанные с подобными объектами, нужно производить именно в клиентской процедуре. Также в этом обработчике доступны для анализа параметры записи, созданные платформой или переданные разработчиком. Подробнее Раздел «Параметры записи», стр. 305. Том 1 301 Глава 8. Разработка форм Проверка заполнения После обработки события Перед записью платформа выполняет контекстный серверный вызов. Контекст формы упаковывается, передается на сервер. На сервере создается программный объект формы. Из полученного контекста заполняются реквизиты, элементы, параметры формы, инициализируется модуль формы, и в дело вступает механизм проверки заполнения. Его работа заключается в последовательном вызове двух событий: одного – у формы, и второго – у того объекта, который будет записан. Работа механизма проверки заполнения подробно рассматривается в разделе «Проверка заполнения» (стр. 310), поэтому сейчас мы не будем подробно останавливаться на назначении каждого из событий. Опишем их лишь в общих чертах. Сначала вызывается событие формы Обработка проверки заполнения на сервере. После этого выполняется преобразование данных формы в данные прикладного объекта: в памяти сервера создается прикладной объект, соответствующий типу основного реквизита формы, и его данные заполняются из данных формы. Затем вызывается событие прикладного объекта Обработка проверки заполнения. Событие «Перед записью на сервере» После того как механизм проверки заполнения закончил свою работу, на сервере вызывается событие формы Перед записью на сервере. Чем интересен этот обработчик? Как мы говорили выше, в процессе проверки заполнения произошло «разделение» формы на форму и прикладной объект, данные которого будут записаны в базу данных. Это определяет ряд особенностей дальнейшей работы. Обработчик Перед записью на сервере – первый, в котором появляется возможность доступа как к данным основного реквизита формы (через его имя, как правило, Объект), так и к самому объекту, который будет записан. Этот объект система передает в обработчик в параметре ТекущийОбъект. Напомним описание вызова этого обработчика (листинг 8.28). Листинг 8.28. Объявление обработчика события «Перед записью на сервере» Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Что важно понимать, находясь в этом обработчике? Данные, доступные через основной реквизит формы Объект, «мертвы». Мертвы в том смысле, что их изменение не даст никакого результата. Их можно только анализировать. 302 При этом также нужно понимать, что эти данные – это не то, что будет записано в информационную базу. Это то, что «приехало» с клиента и «пережило» проверку заполнения. Поэтому и анализировать их можно только с точки зрения того «а что же было». А записан в информационную базу будет ТекущийОбъект. Отсюда еще два замечания: ■■ если нужно принять решение о том, можно записывать данные или нельзя, нужно анализировать ТекущийОбъект; ■■ если нужно модифицировать записываемые данные (например, дописать служебную информацию в реквизиты), использовать нужно ТекущийОбъект. Все попытки изменить данные через реквизит формы Объект ни к чему не приведут. В информационную базу эти данные записаны не будут, а перед тем как форма «поедет» обратно на клиента, ее данные будут замещены данными записанного в информационную базу объекта. Таким образом, все изменения, внесенные в Объект, пропадут. Также нужно понимать, что все действия, выполняемые в этом обработчике (отказ от записи, изменение данных объекта), должны быть связаны именно с тем фактом, что данные записываются именно из формы. При программной записи объекта (методом объекта) форма будет отсутствовать, следовательно, и это событие вызываться не будет. Поэтому если какие-либо алгоритмы должны выполняться при любом способе записи данных объекта, а не только при записи из формы, их следует размещать в обработчике события объекта (Перед записью), а не в обработчике события формы. Запись данных в базу данных После обработки события формы Перед записью на сервере в СУБД открывается транзакция записи и начинается процесс записи данных прикладного объекта в базу данных, который представлен на рисунке 8.224. Прежде всего, вызывается событие объекта Перед записью. В этом событии можно отказаться от записи данных. Причем эта проверка будет выполняться всегда, независимо от того, каким способом данные объекта записываются. После обработки события Перед записью данные записываются в базу данных, но транзакция не закрывается. После записи данных вызывается еще одно событие объекта – При записи. Это событие предназначено для того, чтобы выполнить действия над дополнительными данными, которые неразрывно связаны с основными данными объекта и не могут быть изменены независимо от основных данных. Поскольку это событие обрабатывается в транзакции записи основных данных, гарантируется синхронность изменения основных и вспомогательных данных. Либо и те и другие будут записаны, либо и те и другие изменения будут отменены при отмене транзакции. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм конкретное значение ссылки на этот элемент в информационной базе. Конечно, все это справедливо только в том случае, если не выполнялось программное изменение ссылки до или после записи. Итак, по поводу этого обработчика можно сделать следующее замечание: ■■ если нужно выполнять какие-то действия, связанные с записанным объектом, и при этом, например, нужна ссылка на этот объект, необходимо использовать ТекущийОбъект.Ссылка; ■■ если нужно изменить записанные данные перед отправкой их на клиента, необходимо использовать ТекущийОбъект. Основной реквизит формы Объект можно использовать только для сравнения того, что «было», с тем, что «записалось». Изменять его бессмысленно, т. к. он будет замещен данными из ТекущийОбъект. Событие «После записи на сервере» Рис. 8.224. Последовательность действий и событий при записи объекта. Продолжение После обработки события объекта При записи, пока транзакция открыта, на сервере вызывается событие формы При записи на сервере. Назначение этого обработчика аналогично предыдущему, чтобы записать в базу данных дополнительную информацию, связанную с данными записываемого объекта. Ведь совсем не обязательно, что все исходные данные для записи дополнительной информации находятся в самом объекте. Они могут находиться и в форме. Как раз для таких случаев и предназначено это событие. После того как обработано событие формы При записи на сервере, транзакция записи в СУБД закрывается, и начинается процесс передачи данных на клиента и закрытия формы. Он выглядит следующим образом (рис. 8.225). Описание процедуры, обрабатывающей это событие, выглядит следующим образом (листинг 8.29). Листинг 8.29. Объявление обработчика события «При записи на сервере» Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Находясь в этом обработчике, важно понимать, что имеет смысл работать только с теми данными объекта, которые доступны через ТекущийОбъект. Здесь ТекущийОбъект – это именно то, что было записано в информационную базу. Те данные, которые доступны через основной реквизит формы Объект, – это «старые» данные, это то, что было в форме, когда она «приехала» на сервер. Изменять эти данные бесполезно, потому что после выхода из этого обработчика они будут заменены данными, содержащимися в ТекущийОбъект. Иногда имеет смысл их анализировать. Например, в случае записи нового объекта тут будет следующая ситуация. Объект.Ссылка, скорее всего, будет содержать пустую ссылку (т. к. пока новый объект не записан, у него нет ссылки). В то же время ТекущийОбъект.Ссылка будет содержать уже Том 1 Рис. 8.225. Последовательность действий и событий при записи объекта. Окончание 303 Глава 8. Разработка форм После завершения транзакции записи выполняется преобразование данных записанного объекта в данные формы. После этого вызывается событие формы После записи на сервере. Это третий и последний обработчик, в котором по отдельности доступны данные формы, и объект, который был записан. Вызов этого обработчика также содержит ТекущийОбъект и похож на предыдущие (листинг 8.30). Событие «После записи» Листинг 8.30. Объявление обработчика события «После записи на сервере» Событие «Перед закрытием» Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Так как мы рассматриваем ситуацию записи объекта и закрытия его формы, то после обработки на клиенте события После записи на клиенте же вызывается событие Перед закрытием. Однако здесь назначение ТекущийОбъект – прямо противоположное тому, что было до этого. Объясним подробнее. В этом обработчике данные записанного объекта уже помещены в форму. Поэтому «живым» в этом обработчике является уже основной реквизит формы Объект. А ТекущийОбъект существует лишь для того, чтобы дать возможность разработчику выполнить какие-то вспомогательные действия. Что обычно делают в этом обработчике? Обработчик – в модуле формы, значит, предполагаются действия над формой. Обработчик вызывается после окончания транзакции записи – значит, это действия, которые должны быть выполнены только в том случае, когда объект 100 % записан. Например, вывод в форме некоторой дополнительной информации, связанной с основными данными объекта. Или выполнение каких-либо действий, которые должны быть выполнены только в том случае, когда объект гарантированно записан. Отсюда последние замечания: ■■ ТекущийОбъект изменять бессмысленно – он будет уничтожен при выходе из обработчика; ■■ если для выполнения связанных действий нужны какие-то данные или методы объекта, нужно использовать ТекущийОбъект, а не пытаться получать их через основной реквизит формы. В обработчике этого события также выполняются действия над формой, которые должны быть выполнены только в случае 100 % записи данных объекта. Те действия, которые требуют интерактивного взаимодействия с пользователем или которые невозможно выполнить на сервере. Основное назначение этого события – проанализировать, можно закрывать форму или нельзя. И если нельзя, то отказаться от ее закрытия. Описание процедуры обработчика этого события выглядит следующим образом (листинг 8.31). Листинг 8.31. Объявление обработчика события «Перед закрытием» &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Установка параметра Отказ в значение Истина позволяет отказаться от закрытия формы. А запрет стандартной обработки (СтандартнаяОбработка = Ложь) позволяет отказаться от стандартных действий, которые опять-таки определяются типом основного реквизита формы. Например, в случае с формой справочника стандартные действия платформы будут заключаться в следующем. Если форма модифицирована и окно формы закрывается клавишей Esc или нажатием кнопки закрытия окна, то платформа сообщит о том, что данные формы модифицированы, и предложит либо записать их, либо закрыть без сохранения изменений, либо отказаться от закрытия формы. Если в этой ситуации отказаться от стандартной обработки, то форма будет закрыта без вопросов в любом случае, независимо от того, модифицированы в ней данные или нет. Передача формы на клиента Событие «При закрытии» После обработки события После записи на сервере форма передается на клиента. В памяти сервера уничтожается прикладной объект. Измененные реквизиты, элементы и параметры формы, требуемые для отображения, передаются на клиента. Уничтожается объект формы на сервере. После этого на клиенте вызывается событие формы После записи. После обработки события Перед закрытием форма закрывается, пользователь перестает ее видеть. Однако программный объект формы все еще существует, и на клиенте вызывается событие формы При закрытии. Назначение этого события в том, чтобы выполнить действия, которые должны быть выполнены только в случае 100 % закрытия формы. Например, закрыть вспомогательную форму, существующую только в том случае, если открыта основная форма. После обработки этого события программный объект формы удаляется из памяти клиента. 304 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Параметры записи Начальное заполнение Запись данных объекта в форме может быть выполнена средствами встроенного языка. Для этого у многих расширений формы существует метод Записать(). У этого метода есть единственный параметр – ПараметрыЗаписи. Он содержит структуру произвольных параметров записи. Механизм начального заполнения позволяет описать правила и алгоритмы, по которым новые объекты, интерактивно создаваемые в информационной базе, будут заполнены некоторыми данными. Некоторые расширения форм объектов добавляют собственные предопределенные параметры записи. Например, расширение документа добавляет параметры РежимЗаписи и РежимПроведения, расширение задачи – параметр ВыполнитьЗадачу. Подробнее о предопределенных параметрах можно прочитать в синтакспомощнике, в описании события Перед записью для разных расширений формы или в описании других событий, перечисленных ниже. Наряду с предопределенными параметрами разработчик может добавлять и собственные параметры. Эти параметры разработчик может использовать в различных обработчиках событий записи в зависимости от своих нужд. Таких событий, в которых будут доступны параметры записи, пять. На рисунке 8.226 они выделены рамкой. Механизм начального заполнения ориентирован исключительно на интерактивную работу. При создании новых объектов средствами встроенного языка он не вызывается. Но при необходимости разработчик может его задействовать для того, чтобы имитировать интерактивное создание новых объектов. Начальное заполнение вызывается в следующих случаях интерактивного создания нового объекта: ■■ командой Создать в панели действий или в списке; ■■ командой ввода на основании; ■■ при программном вызове методов глобального ОткрытьФорму() или ПолучитьФорму(); ■■ при программном вызове методов объектов Заполнить(). контекста Кроме перечисленных способов есть еще один способ интерактивного создания нового объекта – копированием. Этот случай обрабатывается платформой отдельно, и механизм начального заполнения при этом не задействуется. Механизм начального заполнения имеет несколько составляющих, часть из них доступна в режиме Конфигуратор, часть – во встроенном языке в режиме 1С:Предприятие: Рис. 8.226. События, в которых доступны параметры записи В любом из этих обработчиков параметры записи можно изменять, добавлять, удалять – все выполненные изменения будут переданы в следующий обработчик. Том 1 ■■ во-первых, в конфигураторе можно задать конкретные значения, которыми автоматически будут заполнены реквизиты нового объекта. У реквизитов есть свойство Значение заполнения; ■■ во-вторых, в конфигураторе можно разрешить платформе в некоторых случаях самостоятельно заполнить реквизиты нового объекта подходящими данными. У реквизитов есть свойство Заполнять из данных заполнения; ■■ в-третьих, во встроенном языке разработчик может описать собственные алгоритмы заполнения реквизитов данными в обработчике события объекта Обработка заполнения. Это событие вызывается в тех случаях, которые были перечислены выше у прикладных объектов (справочников, документов и т. д.) и у набора записей регистра сведений. Рассмотрим каждый из этих трех элементов подробнее. В качестве примера мы будем использовать демонстрационную базу «Разработка форм, пример 4». 305 Глава 8. Разработка форм Свойство «Значение заполнения» У реквизитов объектов конфигурации существует свойство Значение заполнения. Если реквизит примитивного типа (Строка, Число, Дата, Булево), то в свойстве можно задать любое значение этого типа, которым платформа автоматически заполнит этот реквизит у нового объекта. Если реквизит имеет тип ссылки или перечисления, то в этом свойстве можно задать предопределенный элемент или конкретное значение перечисления. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 4», документ Накладная, реквизит Склад. Например, у документа Накладная может быть реквизит Склад с типом ссылки на справочник Склады. А в справочнике Склады может существовать предопределенный элемент Главный склад. Тогда прямо в конфигураторе можно указать, что в новых документах реквизит Склад будет сразу же заполнен ссылкой на главный склад (рис. 8.227). Рис. 8.228. Автоматическое заполнение реквизита для новых объектов Свойство «Заполнять из данных заполнения» Другая возможность обеспечить начальное заполнение данных нового объекта – это разрешить платформе в некоторых ситуациях сделать это автоматически. Для этого используется другое свойство реквизитов объекта конфигурации – Заполнять из данных заполнения. Если это свойство установлено, платформа автоматически заполнит значение такого реквизита из данных заполнения в том случае, если они представляют собой структуру, содержащую отборы, и имя одного из условий отбора совпадает с именем этого реквизита. Вообще в данные заполнения платформа может передавать различные типы значений. Рис. 8.227. Свойство «Значение заполнения» В демонстрационной базе можно создать новую накладную (командой в панели действий или командой в списке) и убедиться, что склад в новой накладной заполнен (рис. 8.228). Например, если просто создается новый объект, то в данных заполнения будет значение Неопределено. Если новый объект создается вводом на основании, то в данных заполнения будет ссылка на объект, являющийся основанием. Но во всех этих случаях платформа не будет автоматически заполнять реквизиты из данных заполнения. Автоматическое заполнение будет только в том случае, когда данные заполнения содержат структуру, состоящую из условий отбора. Когда в данных заполнения может оказаться такая структура? ■■ во-первых, когда новый объект вводится командой Создать из списка, в котором установлены некоторые отборы. Тогда все эти отборы платформа автоматически поместит в данные заполнения; 306 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм ■■ во-вторых, когда новый объект вводится в результате программного вызова методов ОткрытьФорму(), ПолучитьФорму() или метода объекта Заполнить(). Во все эти методы разработчик самостоятельно может передать структуру, содержащую нужные отборы. Рассмотрим оба этих случая. Создание объекта из отобранного списка подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 4», документ Накладная, реквизит Поставщик. Сначала рассмотрим случай, когда, например, в списке накладных установлен отбор и пользователь нажимает кнопку Создать в командной панели списка. При этом у накладной существует реквизит Поставщик, для которого установлено свойство Заполнять из данных заполнения (рис. 8.229). Рис. 8.230. Отбор, установленный в списке накладных Рис. 8.229. Свойство «Заполнять из данных заполнения» В режиме 1С:Предприятие в списке накладных установлены отборы по поставщику и по складу (рис. 8.230). Командой Создать списка можно создать новую накладную и убедиться, что поставщик будет заполнен тем значением, по которому был установлен отбор – Поставщик 3 (рис. 8.231). При этом склад будет по-прежнему заполнен значением Главный склад, т. к. в конфигураторе оно указано как значение заполнения. Рис. 8.231. Автоматическое заполнение реквизитов данными отбора Если в конфигураторе для реквизита Склад тоже установить свойство Заполнять из данных заполнения, то тогда при создании из отобранного списка и поставщик, и склад будут заполнены значениями отбора, несмотря на то, что для склада установлено значение заполнения (рис. 8.232). Том 1 307 Глава 8. Разработка форм А затем в клиентской процедуре создадим структуру, содержащую отбор по поставщику (ЭлементыОтбора) и передадим ее в параметр формы ЗначенияЗаполнения (листинг 8.33). Листинг 8.33. Установка значения заполнения при открытии формы &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) СсылкаНаПоставщика = ПолучитьПоставщикаНаСервере(); ЭлементыОтбора = Новый Структура("Поставщик", СсылкаНаПоставщика); ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЭлементыОтбора); ОткрытьФорму("Документ.Накладная.ФормаОбъекта", ПараметрыФормы); КонецПроцедуры В результате выполнения такой команды будет открыта форма новой накладной, в которой поставщик будет заполнен значением Поставщик 1 (рис. 8.233). Рис. 8.232. Приоритет данных заполнения перед значением заполнения Программная установка данных заполнения Теперь рассмотрим второй случай, когда данные заполнения устанавливаются программно. Например, выполняется метод встроенного языка ОткрытьФорму(). Как говорилось выше, при программном открытии формы есть возможность задать значения параметров формы. Для решения нашей задачи предназначен параметр расширения формы ЗначенияЗаполнения. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 4», глобальная команда Открыть форму. Например, мы хотим открыть форму и сразу же указать, что реквизит Поставщик должен быть заполнен некоторой конкретной ссылкой. Для этого создадим серверную функцию, которая вернет эту самую ссылку на поставщика (листинг 8.32). Листинг 8.32. Серверная функция, возвращающая ссылку на поставщика &НаСервере Функция ПолучитьПоставщикаНаСервере() Возврат Справочники.Поставщики.НайтиПоКоду("000000001"); Рис. 8.233. Результат программной установки значения заполнения В ситуации, когда новый объект полностью создается и записывается без участия пользователя, можно использовать метод объекта Заполнить(), чтобы смоделировать создание объекта по тем правилам и алгоритмам, которые используются при интерактивном создании. Подробнее КонецФункции Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 4», глобальная команда Заполнить. 308 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Например, находясь на сервере, можно создать новый объект накладной и затем вызвать у него метод Заполнить(). В этот метод передать значения, необходимые для начального заполнения, например поставщика. При интерактивном создании накладной расширение формы автоматически устанавливает дату нового документа. В программном создании накладной форма не участвует, поэтому в структуре данных заполнения нужно передать еще и значение для поля Дата, иначе записать такую накладную не удастся. А для того чтобы платформа обработала его автоматически, в конфигураторе у стандартного реквизита накладной Дата нужно установить свойство Заполнять из данных заполнения (листинг 8.34). Листинг 8.34. Использование метода «Заполнить()» &НаСервере Процедура СоздатьИЗаписатьОбъектНаСервере() Для остальных стандартных реквизитов, как в нашем случае для даты, нужно это свойство устанавливать самостоятельно, если планируется использовать возможность их автоматического заполнения. Событие «Обработка заполнения» Если разработчика не устраивают значения заполнения, установленные в конфигураторе, или значения, переданные в данные заполнения, он может реализовать собственный алгоритм заполнения нового объекта данными. Для этого у объекта есть событие Обработка заполнения, которое может быть обработано в серверной процедуре. Чтобы лучше представлять себе возможности программной обработки заполнения, рассмотрим еще раз последовательность, в которой платформа использует те или иные элементы механизма заполнения (рис. 8.235). СсылкаНаПоставщика = Справочники.Поставщики.НайтиПоКоду("000000002"); ЭлементыОтбора = Новый Структура("Поставщик, Дата", СсылкаНаПоставщика, ТекущаяДата()); ОбъектНакладной = Документы.Накладная.СоздатьДокумент(); ОбъектНакладной.Заполнить(ЭлементыОтбора); ОбъектНакладной.Записать(); КонецПроцедуры В результате выполнения такой команды будет создана и записана новая накладная с текущей датой и поставщиком Поставщик 2. Значение для реквизита Склад будет взято из его свойства Значение заполнения (рис. 8.234). Рис. 8.235. Последовательность автоматического заполнения реквизитов нового объекта Сначала будет вызван обработчик события и выполнен его код. Рис. 8.234. Результат использования метода «Заполнить()» Следует заметить, что для стандартных реквизитов Родитель, Владелец и для ведущих измерений регистров сведений платформа автоматически в конфигураторе устанавливает свойство Заполнять из данных заполнения. Том 1 Обработка заполнения Если после выхода из этого обработчика его параметр СтандартнаяОбработка будет иметь значение Ложь, то платформа не будет пытаться самостоятельно заполнить реквизиты нового объекта, а сразу же вызовет событие формы При создании на сервере. Если же после выхода из обработчика значение его параметра СтандартнаяОбработка будет Истина (по умолчанию), то сначала платформа попытается заполнить значения реквизитов из данных заполнения. 309 Глава 8. Разработка форм Если после этого реквизит все еще будет иметь значение своего типа по умолчанию, то платформа попытается заполнить его значением заполнения, указанным в конфигураторе. Если же после данных заполнения реквизит будет иметь значение, отличное от значения по умолчанию, то значение заполнения использоваться не будет, даже если оно указано для этого реквизита. Таким образом, находясь в обработчике Обработка заполнения, разработчик может, проанализировав данные заполнения, самостоятельно заполнить реквизиты нового объекта и затем использовать или не использовать возможности стандартной обработки заполнения. Какие возможны варианты? Мы уже говорили о них, перечислим еще раз: ■■ если данные заполнения имеют значение Неопределено, это значит, что новый объект создается командой Создать в панели действий или командой Создать из списка, в котором отсутствуют отборы; ■■ если данные заполнения являются ссылкой, то выполняется ввод на основании и разработчик должен самостоятельно обработать это значение: либо сохранить его в реквизите формы, либо на основе этих данных заполнить несколько реквизитов формы; ■■ если данные заполнения – это структура, значит, новый объект создается командой Создать из отобранного списка, или в общем случае разработчик создает его программно, передавая эту структуру через методы ОткрытьФорму(), ПолучитьФорму() или Заполнить(). В качестве примера рассмотрим процедуру Обработка заполнения документа Накладная (листинг 8.35). Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 4», модуль документа Накладная, процедура ОбработкаЗаполнения(). Листинг 8.35. Различные варианты обработки автоматического заполнения Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) ОтобранныйПоставщик = Неопределено; Если ДанныеЗаполнения.Свойство("Поставщик", ОтобранныйПоставщик) Тогда Поставщик = ОтобранныйПоставщик; КонецЕсли; КонецЕсли; Сообщение.Сообщить(); КонецПроцедуры В этой процедуре для наглядности в каждом из возможных вариантов выводится информационное сообщение. При обычном вводе (Если ДанныеЗаполнения = Неопределено Тогда) не выполняется никаких действий, документ заполняется стандартным способом – реквизит Склад заполняется своим значением заполнения. При вводе на основании поставщика (ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Поставщики") Тогда) реквизиту Поставщик устанавливается значение того поставщика, на основании которого введена эта накладная. И также используются возможности стандартного заполнения – реквизит Склад заполняется своим значением заполнения. При вводе из отобранного списка (ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда) стандартное заполнение не используется (склад не заполняется), а из переданного отбора берется только значение для реквизита Поставщик (другие элементы отбора игнорируются). Проверка заполнения Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта. Такая проверка выполняется при интерактивном вводе объекта, перед его записью. Поля реквизитов, для которых должно проверяться заполнение, автоматически выделяются в форме красным подчеркиванием. Если перед записью объекта эти поля окажутся не заполнены, запись не будет выполнена, а в форме будут выданы сообщения об ошибках, привязанные к незаполненным реквизитам (рис. 8.236). Сообщение = Новый СообщениеПользователю; Если ДанныеЗаполнения = Неопределено Тогда Сообщение.Текст = "Ввод новой накладной"; ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Поставщики") Тогда Сообщение.Текст = "Ввод накладной на основании поставщика"; Поставщик = ДанныеЗаполнения; ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда Сообщение.Текст = "Ввод накладной из отобранного списка"; СтандартнаяОбработка = Ложь; Механизм проверки заполнения ориентирован исключительно на интерактивную работу, при записи объектов средствами встроенного языка он не вызывается. Но при необходимости имитировать интерактивную запись объекта разработчик может вызвать этот механизм из встроенного языка. 310 Профессиональная разработка в системе «1С:Предприятие 8» Суть проверки заполнения заключается в том, что у реквизитов объектов конфигурации, у табличных частей, у реквизитов табличных частей и у реквизитов форм есть свойство Проверка заполнения. Стандартное значение этого свойства – Не проверять. Оно означает, что реквизит не участвует в проверке заполнения. Программирование форм Рис. 8.236. Сообщения пользователю Однако если это свойство установить в значение Выдавать ошибку, то перед записью платформа будет проверять, что значение реквизита отличается от значения его типа по умолчанию. А для табличных частей будет проверять, что в табличной части есть хотя бы одна строка (рис. 8.237). Рис. 8.237. Свойство «Проверка заполнения» Рис. 8.238. Сообщения о незаполненности реквизитов А при попытке записать документ с пустой строкой в табличной части сообщения будут следующими (рис. 8.239). Рис. 8.239. Сообщения о незаполненности табличной части Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», документ Накладная, реквизиты Склад, Поставщик, табличная часть Товары, реквизиты табличной части Товар, Количество, Цена, Валюта, форма документа, реквизит Ответственный. С помощью мыши или курсора можно перемещаться по сообщениям в окне Сообщения, при этом выделенное сообщение будет показано в форме в специальном окне, размещенном под тем элементом, в котором допущена ошибка. Нажимая кнопки Предыдущее сообщение и Следующее сообщение, пользователь может перемещаться по форме и заполнять пропущенные данные. Например, в документе Накладная проверка заполнения может быть указана для его реквизитов, табличной части и реквизитов табличной части. Тогда при попытке записать незаполненный документ платформа выдаст следующие сообщения (рис. 8.238). Естественно, во встроенном языке разработчик может описать собственные алгоритмы проверки заполнения реквизитов данными. Для этого предназначены два события. Событие формы Обработка проверки заполнения на сервере и событие прикладного объекта, редактируемого в форме, – Обработка проверки заполнения. Подробнее Том 1 311 Глава 8. Разработка форм Заполнение и проверка заполнения Свойство «Проверка заполнения» Прежде чем подробнее рассматривать механизм проверки заполнения, хотелось бы обратить внимание на то, что в платформе есть два интерактивных, созвучных между собой механизма: механизм заполнения и механизм проверки заполнения. Относительно свойства Проверка заполнения хочется сделать следующее замечание. Хотя стандартно для новых реквизитов платформа устанавливает это свойство в значение Не проверять, для некоторых стандартных реквизитов, наоборот, платформа автоматически включает это свойство при создании объектов конфигурации. Не следует их путать. Заполнение – это: ■■ свойства реквизитов объектов конфигурации Значение заполнения, Заполнять из данных заполнения; ■■ обработчик объекта Обработка заполнения; ■■ заполнение выполняется при интерактивном создании нового объекта. подробнее Раздел «Начальное заполнение», стр. 305. Проверка заполнения – это: ■■ свойства реквизитов объектов конфигурации Проверка заполнения; ■■ обработчик формы Обработка проверки заполнения на сервере и обработчик объекта Обработка проверки заполнения; ■■ проверка заполнения выполняется при интерактивной записи объекта. Такими реквизитами являются, например, Наименование и Владелец для справочника, Дата для документа и так далее. подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 5.6.8.1. Поэтому в тех случаях, когда требуется реализовать нестандартное поведение системы, эти свойства для стандартных реквизитов нужно установить в значение Не проверять или программно исключить эти реквизиты из проверки заполнения (рис. 8.241). Для большей наглядности можно представить следующую схему (рис. 8.240). Рис. 8.241. Проверка заполнения для стандартных реквизитов Программная обработка проверки заполнения Каким образом разработчик может повлиять на стандартную проверку заполнения, выполняемую платформой? Для этого у него есть два события. Одно событие – Обработка проверки заполнения на сервере – можно обработать в модуле формы. Другое событие – Обработка проверки заполнения – можно обработать в модуле прикладного объекта. Рис. 8.240. Заполнение и проверка заполнения 312 Все, что относится к проверкам реквизитов основного объекта формы, нужно обрабатывать в модуле объекта. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Обработчик в форме нужен потому, что форма может иметь данные, не относящиеся к объекту, и свои причины для проверки. И тот и другой обработчик имеют два параметра: Отказ и ПроверяемыеРеквизиты. В параметр ПроверяемыеРеквизиты платформа передает массив имен тех реквизитов, заполненность которых должна быть проверена. Разработчик может поступить несколькими способами: ■■ проверить заполненность реквизитов самостоятельно и очистить массив ПроверяемыеРеквизиты, чтобы платформа не выполняла их проверку (листинг 8.36). Листинг 8.36. Самостоятельная проверка всех реквизитов Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // Проверка остальных реквизитов. // ... // Очистить массив проверяемых реквизитов, чтобы платформа // не выполняла их автоматическую проверку. ПроверяемыеРеквизиты.Очистить(); подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 1. Если ИндексПоляПоставщик <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексПоляПоставщик); КонецЕсли; КонецЕсли; подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 2. ■■ добавить в массив ПроверяемыеРеквизиты какие-то реквизиты, чтобы платформа проверила и их тоже (листинг 8.38). Листинг 8.38. Добавление новых реквизитов для автоматической проверки ПроверяемыеРеквизиты.Добавить("Комментарий"); подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 3. ■■ очистить массив ПроверяемыеРеквизиты, чтобы ничего не проверять ни самому, ни платформе (листинг 8.39). Листинг 8.39. Отказ от автоматической проверки реквизитов ПроверяемыеРеквизиты.Очистить(); подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 4. ■■ проверить часть реквизитов самостоятельно, удалить их из массива ПроверяемыеРеквизиты, а оставшиеся реквизиты оставить на проверку платформе (листинг 8.37). Нужно заметить, что состав массива ПроверяемыеРеквизиты различен в обработчике формы и в обработчике объекта. Листинг 8.37. Частичная проверка заполненности реквизитов В обработчике объекта в этом массиве содержатся имена реквизитов объекта, которые требуют проверки (рис. 8.242). Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; // Удалить поставщика из массива проверяемых реквизитов. ИндексПоляПоставщик = ПроверяемыеРеквизиты.Найти("Поставщик"); Том 1 Рис. 8.242. Массив реквизитов, проверяемых в объекте 313 Глава 8. Разработка форм В обработчике формы содержатся имена реквизитов формы, которые требуют проверки. И если есть реквизиты объекта, которые нужно проверять, то содержится имя основного реквизита формы, содержащего данные объекта (рис. 8.243). Рис. 8.243. Массив реквизитов, проверяемых в форме Параметр Отказ нужен для того, чтобы отказаться от записи объекта. Не от проверки заполненности, а именно от записи. Чтобы отказаться от проверки объектов, нужно очистить массив ПроверяемыеРеквизиты. Если установить параметр Отказ при обработке события в объекте, то после выполнения обработчика Обработка проверки заполнения процесс записи будет прекращен (рис. 8.244). Рис. 8.245. Использование параметра «Отказ» в обработчике формы Вывод сообщений с привязкой к элементам формы При самостоятельной проверке заполненности реквизитов, естественно, возникает желание вывести такие же сообщения об ошибках, которые выводит и система, чтобы они были привязаны к тем элементам формы, в которых значения не заполнены. Для этого используется специальный механизм платформы – механизм сообщений пользователю. Подробнее об этом механизме можно прочитать в разделе «Сообщения пользователю», стр. 321. Здесь мы рассмотрим только некоторые примеры его использования. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 5. Рис. 8.244. Использование параметра «Отказ» в обработчике объекта Если параметр Отказ установить в форме, то дальнейшее поведение системы будет зависеть от того, есть ли в списке проверяемых реквизитов основной реквизит формы (рис. 8.243). Если есть, отработает проверка заполнения в объекте, и на этом все закончится (рис. 8.244). Если нет (например, разработчик очистил этот список), то обработчик в модуле объекта вызываться не будет (рис. 8.245). 314 Чтобы вывести такое сообщение из модуля объекта (в обработчике события Обработка проверки заполнения), нужно создать новый объект СообщениеПользователю, задать текст этого сообщения. Также нужно указать, с каким реквизитом формы будет связано это сообщение. Для этого используется свойство Поле (Сообщение.Поле = "Поставщик"). Таким образом, мы указываем, что сообщение должно быть привязано к тому элементу формы, который отображает значение реквизита Поставщик. Мы указали, к какому реквизиту привязать сообщение. Но неизвестно, в какой форме находится этот реквизит. Ведь наш код выполняется в модуле объекта, и у нас нет информации о каких-либо открытых формах. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Сейчас мы не будем подробно углубляться в этот вопрос, скажем лишь, что для того, чтобы сообщение было правильно привязано в форме нашего объекта, нужно задать значения еще двух свойств: ПутьКДанным и КлючДанных. Эти свойства платформа может заполнить самостоятельно, если выполнить метод УстановитьДанные() и передать в него тот программный объект, в модуле которого мы находимся. Ну и собственно для показа сообщения используется метод Сообщить(). Допустим, нужно (рис. 8.246). проверить заполненность реквизита Поставщик Рис. 8.247. Сообщение о незаполненном реквизите Теперь рассмотрим ситуацию, когда нужно сообщить об отсутствии строк в табличной части Товары (рис. 8.248). Рис. 8.246. Реквизит «Поставщик», заполненность которого нужно проверить Это можно выполнить следующим образом (листинг 8.40). Листинг 8.40. Привязка сообщения к реквизиту объекта Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Поставщик"; // имя реквизита Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Текст = "Нужно заполнить поставщика!"; Сообщение.Сообщить(); Отказ = Истина; // не выполнять запись КонецЕсли; В результате, если поставщик не заполнен, мы будем иметь такое сообщение в форме (рис. 8.247). Обратите внимание, что после выдачи сообщения пользователю мы отменяем дальнейшую запись объекта (Отказ = Истина). Если этого не сделать, объект будет записан, несмотря на все наши сообщения, а если выполнялась команда Записать и закрыть, то форма тоже будет закрыта, несмотря на то, что в нее были выведены сообщения. Том 1 Рис. 8.248. Табличная часть, заполненность которой нужно проверить Это можно выполнить следующим образом (листинг 8.41). Листинг 8.41. Привязка сообщения к табличной части Если Товары.Количество() = 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Товары"; // имя табличной части Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Текст = "Нужно заполнить список полученных товаров!"; Сообщение.Сообщить(); Отказ = Истина; // не выполнять запись КонецЕсли; Здесь в свойстве Поле указывается имя табличной части. 315 Глава 8. Разработка форм В результате, если табличная часть пуста, мы будем иметь такое сообщение в форме (рис. 8.249). Листинг 8.42. Привязка сообщения к реквизиту табличной части Если Товары[1].Цена = 0 Тогда Сообщение = Новый СообщениеПользователю; // Индекс строки табличной части и имя поля. Сообщение.Поле = "Товары[1].Цена"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Текст = "Нужно написать цену товара!"; Сообщение.Сообщить(); Отказ = Истина; // не выполнять запись КонецЕсли; Здесь в свойстве Поле указывается путь к нужному полю табличной части. Сначала с помощью индекса указывается строка (Товары[1]), затем через точку указывается поле в этой строке (Цена). В результате, если цена не заполнена, мы будем иметь такое сообщение в форме (рис. 8.251). Рис. 8.249. Сообщение о незаполненной табличной части Теперь допустим, нужно сообщить о том, что в некоторой строке табличной части не заполнено какое-то поле, например, во второй строке пустое поле Цена (рис. 8.250). Рис. 8.251. Сообщение о незаполненном реквизите табличной части В ситуации, когда нужно самостоятельно проверять заполненность какихлибо реквизитов формы (а не реквизитов объекта), все обстоит несколько проще. Такие проверки нужно делать в обработчике события формы Обработка проверки заполнения на сервере. Рис. 8.250. Реквизит табличной части, заполненность которого нужно проверить Поскольку код этого обработчика выполняется в контексте формы, нет необходимости устанавливать для сообщения данные (Сообщение.УстановитьДанные(…)). Достаточно лишь указать имя реквизита формы, к данным которого будет привязано сообщение. Это можно выполнить следующим образом (листинг 8.42). подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль формы документа Накладная, снять комментарии с процедуры ОбработкаПроверкиЗаполненияНаСервере. 316 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Например, нужно проверить реквизит формы Ответственный (рис. 8.252). Проверка заполнения и функциональные опции Использование функциональных опций определяет некоторые особенности проверки заполнения. Функциональные опции позволяют автоматически скрыть/отобразить элементы интерфейса, которые связаны с функциональностью, не использующейся в данном прикладном решении (или, наоборот, использующейся). Функциональные опции бывают независимые и параметризуемые. Рис. 8.252. Реквизит формы, заполненность которого нужно проверить Это может выглядеть следующим образом (листинг 8.43). Листинг 8.43. Привязка сообщения к реквизиту формы Если СокрЛП(Ответственный) = "" Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Ответственный"; Сообщение.Текст = "Нужно написать фамилию ответственного!"; Сообщение.Сообщить(); // Удалить ответственного из массива проверяемых реквизитов, // чтобы платформа не проверяла его автоматически еще раз. ИндексОтветственного = ПроверяемыеРеквизиты.Найти("Ответственный"); Если ИндексОтветственного <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексОтветственного); КонецЕсли; КонецЕсли; Если функциональная опция независимая, то ее значение неизменно для всей конфигурации в целом. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», функциональная опция УчетПоСкладам. Оно может храниться, например, в константе типа Булево. Истина – функциональная опция включена, Ложь – выключена (рис. 8.254). В результате, если ответственный не заполнен, мы будем иметь такое сообщение в форме (рис. 8.253). Рис. 8.254. Независимая функциональная опция В этом случае все просто и понятно. Если, например, реквизит Склад связан с такой функциональной опцией, то, когда опция выключена, реквизит не отображается в форме и платформа не проверяет его заполненность, не включает его в массив проверяемых реквизитов. Если функциональная опция включена, реквизит отображается в форме и его заполненность проверяется. Рис. 8.253. Сообщение о незаполненном реквизите формы Том 1 317 Глава 8. Разработка форм С параметризуемыми функциональными опциями дело обстоит сложнее. Их значение не постоянно для всей конфигурации. Параметризуемая опция в одном документе может иметь значение Истина (быть включенной), а в другом – иметь значение Ложь (быть выключенной). Все зависит от ее параметра. Поясним на примере. какого именно поставщика нужно брать для выяснения значения функциональной опции. Например, в форме накладной при изменении значения поля Поставщик может выполняться следующий код (листинг 8.44). Листинг 8.44. Установка параметра функциональной опции подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», функциональная опция ВалютныйУчет. Допустим, есть параметризуемая функциональная опция ВалютныйУчет. Она определяет, нужно ли использовать различные валюты при расчетах с поставщиками. Особенность заключается в том, что все зависит от конкретного поставщика. С одним поставщиком расчеты ведутся только в рублях и никак иначе. А с другим поставщиком расчеты могут производиться как в рублях, так и в валюте. Пусть значение такой функциональной опции хранится в реквизите РасчетыВВалюте справочника Поставщики (рис. 8.255). ПараметрыОпций = Новый Структура("Поставщик", Объект.Поставщик); УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыОпций); Таким образом, платформе сообщается, что в данный момент параметр функциональной опции должен быть равен тому поставщику, которого выбрал пользователь в поле Поставщик. Имея эту информацию, дальше платформа самостоятельно выясняет значение функциональной опции и скрывает или, наоборот, отображает реквизит табличной части Валюта. Теперь вернемся к проверке заполнения. Поскольку от разработчика зависит, как и в какой момент в конкретной форме будут установлены параметры функциональных опций, проверяемые реквизиты, связанные с параметризуемыми функциональными опциями, всегда присутствуют в массиве ПроверяемыеРеквизиты. Если в конкретной ситуации заполненность этого реквизита проверять не нужно, разработчик самостоятельно должен удалить его из массива проверяемых реквизитов. Рассмотрим это на примере. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 5», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта Пример 6. Выполним команду Настройки в панели действий рабочего стола (рис. 8.256). Рис. 8.255. Параметризуемая функциональная опция Поставщиков в базе данных может существовать много. У одних этот реквизит может иметь значение Истина, у других – Ложь. Какого именно поставщика взять для определения значения функциональной опции? Для этого как раз и служит параметр функциональной опции (в нашем примере Поставщик). В каждом конкретном случае он определяет, реквизит 318 Рис. 8.256. Включение/выключение функциональной опции Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Сейчас учет по складам включен, в списке накладных есть колонка Склад, а в самой накладной есть поле Склад. Выключим учет по складам и закроем форму настроек. Создадим новую накладную (рис. 8.257). В данном случае независимая функциональная опция включена, и поэтому платформа автоматически включила связанный с ней реквизит Склад в проверку. В ней уже нет поля Склад. Теперь рассмотрим работу параметризуемой функциональной опции ВалютныйУчет. С этой функциональной опцией связан реквизит табличной части Валюта. Заполним все требуемые поля, запишем и закроем накладную. Создадим новую накладную и выберем поставщика Поставщик валютный. В табличной части появится колонка Валюта (рис. 8.259). Рис. 8.257. Новая накладная при выключенном учете по складам Никаких сообщений о незаполненности реквизита Склад мы не получим, т. к. платформа автоматически исключила его из числа проверяемых реквизитов, потому что независимая функциональная опция УчетПоСкладам выключена. Включим учет по складам и снова откроем эту же накладную. В ней появилось поле Склад, и оно не заполнено. Таким его и оставим. Реквизит Ответственный требует заполнения, но не сохраняется в базе данных. Такова логика работы нашей демонстрационной формы. Поэтому сейчас для чистоты эксперимента заполним его еще раз. Рис. 8.259. Колонка «Валюта» в табличной части Заполним все требуемые поля, кроме валюты, и попробуем записать документ. Мы получим сообщение о том, что поле Валюта не заполнено (рис. 8.260). После этого попробуем записать документ. Мы получим сообщение о том, что реквизит Склад не заполнен (рис. 8.258). Рис. 8.260. Сообщение о незаполненном поле «Валюта» Рис. 8.258. Сообщение о незаполненном поле «Склад» Том 1 319 Глава 8. Разработка форм Теперь, так и не заполняя поле Валюта, выберем другого поставщика – Поставщик рублевый 2. Колонка Валюта исчезнет. Попробуем записать документ. Документ запишется без сообщений об ошибках. Таким образом, в одном случае реквизит Валюта проверяется, а в другом – нет. Хотя и в одном, и в другом случае он присутствует в массиве проверяемых реквизитов. Как это достигается? Откроем модуль документа, процедуру ОбработкаПроверкиЗаполнения, пример 6. В ней присутствует следующий код, который в зависимости от значения функциональной опции перед записью исключает реквизит Валюта из проверки (листинг 8.45). Проверка заполнения и проверка при записи Еще раз хочется обратить внимание на то, что проверка заполнения – это механизм, ориентированный исключительно на интерактивный ввод данных пользователем. Он автоматически вызывается расширениями форм. Но могут быть ситуации, когда программно реализуется некоторый алгоритм, который должен имитировать для пользователя интерактивный ввод данных. В этом случае проверку заполнения можно вызвать с помощью методов ПроверитьЗаполнение(), реализованных у объектов, наборов записей регистров и формы. Важно понимать, что проверка заполнения не является частью записи объекта. Она специально выделена отдельно (рис. 8.261). Листинг 8.45. Исключение реквизита из проверки в зависимости от значения функциональной опции СтруктураПараметров = Новый Структура("Поставщик", Поставщик); // Если функциональная опция "Валютный учет" выключена... Если НЕ ПолучитьФункциональнуюОпцию("ВалютныйУчет", СтруктураПараметров) Тогда // ...не проверять заполненность поля "Валюта" табличной части. ИндексПоляВалюта = ПроверяемыеРеквизиты.Найти("Товары.Валюта"); Если ИндексПоляВалюта <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексПоляВалюта); КонецЕсли; КонецЕсли; Во встроенном языке существует метод глобального контекста ПолучитьФункциональнуюОпцию(). Он позволяет узнать значение параметризуемой функциональной опции. Кроме имени функциональной опции ему нужно передать и значение ее параметра. Значение параметра передается в виде структуры, которая содержит имя параметра и значение параметра. В нашем случае такой структурой является СтруктураПараметров, где в качестве значения используется поставщик, выбранный в поле Поставщик накладной. Таким образом, если метод возвращает значение Ложь (выбран поставщик без расчетов в валюте, функциональная опция выключена), выполняется условие Если…, и из массива проверяемых реквизитов удаляется реквизит табличной части Валюта. Если функциональная опция включена, ничего не происходит, и платформа проверяет значение реквизита Валюта. Рис. 8.261. Проверка заполнения и запись объекта Таким образом, есть два отдельных вопроса. Первый вопрос – все ли реквизиты объекта заполнены. Второй вопрос – можно ли записывать объект в информационную базу. Запись объекта может происходить в самых разных ситуациях: обмен данными, генерация данных обработкой. Это может быть программный код, который «очень хорошо знает», что с объектом нужно сделать и что в нем нужно записать. Поэтому если просто записывать объект из встроенного языка, автоматическая проверка заполнения не вызывается. Если же запись объекта вызывается из формы, использующей стандартное расширение форм, то это расширение вызовет автоматическую проверку заполнения. Естественно, в какой-то момент может возникнуть вопрос: что проверять перед записью, а что – в проверке заполнения? 320 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Чтобы решить, нужно, по сути, ответить на вопрос: что является неотемлемой частью технической логики объекта, не зависящей от способа ввода данных? Такой частью, без которой он существовать не может? измерением не имеют смысла в информационной базе, каким бы образом они в нее ни попали: в результате интерактивного ввода или в результате выполнения программного кода. Наверняка какие-то проверки нужно выполнять перед записью. Но они, во-первых, должны быть очень быстрыми (потому что у вас может происходить массовая генерация объектов) и, во-вторых, должны быть очень «жестокими». То есть вообще в базу данных никогда не должен попасть объект «без такого вот значения». Сообщения пользователю А проверка заполнения может содержать больший объем проверок, ориентированных именно на то, что не хочется пользователю дать возможность ввести «вот такое» интерактивно. ■■ во-первых, сообщения выводятся в окно сообщений формы (или в окно сообщений основного окна) и накапливаются в нем. Таким образом, пользователь может последовательно или выборочно выполнять рекомендации, содержащиеся в этих сообщениях; ■■ во-вторых, сообщения могут привязываться к элементам формы. В результате пользователь не только быстро находит поле, которое требует исправления, но и быстро выполняет это исправление. Как только сообщение отображается рядом с нужным полем формы, это поле сразу же переходит в режим редактирования; ■■ в-третьих, сообщения могут относиться не только к той форме, в которой они выведены, но и к другим формам. В этом случае при двойном щелчке на таком сообщении будет открыта форма, к которой относится это сообщение, и в этой форме сообщение будет спозиционировано рядом с нужным элементом формы. Рассмотрим подробнее, каким образом сообщение определяет тот элемент формы, около которого оно должно быть отображено. Пару слов следует сказать о свойстве Запрет незаполненных значений, которое существует у измерений регистров. Если это свойство установлено у измерения, то платформа автоматически будет проверять при записи наборов записей, что измерение заполнено (рис. 8.262). Сообщения пользователю – удобный инструмент для оповещения пользователя об ошибках в заполнении тех или иных данных. Можно выделить три ключевые возможности сообщений пользователю: Сообщение имеет три свойства, которые позволяют ему точно позиционироваться возле нужного элемента формы: КлючДанных, ПутьКДанным и Поле (рис. 8.263). Рис. 8.262. Свойство «Запрет незаполненных значений» На первый взгляд может показаться, что и там, и там проверяется заполненность, что это одно и то же. Тут нужно понимать, что проверка заполнения – это исключительно интерактивная проверка; проверка того, что пользователь ввел интерактивно. В отличие от этого, запрет незаполненных значений – это неотъемлемая часть бизнес-логики регистра. Она означает, что записи с незаполненным Том 1 Рис. 8.263. Назначение свойств объекта «СообщениеПользователю» 321 Глава 8. Разработка форм Выполнение любого программного кода всегда начинается на клиенте – из какой-нибудь активной формы или из основного окна. Все сообщения пользователю платформа всегда выводит в активное окно. Если такого окна нет, а есть только основное окно, сообщение будут выведено в основное окно. Когда сообщение оказывается в окне какой-либо формы, первым делом анализируется ссылка, содержащаяся в свойстве КлючДанных. ■■ Если эта ссылка совпадает с данными, содержащимися в основном реквизите формы, значит, сообщение предназначено этой форме. Затем ищется реквизит формы, имя которого указано в свойстве ПутьКДанным. После этого ищется подчиненный реквизит, имя которого указано в свойстве Поле. В результате после двойного щелчка на сообщении оно отображается рядом с нужным элементом формы. ■■ Другой сценарий – когда ссылка, содержащаяся в свойстве КлючДанных, не совпадает с данными, содержащимися в основном реквизите формы. Это означает, что сообщение предназначено другой форме – основной форме того объекта, ссылка на который содержится в ключе данных. В этом случае после двойного щелчка на сообщении будет открыта основная форма объекта, ссылка на который содержится в ключе данных, а далее сообщение будет спозиционировано рядом с нужным элементом формы по принципу, описанному выше. Оба рассмотренных случая, когда заполнены все три свойства сообщения, являются наиболее общими и универсальными. Они позволяют правильно воспользоваться сообщением независимо от того, в какой форме оно оказалось. Теперь рассмотрим все эти ситуации на небольшом практическом примере. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 6». Допустим, у нас есть обработка ПроведениеДокументов. Задача этой обработки – провести (перепровести) выбранный документ некоторым специальным образом, который не требуется для обычного ежедневного учета. То есть при таком проведении помимо «обычных» данных формируются дополнительные данные, требуемые для расчетов с отдельными поставщиками. Алгоритм расчета этих данных сложен, таких поставщиков немного, данные требуются эпизодически. Поэтому существует отдельная обработка для получения этих данных. Наша задача будет заключаться в том, чтобы: ■■ проверить правильность заполнения всех полей в обработке и выдать сообщения, если какие-то поля не заполнены; ■■ выполнить проведение документа «сложным» образом, из обработки, и выдать сообщение, если «что-то не так»; ■■ обеспечить «обычное», ежедневное проведение документа и выдачу сообщений о недостатке списываемых товаров на складе. Обработка имеет реквизит Документ, в котором содержится ссылка на обрабатываемый документ Накладная. Кроме этого, форма обработки имеет реквизит Комментарий, в который должен быть записан произвольный комментарий при интерактивном выполнении обработки (рис. 8.264). Но могут быть и другие варианты. Например, если точно известно, что сообщение может оказаться только в одной-единственной форме (например, когда оно формируется в этой самой форме), можно не указывать КлючДанных. В этом случае будет считаться, что сообщение относится именно к той форме, в которой оно оказалось. При этом если сообщение должно быть привязано не к реквизиту основного объекта, а к реквизиту формы, также не нужно указывать ПутьКДанным, достаточно указать только Поле. Есть и еще одна ситуация, которая может возникнуть при работе с сообщениями. Может оказаться так, что для сообщения будет указан КлючДанных и Поле. А свойство ПутьКДанным не будет заполнено. В этой ситуации сообщение автоматически заполнит свойство ПутьКДанным именем основного реквизита формы. Той, в которой оно оказалось (если ключ данных совпадает), или той, которая будет открыта при двойном щелчке на сообщении. Рис. 8.264. Реквизиты формы 322 Профессиональная разработка в системе «1С:Предприятие 8» Документ является реквизитом обработки для того, чтобы была возможность программного запуска обработки без использования ее формы. Программирование форм Для выполнения нашего алгоритма в форме обработки существует локальная команда ПровестиДокументы, которая вызывает процедуру ПровестиДокументы в модуле формы (листинг 8.46). Листинг 8.46. Обработчик локальной команды формы &НаКлиенте Процедура ПровестиДокументы(Команда) Сначала исключаем комментарий из массива проверяемых реквизитов. Затем, если комментарий «пустой», формируем и выводим сообщение. В сообщении мы заполняем только свойство Поле. В данном случае активной формой будет форма обработки, и сообщение попадет в нее. Поэтому достаточно указать лишь поле, остальные свойства сообщения не понадобятся (рис. 8.265, 8.266). // Использовать стандартный механизм проверки заполнения, // реализуемый платформой для обработки. Если ПроверитьЗаполнение() Тогда // Выполнить собственный алгоритм обработки данных. НаСервере(); КонецЕсли; КонецПроцедуры В этой процедуре сначала вызывается стандартная проверка заполнения, реализуемая платформой, – Если ПроверитьЗаполнение() Тогда. Рис. 8.265. Заполнение свойств сообщения Метод формы ПроверитьЗаполнение() вызывает сначала проверку заполнения в форме, а затем – в объекте обработки. Аналогично тому, как выполняется проверка заполнения при интерактивной записи объектов из формы. подробнее Раздел «Проверка заполнения», стр. 310. Сначала будет вызвано событие Обработка проверки заполнения на сервере у формы. В обработчике этого события нам нужно проверить заполненность реквизита формы Комментарий и вывести сообщение (листинг 8.47). Листинг 8.47. Обработчик события «Обработка проверки заполнения на сервере» &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) ИндексКомментария = ПроверяемыеРеквизиты.Найти("Комментарий"); Если ИндексКомментария <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексКомментария); КонецЕсли; Рис. 8.266. Сообщение, привязанное к реквизиту формы После того как будет обработано событие в форме, платформа вызовет аналогичное событие у объекта обработки – Обработка проверки заполнения. В обработчике этого события нам нужно проверить заполненность реквизита обработки Документ и вывести сообщение (листинг 8.48). Листинг 8.48. Обработчик события «Обработка проверки заполнения» Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) ПроверяемыеРеквизиты.Очистить(); Если СокрЛП(Комментарий) = "" Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Комментарий"; Сообщение.Текст = "Нужно написать комментарий."; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Документ = Документы.Накладная.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Документ"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Текст = "Нужно выбрать какую-нибудь накладную."; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецПроцедуры КонецПроцедуры Том 1 323 Глава 8. Разработка форм Сначала мы очищаем массив проверяемых реквизитов, т. к. все проверки будем выполнять самостоятельно. Затем проверяем заполненность реквизита Документ, и если он не заполнен (Если Документ = Документы.Накладная.ПустаяСсылка()), формируем и выводим сообщение. Тут все уже несколько сложнее, чем в форме. Проверка заполнения в модуле обработки может быть вызвана и из формы обработки, и программно, без использования формы обработки. А это значит, что формируемое сообщение может попасть не только в форму обработки, для которой оно предназначено, но и в какую-нибудь другую форму. Рис. 8.267. Заполнение свойств сообщения Поэтому нужно заполнить все свойства сообщения, чтобы, попав в другую форму, сообщение «знало», что нужно открыть форму обработки и именно в ней спозиционироваться возле поля Документ. Свойство Поле мы заполняем самостоятельно – Сообщение.Поле = "Документ". А для того чтобы заполнить два других свойства, КлючДанных и ПутьКДанным, мы воспользуемся возможностями, предоставляемыми платформой. Дело в том, что при выполнении некоторых определенных действий платформа запоминает соответствие объекта, который отображается в форме, и имени основного реквизита этой формы. Например, когда в форме объекта выполняется стандартная команда записи или когда в форме вызывается метод ПроверитьЗаполнение(). «Запоминанием» этого соответствия занимается расширение формы, определяемое основным реквизитом. Соответствие запоминается для того, чтобы в модуле объекта можно было бы им воспользоваться для правильного формирования сообщения. Ведь в общем случае, попав в модуль объекта, мы не знаем, из какой формы мы в него попали, не знаем, как в этой форме называется основной реквизит формы. Поэтому прежде чем перейти в модуль объекта, платформа запоминает, какие данные (ссылку) содержит основной реквизит формы и как он называется. В случае с обработкой платформа запомнит только имя основного реквизита формы обработки. В платформе не существует типа ссылки на обработку, поэтому запоминать просто нечего. Затем в модуле обработки мы просто пишем Сообщение.УстановитьДанные(ЭтотОбъект); и у сообщения будет установлено свойство ПутьКДанным – "Объект". КлючДанных останется незаполненным, так как заполнить его просто нечем. В результате сообщение окажется в форме обработки с незаполненным свойством КлючДанных. Поэтому платформа будет пытаться (и это ей удастся) привязать его к форме обработки, используя значения свойств ПутьКДанным и Поле (рис. 8.267, 8.268). 324 Рис. 8.268. Сообщение, привязанное к реквизиту обработки Поскольку оба раза при проверке заполнения мы устанавливали параметр Отказ обработчиков в значение Истина, после обработки события Обработка проверки заполнения дальнейшее выполнение действий останавливается. Метод ПроверитьЗаполнение() возвращает Ложь, и наша процедура НаСервере() не выполняется. Пока на этом остановимся и обратим внимание на документ Накладная. В модуле документа в процедуре ОбработкаПроведения находится код, который формирует движения документа. А после него для примера формируются и выводятся два сообщения. Предполагается, что наша накладная имеет «два повода» для проведения – обычное повседневное проведение и «специальное» проведение, выполняемое только из этой обработки. Чтобы отличать, каким образом в данный момент проводится накладная, в модуле накладной существует экспортируемая переменная ПроведениеИзОбработки (листинг 8.49). Листинг 8.49. Экспортируемая переменная Перем ПроведениеИзОбработки Экспорт; При любом проведении значение этой переменной сначала устанавливается в Ложь (последняя строка модуля – тело модуля), листинг 8.50. Листинг 8.50. Инициализация экспортируемой переменной ПроведениеИзОбработки = Ложь; Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Это значение будет говорить нам о том, что проведение документа выполняется не из обработки. И в этом случае мы контролируем остатки и выводим сообщение, если товара на складе недостаточно (листинг 8.51). Листинг 8.51. Сообщение в случае, когда проведение выполняется не из обработки // Проверить, есть ли на складе достаточное количество товара // в случае оперативного проведения. // ... Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Товары[0].Количество"; Сообщение.Текст = "На складе есть только 5 единиц товара."; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Здесь, как и в модуле обработки, мы используем возможность платформы самостоятельно устанавливать данные для сообщения (Сообщение.УстановитьДанные(ЭтотОбъект);). Рис. 8.270. Сообщение, привязанное к реквизиту документа Если проведение документа будет выполняться стандартной командой из формы документа, то расширение формы документа автоматически установит соответствие объекта и реквизита формы. Таким образом, КлючДанных и ПутьКДанным будут заполнены, и сообщение будет привязано к нужному полю (рис. 8.269, 8.270). Рис. 8.271. Сообщение в основном окне приложения При двойном щелчке на этом сообщении будет открыта форма накладной, т. к. у сообщения установлен КлючДанных. Платформа автоматически заполнит свойство ПутьКДанным именем основного реквизита формы и правильно привяжет его к полю Количество (рис. 8.272, 8.273). Рис. 8.269. Заполнение свойств сообщения Если проведение будет выполняться, например, стандартной командой из формы списка (Все действия – Провести), то такого соответствия автоматически установлено не будет. Выполнение метода Сообщение.УстановитьДанные(ЭтотОбъект); приведет лишь к тому, что будет установлено свойство КлючДанных – ссылка на объект документа. Свойство ПутьКДанным останется незаполненным. При этом сообщение попадет в основное окно приложения (рис. 8.271). Том 1 Рис. 8.272. Заполнение свойств сообщения 325 Глава 8. Разработка форм В модуле документа, в обработке проведения, анализируем значение переменной ПроведениеИзОбработки, выполняем уже другие проверки и выводим другое сообщение, не такое, как при обычном проведении (листинг 8.54). Листинг 8.54. Сообщение в случае проведения из обработки Рис. 8.273. Сообщение, привязанное к реквизиту формы Таким образом, если при формировании сообщения мы используем метод УстановитьДанные() при любом способе проведения документа, сообщение отработает правильно, в какой бы форме оно не оказалось. Теперь вернемся к обработке, заполним поля документа и комментарий и нажмем кнопку Провести документы. В модуле формы будет вызвана процедура НаСервере(), листинг 8.52. Если ПроведениеИзОбработки Тогда // Проверить, подходит ли поставщик для выполнения задуманной операции. Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Документ"; Сообщение.ПутьКДанным = "Объект"; Сообщение.Текст = "Выбран неудачный документ. Расчеты с этим поставщиком были прекращены в прошлом году."; Сообщение.Сообщить(); Мы хотим, чтобы это сообщение отображалось не в форме документа, а в форме обработки, и было привязано к полю Документ. Поэтому в свойстве Поле мы указываем "Документ", а в свойстве ПутьКДанным – Объект, так как Документ – это подчиненный реквизит объекта обработки. КлючДанных мы не указываем (рис. 8.274). Листинг 8.52. Серверная процедура в модуле формы обработки &НаСервере Процедура НаСервере() // Получить объект документа. ОбъектДокумента = Объект.Документ.ПолучитьОбъект(); // Провести документ. ОбъектДокумента.ПроведениеИзОбработки = Истина; ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение); КонецПроцедуры В ней мы получаем объект документа от ссылки, хранящейся в реквизите Документ. Затем устанавливаем значение экспортируемой переменной ПроведениеИзОбработки модуля документа в Истина. В процедуре обработки проведения документа это будет означать для нас, что проведение выполняется «сложным» способом, из обработки. И после этого вызываем проведение документа в неоперативном режиме (листинг 8.53). Листинг 8.53. Проведение документа в неоперативном режиме ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение); 326 Рис. 8.274. Заполнение свойств сообщения Во-первых, у нас его нет. Ключом данных должна быть ссылка на объект обработки, а такой тип в платформе отсутствует. Вообще говоря, это не очень хорошо, т. к. снижает универсальность нашего сообщения. Если оно попадет не в форму обработки, то не сможет правильно отработать. С другой стороны, вероятность того, что оно попадет не в форму обработки, очень мала. Если предполагается, что обработка будет использоваться только интерактивно, тогда можно допустить, что в другую форму это сообщение не попадет никогда. А раз так, то свойств Поле и ПутьКДанным будет достаточно для того, чтобы правильно привязать сообщение в форме обработки. Проверим (рис. 8.275). При использовании сообщений всегда следует помнить о том, что присутствие сообщений в форме не препятствует ее закрытию. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм ПРИМЕЧАНИЕ Пример использования этого объекта будет рассмотрен далее (стр. 328). Рис. 8.275. Сообщение, привязанное к реквизиту обработки Поэтому если вывод сообщений используется в стандартных процедурах проверки заполнения, всегда следует отказываться от продолжения работы. Для этого параметр Отказ этих обработчиков нужно устанавливать в значение Истина. В других случаях следует самостоятельно заботиться о том, чтобы форма не была закрыта при появлении в ней сообщений, например, анализируя какой-нибудь служебный реквизит объекта в процедуре формы ПередЗакрытием(). Способы информирования пользователя Начав говорить о сообщениях пользователю, имеет смысл взглянуть более широко на то, какие существуют способы информирования пользователей вообще и в каких ситуациях следует применять тот или иной способ. ■■ сообщения, с которыми нужно ознакомиться после окончания некоторого процесса, сообщения о проделанной работе. Такие сообщения могут включать информацию о том, что сделано, ее можно посмотреть, но можно и не смотреть. Для таких сообщений следует использовать метод глобального контекста ПоказатьОповещениеПользователя(). Оповещение выводится в специальном, постепенно затухающем окне и дублируется в информационной панели основного окна приложения (рис. 8.278). Рис. 8.278. Оповещение пользователя ■■ сообщения, с которыми обязательно нужно ознакомиться до начала или после окончания некоторого процесса. Для вывода таких сообщений хорошо подходит метод Предупреждение(), выводящий на экран модальное окно (рис. 8.279). Все сообщения, предназначенные пользователю, можно разделить на несколько основных категорий: ■■ сообщения о неудачном окончании некоторого процесса. Такие сообщения возникают тогда, когда возникло некоторое исключение. Они информируют пользователя о причинах неудачи. Для таких случаев рекомендуется использовать объект СообщениеПользователю. Он был подробно рассмотрен в предыдущей главе (рис. 8.276). Рис. 8.279. Предупреждение Если не указан тайм-аут, то для продолжения работы обязательно требуется реакция пользователя на это сообщение. Рассмотрим все перечисленные способы на небольшом примере. подробнее Рис. 8.276. Сообщение пользователю ■■ сообщения, которые отражают ход работы. Такие сообщения нужны для информирования пользователя о текущем этапе работы. Для этого хорошо подходит метод глобального контекста Состояние(). Он выводит на экран панель состояния, снабженную индикатором (рис. 8.277). Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 7». Пусть в конфигурации существует справочник Товары, у которого перед записью проверяется заполненность реквизита Наименование. Для этого в модуле объекта, в процедуре ОбработкаПроверкиЗаполнения, используется сообщение пользователю (листинг 8.55, рис. 8.280). Рис. 8.277. Состояние Том 1 327 Глава 8. Разработка форм Листинг 8.55. Использование сообщения пользователю ПроверяемыеРеквизиты.Очистить(); Если СокрЛП(Наименование) = "" Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Наименование"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Текст = "Не заполнено наименование товара!"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Рис. 8.281. Предупреждение Листинг 8.57. Серверная функция &НаСервере Функция НаСервере(НомерВызова) Рис. 8.280. Сообщение пользователю Кроме этого, в конфигурации существует глобальная команда ГенерацияТоваров, которая заполняет справочник Товары элементами в тестовых целях. Перед началом работы пользователю выдается сообщение о предполагаемых действиях и о том, что он может прервать выполнение этих действий (листинг 8.56). Листинг 8.56. Использование предупреждения Предупреждение("Будет добавлено 1000 товаров. |Выполнение можно прервать, нажав сочетание клавиш Ctrl + Break", , "Добавление товаров"); Для этого используется предупреждение, которое прерывает дальнейшее выполнение кода до тех пор, пока пользователь не ознакомится с этим сообщением и не нажмет кнопку ОК (рис. 8.281). После этого происходит добавление элементов в справочник Товары. Добавление элементов в справочник может быть выполнено только на сервере, и для этого используется серверная функция НаСервере(). Она добавляет в справочник 100 элементов (листинг 8.57). Для того чтобы пользователь имел возможность прервать процесс добавления элементов в справочник, серверная функция вызывается в цикле несколько раз, то есть добавление элементов выполняется порциями по 100 штук (листинг 8.58). 328 Для Счетчик = 1 по 100 Цикл ОбъектТовара = Справочники.Товары.СоздатьЭлемент(); ОбъектТовара.Наименование = "Товар_" + Строка(НомерВызова * 100 + Счетчик); ОбъектТовара.Записать(); КонецЦикла; Возврат ОбъектТовара.Ссылка; КонецФункции Листинг 8.58. Вызов серверной функции Для Счетчик = 0 по 9 Цикл ПоследняяДобавленнаяСсылка = НаСервере(Счетчик); Состояние("Добавление товаров", 10 + Счетчик * 10, "Выполняется автоматическое заполнение справочника Товары", БиблиотекаКартинок.СоздатьЭлементСписка); ОбработкаПрерыванияПользователя(); КонецЦикла; Каждый раз после выполнения функции проверяется, не нажал ли пользователь комбинацию клавиш Ctrl + Break. Для этого вызывается метод глобального контекста ОбработкаПрерыванияПользователя(). Кроме этого, каждый раз после вызова серверной функции выводится окно состояния, отображающее ход процесса с помощью индикатора (10 + Счетчик * 10), листинг 8.59, рис. 8.282. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.59. Вывод состояния Состояние("Добавление товаров", 10 + Счетчик * 10, "Выполняется автоматическое заполнение справочника Товары", БиблиотекаКартинок.СоздатьЭлементСписка); Рис. 8.282. Состояние В данном случае состояние используется, во-первых, для того, чтобы информировать пользователя о том, что система выполняет какие-то действия, а во-вторых, для того, чтобы пользователь мог примерно оценить время, оставшееся до окончания действий. Серверная функция возвращает ссылку на последний элемент, добавленный в справочник Товары. Эта ссылка используется для того, чтобы после добавления всех элементов обновить список товаров, расположенный на рабочем столе (листинг 8.60). Листинг 8.60. Обновление списка товаров // Обновить список товаров на рабочем столе. ОповеститьОбИзменении(ПоследняяДобавленнаяСсылка); Также эта ссылка используется в оповещении, которое выдается по окончании процесса (листинг 8.61, рис. 8.283). Листинг 8.61. Вывод оповещения пользователя ПоказатьОповещениеПользователя("Данные заполнены", ПолучитьНавигационнуюСсылку(ПоследняяДобавленнаяСсылка), "Открыть последний добавленный товар", БиблиотекаКартинок.Справочник); Рис. 8.284. Оповещение в информационной панели Обновление данных в динамических списках Зачастую запись тех или иных объектов в базу данных выполняется программно, из встроенного языка. Запись в базу данных возможна только на сервере, и в этом случае, естественно, открытые в клиентском приложении формы ничего не знают о том, что данные в базе данных изменились. А ведь эти формы могут содержать списки тех объектов, которые мы изменяли или добавляли в базу данных. Сама по себе информация в этих списках не обновится. Разработчик должен предпринять специальные действия для того, чтобы динамические списки, существующие в открытых формах, перечитали данные и начали отображать новую, измененную информацию. Для этого существует несколько способов, которые можно применять в зависимости от конкретной ситуации. Рассмотрим их по порядку, от наиболее универсального к менее универсальному. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 8», обработка ВариантыОбновления. Метод «ОповеститьОбИзменении()» Рис. 8.283. Оповещение во всплывающем окне Ссылка позволяет открыть форму последнего добавленного товара сразу же, из оповещения, или позже, из информационной панели основного окна (рис. 8.284). Сообщение о том, что система закончила выполнение действий, является чисто информационным. В общем случае оно не требует от пользователя никаких действий. Поэтому используется оповещение, исчезающее с экрана в случае отсутствия реакции пользователя. Том 1 Наиболее простым и наиболее частым является использование метода глобального контекста ОповеститьОбИзменении(). В этот метод передается единственный параметр – ссылка на объект (или ключ записи), об изменении которого нужно оповестить формы. Этот метод уведомит все динамические списки, расположенные в созданных (не обязательно открытых) на клиенте формах, об изменении этого объекта, и они обновят свои данные. Но есть особенность: этот метод не обновит те динамические списки, у которых не задана основная таблица. 329 Глава 8. Разработка форм Эта процедура возвращает ссылку на тот товар, который был добавлен. А в процессе выполнения некоторого алгоритма на клиенте может выполняться следующий код (листинг 8.63). Листинг 8.63. Использование метода «ОповеститьОбИзменении()» СсылкаНаНовыйЭлемент = ДобавитьЭлементНаСервере (); ОповеститьОбИзменении(СсылкаНаНовыйЭлемент); Сначала вызывается серверная процедура и добавляется новый товар, а затем полученная ссылка передается в метод ОповеститьОбИзменении(). В результате во всех открытых формах, отображающих список товаров, появится новый товар. Исключением будет лишь специальная форма списка, в которой для динамического списка не назначена основная таблица (рис. 8.285). Метод «Оповестить()» Второй способ связан с тем, что мы заранее должны прописать некоторый код в тех формах, в которых нужно что-то обновлять. Но зато тут уже мы можем полностью манипулировать этими формами так, как хочется. Рис. 8.285. Обновление данных методом «ОповеститьобИзменении()» Преимущество этого способа заключается в том, что нам ничего не нужно знать об открытых формах, не нужно «влезать» внутрь этих форм – платформа все сделает сама. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 8», обработка ВариантыОбновления, локальная команда формы ОповеститьОбИзменении. Например, в модуле формы может существовать серверная процедура, добавляющая новый элемент в справочник Товары (листинг 8.62). Листинг 8.62. Серверная процедура &НаСервереБезКонтекста Функция ДобавитьЭлементНаСервере () ОбъектТовара = Справочники.Товары.СоздатьЭлемент(); ОбъектТовара.Наименование = "Новый товар" + Строка(ТекущаяДата()); ОбъектТовара.Записать(); Возврат ОбъектТовара.Ссылка; КонецФункции 330 Суть этого способа заключается в том, что существует метод глобального контекста Оповестить(). Он отсылает оповещение всем созданным (не обязательно открытым) формам. Если в форме написан обработчик события ОбработкаОповещения(), то в этом обработчике можно обработать это сообщение и выполнить нужную модификацию формы. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 8», обработка ВариантыОбновления, локальная команда формы Оповестить. Например, как и раньше, в серверной процедуре добавляется новый товар. После этого вызывается метод Оповестить(), в котором передается идентификатор события – произвольная строка, по которой в форме можно будет понять, какой алгоритм следует выполнить (листинг 8.64). Листинг 8.64. Использование метода «Оповестить()» СсылкаНаНовыйЭлемент = ДобавитьЭлементНаСервере (); Оповестить("ОбновитьСписокТоваров"); Во всех формах, в которых может понадобиться обновление списка товаров, создается обработчик события ОбработкаОповещения(). Например, он может выглядеть следующим образом (листинг 8.65). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.65. Обработчик события «Обработка оповещения» &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "ОбновитьСписокТоваров" Тогда Элементы.Список.Обновить(); КонецЕсли; КонецПроцедуры В результате во всех открытых формах, в которых существует обработчик события ОбработкаОповещения(), появится новый товар. В том числе и в тех формах, которые расположены на рабочем столе (рис. 8.286). подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 8», обработка ВариантыОбновления, локальная команда формы ПолучитьФорму. Для получения формы используется метод глобального контекста ПолучитьФорму(), листинг 8.66. Листинг 8.66. Получение формы и обновление списка СсылкаНаНовыйЭлемент = ДобавитьЭлементНаСервере (); Форма = ПолучитьФорму("Справочник.Товары.ФормаСписка"); Форма.Элементы.Список.Обновить(); Так как четвертый параметр в этом методе не указывается, то будет получена уже открытая форма. Затем обновляется список, расположенный в этой форме. В результате в форме списка товаров появится новый товар. Остальные формы останутся без изменений (рис. 8.287). Рис. 8.286. Обновление данных методом «Оповестить()» Обновление формы извне Способ, описанный далее, можно использовать тогда, когда нам точно известна форма, в которой нужно что-то обновить, и известно, что эта форма открыта. Идея заключается в том, чтобы получить саму открытую форму, получить список, расположенный в этой форме, и обновить его. Том 1 Рис. 8.287. Обновление данных в конкретном списке Этот способ имеет два недостатка. 331 Глава 8. Разработка форм Во-первых, нужно точно знать устройство формы, как называется ее таблица, отображающая данные динамического списка. Если по каким-то причинам ее имя изменится, форма перестанет обновляться. Во-вторых, таким способом не удастся обновить формы, расположенные в основном окне приложения: на рабочем столе или открытые в разделах прикладного решения, так как их нельзя получить из встроенного языка. таблица будет иметь стандартное имя Список, да и хорошо бы проверить тип объектов, которые отображаются в этом списке… Поэтому здесь просто приведен один из возможных вариантов тех действий, которые требуется выполнить в открытых формах. В результате в форме списка товаров и в специальной форме появится новый товар. Формы, открытые в основном окне приложения, останутся без изменений (рис. 8.288). Коллекция окон Последний, четвертый, способ удобен тогда, когда нужно выполнить одинаковые действия со всеми отрытыми формами. Можно получить коллекцию открытых окон приложения, обойти ее и от каждого окна попробовать получить содержащуюся в нем форму. Затем, как и в предыдущем способе, обновить список, расположенный в этой форме. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 8», обработка ВариантыОбновления, локальная команда формы ПолучитьОкна. Коллекцию открытых окон приложения можно получить с помощью метода глобального контекста ПолучитьОкна(), листинг 8.67. Листинг 8.67. Работа с коллекцией окон СсылкаНаНовыйЭлемент = ДобавитьЭлементНаСервере(); КоллекцияОкон = ПолучитьОкна(); Для Каждого Окно из КоллекцияОкон Цикл Если НЕ Окно.Основное Тогда // От основного окна нельзя получить формы. Форма = Окно.ПолучитьСодержимое(); СписокТоваров = Форма.Элементы.Найти("Список"); // Если есть элемент Список, обновить его. Если СписокТоваров <> Неопределено Тогда СписокТоваров.Обновить(); КонецЕсли; КонецЕсли; КонецЦикла; В этом примере, получив очередное окно, мы проверяем, что это окно не является основным окном приложения (Если НЕ Окно.Основное Тогда). Как уже говорилось выше, от основного окна получить формы не удастся. Рис. 8.288. Обновление данных в конкретном списке Оформление списков «1С:Предприятие» позволяет различным образом оформлять данные, представленные в списках. Самые большие возможности оформления предоставляют динамические списки. Для них можно задавать отбор, сортировку, группировать данные по значению и применять условное оформление. Эти возможности доступны разработчику интерактивно в конфигураторе и пользователю, также интерактивно, в режиме 1С:Предприятие. После этого в полученной форме мы ищем элемент с именем Список и, если он есть, обновляем его. На самом деле алгоритм поиска того, что нужно обновлять, может быть более сложным. Ведь совсем не обязательно Возможности по оформлению статических списков (табличных частей, таблиц значений, деревьев значений и пр.) значительно меньше. К ним может быть применено только условное оформление, которое разработчик интерактивно задает в конфигураторе. 332 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Однако все упомянутые возможности оформления списков доступны из встроенного языка в режиме 1С:Предприятие. Таким образом, разработчик может не только реализовать собственный алгоритм оформления динамического списка, но и предоставить, например, пользователю возможность задать условное оформление для табличной части документа. Рассмотрим на двух простых примерах, каким образом можно оформить «обычные» и динамические списки. Динамические списки Для того чтобы познакомиться с возможностями оформления динамического списка, создадим четыре команды, которые в режиме 1С:Предприятие позволят нам задать отбор, порядок, группировку и условное оформление списка документов. Список – это реквизит формы, содержащий динамический список. Его свойство Отбор может содержать произвольное количество элементов, описывающих условия отбора в этом списке. Эти условия могут быть заданы разработчиком в конфигураторе или пользователем в режиме 1С:Предприятие. Поэтому, прежде чем ставить собственные условия отбора в списке, мы должны каким-то образом обработать ситуацию, когда в списке уже имеются условия отбора. В реальной жизни возможны различные алгоритмы, но, поскольку у нас всего лишь демонстрационный пример, мы поступим просто. Если для динамического списка уже заданы какие-то условия отбора, мы не будем предпринимать никаких действий и предложим пользователю самостоятельно удалить имеющиеся условия отбора (листинг 8.69). Листинг 8.69. Анализ имеющихся условий отбора Отбор = Список.Отбор.Элементы; Отбор подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 9», форма списка документа Накладная, команда Отбор. Это локальная команда этой формы. Любое оформление динамических списков возможно на клиенте. Поэтому для программной установки отбора в списке накладных мы будем использовать локальную команду формы списка. Обработчик этой команды выглядит следующим образом (листинг 8.68). Листинг 8.68. Установка отбора динамического списка &НаКлиенте Процедура Отбор(Команда) Отбор = Список.Отбор.Элементы; Если Отбор.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Отбор уже задан. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле"); УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; УсловиеОтбора.ПравоеЗначение = Истина; Если Отбор.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Отбор уже задан. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; Если же никаких условий отбора еще не задано, мы зададим одно условие. Для этого в коллекцию элементов отбора добавим новый элемент (листинг 8.70). Листинг 8.70. Добавление нового условия отбора УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); В простом случае отбора может быть перечислено несколько элементов, которые объединяются по условию И. В более сложных случаях отборов несколько элементов могут объединяться в группы, и для каждой группы можно задать собственное условие объединения элементов: И, ИЛИ, НЕ. Таким образом, в коллекции условий отбора могут находиться как элементы, так и группы. В нашем простом примере мы добавляем один элемент, но если вы захотите формировать сложные условия, нужно будет добавлять группы (Тип("ГруппаЭлементовОтбораКомпоновкиДанных")), устанавливать их свойство ТипГруппы и уже в эти группы добавлять отдельные элементы. Итак, после того как элемент добавлен, нужно задать условие отбора. КонецПроцедуры Том 1 333 Глава 8. Разработка форм У нашей накладной есть булев реквизит НаКонтроле, который проставляется для накладных, требующих особого внимания (рис. 8.289). Рис. 8.290. Полный список накладных После того как мы выполним команду Отбор, в списке останутся только накладные на контроле (рис. 8.291). Рис. 8.289. Реквизит «НаКонтроле» Мы хотим, чтобы в результате наших действий в списке отображались только те накладные, которые на контроле. Условие отбора задается с помощью свойств ЛевоеЗначение, ВидСравнения и ПравоеЗначение. В нашем случае левое значение – это поле НаКонтроле (листинг 8.71). Листинг 8.71. Установка левого значения УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле"); Это поле мы создаем конструктором Новый, указывая имя поля. Условие сравнения – равенство. Оно задается с помощью системного перечисления (листинг 8.72). Рис. 8.291. Накладные на контроле Если мы откроем настройку списка (Все действия – Настроить список…), то увидим, что появилось условие отбора (рис. 8.292). Листинг 8.72. Установка вида сравнения УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; Правое значение – Истина (листинг 8.73). Листинг 8.73. Установка правого значения УсловиеОтбора.ПравоеЗначение = Истина; Таким образом должны быть отобраны только те накладные, у которых поле НаКонтроле содержит значение Истина. Запустим конфигурацию в режиме 1С:Предприятие. Откроется полный список накладных (рис. 8.290). Рис. 8.292. Отбор в настройках динамического списка 334 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Это то самое условие, которое мы добавили из встроенного языка. Пользователь может его изменить, отключить, удалить. Если требуется сделать это условие недоступным и невидимым для пользователя, то в обработчик команды Отбор нужно добавить следующую строчку кода (листинг 8.74). Листинг 8.74. Установка недоступности для пользователя условия отбора УсловиеОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Сортировка Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 9», форма списка документа Накладная, команда Сортировка. Это локальная команда этой формы. Для сортировки динамического списка будем использовать локальную команду формы со следующим текстом (листинг 8.75). задано платформой. Мы будем отключать его использование и добавлять собственное условие. Если условий несколько, сообщим об этом пользователю и не будем выполнять никаких действий (листинг 8.76). Листинг 8.76. Анализ имеющихся условий сортировки Сортировка = Список.Порядок.Элементы; Если Сортировка.Количество() = 1 Тогда Сортировка[0].Использование = Ложь; ИначеЕсли Сортировка.Количество() > 1 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Уже задано несколько условий сортировки. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; После этого добавляем свое новое условие сортировки (листинг 8.77). Листинг 8.77. Добавление нового условия сортировки Листинг 8.75. Установка сортировки динамического списка УсловиеСортировки = Сортировка.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); &НаКлиенте Процедура Сортировка(Команда) Поскольку мы собираемся самостоятельно указать, по какому полю сортировать список, мы добавляем «обычный» элемент порядка. Но существует возможность добавить и автоэлемент порядка (Тип("АвтоЭлементПорядкаКомпоновкиДанных")). Тогда платформа самостоятельно, на основе имеющегося описания запроса динамического списка определит, по каким полям нужно выполнять сортировку. Сортировка = Список.Порядок.Элементы; Если Сортировка.Количество() = 1 Тогда Сортировка[0].Использование = Ложь; ИначеЕсли Сортировка.Количество() > 1 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Уже задано несколько условий сортировки. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; УсловиеСортировки = Сортировка.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); УсловиеСортировки.Поле = Новый ПолеКомпоновкиДанных("Склад"); УсловиеСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; Итак, после того как новый элемент порядка добавлен, нужно указать поле, по которому будет выполняться сортировка, и направление сортировки. В нашем случае сортировать будем по полю Склад (листинг 8.78). Листинг 8.78. Установка поля, по которому будут выполняться сортировки УсловиеСортировки.Поле = Новый ПолеКомпоновкиДанных("Склад"); А направление сортировки будет по убыванию значения этого поля (листинг 8.79). КонецПроцедуры Листинг 8.79. Установка направления сортировки Как правило, динамический список всегда содержит некоторое условие сортировки. Например, список документов платформа стандартно сортирует по дате документа. УсловиеСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; Поэтому анализировать имеющиеся условия сортировки мы будем следующим образом. Если условие одно, будем считать, что это условие Том 1 Поскольку поле Склад – это ссылочное поле (содержит ссылки на элементы справочника Склады), то сортировка фактически будет выполняться не по самим значениям ссылок, а по их представлениям, то есть по наименованиям складов, которые являются строками. 335 Глава 8. Разработка форм Запустим конфигурацию в режиме 1С:Предприятие. Откроется список накладных, который стандартно отсортирован платформой по возрастанию даты (рис. 8.293). Первое – это стандартная сортировка по дате, которую мы отключили, но не удалили. А второе – это то самое условие, которое мы добавили из встроенного языка. Пользователь может его отключить или удалить. Группировка Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 9», форма списка документа Накладная, команда Группировка. Это локальная команда этой формы. Для группировки динамического списка мы также будем использовать локальную команду формы (листинг 8.80). Рис. 8.293. Стандартная сортировка списка После того как мы выполним команду Сортировка, список будет отсортирован по убыванию наименования склада (рис. 8.294). Листинг 8.80. Установка группировки &НаКлиенте Процедура Группировка(Команда) ГруппировкаСписка = Список.Группировка.Элементы; Если ГруппировкаСписка.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Группировка уже задана. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; Рис. 8.294. Сортировка по полю «Склад» Если мы откроем настройку списка, то увидим, что существуют два условия сортировки (рис. 8.295). ЭлементГруппировки = ГруппировкаСписка.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЭлементГруппировки.Поле = Новый ПолеКомпоновкиДанных("Поставщик"); Элементы.Список.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать; КонецПроцедуры Здесь, так же как и в случае с отбором, для простоты примера не будем выполнять никаких действий, если условия группировки уже заданы (листинг 8.81). Листинг 8.81. Анализ имеющихся условий группировки ГруппировкаСписка = Список.Группировка.Элементы; Рис. 8.295. Сортировка в настройках динамического списка 336 Если ГруппировкаСписка.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Группировка уже задана. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Если условия группировки не заданы, добавим новый элемент группировки (листинг 8.82). Листинг 8.82. Добавление нового элемента группировки После того как мы выполним команду Группировка, для каждого поставщика будет создана своя группа, в которой будут находиться документы этого поставщика. Все группы будут свернуты, за исключением той, в которой находится текущая строка списка (рис. 8.297). ЭлементГруппировки = ГруппировкаСписка.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); Как и в случае с сортировкой, можно использовать автополя группировки, но мы добавим обычное поле, чтобы самостоятельно задать его значение. Группировать список будем по значению поля Поставщик (листинг 8.83). Листинг 8.83. Добавление поля, по которому будет осуществляться группировка ЭлементГруппировки.Поле = Новый ПолеКомпоновкиДанных("Поставщик"); Дополнительно, для «красоты», укажем, что все группы списка должны быть свернуты. Для этого мы обратимся не к динамическому списку (реквизиту), а к таблице формы, которая этот динамический список отображает. Воспользуемся ее свойством НачальноеОтображениеДерева (листинг 8.84). Рис. 8.297. Группировка по поставщику Если мы откроем настройку списка, то увидим, что появилось условие группировки (рис. 8.298). Листинг 8.84. Установка свойств таблицы Элементы.Список.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать; У системного перечисления, которое мы использовали, есть еще и два других значения: РаскрыватьВерхнийУровень и РаскрыватьВсеУровни. При необходимости можно использовать их. Платформа не предоставляет возможности как-либо скрывать/раскрывать отдельные группы сгруппированного динамического списка из встроенного языка. Это можно сделать только интерактивно. Запустим конфигурацию в режиме 1С:Предприятие. Откроется список накладных, который стандартно представлен в виде линейного списка (рис. 8.296). Рис. 8.298. Группировка в настройках динамического списка Это то самое условие, которое мы добавили из встроенного языка. Пользователь может его изменить, отключить, удалить. Условное оформление Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 9», форма списка документа Накладная, команда Условное оформление. Это локальная команда этой формы. Рис. 8.296. Список без группировки Том 1 Для условного оформления динамического списка будем использовать локальную команду формы со следующим текстом (листинг 8.85). 337 Глава 8. Разработка форм Листинг 8.85. Установка условного оформления Теперь для этого элемента нужно задать: &НаКлиенте Процедура УсловноеОформление(Команда) ■■ само оформление, которое будет применяться (цвет, жирность шрифта и пр.); ■■ условие, при выполнении которого это оформление будет применяться; ■■ поля, которые таким образом будут оформлены. УО = Список.УсловноеОформление.Элементы; Если УО.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Условное оформление уже задано. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; ЭлементУО = УО.Добавить(); // Оформление: цвет фона – светлый лосось. ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЛососьСветлый); // Условие: поле НаКонтроле равно Истина. ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле"); ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементУсловия.ПравоеЗначение = Истина; // Оформляемое поле: Номер. ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Номер"); КонецПроцедуры Здесь также для простоты примера не будем выполнять никаких действий, если условное оформление уже задано (листинг 8.86). Листинг 8.86. Анализ имеющихся элементов условного оформления УО = Список.УсловноеОформление.Элементы; Если УО.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Условное оформление уже задано. Команда не выполнена."; Сообщение.Сообщить(); Возврат; КонецЕсли; Если же условное оформление не задано, добавим новый элемент, описывающий условное оформление (листинг 8.87). Листинг 8.87. Добавление нового элемента условного оформления ЭлементУО = УО.Добавить(); 338 Оформление задается путем установки значений имеющихся предопределенных параметров оформления. В нашем примере мы указываем, что поля будут выделяться другим цветом фона – светлый лосось (листинг 8.88). Листинг 8.88. Установка оформления, которое будет применяться // Оформление: цвет фона светлый лосось. ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЛососьСветлый); Для задания условия, при котором будет применяться оформление, мы используем уже знакомый нам по первому примеру отбор компоновки данных. В коллекцию условий отбора добавим новый элемент и зададим для него левое значение, вид сравнения и правое значение (листинг 8.89). Листинг 8.89. Добавление условий, при которых будет применяться оформление // Условие: поле НаКонтроле равно Истина. ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле"); ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементУсловия.ПравоеЗначение = Истина; В результате оформление будет применяться в тех строках, где поле НаКонтроле имеет значение Истина. То есть мы «подсветим» документы, требующие особого внимания. В заключение укажем, какие поля будут «подсвечиваться». Если не указывать ничего, то будет «подсвечена» вся строка. Но мы добавим новое поле в коллекцию оформляемых полей и укажем, что оформляться будет только одно поле – Номер (листинг 8.90). Листинг 8.90. Установка оформляемого поля // Оформляемое поле: Номер. ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Номер"); Запустим конфигурацию в режиме 1С:Предприятие. Откроется список накладных, который стандартно не содержит никакого условного оформления (рис. 8.299). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Табличная часть Возможность условного оформления нединамических списков мы рассмотрим на примере табличной части документа. Будем выделять те строки документа, в которых количество товара больше 10. Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 9», форма документа Накладная, команда Условное оформление. Это локальная команда этой формы. Рис. 8.299. Список без условного оформления После того как мы выполним команду Условное оформление, номера документов 2 и 5 будут выделены цветом фона. Именно эти документы находятся на контроле (рис. 8.300). При оформлении нединамических списков есть несколько особенностей. Во-первых, для динамических списков условное оформление являлось свойством самого реквизита формы. Чтобы оформить нединамические списки, нужно использовать условное оформление самой формы. Во-вторых, задать оформление динамического списка можно было прямо на клиенте. Условное же оформление формы можно задать только на сервере. В остальном программная работа с условным оформлением нединамических списков ничем не отличается от рассмотренного выше примера. Для того чтобы оформить табличную часть накладной, создадим локальную команду формы, в которой вызовем контекстную серверную процедуру (листинг 8.91). Листинг 8.91. Вызов серверной процедуры для оформления формы Рис. 8.300. Условное оформление списка Если мы откроем настройку списка, то увидим, что появилось условное оформление (рис. 8.301). &НаКлиенте Процедура УсловноеОформление(Команда) ОформитьНаСервере(); КонецПроцедуры А в серверной (листинг 8.92). процедуре выполним условное оформление Листинг 8.92. Условное оформление формы &НаСервере Процедура ОформитьНаСервере() Рис. 8.301. Условное оформление в настройках динамического списка Это то самое условие, которое мы добавили из встроенного языка. Пользователь может его изменить, отключить, удалить. Том 1 Если УсловноеОформление.Элементы.Количество() > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Условное оформление уже задано. Команда не выполнена"; Сообщение.Сообщить(); Возврат; КонецЕсли; ЭлементУО = УсловноеОформление.Элементы.Добавить(); 339 Глава 8. Разработка форм // Оформление: цвет фона – зеленая лужайка. ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленаяЛужайка); // Условие: количество в табличной части больше 10. ЭлементУсловия = ЭлементУО.Отбор.Элементы. Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество"); ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; ЭлементУсловия.ПравоеЗначение = 10; // Оформляемое поле: товар в табличной части. ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыТовар"); КонецПроцедуры Из особенностей здесь можно сказать об именах полей, которые используются в условии оформления и в коллекции оформляемых полей. В динамических списках не вызывает затруднений указать правильное имя поля. Как правило, имена полей в реквизите (динамическом списке) и в таблице совпадают. Так было в предыдущем примере (рис. 8.302). Рис. 8.303. В условии оформления указывается поле реквизита формы А в коллекции оформляемых полей нужно указывать имя поля таблицы – ТоварыТовар (листинг 8.94, рис. 8.304). Листинг 8.94. В коллекции оформляемых полей указывается имя поля таблицы ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыТовар"); Рис. 8.302. Имена реквизитов и элементов в динамическом списке Мы накладывали условие на поле реквизита НаКонтроле, а оформляли поле таблицы Номер. При этом можно было не задумываться, в каком случае чье поле указывается. В случае с табличной частью имена большей частью не совпадают. Поэтому когда описывается условие оформления, нужно помнить, что указывается поле реквизита формы – Объект.Товары.Количество (листинг 8.93, рис. 8.303). Листинг 8.93. В условии оформления указывается поле реквизита формы ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество"); 340 Рис. 8.304. В коллекции оформляемых полей указывается имя поля таблицы Теперь запустим конфигурацию в режиме 1С:Предприятие и откроем накладную № 6. Ее табличная часть не содержит никакого условного оформления (рис. 8.305). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Дополнительные колонки в списках Одна из часто встречающихся задач – добавить собственные колонки с дополнительными данными в динамический список или в табличную часть документа. Обе эти задачи решаются относительно просто. В случае с динамическим списком нужно использовать произвольный запрос, который выведет требуемые поля данных. В случае с табличной частью решение может быть более сложным, и оно зависит от того, какие именно данные хочется показать в дополнительных колонках. Рис. 8.305. Табличная часть без условного оформления После того как мы выполним команду Условное оформление, товар Товар 2 будет выделен цветом фона, потому что количество этого товара больше 10 (рис. 8.306). Динамический список Подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 10», форма списка справочника Товары. Для примера возьмем стандартную форму списка товаров, созданную конструктором. В этой форме находится динамический список, отображающий товары и некоторые их реквизиты (рис. 8.307). Рис. 8.306. Оформленная табличная часть Пользователь не имеет стандартной возможности изменять условное оформление формы, поэтому в данной ситуации он не сможет отключить или удалить условное оформление, добавленное нами. Напоследок хочется сделать еще одно небольшое замечание. В отличие от динамических списков, в условном оформлении формы обязательно нужно указывать оформляемые поля. Если хочется выделить всю строку табличной части, нужно указать все поля, которые в ней содержатся. Том 1 Рис. 8.307. Динамический список в форме В списке отображаются только два реквизита справочника: Наименование и Код, хотя на самом деле справочник содержит также реквизиты Артикул и Сорт (рис. 8.308). 341 Глава 8. Разработка форм Платформа, создавая динамический список, включила в него все поля, связанные со справочником Товары, но только два поля поместила в таблицу формы: Наименование и Код. Поэтому наша задача решается очень просто. Нужно перетащить мышью поля Артикул и Сорт в дерево элементов, в таблицу Список (рис. 2.310). Рис. 8.308. Реквизиты справочника «Товары» Это стандартное поведение конструктора. Он включает в список только необходимые реквизиты справочника. Другие реквизиты разработчик может добавить самостоятельно, если в этом есть необходимость. У нас как раз есть такая необходимость. Мы хотим дополнительно отображать в этом списке колонки – Артикул и Сорт. Поскольку эти поля являются реквизитами справочника, отобразить их в списке будет очень просто. Если мы раскроем реквизит формы Список, то увидим, что нужные нам поля уже есть в составе этого реквизита (рис. 2.309). Рис. 8.310. Добавление колонок в список Если теперь запустить конфигурацию в режиме 1С:Предприятие, мы увидим, что в списке товаров отображаются две дополнительные колонки: Артикул и Сорт (рис. 8.311). Рис. 8.311. Новые колонки в списке Рис. 8.309. Поля динамического списка Итак, мы рассмотрели простой случай, когда в динамический список нужно добавить дополнительные колонки, отображающие данные реквизитов. 342 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Теперь рассмотрим более сложный случай, когда дополнительные данные не являются реквизитами объекта, содержащегося в основной таблице динамического списка. После этого состав свойств этого реквизита изменится. Нажав на гиперссылку Настройка списка, мы увидим стандартный текст запроса и сможем его изменить (рис. 8.314). В демонстрационной базе существует периодический регистр сведений Цены. В нем хранятся цены на товары (рис. 8.312). Рис. 8.312. Структура регистра «Цены» Теперь наша задача будет заключаться в том, чтобы в списке товаров показать в отдельной колонке актуальную цену товара. Для этого нам понадобится изменить текст запроса, который содержится в динамическом списке. В свойствах реквизита формы, содержащего динамический список, установим флажок Произвольный запрос (рис. 8.313). Рис. 8.314. Настройка динамического списка Заменим существующий текст запроса следующим (листинг 8.95). Листинг 8.95. Произвольный запрос динамического списка ВЫБРАТЬ СправочникТовары.Ссылка, СправочникТовары.ПометкаУдаления, СправочникТовары.Предопределенный, СправочникТовары.Код, СправочникТовары.Наименование, СправочникТовары.Артикул, СправочникТовары.Сорт, ЦеныСрезПоследних.Цена ИЗ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК СправочникТовары ПО ЦеныСрезПоследних.Товар = СправочникТовары.Ссылка Рис. 8.313. Свойство «Произвольный запрос» Том 1 Этим запросом мы дополнительно выводим поле Цена, соединяясь с виртуальной таблицей среза последних этого регистра. 343 Глава 8. Разработка форм Нажмем ОК в диалоге Динамический список, вернемся к форме и развернем реквизит формы Список. Теперь среди его полей появилось поле Цена. Как и раньше, просто перетащим его в таблицу формы (рис. 8.315). Табличная часть подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 10», форма документа Накладная. Добавление дополнительных колонок в табличную часть также рассмотрим на двух примерах. «Экспериментировать» будем со стандартной формой документа Накладная. Его табличная часть содержит колонки Номер строки, Товар, Количество, Цена и Сумма (рис. 8.317). Рис. 8.315. Добавление нового поля Теперь осталось запустить конфигурацию в режиме 1С:Предприятие и убедиться в том, что в списке товаров отображается еще одна дополнительная колонка, содержащая актуальную цену товара (рис. 8.316). Рис. 8.317. Поля табличной части Как мы помним из предыдущего примера, у товара есть реквизит Артикул, который нам тоже хотелось бы видеть в табличной части этого документа. Рис. 8.316. Новая колонка в динамическом списке Чтобы добавить Артикул, развернем реквизит формы Объект, развернем его табличную часть Товары, развернем реквизит Товар и увидим интересующее нас поле Артикул. Перетащим его в таблицу формы Товары (рис. 8.318). 344 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Но как быть в том случае, когда добавляемые данные не являются реквизитом, а должны быть получены в результате некоторых вычислений? В этом случае все будет несколько сложнее. В реквизит формы, описывающий табличную часть документа, нужно будет добавить собственное поле и заполнить его данными в определенных обработчиках формы документа. Чтобы не усложнять пример алгоритмами, не относящимися к сути, мы добавим в документ еще один реквизит товара – Сорт. Это позволит нам в обработчиках событий при заполнении собственной колонки данными просто писать Товар.Сорт. В реальной же ситуации тут будет некоторый алгоритм, который по имеющейся ссылке на товар будет получать данные, необходимые для отображения. Итак, сначала в реквизит формы, в табличную часть, добавим собственное поле СортТовара, имеющее тип ссылки на значение перечисления Сорт (рис. 8.320). Рис. 8.318. Добавление нового поля в таблицу Теперь останется только запустить конфигурацию в режиме 1С:Предприятие и убедиться, что в табличной части накладной отображается колонка с артикулом товара (рис. 8.319). Рис. 8.320. Добавление реквизита формы Рис. 8.319. Новая колонка в табличной части Затем перетащим это поле в таблицу формы Товары (рис. 8.321). Все просто потому, что добавляемые данные являются реквизитом товара, который сам по себе уже отображается в табличной части документа. Теперь начнем создавать обработчики событий, в которых колонка СортТовара будет заполняться данными. Том 1 345 Глава 8. Разработка форм Листинг 8.97. Обработчик события «При изменении» // Заполнение поля дополнительной колонки при изменении товара в табличной части. &НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) // Алгоритм, по которому поле дополнительной колонки заполняется данными. ДанныеСтроки = Элементы.Товары.ТекущиеДанные; ДанныеСтроки.СортТовара = ПолучитьСортТовара(ДанныеСтроки.Товар); КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьСортТовара(Товар) Возврат Товар.Сорт; КонецФункции Для того чтобы дополнительная колонка была заполнена данными при копировании или при вводе накладной на основании другого объекта, создадим обработчик события формы При создании на сервере (листинг 8.98). Листинг 8.98. Обработчик события «При создании на сервере» // Заполнение дополнительной колонки при копировании или вводе на основании. &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Рис. 8.321. Добавление поля таблицы Для того чтобы дополнительная колонка была заполнена данными при чтении существующей накладной из базы данных, создадим обработчик события формы При чтении на сервере (листинг 8.96). Листинг 8.96. Обработчик события «При чтении на сервере» // Заполнение дополнительной колонки при чтении существующего объекта. &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) // Алгоритм, по которому дополнительная колонка заполняется данными. Для Каждого СтрокаДанных Из Объект.Товары Цикл СтрокаДанных.СортТовара = СтрокаДанных.Товар.Сорт; КонецЦикла КонецПроцедуры Для того чтобы поле дополнительной колонки было заполнено данными при изменении строки табличной части или при добавлении новой строки, создадим обработчик При изменении поля таблицы ТоварыТовар. Поскольку это клиентский обработчик формы, для получения данных из базы данных будем вызывать серверную процедуру (листинг 8.97). 346 // Алгоритм, по которому дополнительная колонка заполняется данными. Для Каждого СтрокаДанных Из Объект.Товары Цикл Если НЕ ЗначениеЗаполнено(СтрокаДанных.СортТовара) Тогда СтрокаДанных.СортТовара = СтрокаДанных.Товар.Сорт; КонецЕсли; КонецЦикла КонецПроцедуры И, наконец, предусмотрим ситуацию, когда данные накладной могут быть изменены в процессе ее записи. На этот случай создадим обработчик события формы После записи на сервере (листинг 8.99). Листинг 8.99. Обработчик события «После записи на сервере» // Заполнение дополнительной колонки, если данные были изменены при записи. &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) // Алгоритм, по которому дополнительная колонка заполняется данными. Для Каждого СтрокаДанных Из Объект.Товары Цикл Если НЕ ЗначениеЗаполнено(СтрокаДанных.СортТовара) Тогда СтрокаДанных.СортТовара = СтрокаДанных.Товар.Сорт; КонецЕсли; КонецЦикла КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Теперь осталось запустить конфигурацию в режиме 1С:Предприятие и убедиться, что при любых манипуляциях с накладной данные колонки Сорт заполняются правильно (рис. 8.322). Для решения этой задачи используется идентификатор (рис. 8.323). Рис. 8.323. Использование идентификатора для получения строки реквизита Находясь в таблице формы, узнать идентификатор текущей строки просто. Его возвращает свойство таблицы ТекущаяСтрока. Рис. 8.322. Новая колонка в табличной части Работа с таблицей в форме При работе с табличной частью документа или просто произвольной таблицей значений, расположенной в форме, зачастую возникает необходимость выборочной или групповой обработки данных, содержащихся в таблице. Имея этот идентификатор, найти соответствующий ему элемент коллекции, содержащейся в реквизите, тоже просто. У коллекции есть метод НайтиПоИдентификатору(), который вернет нужный элемент коллекции. В обратную сторону все работает похожим образом (рис. 8.324). Особенность заключается в том, что для выполнения простейших действий с текущей строкой можно не обращаться к данным (реквизиту формы), а получить нужные значения прямо из элемента формы Таблица. Для этого используется свойство таблицы ТекущиеДанные. Однако для выполнения более сложных или массовых операций требуется доступ непосредственно к данным формы, то есть к ее реквизиту. Реквизит формы может иметь разный тип, например, в случае табличной части это будет ДанныеФормыКоллекция, а в случае дерева значений – ДанныеФормыДерево. Сути дела это не меняет. В любом случае реквизит формы является некоторой коллекцией. И когда мы «переходим» от элемента формы, в котором какая-то строка является текущей, к реквизиту, нужно уметь однозначно определить, какой элемент этой коллекции соответствует текущей строке таблицы. И наоборот, зная некоторый элемент коллекции, содержащейся в реквизите, нужно уметь сделать текущей строкой таблицы ту, которая соответствует этому элементу коллекции. Том 1 Рис. 8.324. Использование идентификатора для установки текущей строки таблицы Имея некоторый элемент коллекции, содержащейся в реквизите, мы можем получить его идентификатор с помощью его метода ПолучитьИдентификатор(). Останется только присвоить этот идентификатор текущей строке таблицы, чтобы спозиционироваться на нужной строке. Рассмотрим работу с таблицей на двух примерах. Первый будет заключаться в том, чтобы обойти поля таблицы в нужной последовательности, а второй – в том, чтобы сохранить текущую строку таблицы после массированного изменения данных. 347 Глава 8. Разработка форм Ввод данных по колонкам Сразу оговоримся, что этот пример не совсем хорош. Мы будем использовать сообщения пользователю, но не по назначению. Сообщение пользователю предназначено для того, чтобы прервать действие и указать на элемент формы, содержащий неправильные данные. Мы же будем использовать их для того, чтобы «подсказывать» пользователю, в какой элемент формы необходимо ввести данные. Полезное свойство сообщений заключается в том, что если сообщение выводится с привязкой к элементу формы, то этот элемент сразу же переходит в режим редактирования. Таким образом, пользователю остается всего лишь ввести в него правильные данные. Сценарий, который мы будем реализовывать, имеет под собой вполне реальную основу. Зачастую оператору, вводящему накладную, удобно вводить ее не по строкам, а по столбцам. Сначала вводится вся номенклатура – первая колонка. Затем вводится все количество – вторая колонка. После этого вводится вся цена – третья колонка. В конце контролируется итоговая сумма, и если есть расхождения, они исправляются путем построчной проверки сумм. Такой сценарий удобен тем, что на каждом этапе выполняются однотипные действия, которые легко сверять с бумажным документом. Сначала – подбор номенклатуры. Затем – ввод чисел. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 11», форма документа Накладная, обработчик ТоварыКоличествоПриИзменении() реквизита ТоварыКоличество таблицы. Для того чтобы реализовать этот сценарий, напишем обработчик события При изменении для того реквизита таблицы, который предполагается заполнять по колонке. В нашем случае таким реквизитом будет ТоварыКоличество (рис. 8.325). Обработчик будет выглядеть следующим образом (листинг 8.100). Листинг 8.100. Обработчик события «При изменении» СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока); ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции); Если Объект.Товары.Количество() > ИндексСтрокиКоллекции + 1 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.КлючДанных = Объект.Ссылка; Сообщение.ПутьКДанным = "Объект"; Сообщение.Поле = "Товары[" + Строка(ИндексСтрокиКоллекции + 1) + "].Количество"; Сообщение.Текст = "Введите количество товара"; Сообщение.Сообщить(); КонецЕсли; 348 Рис. 8.325. Реквизит «ТоварыКоличество» Сначала мы находим строку коллекции, которая соответствует текущей строке таблицы (листинг 8.101). Листинг 8.101. Получение строки коллекции СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока); Затем получаем индекс этой строки в коллекции, т. к. нам нужно будет привязать сообщение к следующей строке таблицы. Следующая строка будет иметь индекс на единицу больше, чем текущая (листинг 8.102). Листинг 8.102. Получение индекса строки коллекции ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции); После этого мы формируем сообщение пользователю и привязываем его к полю Количество, находящемуся в следующей строке таблицы (листинг 8.103). Листинг 8.103. Привязка сообщения к полю «Количество» Сообщение.Поле = "Товары[" + Строка(ИндексСтрокиКоллекции + 1) + "].Количество"; Условие Если… нужно для того, чтобы не формировать сообщение в том случае, когда редактируется последняя строка таблицы (листинг 8.104). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.104. Контроль окончания редактируемой таблицы Листинг 8.105. Сортировка таблицы реквизита Если Объект.Товары.Количество() > ИндексСтрокиКоллекции + 1 Тогда &НаКлиенте Процедура СортироватьБезВыгрузки(Команда) В результате, если запустить систему в режиме 1С:Предприятие и заполнить номенклатуру в документе Накладная, мы сможем затем последовательно ввести количество номенклатуры, просто набирая его на клавиатуре и нажимая клавишу Ввод. Позиционирование на нужном элементе управления и вход в режим редактирования будут выполняться автоматически. Кроме этого, сообщение в форме всегда будет подсказывать текущую позицию ввода, что удобно для сверки с документом (рис. 8.326). Рис. 8.326. Позиционирование на следующем поле и подсказка Сохранение текущей строки после загрузки данных Объект.Товары.Сортировать("Цена"); КонецПроцедуры Допустим, перед выполнением этого действия текущей была, например, третья строка табличной части (рис. 8.327). Рис. 8.327. Текущая строка перед выполнением сортировки Тогда после выполнения сортировки эта же строка останется текущей. Она уже не будет третьей, но это будет та же самая строка (рис. 8.328). Второй пример поможет понять некоторые особенности работы с коллекцией, которая хранит данные таблицы в реквизите формы. Мы будем рассматривать ситуацию, когда эти данные обрабатываются по некоторому непростому алгоритму. В примере мы будем всего лишь сортировать данные, но в реальной жизни это может быть гораздо более сложный алгоритм обработки. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 11», форма документа Накладная, команды Сортировать без выгрузки, Сортировать с выгрузкой (неправильно), Сортировать с выгрузкой (правильно). Это локальные команды формы. Итак, наша задача – отсортировать табличную часть документа по возрастанию значений в колонке Цена. Самый простой способ – обратиться непосредственно к реквизиту формы и выполнить его метод Сортировать(), листинг 8.105. Том 1 Рис. 8.328. Текущая строка после сортировки Теперь рассмотрим другой случай. Допустим, для выполнения нашего алгоритма нужно выгрузить данные из реквизита в таблицу значений, обработать их и затем загрузить обратно (команда Сортировать с выгрузкой (неправильно)), листинг 8.106. 349 Глава 8. Разработка форм Листинг 8.106. Сортировка с выгрузкой и загрузкой. Неправильный вариант Листинг 8.107. Сортировка с выгрузкой и загрузкой. Правильный вариант &НаКлиенте Процедура СортироватьСВыгрузкойНеправильно(Команда) &НаКлиенте Процедура СортироватьСВыгрузкойПравильно(Команда) НаСервереНеправильно(); НаСервереПравильно(); КонецПроцедуры КонецПроцедуры &НаСервере Процедура НаСервереНеправильно() &НаСервере Процедура НаСервереПравильно() ТЗ = Объект.Товары.Выгрузить(); ТЗ.Сортировать("Цена"); Объект.Товары.Загрузить(ТЗ); КонецПроцедуры В этом случае результат окажется другим. Строки, как и раньше, будут отсортированы, однако текущей станет первая строка таблицы (рис. 8.329). СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока); ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции); ТЗ = Объект.Товары.Выгрузить(); СтрокаВыгруженнойТаблицы = ТЗ.Получить(ИндексСтрокиКоллекции); ТЗ.Сортировать("Цена"); ИндексСтрокиПослеСортировки = ТЗ.Индекс(СтрокаВыгруженнойТаблицы); Объект.Товары.Загрузить(ТЗ); СтрокаКоллекции = Объект.Товары.Получить(ИндексСтрокиПослеСортировки); Элементы.Товары.ТекущаяСтрока = СтрокаКоллекции.ПолучитьИдентификатор(); КонецПроцедуры Прежде всего, оказавшись на сервере, мы находим ту строку реквизита, которая соответствует текущей строке в таблице формы (листинг 8.108, рис. 8.330). Листинг 8.108. Получение строки в коллекции реквизита СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока); Рис. 8.329. Сброс текущей строки после сортировки Так происходит потому, что после загрузки данных в реквизит формы в нем фактически оказывается новая коллекция данных. Они могут не совпадать с теми данными, которые были из реквизита выгружены. Поэтому текущей становится первая строка таблицы, что соответствует стандартному поведению платформы. Однако мы знаем, что данные, которые загружены, те же самые, поменялся лишь порядок строк. Как в этом случае сохранить правильную текущую строку? Рис. 8.330. Получение строки в коллекции реквизита Затем мы получаем индекс этой строки (листинг 8.109, рис. 8.331). Листинг 8.109. Получение индекса строки в реквизите ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции); Рассмотрим третий вариант (команда Сортировать с выгрузкой (правильно)), листинг 8.107. Рис. 8.331. Получение индекса строки в реквизите 350 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Этот индекс понадобится нам в дальнейшем, чтобы найти по нему эту же строку, но уже в таблице значений, в которую мы выгрузим данные (листинг 8.110). Зная этот индекс, мы можем загрузить данные обратно в реквизит и найти уже в нем ту строку, которая соответствует «текущей» (листинг 8.113, рис. 8.335). Листинг 8.110. Получение строки в таблице значений Листинг 8.113. Получение строки в реквизите ТЗ = Объект.Товары.Выгрузить(); СтрокаВыгруженнойТаблицы = ТЗ.Получить(ИндексСтрокиКоллекции); Объект.Товары.Загрузить(ТЗ); СтрокаКоллекции = Объект.Товары.Получить(ИндексСтрокиПослеСортировки); Поскольку в процессе выгрузки мы не преобразовывали таблицу (не изменяли порядок и количество строк), то наша строка в реквизите и аналогичная строка в выгруженной таблице значений будут иметь одинаковые индексы (рис. 8.332). Рис. 8.335. Получение строки в реквизите И в заключение, зная «текущую строку» в реквизите, мы можем спозиционировать курсор в таблице формы на нужную нам строку, используя идентификатор (листинг 8.114, рис. 8.336). Рис. 8.332. Получение строки в таблице значений Теперь, после того как в переменной СтрокаВыгруженнойТаблицы мы запомнили «текущую строку» таблицы значений, можно эту таблицу значений сортировать (листинг 8.111, рис. 8.333). Листинг 8.114. Позиционирование текущей строки в таблице формы Элементы.Товары.ТекущаяСтрока = СтрокаКоллекции.ПолучитьИдентификатор(); Листинг 8.111. Сортировка таблицы значений ТЗ.Сортировать("Цена"); Рис. 8.336. Позиционирование текущей строки в таблице формы Если теперь посмотреть, как это работает в режиме 1С:Предприятие, мы увидим, что после сортировки текущей остается та строка, которая была ею перед началом действия. Рис. 8.333. Сортировка таблицы значений Работа с файлами и картинками В отсортированной таблице значений порядок строк поменялся, и нам нужно определить, какой же индекс стал теперь у нашей «текущей строки» (листинг 8.112, рис. 8.334). Тонкий клиент и веб-клиент имеют разные возможности по работе с файлами и картинками. Листинг 8.112. Получение индекса строки в таблице значений ИндексСтрокиПослеСортировки = ТЗ.Индекс(СтрокаВыгруженнойТаблицы); Поскольку веб-клиент является типичным веб-приложением, он ничего не знает о локальной файловой системе компьютера, на котором работает. Его собственные стандартные возможности заключаются лишь в том, чтобы поместить один файл на сервер или получить один файл из базы данных. Причем и в одном и в другом случае передается только один файл, и эта операция интерактивна в том смысле, что отсутствуют какие-либо средства программной работы с локальной файловой системой клиентского компьютера. Рис. 8.334. Получение индекса строки в таблице значений Том 1 351 Глава 8. Разработка форм Исходный файл для помещения на сервер должен быть выбран пользователем интерактивно, или путь к нему должен быть указан в явном виде. Аналогично и при получении файла из базы данных – его конечное местоположение должно быть выбрано пользователем интерактивно или в явном виде указано в программном коде. Тонкий клиент является Windows-приложением и имеет более широкие возможности работы с файлами. В частности, он поддерживает множественный экспорт и импорт файлов и предоставляет программные средства для работы с локальной файловой системой клиентского компьютера. Для того чтобы веб-клиент смог выполнять такие же действия, на клиентском компьютере необходимо установить и подключить расширение работы с файлами. Это отдельный компонент платформы, его установка и подключение выполняются автоматически средствами встроенного языка. Однако использование расширения работы с файлами снижает общую безопасность системы: в браузере Microsoft Internet Explorer требуется разрешение на установку и использование ActiveX, а в браузере Mozilla Firefox необходимо предоставление расширенных привилегий. Пользователь веб-клиента попросту может не иметь подобных прав, если работа выполняется на публичном компьютере или в организации, использующей определенную политику безопасности. Рис. 8.337. Помещение файла во временное хранилище Временное хранилище – это набор служебных файлов кластера, в которых в течение ограниченного времени могут храниться произвольные данные до помещения их в базу данных. На втором этапе, когда пользователь принимает решение сохранить редактируемые данные в базе данных, файл из временного хранилища помещается в какой-либо реквизит, имеющий тип ХранилищеЗначения, и эти данные записываются в базу данных (рис. 8.338). Поэтому при работе с файлами и картинками следует в обязательном порядке реализовывать алгоритмы, использующие стандартные, общие для тонкого и веб-клиента возможности работы с файлами. Кроме этого, можно реализовать и другую ветку алгоритма, использующую расширенные возможности работы с файлами. Но эта ветка должна быть опциональной, дополнительной. Нельзя обязательно заставлять пользователя использовать расширение работы с файлами, ведь у него может не быть прав на его установку. Стандартные возможности Рис. 8.338. Перемещение файла из временного хранилища в базу данных ПоместитьФайл() Если же пользователь отказывается от сохранения редактируемых данных, то файл удаляется из временного хранилища либо автоматически, когда будет закрыта форма, с помощью которой он туда был помещен, либо «вручную», из встроенного языка. ПолучитьФайл() – получает файл из информационной базы и помещает Процесс получения файла из информационной базы проще. Он выполняется в один этап, с помощью метода ПолучитьФайл(), рис. 8.339. Стандартные возможности работы с файлами реализуются двумя методами встроенного языка: ПоместитьФайл() и ПолучитьФайл(). – помещает файл с пользовательского компьютера на сервер «1С:Предприятия». его на клиентский компьютер. Помещение файла в информационную базу выполняется в два этапа. Сначала с помощью метода ПоместитьФайл() файл с клиентского компьютера помещается во временное хранилище (рис. 8.337). 352 Файл извлекается из реквизита типа ХранилищеЗначения и помещается на компьютер пользователя. С помощью этого метода можно получить на клиентский компьютер данные не только из базы данных, но и из временного хранилища. При работе с файлами эта возможность имеет малое практическое значение. Зато она востребована, например, в тех случаях, когда временное Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм хранилище используется для передачи больших массивов данных между двумя формами на клиенте. Такой пример рассмотрен в разделе «Использование временного хранилища для передачи данных между формами», стр. 425. Чтобы не запутаться в различных методах работы с файлами, все их можно представить в виде следующей иерархии (рис. 8.340). Рис. 8.340. Методы работы с файлами Рис. 8.339. Извлечение файла из временного хранилища или из базы данных Получение файла и сохранение его в базе данных Расширенные возможности В качестве примера рассмотрим задачу получения файла с клиентского компьютера и сохранения его в реквизите справочника. Как уже говорилось раньше, в тонком клиенте расширенные возможности работы с файлами доступны всегда. В веб-клиенте для их использования нужно установить и подключить расширение работы с файлами. Здесь мы лишь перечислим эти возможности, так как их практическое использование, как правило, не вызывает трудностей. Установка и подключение расширения работы с файлами выполняются с помощью двух методов встроенного языка: ■■ УстановитьРасширениеРаботыСФайлами(), ■■ ПодключитьРасширениеРаботыСФайлами(). После этого в веб-клиенте становятся доступны методы экспорта/импорта файлов: ■■ ПоместитьФайлы(), ■■ ПолучитьФайлы(). Они аналогичны упоминавшимся ранее методам, но позволяют выполнять операции сразу над группой файлов. Также становятся доступны методы прямого доступа к локальной файловой системе клиентского компьютера: ■■ КопироватьФайл(), ■■ НайтиФайлы(), ■■ ПереместитьФайл(), ■■ СоздатьКаталог(), ■■ УдалитьФайлы(). Том 1 подробнее Пример можно посмотреть в базе «Файлы и картинки», справочник Поставщики. Пусть в конфигурации существует справочник Поставщики. Для каждого поставщика в базе данных должен храниться произвольный файл, содержащий договор с этим поставщиком. Сразу оговоримся, что рассматриваемый пример упрощен и произвольный файл мы будем хранить в одном из реквизитов самого справочника Поставщики. В реальной работе, как правило, так не поступают. Для хранения больших объемов бинарных данных (файлы, картинки) создаются отдельные объекты конфигурации (справочники или регистры сведений), связанные с данным объектом. Такой подход позволяет исключить обязательное считывание больших объемов информации при считывании самого объекта. Итак, справочник Поставбудет содержать два реквизита: ФайлДоговора (для хранения двоичных данных) и ИмяФайлаДоговора (для хранения имени загруженного файла), рис. 8.341. щики Рис. 8.341. Структура справочника «Поставщики» 353 Глава 8. Разработка форм Имя загруженного файла понадобится нам для того, чтобы иметь возможность в дальнейшем этот файл поместить обратно на компьютер пользователя. Форма элемента справочника Поставщики, помимо данных самого объекта, будет содержать два дополнительных реквизита: ИмяФайлаДоговора и СсылкаНаФайлВоВременномХранилище (рис. 8.342). Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда Файл = Новый Файл(ВыбранноеИмяФайла); ИмяФайлаДоговора = Файл.Имя; СсылкаНаФайлВоВременномХранилище = АдресВХранилище; Модифицированность = Истина; КонецЕсли; КонецПроцедуры Сначала создаются две служебные переменные АдресВХранилище и ВыбранноеИмяФайла, в которые будут возвращены ссылка на файл в хранилище и полное имя файла, выбранного на компьютере пользователя. Затем выполняется метод ПоместитьФайл(). Он располагается в условии Если потому, что в процессе выбора файла пользователь может, вообще говоря, отказаться от задуманной операции – загрузки файла. Поэтому модификация реквизитов формы выполняется только в том случае, когда операция помещения файла выполнена успешно. В этом случае короткое имя файла помещается в реквизит формы ИмяФайлаДоговора, а ссылка на этот файл во временном хранилище помещается в реквизит формы СсылкаНаФайлВоВременномХранилище. Рис. 8.342. Реквизиты формы элемента справочника «Поставщики» Ссылка на временное хранилище запоминается в форме потому, что она необходима лишь на момент от загрузки файла до записи объекта в базу данных и не является частью прикладных данных объекта. ИмяФайлаДоговора запоминается в форме для того, чтобы не модифициро- вать данные объекта до тех пор, пока не начнется запись объекта в базу данных. В принципе можно обойтись и без него, сохранять имя файла прямо в реквизит объекта, но тогда несколько сложнее станет проверка, выполняемая при сохранении файла на компьютер пользователя. Для того чтобы из полного имени файла получить короткое имя, используется программный объект Файл (листинг 8.116). Листинг 8.116. Получение короткого имени файла Файл = Новый Файл(ВыбранноеИмяФайла); ИмяФайлаДоговора = Файл.Имя; Таким образом, после помещения файл окажется во временном хранилище, а в реквизитах формы будет ссылка на него и его имя (рис. 8.343). Для загрузки файла с диска в информационную базу и для сохранения его на диск в форме созданы две локальные команды: ЗагрузитьСДиска и СохранитьНаДиск. Загрузка файла выполняется следующим образом (листинг 8.115). Листинг 8.115. Загрузка файла &НаКлиенте Процедура ЗагрузитьСДиска(Команда) АдресВХранилище = ""; ВыбранноеИмяФайла = ""; 354 Рис. 8.343. Файл во временном хранилище Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Примечательным здесь является то, что при помещении файла мы указали последний параметр метода ПоместитьФайл(), листинг 8.117. Листинг 8.117. Привязка файла к открытой форме ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) В качестве этого параметра мы передали уникальный идентификатор нашей открытой формы. Это значит, что файл во временном хранилище будет существовать до тех пор, пока мы не закроем форму. Тогда платформа автоматически удалит его из хранилища. Значит, если пользователь откажется от сохранения изменений, сделанных в форме, нам не нужно заботиться об удалении файла из временного хранилища – платформа это сделает сама. Листинг 8.120. Помещение файла в реквизит объекта ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище); ТекущийОбъект.ФайлДоговора = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); Таким образом, после выполнения этого обработчика мы будем иметь следующую картину (рис. 8.344). А вот если пользователь решит сохранить сделанные изменения, тогда будут выполнены следующие действия. Сначала на сервере будет вызван обработчик события формы Перед записью на сервере (листинг 8.118). Листинг 8.118. Обработчик события «Перед записью на сервере» &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Рис. 8.344. Файл в реквизите объекта Затем платформа начнет запись объекта, и его данные будут помещены в базу данных (рис. 8.345). // Получить файл из хранилища и поместить его в объект. Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда ДвоичныеДанные = ПолучитьИзВременногоХранилища( СсылкаНаФайлВоВременномХранилище); ТекущийОбъект.ФайлДоговора = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); ТекущийОбъект.ИмяФайлаДоговора = ИмяФайлаДоговора; КонецЕсли; КонецПроцедуры В этом обработчике мы поместим файл из временного хранилища в реквизит записываемого объекта и в другой реквизит объекта поместим имя этого файла. Делать это мы будем не всегда (ведь пользователь может записать объект и не указывая файл договора), а только в том случае, когда реквизит формы действительно хранит ссылку на файл во временном хранилище (листинг 8.119). Рис. 8.345. Запись данных объекта в базу данных После этого, еще до окончания транзакции записи, на сервере будет вызван обработчик события формы При записи на сервере (листинг 8.121). Листинг 8.121. Обработчик события «При записи на сервере» Листинг 8.119. Проверка того, что навигационная ссылка указывает на временное хранилище &НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда // Удалить файл из временного хранилища. Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда УдалитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище); КонецЕсли; КонецПроцедуры В этом случае мы получим из временного хранилища двоичные данные и преобразуем их в объект ХранилищеЗначения, который и поместим в реквизит записываемого объекта (листинг 8.120). Том 1 355 Глава 8. Разработка форм В этом обработчике мы «наведем красоту». Так как данные объекта уже записаны в базу данных, полученный файл успешно сохранен, можно удалить из временного хранилища находящийся там файл. Для этого мы используем ссылку, сохраненную в реквизите формы (рис. 8.346). Затем просто получаем файл на компьютер пользователя (листинг 8.124). Листинг 8.124. Получение файла на компьютер пользователя ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаДоговора); При выполнении этого метода будет открыт стандартный диалог операционной системы, который предложит либо открыть, либо сохранить получаемый файл (рис. 8.347). Рис. 8.346. Удаление файла из временного хранилища Теоретически можно это и не делать – платформа все равно автоматически удалит этот файл, когда мы закроем форму. Но в общем случае при интенсивной многопользовательской работе лучше освобождать ресурсы сервера сразу же после того, как необходимость в них исчезает. Процесс получения файла из информационной базы выглядит гораздо проще. Он целиком реализован в обработчике локальной команды формы СохранитьНаДиск (листинг 8.122). Листинг 8.122. Получение файла из информационной базы &НаКлиенте Процедура СохранитьНаДиск(Команда) Если Объект.ИмяФайлаДоговора = "" Тогда Предупреждение("У поставщика нет сохраненного в базе договора"); Иначе СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлДоговора"); ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаДоговора); КонецЕсли; КонецПроцедуры Поскольку имя файла договора мы записываем в реквизит объекта только в момент записи, можно использовать его для определения того, есть ли в объекте сохраненный файл или нет. Чтобы получить файл из информационной базы, нужно иметь навигационную ссылку на этот файл. Навигационную ссылку мы получаем, указывая ссылку на объект и указывая имя реквизита объекта, в котором хранится файл (листинг 8.123). Листинг 8.123. Получение навигационной ссылки на реквизит объекта Рис. 8.347. Диалог получения файла Картинка товара в форме При работе с картинками используется тот же самый подход, который был описан выше. Отличие заключается только в том, что в предыдущем примере нам не нужно было никак отображать файл в форме элемента справочника Поставщики. А картинка, как правило, загружается в информационную базу именно для того, чтобы отображать ее в какой-либо форме. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 12», справочник Товары. Работу с картинками рассмотрим на примере справочника Товары и картинки товара. Ее нужно загрузить, отобразить в форме, сохранить в базе данных и иметь возможность получить из базы данных на клиентский компьютер. Снова сделаем оговорку. Рассматриваемый пример упрощен, и картинку мы будем хранить в одном из реквизитов самого справочника Товары. В реальной работе, как правило, так не поступают, а хранят картинки в отдельных объектах конфигурации, в справочниках или в регистрах сведений. Как и в предыдущем примере, справочник Товары будет содержать два реквизита: ФайлКартинки, чтобы хранить саму картинку, и ИмяФайлаКартинки, чтобы знать ее имя при выгрузке на клиентский компьютер (рис. 8.348). СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлДоговора"); 356 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Загрузка картинки выполняется следующим образом (листинг 8.125). Листинг 8.125. Загрузка картинки &НаКлиенте Процедура ЗагрузитьСДиска(Команда) АдресВХранилище = ""; ВыбранноеИмяФайла = ""; Рис. 8.348. Структура справочника «Товары» Форма элемента справочника Товары также будет содержать два дополнительных реквизита: ИмяФайлаКартинки и СсылкаНаКартинку (рис. 8.349). Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда Файл = Новый Файл(ВыбранноеИмяФайла); ИмяФайлаКартинки = Файл.Имя; СсылкаНаКартинку = АдресВХранилище; Модифицированность = Истина; КонецЕсли; КонецПроцедуры Процедура полностью в листинге 8.115. аналогична той, что рассматривалась Как только в реквизит формы мы поместим ссылку на картинку во временном хранилище (СсылкаНаКартинку = АдресВХранилище;), она отобразится в форме (рис. 8.350). Рис. 8.349. Реквизиты формы справочника «Товары» ИмяФайлаКартинки в форме нужно для того, чтобы не модифицировать данные объекта до того, как начнется запись в базу данных, а СсылкаНаКартинку будет содержать навигационную ссылку на картинку, находящуюся во временном хранилище или в базе данных. Этот реквизит связан с полем формы, имеющим вид Поле картинки. Таким образом, платформа будет автоматически отображать в форме ту картинку, которая находится по ссылке, содержащейся в этом реквизите. Для загрузки картинки с диска в информационную базу и для сохранения ее на диск в форме созданы две локальные команды: ЗагрузитьСДиска и СохранитьНаДиск. Том 1 Рис. 8.350. Форма элемента справочника «Товары» Таким образом, после помещения картинки она окажется во временном хранилище, а в реквизите формы будет ссылка на нее. Связанное с реквизитом поле картинки отобразит ее в форме (рис. 351). 357 Глава 8. Разработка форм Затем платформа начнет запись объекта, и его данные будут помещены в базу данных (рис. 8.353). Рис. 8.351. Отображение картинки из временного хранилища Когда пользователь решит сохранить сделанные изменения, на сервере будет вызван обработчик события формы Перед записью на сервере (листинг 8.126). Листинг 8.126. Обработчик события «Перед записью на сервере» &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // Получить файл из хранилища и поместить его в объект. Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаКартинку); ТекущийОбъект.ФайлКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); ТекущийОбъект.ИмяФайлаКартинки = ИмяФайлаКартинки; КонецЕсли; КонецПроцедуры Этот обработчик также аналогичен тому, что рассматривался в листинге 8.118. Картинка из временного хранилища помещается в объект справочника, туда же помещается имя картинки из реквизита формы (рис. 8.352). Рис. 8.353. Запись данных справочника в базу данных После этого, еще до окончания транзакции записи, на сервере будет вызван обработчик события формы При записи на сервере (листинг 8.127). Листинг 8.127. Обработчик события «При записи на сервере» &НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // Удалить файл из временного хранилища. Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда УдалитьИзВременногоХранилища(СсылкаНаКартинку); СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ФайлКартинки"); КонецЕсли; КонецПроцедуры Здесь есть небольшое отличие от того, что мы делали при работе с файлами. Как и раньше, мы удаляем картинку из временного хранилища, т. к. она нам больше не нужна, она уже сохранена в базе данных. Но так как форма, как и раньше, должна отображать картинку, в реквизит формы мы помещаем навигационную ссылку на картинку, которая теперь находится в базе данных. Для получения навигационной ссылки указываем ссылку на сам объект и имя его реквизита, в котором хранится картинка (листинг 8.128). Листинг 8.128. Получение навигационной ссылки на реквизит объекта СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ФайлКартинки"); Рис. 8.352. Помещение картинки в реквизит справочника 358 В результате мы будем иметь следующую картину (рис. 8.354). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Рис. 8.355. Диалог получения файла Картинки, используемые для оформления Рис. 8.354. Отображение картинки из реквизита справочника Теперь осталось сделать последнюю небольшую доработку. Если сейчас закрыть форму и снова открыть сохраненный элемент, мы не увидим картинки в форме, так как в реквизите формы нет ссылки на сохраненную в базе данных картинку. Поэтому создадим обработчик события формы При создании на сервере и в нем поместим в реквизит формы ссылку на картинку (листинг 8.129). Листинг 8.129. Обработчик события «При создании на сервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Объект.ИмяФайлаКартинки <> "" Тогда СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки"); КонецЕсли; КонецПроцедуры Процесс получения картинки из информационной базы выглядит точно так же, как и в случае работы с файлами (листинг 8.130, рис. 8.355). Листинг 8.130. Получение картинки из информационной базы &НаКлиенте Процедура СохранитьНаДиск(Команда) Если Объект.ИмяФайлаКартинки = "" Тогда Предупреждение("У товара нет сохраненной в базе картинки"); Иначе СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки"); ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаКартинки); КонецЕсли; КонецПроцедуры Том 1 Кроме картинок, являющихся данными и существующих в виде файлов, в формах могут использоваться картинки, являющиеся элементами оформления. Такие картинки хранятся либо в конфигурации, либо в библиотеке картинок, либо как общие картинки. Существует два способа использования таких картинок: ■■ во-первых, такую картинку можно поместить непосредственно в реквизит формы; ■■ во-вторых, картинку, являющуюся коллекцией, можно поместить в свойство элемента формы Поле, и тогда платформа будет отображать одну из имеющихся картинок коллекции. Здесь возможны два варианта: □□ когда поле связано с реквизитом типа Булево, в коллекции должно быть две картинки: одна из них будет отображаться, когда реквизит имеет значение Истина, другая – когда Ложь; □□ вторая возможность – связать поле с реквизитом типа Число. Тогда будет отображаться та картинка из коллекции, индекс которой содержится в реквизите. Рассмотрим перечисленные способы на примере. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 12», обработка Формирование маршрутных листов. В качестве «подопытного кролика» будем использовать форму гипотетической обработки ФормированиеМаршрутныхЛистов. В ней пользователь должен выбрать сначала тип автомобилей, для которых будут формироваться маршрутные листы: фуры или «газели». Чтобы тип выбранных автомобилей был хорошо заметен визуально, в левом углу формы мы выведем картинку, иллюстрирующую тот или иной тип автомобиля. Чтобы выполнить эту задачу, создадим в конфигурации две общие картинки: Грузовик и Газель (рис. 8.356). 359 Глава 8. Разработка форм Рис. 8.356. Общие картинки Затем создадим реквизит формы обработки ТипАвтомобилей типа Число и свяжем его с полем, имеющим вид Поле переключателя (рис. 8.357). Рис. 8.358. Реквизит формы «Картинка» Теперь для поля ТипАвтомобилей создадим обработчик события ПриИзменении(), в котором напишем следующий текст (листинг 8.131). Листинг 8.131. Обработчик события «При изменении» &НаКлиенте Процедура ТипМашинПриИзменении(Элемент) Если ТипАвтомобилей = 1 Тогда Картинка = БиблиотекаКартинок.Газель; ИначеЕсли ТипАвтомобилей = 2 Тогда Картинка = БиблиотекаКартинок.Грузовик; КонецЕсли; КонецПроцедуры В зависимости от выбранного значения переключателя мы подставляем в реквизит формы ту или иную картинку. Чтобы при открытии формы были выбраны значения переключателя и картинки, в обработчике события формы При создании на сервере напишем такой код (листинг 8.132). Листинг 8.132. Обработчик события «При создании на сервере» Рис. 8.357. Реквизит формы «ТипАвтомобилей» Кроме этого, создадим реквизит формы Картинка типа Картинка и свяжем его с полем, имеющим вид Поле картинки (рис. 8.358). 360 &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТипАвтомобилей = 1; Картинка = БиблиотекаКартинок.Газель; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В результате после открытия формы она будет иметь следующий вид (рис. 8.359). Рис. 8.361. Картинка «Внимание» Если экспедитор требуется, будем показывать восклицательный знак. Если экспедитор не нужен, будем показывать пустую картинку. Затем создадим реквизит формы СписокАвтомобилей (ТаблицаЗначений) и ее колонки: Автомобиль (Строка) и НуженЭкспедитор (Булево), рис. 8.362. Рис. 8.359. Вид формы после открытия Если изменить значение переключателя, то изменится и отображаемая в форме картинка (рис. 8.360). Рис. 8.360. Вид формы после переключения типа автомобилей Теперь займемся списком автомобилей. Кроме идентификатора автомобиля в этом списке указывается, нужен ли на данный автомобиль экспедитор или нет. Чтобы визуально быстро выделять автомобили, на которые нужен экспедитор, мы будем использовать пиктограмму, выводимую в первой колонке списка. Сначала добавим в общие картинки картинку Внимание. Она является коллекцией, состоящей из двух картинок: восклицательного знака и пустой картинки (рис. 8.361). Рис. 8.362. Реквизиты «Автомобиль» и «НуженЭкспедитор» Реквизит НуженЭкспедитор свяжем сразу с двумя полями таблицы формы. Во-первых, с полем СписокАвтомобилейНуженЭкспедитор, имеющим вид Поле флажка. В этом поле мы и будем устанавливать желаемое значение. Во-вторых, с полем СписокАвтомобилейКартинка, имеющим вид Поле картинки. В этом поле будет отображаться одна из двух пиктограмм. Чтобы поле СписокАвтомобилейКартинка «знало», где взять пиктограммы, в его свойстве КартинкаЗначений укажем созданную нами общую картинку Внимание (рис. 8.363). Том 1 361 Глава 8. Разработка форм Для этого добавим в конфигурацию еще одну общую картинку Оповещения. Она также является коллекцией картинок (рис. 8.365). Рис. 8.365. Картинка «Оповещения» Первая картинка в коллекции – пустая, остальные символизируют определенный вид оповещения. Также добавим (рис. 8.366). в конфигурацию перечисление ВидыОповещений Рис. 8.363. Свойство «Картинка значений» В результате, если в реквизите НуженЭкспедитор будет значение Истина, отобразится первая картинка из коллекции. Если Ложь – вторая, пустая (рис. 8.364). Рис. 8.366. Перечисление «ВидыОповещений» После этого в таблицу значений в форме добавим два реквизита. Рис. 8.364. Отображение картинки в форме Теперь рассмотрим последний способ работы с картинками. В списке автомобилей желательно также указывать, есть ли необходимость оповещать клиента о предстоящей доставке груза, и если есть – указывать конкретный способ оповещения: по телефону, по электронной почте и т. д. При этом хочется видеть визуальные отметки о том или ином виде оповещения. 362 Первый реквизит – ОповеститьКлиента (с типом перечисления ВидыОповещения). Свяжем его с полем таблицы СписокАвтомобилейОповеститьКлиента (рис. 8.367). В этом поле мы будем устанавливать нужное значение перечисления. Второй реквизит – НомерОповещения типа Число. Его свяжем с реквизитом таблицы СписокАвтомобилейКартинкаОповещения, имеющим вид Поле картинки. В этом поле будет отображаться одна из выбранных пиктограмм. В его свойстве КартинкаЗначений выберем нашу общую картинку Оповещения. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм ДанныеСтроки.НомерОповещения = 5; ИначеЕсли ДанныеСтроки.ОповеститьКлиента.Пустая() Тогда ДанныеСтроки.НомерОповещения = 0; КонецЕсли; КонецПроцедуры В результате, если значение перечисления не выбрано, будет отображаться пустая пиктограмма. Если выбрано – пиктограмма, соответствующая этому способу оповещения (рис. 8.368). Рис. 8.367. Реквизиты «ОповеститьКлиента» и «НомерОповещения» Для поля таблицы СписокАвтомобилейОповеститьКлиента создадим обработчик события ПриИзменении(), в котором, в зависимости от выбранного значения перечисления, будем заполнять реквизит НомерОповещения (листинг 8.133). Листинг 8.133. Обработчик события «При изменении» &НаКлиенте Процедура СписокАвтомобилейОповеститьКлиентаПриИзменении(Элемент) ДанныеСтроки = Элементы.СписокАвтомобилей.ТекущиеДанные; Если ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение( "Перечисление.ВидыОповещений.Почта") Тогда ДанныеСтроки.НомерОповещения = 1; ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение( "Перечисление.ВидыОповещений.Телефон") Тогда ДанныеСтроки.НомерОповещения = 2; ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение( "Перечисление.ВидыОповещений.ЭлектроннаяПочта") Тогда ДанныеСтроки.НомерОповещения = 3; ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение( "Перечисление.ВидыОповещений.Интернет") Тогда ДанныеСтроки.НомерОповещения = 4; ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение( "Перечисление.ВидыОповещений.НеОповещать") Тогда Том 1 Рис. 8.368. Отображение картинки в форме Следует сделать небольшое замечание относительно пустых картинок (и картинок вообще), отображаемых в табличной части. Текущая строка списка подсвечивается голубым фоном. Кроме этого, к таблице может применяться условное оформление. Поэтому, чтобы пиктограммы хорошо выглядели на любом (не только белом) фоне, нужно делать их фон прозрачным. Особенно это важно для пустых пиктограмм. В противном случае в текущей строке они будут отображаться в виде белых прямоугольников, что некрасиво и вызывает у пользователя желание нажать на них мышью (рис. 8.369). Рис. 8.369. Отображение картинки с непрозрачным фоном 363 Глава 8. Разработка форм Чтобы сделать пустую картинку прозрачной, нужно отредактировать ее цвет и установить для него свойство Прозрачность в значение 0 (рис. 8.370). Один из возможных способов ввода такого значения в поле показан на рисунке. Нужно нажать кнопку выбора в поле ввода, платформа откроет форму выбора справочника Поставщики, в этой форме необходимо выделить нужного поставщика и нажать кнопку Выбрать. Ссылка на выбранного поставщика будет помещена в поле ввода. Однако можно использовать другой способ – ввод по строке. Не нажимая кнопку выбора, просто начать вводить в поле наименование поставщика. В момент паузы или по окончании ввода платформа автоматически сформирует список подходящих поставщиков, из которого можно будет выбрать нужного (рис. 8.372). Рис. 8.370. Изменение прозрачности цвета Ввод по строке «1С:Предприятие» поддерживает удобную возможность – ввод ссылочных значений в поля ввода путем набора текста прямо в этом поле. Ссылочные поля – это поля, значения которых являются ссылками на другие объекты базы данных. Например, в поле Поставщик может содержаться ссылка на какого-либо поставщика, который является одним из элементов справочника Поставщики (рис. 8.371). Рис. 8.372. Ввод по строке Если такой поставщик окажется один, платформа автоматически подставит ссылку на этого поставщика в редактируемое поле при переходе к другому элементу формы. Ввод по строке возможен благодаря тому, что для каждого объекта конфигурации, имеющего ссылочные значения, автоматически указываются поля, по которым осуществляется ввод по строке (рис. 8.373). Рис. 8.373. Поля, используемые для ввода по строке Рис. 8.371. Ссылочное поле «Поставщик» 364 Обычно для справочников в качестве таких полей используется Наименование и Код, то есть можно вводить в поле наименование элемента справочника или можно вводить его код. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Для других объектов конфигурации стандартно могут использоваться другие поля. Разработчик может изменить состав полей, по которым выполняется ввод по строке. Последовательность событий при вводе по строке Рассмотрим, какие события вызываются платформой при вводе по строке (рис. 8.374). Рис. 8.375. Вызов событий «Автоподбор» и «Окончание ввода текста» После обработки этого события платформа показывает рядом с полем ввода список выбора – список возможных значений, которые могут быть помещены в это поле. Пользователь выбирает одно из значений, после чего возникает событие поля – Обработка выбора. После обработки этого события платформа помещает выбранное значение в поле ввода и вызывает последнее событие поля – При изменении. Чаще всего при работе с вводом по строке разработчик решает две задачи: Рис. 8.374. Последовательность событий при вводе по строке Пользователь начинает вводить текст в поле. Дальше возможны варианты развития событий: ■■ в процессе ввода он делает паузу. В этом случае будет вызвано событие Автоподбор; ■■ находясь в поле ввода, в которое уже введена часть наименования, он нажимает стрелку вниз. Например, после паузы платформа показала список выбора, но пользователь случайно закрыл его. В этом случае также будет вызвано событие Автоподбор; ■■ в процессе ввода он не делает пауз и, введя часть наименования, переходит к следующему элементу формы, нажав Tab или Enter. В этом случае будет вызвано событие Окончание ввода текста (рис. 8.375). События Автоподбор и Окончание ввода текста – это клиентские события поля формы, вернее его расширения – расширения поля ввода. После обработки одного из этих событий платформа вызывает событие Обработка получения данных выбора. Это событие вызывается в модуле менеджера того объекта конфигурации, значение которого хранится в этом поле, в нашем случае это будет событие, обрабатываемое в модуле менеджера справочника Поставщики. Том 1 ■■ сформировать список выбора по своим правилам; ■■ отказаться от выбора, сделанного пользователем, или подставить в поле собственное значение. Вторая задача довольно простая и решается в обработчике события Обработка выбора. ПОДРОБНЕЕ Раздел «Событие «Обработка выбора», стр. 371. А вот для решения первой задачи существует большое количество возможностей, которые мы сейчас и рассмотрим. Формирование собственного списка выбора Как видно из приведенной выше схемы, в любом случае при вводе по строке вызываются два события: ■■ Автоподбор или Окончание ввода текста, ■■ Обработка получения данных выбора. Примечательным здесь является то, что первые события вызываются в форме, в то время как последнее событие вызывается в модуле менеджера прикладного объекта. 365 Глава 8. Разработка форм Из этого следует важное замечание: переопределять формирование списка выбора нужно прежде всего в обработчике Обработка получения данных выбора. Потому что это будет работать во всех случаях, когда в каком-либо поле, в какой-либо форме будет формироваться список выбора значений этого типа. Даже в тех формах, которые генерируются платформой автоматически и которые разработчик изменить не может. Более сложный случай – когда в одной или нескольких формах нужно иметь особенное формирование списка выбора, не такое, как в остальных местах. В этом случае нужно использовать обработчики событий этой (этих) формы: Автоподбор и Окончание ввода текста. В простейшем варианте в этих обработчиках должен быть написан одинаковый алгоритм. Самым сложным и специфическим является случай, когда в некоторой форме список выбора при паузе и при переходе к следующему элементу должен формироваться по разным алгоритмам. Тогда в каждом из обработчиков Автоподбор и Окончание ввода текста будет собственный алгоритм формирования списка выбора. Событие «Обработка получения данных выбора» Итак, рассмотрим возможности, которые существуют в обработчике Обработка получения данных выбора. СтандартнаяОбработка – это булева переменная, на основе которой плат- форма определяет, что делать после выхода из этого обработчика. Если СтандартнаяОбработка равна Истина, то платформа самостоятельно сформирует список выбора, исходя из того, что указано в Параметрах. Если СтандартнаяОбработка равна Ложь, платформа не будет формировать список выбора самостоятельно, а покажет то, что находится в параметре ДанныеВыбора. Таким образом, у нас есть следующие возможности: ■■ изменить Параметры и сказать платформе, чтобы она сформировала список выбора; ■■ отказаться от стандартной обработки и самостоятельно сформировать список выбора. Сначала рассмотрим, каким образом можно модифицировать параметры. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 13», документ Накладная, реквизит Товар табличной части. Синтаксис описания этого обработчика выглядит следующим образом (листинг 8.134). Допустим, есть документ Накладная, в табличной части которого необходимо подбирать товары. Причем для выбора должны предлагаться не все возможные товары, а только те, которые поставляет поставщик, указанный в этом документе, и те, которые не помечены на удаление. Листинг 8.134. Объявление обработчика события «Обработка получения данных выбора» Для этого у реквизита табличной части Товар заданы свойства Связи параметров выбора и Параметры выбора (рис. 8.376). ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) – это переменная, в которую разработчик должен поместить собственный список выбора. При входе в обработчик этот параметр не содержит никаких значений, то есть через него нельзя получить доступ к списку выбора, который сформирует платформа. Просто потому, что этот список формируется уже после выхода из этого обработчика. Однако может возникнуть желание в этом обработчике получить список, формируемый платформой, и добавить в него (удалить) несколько элементов. Как это сделать – рассказано в разделе «Метод ПолучитьДанныеВыбора()», стр. 370. ДанныеВыбора Переменная Параметры содержит набор параметров, которые платформа будет использовать для формирования списка выбора. Особенность заключается в том, что при формировании списка выбора платформа будет учитывать свойства Параметры выбора и Связи параметров выбора, заданные для соответствующего реквизита объекта конфигурации. Поэтому в параметрах могут содержаться какие-то отборы. 366 Рис. 8.376. Свойства «Связи параметров выбора» и «Параметры выбора» Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В связях параметров выбора указывается, что для выбора будут предлагаться только товары поставщика, указанного в документе. В параметрах выбора указывается, что кроме этого для выбора будут предлагаться только товары, не помеченные на удаление. В результате при наборе наименования товара в форме будет предложен следующий список товаров (рис. 8.377). Рис. 8.379. Структура отборов Добавим к ним еще одно условие, что товар не должен быть услугой, а стандартную обработку оставим в значении Истина, чтобы платформа сформировала список выбора самостоятельно (листинг 8.135). Листинг 8.135. Добавление условия отбора Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Параметры.Отбор.Вставить("ВидТовара", Перечисления.ВидыТоваров.Товар); КонецПроцедуры Рис. 8.377. Товары от поставщика «Поставщик 1», не помеченные на удаление Если теперь выполнить те же самые операции, мы увидим, что для выбора предлагаются только элементы, являющиеся товарами (рис. 8.380). Если мы посмотрим на все имеющиеся товары, то заметим, что подбор товаров произведен правильно (рис. 8.378). Рис. 8.380. Товары, предлагаемые для выбора Рис. 8.378. Полный список товаров Допустим, нас не устраивает, что для выбора предлагаются те элементы справочника, которые являются услугами. Мы можем легко исправить это в обработчике события Обработка получения данных выбора в модуле менеджера справочника Товары. Благодаря свойствам Параметры выбора и Связи параметров выбора в этом обработчике структура параметров содержит следующие отборы (рис. 8.379). Том 1 Рассмотрим вторую ситуацию, когда мы полностью самостоятельно формируем список выбора, не используя стандартные возможности платформы. Здесь есть два случая. Список выбора может быть «простым» и «сложным». ■■ в простом случае это должен быть список значений, содержащий выбираемые значения (ссылки); ■■ в сложном случае это будет список значений, содержащий в качестве своих элементов структуры. Каждая такая структура содержит само выбираемое значение и некоторую дополнительную информацию об этом значении. 367 Глава 8. Разработка форм Сначала посмотрим, как можно сформировать простой список. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 13», документ Накладная, реквизит Склад. Затем создаем пустой список значений и, обходя результат запроса, заполняем список ссылками. В конце помещаем этот список в переменную ДанныеВыбора. В результате при вводе наименования склада мы будем иметь следующую ситуацию (рис. 8.381). Допустим, в документе Накладная есть реквизит Склад. Тогда в модуле менеджера справочника Склады мы можем написать следующий обработчик (листинг 8.136). Листинг 8.136. Обработчик события «Обработка получения данных выбора» Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Склады.Ссылка |ИЗ | Справочник.Склады КАК Склады |ГДЕ | Склады.Розничный = ЛОЖЬ | И Склады.Наименование ПОДОБНО &СтрокаПоиска"; Рис. 8.381. Склады, предлагаемые для выбора Если посмотреть на список складов, мы увидим, что выбор произведен правильно, а фрагмент наименования склада может быть произвольным, не обязательно находящимся в начале наименования (рис. 8.382). Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%"); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Список = Новый СписокЗначений; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Список.Добавить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; ДанныеВыбора = Список; КонецПроцедуры В нем мы прежде всего отказываемся от стандартной обработки. Затем формируем запрос, который выберет нам все склады, не являющиеся розничными, и наименование которых содержит строку, введенную пользователем в поле ввода. Строку, введенную пользователем, мы получаем из структуры параметров, в ней она содержится отдельным элементом с ключом СтрокаПоиска (листинг 8.137). Листинг 8.137. Получение строки, введенной пользователем Рис. 8.382. Полный список складов Теперь рассмотрим, как формировать сложный список выбора. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 13», документ Накладная, реквизит Поставщик. В модуле менеджера справочника Поставщики снять комментарии с варианта Пример 1. Допустим, в документе Накладная есть реквизит Поставщик. Тогда в модуле менеджера справочника Поставщики мы можем написать следующий обработчик (листинг 8.138). Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%"); 368 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.138. Обработчик события «Обработка получения данных выбора» Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Поставщики.Ссылка, | Поставщики.ПометкаУдаления, | Поставщики.Ненадежный |ИЗ | Справочник.Поставщики КАК Поставщики |ГДЕ | Поставщики.Наименование ПОДОБНО &СтрокаПоиска"; После заполнения структуры добавляем ее в список значений, а после обхода всего результата запроса список помещаем в переменную ДанныеВыбора. В результате при вводе наименования поставщика список выбора будет выглядеть следующим образом (рис. 8.383). Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%"); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Список = Новый СписокЗначений; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Структура = Новый Структура; Структура.Вставить("Значение", ВыборкаДетальныеЗаписи.Ссылка); Структура.Вставить("ПометкаУдаления", ВыборкаДетальныеЗаписи.ПометкаУдаления); Если ВыборкаДетальныеЗаписи.Ненадежный Тогда Структура.Вставить("Предупреждение", "Это ненадежный поставщик, его лучше не выбирать!"); КонецЕсли; Рис. 8.383. Поставщики, предлагаемые для выбора На примере имеющихся поставщиков мы сможем посмотреть все возможные варианты работы «сложного» списка выбора (рис. 8.384). Список.Добавить(Структура); КонецЦикла; ДанныеВыбора = Список; Рис. 8.384. Полный список поставщиков КонецПроцедуры Если выбрать Поставщик 1, мы не получим никаких предупреждений. Здесь, как и раньше, отказываемся от стандартной обработки и запросом получаем нужные ссылки. Если выбрать поставщика, помеченного на удаление (Поставщик11), мы получим стандартное предупреждение платформы (рис. 8.385). Затем создаем пустой список значений, а при каждом обходе результата запроса создаем структуру, в которую помещаем: ■■ само значение – в элемент с ключом Значение; ■■ признак пометки удаления – в элемент с ключом ПометкаУдаления. Если пользователь выберет поставщика, помеченного на удаление, платформа выдаст стандартное предупреждение; ■■ для тех поставщиков, которые являются ненадежными, мы добавляем в структуру элемент с ключом Предупреждение. Если пользователь выберет ненадежного поставщика, ему будет выдано добавленное нами предупреждение. Том 1 Рис. 8.385. Предупреждение о том, что выбранный элемент помечен на удаление 369 Глава 8. Разработка форм Если выбрать ненадежного поставщика, да еще и помеченного на удаление (Поставщик367), мы получим «свое» предупреждение (рис. 8.386). Другой случай, когда поле ввода имеет ссылочный тип и при обработке события Обработка получения данных выбора в модуле менеджера объекта, еще до того, как платформа сформирует список выбора, необходимо получить этот список для модификации. Для таких особенных случаев в платформе существуют методы ПолучитьДанныеВыбора(). Эти методы полностью имитируют формирование списка выбора платформой, вплоть до вызова события Обработка получения данных выбора. Такой метод есть в глобальном контексте. В его параметре нужно указывать тип объекта, для которого он должен быть вызван. Такие методы есть у всех менеджеров прикладных объектов. Рис. 8.386. Предупреждение о том, что выбран ненадежный поставщик Таким образом, попутно мы убедились в следующем: если для выбираемого элемента указана и пометка удаления, и предупреждение, будет выведено предупреждение. Несколько слов о производительности. Событие Обработка получения данных выбора, обрабатываемое в модуле менеджера объекта, вызывается довольно часто. Перечислим еще раз: ■■ во-первых, при автоподборе, то есть когда возникает пауза при наборе текста в поле ввода; ■■ во-вторых, при вводе по строке, то есть когда в поле ввода уже введена какая-то строка и фокус ввода переходит на другой элемент формы; ■■ и, в-третьих (о чем не упоминалось в этом разделе), при быстром выборе, когда для выбора объекта используется не его основная форма выбора, а небольшой список, формируемый системой. Поэтому при написании обработчика Обработка получения данных выбора нужно особенно тщательно подходить к вопросу эффективности создаваемого кода. Метод «ПолучитьДанныеВыбора()» В процессе работы с полем ввода могут возникнуть самые разные ситуации, связанные с обработкой ввода по строке или автоподбора. Как мы уже говорили, ввод по строке возможен только для ссылочных значений. Однако автоподбор и окончание ввода текста отрабатываются для любых типов в поле ввода. Поэтому, например, поле ввода может иметь строковый тип, но в обработчике события Автоподбор может анализироваться один или несколько справочников, из которых будет получаться список элементов, соответствующих введенной подстроке. 370 В использовании этих методов нет ничего сложного, за исключением того случая, когда этот метод вызывается в обработчике Обработка получения данных выбора. Если не предпринять специальных действий, это приведет к бесконечной рекурсии. Но от нее можно избавиться довольно простым способом. Рассмотрим это на примере. ПОДРОБНЕЕ Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 13», документ Накладная, реквизит Поставщик. В модуле менеджера справочника Поставщики снять комментарии с варианта Пример 2. Рассмотрим следующий обработчик в модуле менеджера справочника Поставщики (листинг 8.139). Листинг 8.139. Обработчик события «Обработка получения данных выбора» Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) // Если это рекурсивный вызов, ничего не делать. Если НЕ Параметры.Свойство("Рекурсия") Тогда СтандартнаяОбработка = Ложь; // Получить стандартный список выбора. Параметры.Вставить("Рекурсия"); СтандартныйСписок = ПолучитьДанныеВыбора(Параметры); // Добавить к стандартному списку собственный элемент. ДополнительныйЭлемент = Справочники.Поставщики.НайтиПоКоду("000000003"); СтандартныйСписок.Добавить(ДополнительныйЭлемент); ДанныеВыбора = СтандартныйСписок; КонецЕсли; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Для защиты от рекурсии перед вызовом метода ПолучитьДанныеВыбора() в структуру параметров будем добавлять служебный параметр с ключом Рекурсия. Весь код, написанный в обработчике, будем выполнять только в том случае, если в параметрах отсутствует элемент Рекурсия, т. е. при первом «заходе» в этот обработчик (листинг 8.140). Листинг 8.140. Проверка на отсутствие рекурсии Если НЕ Параметры.Свойство("Рекурсия") Тогда При втором заходе в этот обработчик (когда платформа будет формировать стандартный список выбора) в параметрах уже будет присутствовать элемент Рекурсия. Таким образом, никакой код выполняться не будет (листинг 8.141). Листинг 8.141. Добавление элемента «Рекурсия» в данные выбора Параметры.Вставить("Рекурсия"); СтандартныйСписок = ПолучитьДанныеВыбора(Параметры); После получения стандартного списка мы добавляем в него еще одного поставщика, который нам очень нравится и, возможно, пригодится пользователю для выбора (листинг 8.142). Листинг 8.142. Добавление «собственного» поставщика ДополнительныйЭлемент = Справочники.Поставщики.НайтиПоКоду("000000003"); СтандартныйСписок.Добавить(ДополнительныйЭлемент); И в конце полученный список помещаем в переменную ДанныеВыбора. Так как в начале мы отказались от стандартной обработки, именно этот список и будет показан пользователю (рис. 8.387). Событие «Обработка выбора» Это событие хорошо тем, что оно вызывается после того, как пользователь выбрал какое-то значение из предложенного списка, но еще до того, как это значение будет помещено в поле ввода. Поэтому в этом событии можно: ■■ отказаться от того выбора, который сделал пользователь (СтандартнаяОбработка = Ложь); ■■ поместить в поле ввода другое значение, не то, которое выбрал пользователь (параметр ВыбранноеЗначение). Первая ситуация может показаться на первый взгляд странной. Если пользователь может выбрать «что-то не то», то зачем тогда предлагать ему это выбирать? Нужно с самого начала предложить ему выбирать только из того, что «можно». Такой подход имеет право на жизнь и, наверное, может применяться в целом ряде случаев. Однако он имеет два недостатка. Первый недостаток, если можно так выразиться, «юзабильный». Например, пользователь начинает вводить в документ поставщика Стройтрест. Он точно знает, что такой поставщик существует в базе данных. Но программа не предлагает ему выбрать этого поставщика. Первое, о чем подумает пользователь, – что программа «сломалась», или что он неправильно пишет наименование. О том, что именно этого поставщика нельзя выбрать именно в этом документе, пользователь может не подумать совсем или догадается об этом только после долгих экспериментов. Поэтому логичнее поступать следующим образом: если пользователь хочет выбрать поставщика с таким наименованием, предоставить ему такую возможность. Но если по каким-то причинам этого поставщика нельзя использовать в этом документе, после выбора пользователя сообщить ему об этом и отказаться от выбора, сделанного пользователем. Такой сценарий, конечно, не является догмой, но в целом ряде случаев, когда для пользователя не является очевидным тот факт, что выбирать можно среди ограниченного множества элементов, этот сценарий вполне имеет право на жизнь. Другой недостаток изначального ограничения списка выбора может быть чисто технологическим. Например, для того чтобы выяснить, можно использовать этого поставщика или нет, требуется выполнить целый ряд сложных и непростых расчетов. Рис. 8.387. Список поставщиков, предложенных для выбора Том 1 Допустим, список выбора, формируемый для пользователя, будет содержать 49 элементов. Для всех них необходимо будет выполнить этот расчет. Это может занять значительное время. А в результате пользователь выберет один-единственный элемент из этих 49. В такой ситуации гораздо производительнее будет, ничего не рассчитывая, предоставить ему для выбора 49 элементов. А после того как он выберет 371 Глава 8. Разработка форм единственный элемент, только для него одного провести необходимые расчеты. И либо согласиться с выбором пользователя, либо отказаться от него. Что касается помещения в поле ввода значения другого типа, такая ситуация может возникнуть при имитации ввода по строке, выполняемого платформой. Например, когда поле ввода имеет строковый тип, список выбора формируется из элементов справочника, на основании выбора пользователя заполняется какая-то служебная информация, а в поле ввода помещается не ссылка, выбранная пользователем, а ее представление. Выполнить все эти действия как раз и можно в обработчике события Обработка выбора. Событие «Начало выбора» Для того чтобы картина с формированием списка выбора для поля ввода была полной, следует упомянуть еще об одном событии – Начало выбора. Это событие возникает в поле ввода в момент нажатия кнопки выбора или клавиши F4 (рис. 8.388). Можно отменить стандартную обработку, а в данные выбора поместить список значений, из которых будет выбирать пользователь. Тогда, даже если для реквизита не используется быстрый выбор, при наступлении события будет открыта не форма выбора, а список выбора, расположенный под полем ввода. Программное изменение формы В «1С:Предприятии» реализован достаточно богатый механизм программного изменения формы, однако он не полностью позволяет реализовать те возможности, которые предоставляются средствами конфигурирования (см. раздел «Конструирование форм», стр. 233). Это обусловлено тем, что сама модель управляемого приложения ориентирована на работу со статическим, а не с динамическим описанием форм. Форма не рождается на клиенте. Форма рождается на сервере, она проходит несколько важных стадий предварительной обработки, прежде чем достичь глаз пользователя. Платформа содержит достаточно сложные механизмы многоуровневого кеширования различных частей формы, как на сервере, так и на клиенте. По этой причине возможность программного изменения формы является скорее опциональной, дополнительной. Она рассчитана на отдельные конкретные сценарии работы и не предполагает массового использования в большом количестве форм конфигурации или в часто используемых формах. Основным подходом при разработке прикладных решений должно являться визуальное конструирование форм в конфигураторе. А программное изменение форм рекомендуется использовать лишь в отдельных специфических сценариях работы. Рис. 8.388. Событие «Начало выбора» Стандартным действием платформы в этом случае является либо открытие формы выбора, либо открытие списка выбора (если для реквизита указан режим быстрого выбора). Если разработчик переопределяет формирование списка выбора при автоподборе и при окончании ввода текста, вполне возможно, что ему захочется формировать подобный список и при начале выбора. Такая возможность существует. Обработчик события Начало выбора имеет параметры ДанныеВыбора и СтандартнаяОбработка. Они используются таким же образом, как и в других рассмотренных обработчиках (листинг 8.143). Такими сценариями могут быть, например, отображение в форме имеющихся типовых операций или характеристик объектов. То есть той информации, которая содержится в базе данных и структура которой неизвестна на этапе конфигурирования. Ее можно узнать только уже в процессе функционирования прикладного решения, в режиме 1С:Предприятие. Поэтому для ее отображения в форме и требуется ее программное изменение. Общие подходы Листинг 8.143. Объявление обработчика события «Начало выбора» Встроенный язык позволяет добавлять, изменять и удалять реквизиты, команды и элементы формы. Особенность заключается в том, что программно удалить можно только то, что программно же и добавлено. Нельзя программно удалить элементы, реквизиты или команды, созданные в конфигураторе. &НаКлиенте Процедура ПоставщикНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) При программном изменении формы нужно управлять «всей троицей» – реквизиты, команды и элементы. Например, чтобы разместить какие-то 372 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм данные в форме, нужно создать реквизит, создать элемент, связать элемент с реквизитом. Для команды – создать команду, связать ее с имеющимся в модуле формы обработчиком, создать элемент, связать элемент с командой. Добавление и удаление реквизитов, команд и элементов формы возможно только на сервере. Поэтому алгоритмы модификации формы нужно размещать в серверных процедурах формы – в обработчиках событий формы на сервере или в контекстных серверных процедурах модуля формы. Добавление поля Разберем пример с добавлением поля так, как мы делали бы его в конфигураторе, средствами визуального конструирования. Сначала мы добавим реквизит формы типа Строка (рис. 8.389). Программное изменение формы возможно только «изнутри» формы, т. е. при нахождении в ее модуле. Нет возможности получить какую-либо форму, программно изменить ее и затем открыть. Потому что изменение формы возможно только на сервере, а открытие формы – только на клиенте. А встроенный язык не содержит методов, позволяющих разработчику принудительно передать форму с сервера на клиента. Механика добавления/удаления реквизитов формы принципиально отличается от механики работы с ее элементами и командами. Элементы и команды можно добавлять/удалять поодиночке, просто обращаясь к коллекциям этих элементов, используя методы Добавить() и Удалить(). Это относительно «безболезненные» операции для формы. Изменение состава реквизитов, напротив, является сложной и затратной операцией. Поэтому здесь используется следующий подход. Сначала разработчик создает два массива программных объектов, которые описывают реквизиты формы. Один массив – это те реквизиты, которые должны быть добавлены, а другой массив – это те реквизиты, которые нужно удалить. После этого «за один подход» выполняется модификация формы с помощью ее метода ИзменитьРеквизиты(), в который передаются оба этих массива. Сначала выполняется удаление реквизитов, затем – добавление. С добавлением реквизитов связана еще одна важная особенность. Можно добавить реквизит и установить его свойства. Но из встроенного языка нельзя назначить реквизит основным. Поэтому, например, полностью программно невозможно создать «настоящую» форму списка или объекта. Рис. 8.389. Реквизит формы «РеквизитКомментарий» После этого добавим элемент формы Поле, который в дальнейшем будет отображать значение реквизита (рис. 8.390). Рис. 8.390. Поле «ПолеКомментарий» Затем свяжем между собой элемент формы и реквизит формы (рис. 8.391). Теперь в качестве примеров рассмотрим четыре случая программного изменения формы: ■■ добавление поля, ■■ добавление динамического списка, ■■ добавление колонки в таблицу, ■■ добавление команды. Том 1 Рис. 8.391. Связь поля и реквизита И в заключение для элемента формы назначим обработчик события При изменении, который заранее заготовлен в модуле нашей формы (рис. 8.392). 373 Глава 8. Разработка форм ОписаниеТиповДляРеквизита, , "Комментарий", Истина); // тип // путь // заголовок // сохраняемые данные ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); ИзменитьРеквизиты(ДобавляемыеРеквизиты); Рис. 8.392. Назначение обработчика события «При изменении» Теперь все те же самые действия выполним программно, из встроенного языка. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 14», общая форма Форма, команда Добавить поле. Это локальная команда этой формы. Для изменения формы сразу же выполним контекстный вызов сервера, в котором и будем модифицировать форму (листинг 8.144). Листинг 8.144. Контекстный вызов сервера для модификации формы &НаКлиенте Процедура ДобавитьПоле(Команда) ДобавитьПолеНаСервере(); КонецПроцедуры &НаСервере Процедура ДобавитьПолеНаСервере() … В серверной процедуре сначала добавим реквизит формы РеквизитКомментарий (листинг 8.145). Листинг 8.145. Добавление реквизита формы // Добавить реквизит. ТипыРеквизита = Новый Массив; ТипыРеквизита.Добавить(Тип("Строка")); ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита); НовыйРеквизит = Новый РеквизитФормы("РеквизитКомментарий", // имя 374 В этом фрагменте мы сначала создаем объект, описывающий тип добавляемого реквизита. Поскольку в общем случае реквизит может иметь составной тип, т. е. включать в себя сразу несколько типов, то для описания его типа используется объект ОписаниеТипов. Этот объект создается на основе массива, содержащего нужные типы. Наш реквизит будет иметь тип Строка, поэтому мы создаем массив ТипыРеквизита, содержащий единственный элемент. Затем на основании этого массива создаем описание типов – ОписаниеТиповДляРеквизита. Это описание типов мы используем при конструировании реквизита формы – НовыйРеквизитФормы(…). В параметрах конструктора мы указываем: ■■ имя реквизита – РеквизитКомментарий; ■■ тип этого реквизита – созданное нами описание типов ОписаниеТиповДляРеквизита; ■■ путь к реквизиту не указываем, поскольку добавляем реквизит первого уровня; ■■ заголовок реквизита – Комментарий, этот заголовок будет использоваться платформой для отображения в форме; ■■ последним параметром указываем, что этот реквизит содержит сохраняемые данные, т. е. при изменении этого реквизита будет автоматически устанавливаться модифицированность формы. В данном случае этот параметр мы используем исключительно в демонстрационных целях, чтобы показать, что такая возможность имеется. Благодаря этому в дальнейшем перед закрытием формы мы сможем анализировать ее модифицированность и предотвращать закрытие формы без сохранения измененных данных. После того как реквизит создан, мы добавляем его в массив и этот массив передаем в метод формы ИзменитьРеквизиты() первым параметром. То есть как те реквизиты, которые нужно добавить в форму. Теперь мы имеем состояние, аналогичное тому, которое было показано на рисунке 8.389. На втором этапе, как мы говорили выше, нужно создать элемент формы. Для этого мы используем следующий код (листинг 8.146). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Листинг 8.146. Добавление элемента формы // Добавить элемент формы и связать его с реквизитом. НовыйЭлемент = Элементы.Добавить("ПолеКомментарий", Тип("ПолеФормы")); В результате мы на рисунке 8.390. имеем состояние, которое было показано Теперь мы связываем элемент формы и реквизит. Для этого в свойстве элемента ПутьКДанным мы указываем имя нашего реквизита (листинг 8.147). Листинг 8.147. Связь элемента с реквизитом НовыйЭлемент.ПутьКДанным = "РеквизитКомментарий"; Теперь мы имеем состояние, которое было показано на рисунке 8.391. После того как элемент добавлен и связан с реквизитом, установим некоторые его свойства. Во-первых, укажем, что это не просто поле, а поле ввода, а во-вторых – отобразим в нем кнопку очистки (листинг 8.148). Рис. 8.393. Поле ввода в форме Добавление динамического списка Пример с добавлением динамического списка, если бы мы выполняли его средствами визуального конструирования, выглядел бы следующим образом. Сначала мы добавим реквизит формы типа (рис. 8.394). ДинамическийСписок Листинг 8.148. Установка свойств поля НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.КнопкаОчистки = Истина; Теперь нам осталось выполнить последний шаг – назначить обработчик события для только что добавленного элемента формы (листинг 8.149). Листинг 8.149. Назначение обработчика события // Установить обработчик события. НовыйЭлемент.УстановитьДействие("ПриИзменении", "ОбработчикПриИзмененииПоляКомментарий"); Здесь мы указываем имя события и имя процедуры, которая будет обрабатывать это событие. Эта процедура должна быть создана в модуле формы заранее, на этапе конфигурирования (листинг 8.150). Рис. 8.394. Добавление реквизита формы После этого для динамического списка зададим текст запроса и основную таблицу (рис. 8.395). Листинг 8.150. Обработчик события «При изменении» &НаКлиенте Процедура ОбработчикПриИзмененииПоляКомментарий(Элемент) Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ЭтаФорма["РеквизитКомментарий"]; Сообщение.Сообщить(); КонецПроцедуры После этого можно запустить систему в режиме 1С:Предприятие и посмотреть, как работает наша команда Добавить поле. В результате ее выполнения внизу формы появится поле ввода Комментарий. При изменении значения этого поля будет обрабатываться событие, и новое значение поля будет выводиться в окно сообщений (рис. 8.393). Том 1 Рис. 8.395. Установка текста запроса и основной таблицы 375 Глава 8. Разработка форм Затем добавим элемент формы Таблица (рис. 8.396). Аналогичным образом создадим еще одну колонку таблицы Код и свяжем ее с колонкой динамического списка Код (рис. 8.399). Рис. 8.396. Добавление таблицы формы После этого свяжем между собой элемент формы и реквизит формы (рис. 8.397). Рис. 8.399. Добавление колонки «КолонкаКод» и ее связь с полем реквизита Теперь эти же самые действия выполним программно, из встроенного языка. подробнее Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 14», общая форма Форма, команда Добавить динамический список. Это локальная команда этой формы. Рис. 8.397. Связь таблицы и реквизита Теперь создадим колонку таблицы Наименование и свяжем ее с колонкой динамического списка Наименование (рис. 8.398). Как и в предыдущем примере, модификацию формы будем выполнять в серверной контекстной процедуре. Сначала добавим реквизит формы РеквизитСписокТоваров (листинг 8.151). Листинг 8.151. Добавление реквизита формы // Добавить реквизит "Динамический список". ТипыРеквизита = Новый Массив; ТипыРеквизита.Добавить(Тип("ДинамическийСписок")); ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита); НовыйРеквизит = Новый РеквизитФормы("РеквизитСписокТоваров", // имя ОписаниеТиповДляРеквизита, // тип , // путь "СписокТоваров", // заголовок Истина); // сохраняемые данные ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); ИзменитьРеквизиты(ДобавляемыеРеквизиты); Рис. 8.398. Добавление колонки «КолонкаНаименование» и ее связь с полем реквизита 376 Здесь все аналогично предыдущему примеру, за исключением типа добавляемого реквизита – ТипыРеквизита.Добавить(Тип("ДинамическийСписок")). Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В результате мы имеем состояние, показанное на рисунке 8.394. В результате мы имеем состояние, показанное на рисунке 8.399. Теперь, после того как реквизит добавлен, можно задать текст запроса и основную таблицу динамического списка (листинг 8.152). После этого можно запустить систему в режиме 1С:Предприятие и посмотреть, как работает наша команда Добавить динамический список. Листинг 8.152. Установка текста запроса и основной таблицы // Задать текст запроса и другие свойства динамического списка. РеквизитСписок = ЭтаФорма["РеквизитСписокТоваров"]; РеквизитСписок.ТекстЗапроса = "ВЫБРАТЬ Наименование, Код ИЗ Справочник.Товары"; РеквизитСписок.ОсновнаяТаблица = "Справочник.Товары"; В результате ее выполнения внизу формы появится полноценный список товаров, позволяющий добавлять, изменять и удалять товары (рис. 8.400). В результате мы имеем состояние, показанное на рисунке 8.395. Теперь добавим элемент формы и свяжем его с данными. Снова все, как и в предыдущем примере. Отличается лишь тип добавляемого элемента (листинг 8.153). Листинг 8.153. Добавление элемента формы // Добавить элемент формы и связать его с реквизитом. НовыйЭлемент = Элементы.Добавить("ЭлементСписокТоваров", Тип("ТаблицаФормы")); НовыйЭлемент.ПутьКДанным = "РеквизитСписокТоваров"; В результате мы имеем состояние, показанное на рисунке 8.397. Особенность работы с таблицей заключается в том, что при визуальном конструировании платформа предлагает автоматически создать колонки таблицы, если вы мышью перетаскиваете реквизит в дерево элементов формы. В нашем же случае необходимо это сделать самостоятельно. И не только создать колонки, но и связать их с данными (листинг 8.154). Листинг 8.154. Создание колонок и их связь с данными Рис. 8.400. Динамический список в форме Добавление колонки в таблицу Пример с добавлением колонки в существующую таблицу, если бы мы выполняли его средствами визуального конструирования, выглядел бы следующим образом. Сначала мы добавим подчиненный реквизит формы типа (рис. 8.401). Строка // Создать колонки и связать их с данными. НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаНаименование", Тип("ПолеФормы"), НовыйЭлемент); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокТоваров.Наименование"; НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКод", Тип("ПолеФормы"), НовыйЭлемент); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокТоваров.Код"; Тут особенность заключается в том, что, во-первых, при добавлении колонки (поля формы) мы указываем его родителя третьим параметром метода Добавить(). НовыйЭлемент – это как раз та самая таблица, которую мы только что добавили в форму. Во-вторых, указывая путь к данным, мы указываем его полностью, от корня реквизитов. Сначала имя реквизита, являющегося динамическим списком, а потом через точку – имя одного из полей запроса, содержащегося в этом динамическом списке – РеквизитСписокТоваров.Наименование. Рис. 8.401. Добавление реквизита формы Том 1 377 Глава 8. Разработка форм После этого добавим элемент формы Поле как подчиненный элемент существующей в форме таблицы (рис. 8.402). Рис. 8.404. Назначение обработчика события подробнее Рис. 8.402. Добавление элемента формы Затем свяжем между собой элемент формы и реквизит формы (рис. 8.403). Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 14», общая форма Форма, команда Добавить колонку в таблицу. Это локальная команда этой формы. Как и раньше, модификацию формы будем выполнять в серверной контекстной процедуре. Сначала добавим реквизит формы РеквизитКолонкаЗанятость (листинг 8.155). Листинг 8.155. Добавление реквизита формы // Добавить реквизит. ТипыРеквизита = Новый Массив; ТипыРеквизита.Добавить(Тип("Строка")); ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита); НовыйРеквизит = Новый РеквизитФормы("РеквизитКолонкаЗанятость", // имя ОписаниеТиповДляРеквизита, // тип "РеквизитТаблицаЗначений", // путь "Занятость", // заголовок Истина); // сохраняемые данные Рис. 8.403. Связь элемента и реквизита В заключение для элемента формы назначим обработчик события При изменении, который заранее заготовлен в модуле нашей формы (рис. 8.404). Теперь все те же самые действия выполним программно, из встроенного языка. 378 ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); ИзменитьРеквизиты(ДобавляемыеРеквизиты); Здесь особенность в том, что при добавлении реквизита мы указываем параметр Путь – РеквизитТаблицаЗначений. Поскольку добавляемый реквизит подчинен существующему в форме реквизиту, в этом параметре нужно указать полный путь от корня реквизитов до добавляемого нами реквизита, не включая имя самого добавляемого реквизита. Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В результате мы имеем состояние, показанное на рисунке 8.401. Добавление команды После этого добавим элемент формы (листинг 8.156). Последний пример, который мы рассмотрим, – это добавление команды. Если бы мы выполняли его в конфигураторе, это выглядело бы следующим образом. Листинг 8.156. Добавление элемента формы // Добавить элемент формы и связать его с реквизитом. НовыйЭлемент = Элементы.Добавить("КолонкаЗанятость", Тип("ПолеФормы"), Элементы.ЭлементТаблицаЗначений); Сначала мы добавим команду формы НоваяКоманда (рис. 8.406). Здесь та же особенность. При добавлении элемента мы указываем его родителя – элемент Таблица, существующий в форме Элементы.ЭлементТаблицаЗначений. В результате мы имеем состояние, показанное на рисунке 8.402. Теперь свяжем элемент формы с реквизитом формы и установим некоторые свойства элемента формы (листинг 8.157). Рис. 8.406. Добавление команды Листинг 8.157. Связь элемента с реквизитом и установка свойств элемента НовыйЭлемент.ПутьКДанным = "РеквизитТаблицаЗначений.РеквизитКолонкаЗанятость"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.КнопкаОчистки = Истина; Затем мы свяжем эту команду с обработчиком, который будет вызываться при исполнении этой команды (рис. 8.407). В результате мы имеем состояние, показанное на рисунке 8.403. В заключение назначим обработчик события для только что добавленного элемента формы (листинг 8.158). Листинг 8.158. Назначение обработчика события // Установить обработчик события. НовыйЭлемент.УстановитьДействие("ПриИзменении", "ОбработчикПриИзмененииКолонкиЗанятость"); В результате мы имеем состояние, показанное на рис. 8.404. После этого можно запустить систему в режиме 1С:Предприятие и посмотреть, как работает наша команда Добавить колонку в таблицу. В результате ее выполнения в существующей в форме таблице появится колонка Занятость. А когда мы изменим данные в этой колонке, новое значение поля будет выведено в окно сообщений – отработает назначенный нами обработчик При изменении (рис. 8.405). Рис. 8.407. Назначение обработчика команды Рис. 8.405. Дополнительная колонка в таблице значений Рис. 8.408. Добавление кнопки в командную панель Том 1 После этого добавим в командную панель формы кнопку (рис. 8.408). 379 Глава 8. Разработка форм И в заключение свяжем кнопку командной панели с той командой, которую мы добавили (рис. 8.409). Здесь мы указываем родителя для добавляемой кнопки – существующую в форме командную панель Элементы.ФормаКоманднаяПанель. В результате мы имеем состояние, показанное на рисунке 8.408. Свяжем кнопку с командой и укажем, что кнопка будет являться кнопкой по умолчанию (она будет выделена среди других кнопок командной панели), листинг 8.162. Листинг 8.162. Связь кнопки с командой НовыйЭлемент.ИмяКоманды = "НоваяКоманда"; НовыйЭлемент.КнопкаПоУмолчанию = Истина; В результате мы имеем состояние, показанное на рисунке 8.409. Рис. 8.409. Связь кнопки с командой Теперь все те же самые действия выполним программно, из встроенного языка. подробнее После этого можно запустить систему в режиме 1С:Предприятие и посмотреть, как работает наша команда Добавить команду. В результате ее выполнения в командной панели формы появится кнопка Новая кнопка. А при нажатии этой кнопки в окно сообщений будет выведен отладочный текст (рис. 8.410). Пример можно посмотреть в демонстрационной базе «Разработка форм, пример 14», общая форма Форма, команда Добавить команду. Это локальная команда этой формы. Как и раньше, модификацию формы будем выполнять в серверной контекстной процедуре. Сначала добавим команду НоваяКоманда (листинг 8.159). Листинг 8.159. Добавление команды // Добавить команду. НоваяКоманда = Команды.Добавить("НоваяКоманда"); В результате мы имеем состояние, показанное на рисунке 8.406. Назначим этой команде обработчик – процедуру, которая была создана в модуле формы заранее, на этапе конфигурирования (листинг 8.160). Листинг 8.160. Назначение обработчика команды НоваяКоманда.Действие = "КомандаФормыДобавленнаяПрограммно"; В результате мы имеем состояние, показанное на рисунке 8.407. Добавим кнопку в командную панель формы (листинг 8.161). Листинг 8.161. Добавление кнопки в командную панель Рис. 8.410. Кнопка в форме Настройки пользователей Платформа «1С:Предприятие» предоставляет возможность сохранения разнообразных настроек, сделанных пользователем в процессе работы, и доступа к ним из встроенного языка. Это, например, размеры и положение открытых форм, настройки печати табличного документа, данные форм, значения реквизитов обработок и т. д. Большинство настроек пользователя стандартно хранятся в системных таблицах информационной базы, и разработчик имеет к ним доступ. Кроме этого, разработчик может переопределить хранение большинства настроек системы и уже в составе конфигурации реализовать собственный механизм хранения настроек и доступа пользователей к ним. // Добавить кнопку и связать ее с командой. НовыйЭлемент = Элементы.Добавить("КнопкаНоваяКоманда", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель); Исключение составляют лишь настройки отбора, порядка и группировки динамических списков, которые платформа стандартно не сохраняет. 380 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм Что такое настройка Что представляет собой одна настройка? Это некоторая совокупность сохраняемых данных (в общем случае произвольная), привязанная к чему-то в конфигурации и имеющая некоторое представление. Совокупность данных, которые сохраняются, называется настройки. Например, если речь идет об автоматическом сохранении данных формы, то настройками будут являться значения, введенные пользователем в поля формы. Или если речь идет о сохранении вариантов отчетов, то настройками будут являться доступные поля, пользовательские поля, условное оформление, структура отчета и другие данные, характеризующие конкретный вариант отчета. Как мы уже сказали, настройки (сохраняемые данные) обязательно привязаны к чему-то в конфигурации. А именно – к настраиваемому объекту и к пользователю информационной базы. Что является настраиваемым объектом, зависит от вида настройки. Например, в случае вариантов отчетов настраиваемым объектом является отчет, содержащийся в конфигурации. В случае с данными формы настраиваемым объектом является форма конфигурации и так далее. Для указания того, к какому объекту принадлежит эта настройка, используется ключ объекта – значение, однозначно идентифицирующее настраиваемый объект. Если настройка сохраняется в стандартном хранилище, то ключ объекта – строка. Например, для настройки варианта отчета ключом объекта может быть строка вида Отчет.ОстаткиТоваров, а для данных формы – строка вида Обработка.ВыгрузкаДанных.Форма.Форма. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», Приложение 4 «Перечень автоматически сохраняемых настроек». Если настройка сохраняется в хранилище, созданном в конфигурации, то ключ объекта может быть произвольного типа. Понятно, что одну и ту же форму, один и тот же отчет разные пользователи могут настроить по-разному. Поэтому каждая настройка однозначно привязана еще и к пользователю информационной базы. Для этого используется строка – идентификатор пользователя. Если настройка сохраняется платформой автоматически, то в качестве идентификатора пользователя платформа использует имя пользователя. Например, МухинАВ. Том 1 Кроме этого многие настраиваемые объекты допускают существование нескольких настроек. Например, один пользователь для одного отчета может создать несколько вариантов, для одной формы этот же пользователь может сохранить несколько наборов ее параметров. Чтобы отличать одну настройку этого объекта и этого пользователя от другой, используется ключ настройки – значение, однозначно идентифицирующее данную настройку в разрезе ключа объекта и идентификатора пользователя. Если настройка сохраняется в стандартном хранилище, то в качестве ключа настройки платформа использует текстовую строку, представляющую собой уникальный идентификатор (UUID). Например, 57d67b45-3ec6-4ed2-82f9-8debcc89cb85. Если настройка сохраняется в хранилище, созданном в конфигурации, то ключ настройки может быть произвольного типа. Последней характеристикой настройки является ее представление – понятное пользователю наименование настройки. Сохраняя настройку, пользователь сам задает ее представление, а при выборе из существующих настроек представление позволяет ему отличить одну настройку от другой. В результате, например, одна настройка данных форм может выглядеть следующим образом: ■■ настройки – структура, содержащая имена реквизитов формы и значения, которые пользователь ввел в эти реквизиты; ■■ ключ объекта – Обработка.ВыгрузкаДанных.Форма.Форма; ■■ ключ настройки – 57d67b45-3ec6-4ed2-82f9-8debcc89cb85; ■■ идентификатор пользователя – МухинАВ; ■■ представление – Выгрузить данные за прошлый месяц. Как хранятся настройки Набор системных таблиц, в которых платформа автоматически сохраняет различные настройки, называется стандартное хранилище настроек. Наряду со стандартным хранилищем настроек могут существовать хранилища настроек, созданные разработчиком в конфигурации. Всего платформа различает пять видов настроек, то есть пять видов информации, которая является настройками: ■■ варианты отчетов, ■■ пользовательские настройки отчетов, ■■ данные форм, ■■ общие настройки, ■■ системные настройки. 381 Глава 8. Разработка форм Все эти настройки могут храниться в стандартном хранилище. И в то же время для хранения всех видов настроек, кроме системных, можно назначить собственное хранилище, созданное в конфигурации. Для этого предназначен вид объектов конфигурации – Хранилища настроек. Они располагаются в ветке Общие дерева конфигурации (рис. 8.411). В стандартном хранилище сохраняются только варианты отчета, созданные в режиме 1С:Предприятие. Варианты отчета, созданные в конфигураторе, сохраняются в самой схеме компоновки данных. То же самое относится и к пользовательским настройкам вариантов. Чтобы для примера посмотреть, как выглядят настройка варианта и пользовательская настройка отчета, можно создать отчет, например ОстаткиТоваров. В режиме 1С:Предприятие сохранить вариант отчета, сохранить пользовательскую настройку этого варианта, а затем выполнить следующий код (листинг 8.163). Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Разработка форм», пример 15. Раздел «Как получить доступ к настройкам в системном хранилище», стр. 386. Листинг 8.163. Пример работы с настройками отчетов // Из системного хранилища получить ключ текущего варианта отчета. КлючТекущегоВарианта = ХранилищеСистемныхНастроек .Загрузить("Отчет.ОстаткиТоваров/КлючТекущегоВарианта"); Рис. 8.411. Хранилища настроек Поскольку каждый из видов настроек имеет свои особенности, рассмотрим их по отдельности. Варианты отчетов и пользовательские настройки отчетов О том, как настраиваются отчеты, рассказано в других разделах этой книги. Здесь пойдет речь только о том, как можно хранить эти настройки. Подробнее Том 2, глава 16, разделы «Варианты отчетов», «Пользовательские настройки». При сохранении в стандартное хранилище для настроек вариантов отчетов ключом объекта является полное имя отчета, например Отчет.ОстаткиТоваров. Для пользовательских настроек отчетов ключом объекта является полное имя отчета плюс ключ настройки варианта отчета, к которому относится данная пользовательская настройка. Например, если есть вариант отчета с ключом настройки // Из хранилища вариантов отчетов получить: // - список имеющихся вариантов отчета // - описание текущего варианта отчета // - сам вариант (настройки) отчета. СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок("Отчет.ОстаткиТоваров"); ОписаниеВарианта = ХранилищеВариантовОтчетов .ПолучитьОписание("Отчет.ОстаткиТоваров", КлючТекущегоВарианта); ВариантОтчета = ХранилищеВариантовОтчетов .Загрузить("Отчет.ОстаткиТоваров", КлючТекущегоВарианта); // Из системного хранилища получить ключ текущей пользовательской настройки варианта. КлючВариантаОтчета = "Отчет.ОстаткиТоваров/" + КлючТекущегоВарианта; КлючТекущейПользовательскойНастройки = ХранилищеСистемныхНастроек .Загрузить(КлючВариантаОтчета + "/КлючТекущихПользовательскихНастроек"); // Из хранилища пользовательских настроек отчетов получить: // - список имеющихся пользовательских настроек для этого варианта отчета // - описание текущей пользовательской настройки // - саму пользовательскую настройку (настройки) этого варианта отчета. СписокПользовательскихНастроек = ХранилищеПользовательскихНастроекОтчетов .ПолучитьСписок(КлючВариантаОтчета); ОписаниеПользовательскойНастройки = ХранилищеПользовательскихНастроекОтчетов .ПолучитьОписание(КлючВариантаОтчета, КлючТекущейПользовательскойНастройки); ПользовательскаяНастройка = ХранилищеПользовательскихНастроекОтчетов .Загрузить(КлючВариантаОтчета, КлючТекущейПользовательскойНастройки); 57d67b45-3ec6-4ed2-82f9-8debcc89cb85, то для пользовательской настройки этого варианта отчета ключ объекта будет Отчет.ОстаткиТоваров/ 57d67b45-3ec6-4ed2-82f9-8debcc89cb85. И для тех, и для других настроек разработчик может переопределить стандартное хранилище этих настроек в конфигурации как на уровне всей конфигурации, т. е. сразу для всех отчетов, так и на уровне отдельного отчета. 382 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В первом случае используются свойства конфигурации Хранилище вариантов отчетов и Хранилище пользовательских настроек отчетов. Во втором случае используются свойства конкретного отчета Хранилище вариантов и Хранилище настроек. Подробнее Том 2, глава 16, раздел «Хранилище вариантов и хранилище пользовательских настроек». Данные форм Данные форм – это значения, установленные для тех или иных реквизитов формы. Данные формы удобно сохранять, например, для того, чтобы запомнить значения, с которыми запускалась некоторая обработка. Система может сохранять данные форм двумя способами: автоматически и вручную. Автоматическое сохранение данных формы в настройках выполняется при закрытии формы. При следующем открытии этой формы сохраненные данные будут восстановлены в соответствующих реквизитах формы. Автоматическое сохранение данных всегда выполняется в системное хранилище, и переназначить его в собственное хранилище нельзя. Стандартно автоматическое сохранение данных формы в настройках отключено. Чтобы его включить у конкретной формы, нужно установить свойство Автоматическое сохранение данных формы в настройках в значение Использовать (рис. 8.412). Рис. 8.412. Свойство «Автоматическое сохранение данных формы в настройках» После этого в списке реквизитов формы станет доступна колонка Сохранение, в которой нужно отметить те реквизиты формы, значения которых должны автоматически сохраняться. Чтобы сохранять/восстанавливать данные формы вручную, также нужно включить одно из свойств формы – СохранениеДанныхФормыВНастройках. Вручную данные формы можно сохранить/восстановить в любой момент работы с формой с помощью стандартных команд формы Сохранить параметры…, Восстановить параметры… Эти настройки стандартно также хранятся в системном хранилище, но разработчик может переназначить хранение этих настроек в собственное хранилище. Задать собственное хранилище для данных форм можно двумя способами. Во-первых, в свойствах конфигурации. Это будет работать для всех форм, которые есть в конфигурации. Для этого у конфигурации есть свойство Хранилище настроек данных форм (рис. 8.413). Рис. 8.413. Свойство «Хранилище настроек данных форм» Том 1 383 Глава 8. Разработка форм Во-вторых, в свойствах конкретной формы. Это будет работать только для этой формы и только при ручном сохранении настроек. Для этого у формы есть свойства (рис. 8.414): ■■ Сохранение данных формы в настройках, ■■ Хранилище настроек. Рис. 8.415. Алгоритм сохранения настроек данных формы Чтобы для примера посмотреть, как выглядит настройка данных формы, можно создать обработку, например ВыгрузкаДанных. Создать у нее несколько реквизитов, разместить их в форме, у формы включить свойства СохранениеДанныхФормыВНастройках и Автоматическое сохранение данных формы в настройках, отметить все реквизиты. Затем в режиме 1С:Предприятие ввести данные в поля формы, сохранить параметры (Все действия – Сохранить параметры), ввести другие данные в поля формы и закрыть форму. Затем выполнить следующий код (листинг 8.164). Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Разработка форм», пример 15. Раздел «Как получить доступ к настройкам в системном хранилище», стр. 386. Рис. 8.414. Свойства формы для назначения хранилища Таким образом, когда система решает, куда сохранить настройки данных форм, она действует по следующему алгоритму (рис. 8.415): 1. Сначала смотрит свойства формы. Если в них указано какое-то хранилище, сохраняет в него. 2. Если в свойствах формы ничего не указано, платформа смотрит свойства конфигурации. Если в них указано какое-то хранилище, она сохраняет в него. 3. Если в свойствах конфигурации тоже ничего не указано, она сохраняет в стандартное хранилище (в системные таблицы информационной базы). 384 Листинг 8.164. Пример работы с настройками данных формы // Из системного хранилища получить данные формы, сохраненные автоматически. ТекущаяНастройкаДанныхФормы = ХранилищеСистемныхНастроек .Загрузить("Обработка.ВыгрузкаДанных.Форма.Форма/ТекущиеДанные"); // Из системного хранилища получить ключ текущих настроек данных формы. КлючТекущихНастроекДанныхФормы = ХранилищеСистемныхНастроек .Загрузить("Обработка.ВыгрузкаДанных.Форма.Форма/КлючТекущихНастроекДанных"); // Из хранилища данных формы получить: // - список имеющихся настроек данных формы // - описание настройки данных формы // - сами данные (настройки) формы. СписокНастроекДанныхФормы = ХранилищеНастроекДанныхФорм .ПолучитьСписок("Обработка.ВыгрузкаДанных.Форма.Форма"); ОписаниеНастройкиДанныхФормы = ХранилищеНастроекДанныхФорм .ПолучитьОписание("Обработка.ВыгрузкаДанных.Форма.Форма", Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм КлючТекущихНастроекДанныхФормы); НастройкаДанныхФормы = ХранилищеНастроекДанныхФорм .Загрузить("Обработка.ВыгрузкаДанных.Форма.Форма", КлючТекущихНастроекДанныхФормы); Общие настройки Общие настройки разработчик может придумать сам. Под общими настройками понимаются произвольные настройки, относящиеся к конкретной конфигурации. Что это за настройки – должен определить сам разработчик, исходя из логики работы своего прикладного решения. Платформа самостоятельно не сохраняет никакие общие настройки. Но разработчик может сохранять всевозможные собственные настройки. Либо в стандартном хранилище, либо в хранилище, созданном в конфигурации. Для этого используются методы менеджера конкретного хранилища конфигурации Сохранить() и Загрузить(). Хранилище общих настроек можно получить с помощью одноименного свойства глобального контекста ХранилищеОбщихНастроек. Причем, если в свойствах конфигурации не указано специального хранилища для общих настроек, будет возвращен экземпляр менеджера стандартного хранилища, обслуживающий общие настройки. Если в свойстве конфигурации указано конкретное хранилище, будет возвращен менеджер этого хранилища (рис. 8.416). Рис. 8.417. Свойство «Хранилище общих настроек» Листинг 8.165. Пример работы с общими настройками // Задать представление первой настройки. ОписаниеПервойНастройки = Новый ОписаниеНастроек; ОписаниеПервойНастройки.Представление = "Представление первой настройки"; // Для примера – некоторый список значений. ДанныеНастройки = Новый Структура("Настройка11, Настройка12", 1, 2); // Сохранить первую настройку. // Пользователь не указан – настройка будет сохранена для текущего пользователя. ХранилищеОбщихНастроек.Сохранить("МойКлючОбъекта", "КлючНастройки1", ДанныеНастройки, ОписаниеПервойНастройки); Рис. 8.416. Алгоритм сохранения общих настроек Для этого у конфигурации есть свойство Хранилище общих настроек (рис. 8.417). Попробовать работу с общими настройками можно на следующем примере (листинг 8.165). Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Разработка форм», пример 15. Раздел «Как получить доступ к настройкам в системном хранилище», стр. 386. Том 1 // Задать представление второй настройки. ОписаниеВторойНастройки = Новый ОписаниеНастроек; ОписаниеВторойНастройки.Представление = "Представление второй настройки"; // Для примера – хранилище значения. ДанныеНастройки = Новый ХранилищеЗначения("Некоторое значение"); // Сохранить вторую настройку. // Пользователь не указан – настройка будет сохранена для текущего пользователя. ХранилищеОбщихНастроек.Сохранить("МойКлючОбъекта", "КлючНастройки2", ДанныеНастройки, ОписаниеВторойНастройки); // Получить из хранилища общих настроек: // - список моих настроек // - описание каждой настройки // - сами настройки. 385 Глава 8. Разработка форм СписокОбщихНастроек = ХранилищеОбщихНастроек.ПолучитьСписок("МойКлючОбъекта"); ОписаниеНастройки1 = ХранилищеОбщихНастроек.ПолучитьОписание("МойКлючОбъекта", "КлючНастройки1"); ОписаниеНастройки2 = ХранилищеОбщихНастроек .ПолучитьОписание("МойКлючОбъекта", "КлючНастройки2"); Настройка1 = ХранилищеОбщихНастроек.Загрузить("МойКлючОбъекта", "КлючНастройки1"); Настройка2 = ХранилищеОбщихНастроек.Загрузить("МойКлючОбъекта", "КлючНастройки2"); Системные настройки Системные настройки – это настройки, которые требуются для работы системы вообще, безотносительно к конкретному прикладному решению. Например, это расположение и размеры открытых форм, настройки печати табличного документа, избранное, настройки глобального командного интерфейса, рабочего стола и так далее. Возможность переопределить хранение системных настроек отсутствует. Поэтому система всегда сохраняет их в стандартное хранилище (в системные таблицы информационной базы), рис. 8.418. Листинг 8.166. Пример работы с системными настройками // Настройка отображения формы: состав элементов, взаимное расположение и свойства элементов. // Сохраняется после изменения формы в режиме 1С:Предприятие (Все действия – Изменить форму). НастройкаОтображенияФормы = ХранилищеСистемныхНастроек .Загрузить("Обработка.ВыгрузкаДанных.Форма.Форма/НастройкиФормы"); // Размеры формы и элементов управления, положение разделителей и ширины колонок таблиц. РазмерыФормы = ХранилищеСистемныхНастроек .Загрузить("Обработка.ВыгрузкаДанных.Форма.Форма/НастройкиОкна"); // Избранное. Избранное = ХранилищеСистемныхНастроек.Загрузить("Общее/ИзбранноеРаботыПользователя"); // Настройка панели разделов // сохраняется после изменения панели разделов (Настройка панели разделов…). ПанельРазделов = ХранилищеСистемныхНастроек .Загрузить("Общее/ПанельРазделов/НастройкиКомандногоИнтерфейса"); // Настройка панели действий // сохраняется после изменения панели действий (Настройка панели действий…). ПанельДействий = ХранилищеСистемныхНастроек .Загрузить("Подсистема.Продажи/ПанельДействий/НастройкиКомандногоИнтерфейса"); // Настройка панели навигации // сохраняется после изменения панели навигации (Настройка панели навигации…). ПанельНавигации = ХранилищеСистемныхНастроек .Загрузить("Подсистема.Продажи/ПанельНавигации/НастройкиКомандногоИнтерфейса"); // Настройки рабочего стола (состав и расположение форм на рабочем столе) // сохраняются после изменения рабочего стола (Настройка рабочего стола…). РабочийСтол = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиРабочегоСтола"); Рис. 8.418. Сохранение системных настроек Значения системных настроек – это объекты без свойств и методов. Практический смысл их использования в основном заключается в обмене настройками между разными пользователями. Исключение составляет лишь избранное, в котором есть возможность работать с отдельными элементами избранного. Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Разработка форм», пример 15. Раздел «Избранное», стр. 21. Далее приведен пример получения различных системных настроек (листинг 8.166). Как получить доступ к настройкам в системном хранилище При программной работе с настройками нужно использовать методы того хранилища, в котором находятся нужные нам настройки. В общем случае ситуация выглядит следующим образом: все настройки могут храниться в стандартном хранилище, или часть из них может храниться в хранилищах, созданных в конфигурации (рис. 8.419). Поэтому существуют методы глобального контекста, которые позволяют получить нужное хранилище, исходя из вида настроек, с которыми предполагается работать. Если вы хотите работать с системными настройками, то нужно использовать свойство глобального контекста ХранилищеСистемныхНастроек. Оно всегда возвращает менеджер стандартного хранилища (листинг 8.167). Листинг 8.167. Менеджер для работы с системными настройками МенеджерСтандартногоХранилища = ХранилищеСистемныхНастроек; 386 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм В случае, когда настройки хранятся в стандартном хранилище (за исключением общих настроек), используются зарезервированные ключи объектов, которые описаны в документации. Подробнее Документация «1С:Предприятие 8.2. Руководство разработчика», Приложение 4 «Перечень автоматически сохраняемых настроек». Если настройки хранятся в хранилищах, созданных в конфигурации, то предполагается, что ключи объектов либо совпадают с зарезервированными, либо описаны в документации к прикладному решению. Когда нужно создавать собственные хранилища настроек Общий подход к работе с хранилищами настроек следующий. Рис. 8.419. Варианты хранения настроек Если вы хотите работать с общими настройками, то нужно использовать свойство глобального контекста ХранилищеОбщихНастроек. Оно вернет либо менеджер стандартного хранилища, либо менеджер хранилища, созданного в конфигурации, если это хранилище указано в свойстве конфигурации ХранилищеОбщихНастроек (листинг 8.168). Листинг 8.168. Менеджер для работы с общими настройками МенеджерХранилищаОбщихНастроек = ХранилищеОбщихНастроек; С настройками вариантов отчета, данных форм и пользовательскими настройками отчетов сложнее. В принципе для них также существуют отдельные свойства глобального контекста: ХранилищеВариантовОтчетов, ХранилищеНастроекДанныхФорм и ХранилищеПользовательскихНастроекОтчетов. Эти свойства вернут либо менеджер стандартного хранилища, либо менеджер хранилища, созданного в конфигурации, если сохранение этого вида настроек переопределено в свойствах конфигурации. Однако если хранение этих видов настроек переопределено в конкретных отчетах или формах, то перечисленные свойства глобального контекста никак на это не отреагируют. В этом случае нужно использовать свойство глобального контекста ХранилищаНастроек и имя нужного хранилища, определенного в конфигурации (листинг 8.169). Листинг 8.169. Менеджер для работы с хранилищем, созданным в конфигурации МенеджерМоегоХранилища = ХранилищаНастроек.МоеХранилище; Для получения данных из хранилища или для сохранения данных в хранилище обязательно нужно знать ключ объекта, к которому относится настройка. Том 1 Предполагается, что в простых конфигурациях будет использоваться стандартный механизм хранения настроек в стандартном хранилище. Это не требует от разработчика какого-либо кодирования. А вот в сложных конфигурациях разработчик будет создавать собственные хранилища настроек и самостоятельно управлять сохранением и загрузкой пользовательских настроек. В каких ситуациях может понадобиться использовать собственное хранилище настроек? 1. Когда нужна особенная структура хранения настроек. Например, чтобы они были привязаны к подразделению. Чтобы у всех пользователей одного подразделения были одинаковые настройки. 2. Когда требуется обмен настройками в распределенной информационной базе, потому что стандартное хранилище не участвует в обмене в распределенной информационной базе. 3. Когда нужно легкое и/или особенное (нестандартное) администрирование настроек. Как организовать собственное хранилище настроек Создание собственного хранилища конфигурации рассмотрим на небольшом примере. Он покажет сохранение настроек данных формы обработки в хранилище, созданном в конфигурации, и получение их из хранилища. Подробнее Этот пример можно посмотреть в демонстрационной конфигурации «Разработка форм», пример 16. 387 Глава 8. Разработка форм Сначала добавим объект конфигурации Хранилище настроек – НастройкиФорм. Перейдем к реквизитам формы и для всех реквизитов отметим, что их значения будут сохраняться. Затем укажем это хранилище в свойстве конфигурации Хранилище настроек данных форм. Это будет означать, что данные любой формы можно будет сохранить в этом хранилище. Для красоты, хотя можно этого и не делать, вынесем стандартные команды сохранения и восстановления параметров прямо в форму (рис. 8.420). После этого добавим объект конфигурации, в котором собственно и будут храниться сами настройки. Можно использовать любой объект, который подходит для этого с точки зрения разработчика. Мы будем использовать справочник. Добавим справочник ХранилищеДанныхФорм с реквизитами: ■■ КлючОбъекта (тип Строка, длина 255); ■■ ДанныеФормы (тип ХранилищеЗначения). Реквизит для хранения пользователя, которому принадлежит настройка, мы не создаем. Все настройки данных форм будут у нас одинаковы для всех пользователей. Заметьте, мы создали хранилище, создали справочник, в котором будут храниться настройки. Но пока они никак между собой не связаны. То есть из свойств конфигурации известно, что данные формы будут храниться не в стандартном хранилище, а в каком-то другом, но где «физически» расположено это хранилище – пока не известно. Позже мы увидим, как устанавливается эта связь. Теперь добавим объект конфигурации Обработка. На примере формы этой обработки посмотрим, как работает сохранение данных формы в настройках. Обработку назовем ЗаполнитьСправочники. Она (теоретически) будет добавлять в выбранный справочник указанное количество элементов и задавать их наименование. Для этого у обработки будет четыре реквизита: ■■ Справочник (тип Строка, длина 10, переменная) – для указания имени заполняемого справочника; ■■ Наименование (тип Строка, длина 20, переменная) – для указания строки, с которой будет начинаться наименование добавляемых элементов; обработка будет автоматически добавлять к нему порядковый номер элемента; ■■ НачинатьСНомера (тип Число, длина 10) – порядковый номер, с которого начинается добавление номеров к наименованию элементов; ■■ КоличествоДобавляемыхЭлементов (тип Число, длина 10) – количество элементов, которые будут добавлены в справочник. Рис. 8.420. Форма обработки «Заполнить справочники» Теперь у хранилища настроек НастройкиФорм с помощью конструктора создадим две стандартные формы: форму загрузки настроек, форму сохранения настроек. Чтобы познакомиться с механикой сохранения и восстановления настроек в собственное хранилище, создадим у этих форм обработчики событий При создании на сервере, в которых напишем любой оператор, на который можно установить точку останова, например, а=4;. И установим на нем точку останова. Такой же текст напишем в обработчиках модуля менеджера хранилища настроек: ОбработкаЗагрузки, ОбработкаСохранения. Если теперь запустить отладочный сеанс «1С:Предприятия», то мы увидим, что при открытии обработки ЗаполнитьСправочники и выполнении команды Сохранить параметры… открывается форма сохранения нашего хранилища настроек, а при выполнении команды Восстановить параметры… открывается форма загрузки настроек. Больше пока ничего не происходит. Создадим форму этой обработки, и свойство формы Сохранение данных в настройках установим в значение Использовать список. Особенность работы с собственными хранилищами настроек как раз и заключается в том, что весь алгоритм сохранения настроек должен 388 Профессиональная разработка в системе «1С:Предприятие 8» Программирование форм быть написан на встроенном языке в основных формах сохранения и загрузки настроек хранилища. Именно он и будет определять, в каком именно объекте конфигурации будут «физически» храниться настройки. Кроме этого, при правильном написании будут вызываться также и обработчики из модуля менеджера хранилища. Итак, расс