Методические указания для выполнения практических (лабораторных) и самостоятельных работ в системе 1С Предприятие 3
Скачать 3.59 Mb.
|
§3.2. Перечисления В созданных справочниках ряд реквизитов (например, «Вид номенклатуры», «Вид учебного заведения») заданы в виде строки. Однако мы их будем заполнять преимущественно одними и теми же значениями. Например, для «Вида номенклатуры» это будут всего два значения: «Товар» или «Услуга». Каждый раз, заполняя данный реквизит, мы вынуждены полностью заполнять данные строки текста. Дополнительно, если необходима будет аналитика по виду номенклатуры, необходимо будет производить посимвольное сопоставление строк, что также не очень удобно. Также пользователь может попросту допустить опечатку. Необходимо, чтобы данные, имеющие ограниченный перечень принимаемых значений, можно было бы один раз задать, а потом производить выбор из них. Конечно, для этих целей можно создать отдельный справочник и выбирать элементы из него. К недостаткам такого варианте можно отнести возможность изменять элементы справочника, что сделает затруднительным их однозначное использование. Поэтому в системе «1С: Предприятие» есть прикладной объект, который будет содержать требуемые списки значений, задаваемые и изменяемые только в Конфигураторе: в режиме исполнения пользователь сможет лишь делать выбор из данных списков. Такие списки целесообразно создавать тогда, когда необходимость их редактирования возникает крайне редко. Такой объект конфигурации называется «Перечисление». Аналогично предопределенным элементам справочника, все элементы перечисления имеют жесткие ссылки. В режиме исполнения в перечисление нельзя добавлять новые элементы или редактировать уже созданные. Перечисление содержит только значения элементов – без указания типа. Создадим перечисление «Виды учебного заведения», добавим его в подсистему «Общий отдел», и в данном перечислении зададим несколько значений (на вкладке «Данные»): школа, НПО, СПО, ВУЗ (рис. 16). Рис. 16. Заполнение значения перечисления Впоследствии, если мы захотим программно обратиться к конкретным значениям перечисления, то это можно будет сделать по полному имени, например: Перечисления.ВидыУчебногоЗаведения.СПО Теперь, для того, чтобы в реквизит «Вид учебного заведения» табличной части «Образование» справочника «Сотрудники» можно было подставлять значения из созданного перечисления, необходимо изменить тип реквизита: вместо типа «Строка» указать тип «ПеречислниеСсылка.ВидыУчебногоЗаведения» (рис. 17). Рис. 17. Выбор ссылочного типа данных (Перечисления) Аналогичным образом создадим перечисление «Виды номенклатуры» (значения «Товар» и «Услуга») и изменим тип реквизита «Вид номенклатуры» справочника «Номенклатура». Дополнительно, для данного реквизита на вкладке «Представление» свойство «Быстрый выбор» установим в значение «Использовать». Запустим систему в режиме отладки. Откроем для редактирования созданную ранее номенклатурную позицию и зададим вид номенклатуры. Обратите внимание: список возможных вариантов невозможно отрыть в отдельном окне – конкретное значение можно выбрать только из выпадающего вниз списка. Такое поведение связано с установленным свойством «Быстрый выбор». Данное свойство имеет смысл настраивать, если перечисление (или другие данные ссылочного типа) содержат немного значений. Для сравнения, создадим сотрудника и заполним соответствующие реквизиты шапки и реквизиты табличной части (рис. 18). Обратите внимание, что здесь, аналогично предыдущему случаю, список возможных вариантов был в виде выпадающего списка внизу. Это связано с тем, что настройка «Быстрый выбор» в разделе «Представление» была установлена в режим «Авто». Соответственно, система сама определила, что в данном перечислении немного элементов и приняла решение использовать быстрый выбор. Для сравнения, установите режим быстрого выбора в режим «Не использовать» для данного реквизита и посмотрите на то, как это проявится в режиме исполнения. Рис. 18. Создание сотрудника (реквизиты шапки, реквизиты табличной части) Самостоятельно наполните созданные справочники различными группами товаров, товарами и услугами; сотрудниками (включая заполнение табличной части); контрагентами (покупателями и поставщиками) и договорами с ними (по несколько договоров с каждым контрагентом). Обратите внимание, что при добавлении/открытии контрагента вверху появляется ссылка «Список договоров». Перейдя по этой ссылке, вы можете просмотреть, добавить, изменить договора, связанные с выбранным контрагентом. Такая возможность существует благодаря тому, что справочник «Договора» подчинен справочнику «Контрагенты», и система автоматически отображает содержимое справочника «Договора» с отбором по выбранному (открытому в данный момент) контрагенту. Также следует отметить, что зачастую приходится заносить множество похожей информации. Соответственно, можно просто скопировать уже введенную информацию (созданный элемент справочника), а затем внести лишь необходимые правки. В системе «1С: Предприятие» в режиме исполнения для этого необходимо выделить элемент, на основании которого будет создаваться копия, и в меню «Еще» выбрать пункт «Скопировать». После чего откроется новый элемент справочника в режиме редактирования, в который нужно просто внести все необходимые изменения. Через вышеуказанное меню также можно выполнить ряд других действий: «Изменить», «Пометить на удаление», «Создать», «Переместить в группу» и т.д. Темы для самостоятельного изучения: 1. Общие реквизиты справочников. 2. Индексирование элементов справочника. Ввод по строке. 3. Пометка на удаление и непосредственное удаление элементов справочника. Занятие 4. Особенности применения программного кода в системе. §4.1. Встроенный язык системы До сих пор при разработке приложения мы использовали лишь стандартные механизмы «1С: Предприятия», без использования программного кода. Система многие события обрабатывает самостоятельно путем уже имеющихся механизмов. Тем не менее, существуют моменты, когда стандартного поведения системы оказывается недостаточно для реализации требуемой функциональности. В нашем случае явным примером является добавление элементов в справочник «Номенклатура». Вы наверняка заметили, что для каждой номенклатурной позиции нам необходимо явно указывать вид номенклатуры. А это может показаться нелогичным: мы и так находимся в определенной группе товаров, так почему система не может это проанализировать и самостоятельно заполнить вид номенклатуры? Стандартного механизма для такого анализа у системы нет. Для того чтобы систему «научить» выполнять такой анализ, необходимо использовать встроенный язык системы. Встроенный язык системы является некоторой смесью множества известных вам языков программирования, включая объектно-ориентированное программирование. Главное отличие заключается в том, что весь программный код пишется на русском языке. Возможно использование англоязычных аналогов операторов, но, в большинстве случаев, программисты все же пишут в «1С» на русском языке. Переменные, операторы Объявление переменной: Перем <имя_переменной>; Присвоение переменной значения: <имя_переменной> = <значение>; Отметим, что в системе нет предопределенного задания типа и жесткой типизации переменных. Тип определяется по первому операнду в выражении, после чего производится попытка автоматического приведения остальных операндов к данному типу. Для объявления переменных, содержащих структурированные данные (коллекции значений, например, массив) используется более сложная конструкция - оператор Новый. Например, для объявления массива: <имя_переменной> = Новый Массив; Запись даты: Сегодня = ‘20140221122045’ (12:25:45 21 февраля 2014 года). Можно написать: Сегодня = ‘2014-02-21 12:25:45’ – все незначащие символы (в данном случае не цифры) игнорируется т.к. в одинарных кавычках пишется только дата. Если не указывать время, то оно будет равно 00:00:00. Есть понятие ПустаяДата – 00:00:00 на 01:01:01 Дата хранится в виде числа секунд от 00:00:00 на 01:01:01. Соответственно с датой можно производить арифметические операции сложения, вычитания для получения другой даты. Можно из одной даты вычесть другую и получить разницу в секундах. Строки всегда записываются в двойных кавычках. Если строка очень длинная, к примеру, текст запроса, тогда имеется возможность переноса при помощи вертикальных разделителей: A = “Строка1 | Строка2 | Строка3 …. | СтрокаN”; Для объединения нескольких строк используется конкатенация символом «+». Числа записываются как обычно, без всяких спецсимволов (10, 12.5). Основные операции: сложение, умножение, вычитание, деление, % (остаток от деления нацело). Переменные булевого типа принимают два значения: Истина или Ложь. Все операторы отделяются друг от друга точкой с запятой. Все незначащие символы (пробелы, переносы строк и т.д.) – просто игнорируются. Например, запись A = 10%4 будет эквивалентна A = 10 %4; Комментарии обозначаются символом // в начале каждой строки комментария. Стандартные алгоритмические конструкции 1. Условный оператор: Если (Условие) Тогда [ИначеЕсли (Условие) Тогда] …. [Иначе] …. КонецЕсли; 2. Оператор цикла с параметром: Для Каждого <переменная> Из <СписокПеременных> Цикл …. КонецЦикла; 3. Оператор цикла с условием: Пока <условие> Цикл …. КонецЦикла; 4. Процедуры и функции: Процедура ИмяПроцедуры ([Параметр1, Параметр2,…]) …. КонецПроцедуры; Вызов процедуры: ИмяПроцедуры (значение1, значение2); По умолчанию передача параметров происходит по ссылке, т.е. значения внутри процедуры, функции могут изменяться. Для передачи параметров по значению (для сохранения значения при выполнении), перед именем параметра указывается ключевое слово Знач. Для вызова процедур, функций в других модулях (а не там, где они описаны) используется ключевое слово Экспорт: Процедура ИмяПроцедуры ([Параметр1, Параметр2,…]) Экспорт Отличие функции от процедуры – в конце присутствует ключевое слово Возврат для передачи управления в точку вызова. Результат работы функции должен быть записан в некоторую переменную. 5. Булевы операции: возвращают результат «Истина» или «Ложь». В результате операций сравнения переменная получает значение типа булево: например, переменная A в результате операции A = 10<3 примет значение «Истина». Для описания операции отрицания используется конструкция «НЕ»: B = НЕ А. Есть операторы логических связок «И», «ИЛИ», «НЕ». Пишутся такие операторы подряд: A = 10 = 10 ИЛИ 3<>5. Если необходимо сформировать приоритеты операций используются круглые скобки. §4.2. Виды программных модулей Система «1С: Предприятие» является событийной. Т.е. все, что происходит, не происходит просто так, а лишь при наступлении определенных событий. Например, пользователь нажимает кнопку создания элемента справочника, и система реагирует на это действие – возникает событие и производится его обработка. Поэтому при использовании встроенного языка программный код не пишется линейно, чтобы некоторые действия выполнялись по заданному алгоритму: любой программный код привязывается к конкретному событию системы, связанному либо с объектами (включая элементы интерфейса), либо с поведением системы в целом. В зависимости от видов событий в системе «1С: Предприятие» выделяется ряд программных модулей, каждый из которых отвечает за обработку тех или иных событий и имеет определенное предназначение. Выделяются следующие виды программных модулей. Модуль формы. Здесь происходит обработка событий, связанная с элементами формы (интерфейсом приложения). Форма – основной объект для интерактивного отображения данных. К примеру, когда мы нажимаем кнопку создания нового элемента справочника, открывается форма элемента для объекта типа «Справочник» со своим набором данных, свойств, методов. Модуль формы связан с интерактивными действиями пользователя (ввод данных в поля формы, выбор данных, и т.д.). Тип формы зависит от отображаемых данных. Существуют различные виды форм, связанные с одним и тем же объектом: форма элемента, форма списка, форма выбора, а также собственные разработанные программистом формы. Соответственно, каждая форма будет иметь свой перечень элементов и свой модуль, содержащий обработчики событий для данной формы. Модуль объекта. В модуле объекта происходит обработка событий, связанная с объектом в целом, вне зависимости от формы. Такие события обычно связаны с записью информации в таблицы базы данных и не зависят от интерактивных действий пользователя. В отличие от модуля формы, модуль объекта содержит обработчики, реагирующие на любые программные обращения к объекту. Если рассматривать последовательность обработки событий, то вначале происходит обработка событий, возникающих в какой-либо форме объекта (интерактивные события), а потом уже обработка событий объекта (программные события). Примечание. Модуль объекта отсутствует у констант, перечислений, регистров. У регистров вместо модуля объекта присутствует модуль набора записей. Модуль менеджера. Появился только в версии 8.2. Очень похож на модуль объекта, но модуль объекта содержит реализацию методов и обработчиков событий, относящихся к конкретному экземпляру объекта, а модуль менеджера содержит методы, которые расширяют/переопределяют методы, относящиеся к всему набору экземпляров объекта, без привязки к конкретному экземпляру. Модуль менеджера есть у всех прикладных объектов. Модуль управляемого приложения. Содержит обработчики событий, возникающих при старте системы в режиме «Управляемого приложения» (начинается с версии 8.2). Также может содержать процедуры и функции, вызываемые в других частях приложения, хотя для этого, преимущественно все же используются другие модули. Модуль сеанса. Содержит обработчики событий, связанные с приложением в целом, вне зависимости от его типа (обычное или управляемое). Происходит установка параметров сеанса до старта системы. Общие модули. Содержат экспортные процедуры и функции, доступные и вызываемые из всех других модулей приложения. Очень близки к понятию «внешние модули» (UNITS) в классических языках программирования. §4.3. Работа приложения в управляемом режиме. Управляемые формы. Теперь пришло время обратиться к тому, как система устроена изнутри, как она получает данные, обрабатывает их и сохраняет. Начиная с версии 8.2 основной режим работы «1С: Предприятие» – это работа в режиме «Управляемого приложения» с использованием управляемых форм. Управляемые формы – это такие формы, которые разработчиком не создаются самостоятельно «с нуля», как это было раньше (в предыдущих версиях системы). Система сама, на основании типа объекта и типа формы уже «знает», как форма должна выглядеть, как функционировать, какие события у нее должны быть и какие обработчики должны быть связаны с этими событиями. От программиста единственное что требуется – это указать системе, какие элементы на форме расположить и где. Остальное система все сделает сама. И только в том случае, если стандартное поведение системы не будет устраивать, только тогда программист может изменять, добавлять требуемую функциональность. Внутри, приложение, разработанное на базе «1С: Предприятия», функционирует по модели «клиент-сервер». «Клиент» содержит все интерактивные элементы управления (кнопки, меню, поля ввода и т.д.), но сам по себе не содержит никаких данных. Все данные находятся на «сервере» - в таблицах базы данных: непосредственно с клиента мы не можем обратиться к ним. И только при специальных серверных вызовах эти данные с сервера поступают к клиенту. Форма (отображающая те или иные данные), как программный объект, достаточно уникальна. Она одновременно существует и на «клиенте», и на «сервере». Если быть более точным, то на сервере она создается (программная копия), после чего передается клиенту и отображается (интерактивная копия, визуальная проекция). У формы есть реквизиты, имеющие тип «Данные формы». Один из реквизитов является основным (у формы лишь один реквизит может быть основным) и связан с таблицами базы данных. При серверном вызове происходит: 1. формирование специального SQL-запроса к таблицам базы данных; 2. извлечение требуемых данных; 3. преобразование данных из формата базы данных к типу «Данные формы»; 4. помещение данных в соответствующие реквизиты основного реквизита формы. Кроме основного, форма также может иметь произвольное число других реквизитов. Данные реквизиты (не основной) не связаны с таблицами базы данных, а содержащаяся в них информация, формируется в результате работы различных программных алгоритмов при вызове или интерактивной работе с формой. При закрытии формы информация, хранящаяся этих реквизитах, никуда не записывается, а пропадает (если не реализовано какого-либо программного алгоритма по передаче указанных данных). Для отображения содержимого реквизитов формы используются элементы формы, имеющие тип «Элементы формы». Элементы формы – это те интерактивные элементы (поля ввода, надписи, кнопочки, переключатели и т.д.), которые видит пользователь при интерактивной работе с формой и которыми он управляет. Рассмотрим пример. Допустим, мы открываем уже созданный ранее элемент справочника. При этом формируется команда на открытие формы элемента данного справочника. На сервере создается форма, и извлекаются данные из таблиц базы данных (этап 1, рис. 19). Рис. 19. Принцип открытия управляемой формы Следует отметить, что при этом извлекаются не все данные, а лишь ссылка и ее представление (Код или Наименование). Ссылка нужна для того, чтобы впоследствии к этим данным можно было обратиться, а представление – для их вывода в интерфейсе. После этого форма «переезжает» на клиент; извлеченные данные преобразуются и помещаются в основной реквизит формы (Данные формы) (этап 2, рис. 24). Затем выполняется команда открытия формы, в результате которой элементы формы отображают содержимое реквизитов формы. Элементы формы связаны с данными формы через специальное свойство «Путь к данным». Далее, допустим, в уже открытой на клиенте форме пользователь что-то изменил. Вопрос: эти изменения происходят где: на клиенте или на сервере? Конечно же, то, что пользователь изменил, т.е. ввел в интерактивные элементы формы, производится на клиенте. Сервер пока что «не знает», что на клиенте что-то поменялось. Однако если происходит серверный вызов, то измененные данные с клиента «переезжают» на сервер и происходит синхронизация данных на клиенте и на сервере. Если же при работе с формой, пользователь на клиенте запросил какие-то данные с сервера, то происходит следующее. Реквизиты формы на клиенте содержат измененные данные из интерактивных элементов (рис. 20). Рис. 20. Работа управляемой формы при серверном вызове Измененная копия формы «переезжает» на сервер и происходит синхронизация с реквизитами формы на сервере (этап 1, рис. 20). Далее выполняется требуемый серверный вызов, например, запрос к базе данных (этап 2, рис. 20). Из базы данных извлекается требуемая информация и помещается в реквизиты формы на сервере (этап 3, рис. 20). После чего форма обратно «переезжает» на клиент, и происходит снова синхронизация данных на клиенте и на сервере (этап 4, рис. 20). В самом конце измененные реквизиты отображаются в соответствующих элементах формы. При обращении к базе данных (например, при записи данных), данные формы преобразуются к формату таблиц базы данных при помощи специального метода ДанныеФормыВЗначение(), при помещении данных из базы данных в реквизиты формы происходит обратное преобразование при помощи метода ЗначениеВДанныеФормы(). Модуль формы существует одновременно и на клиенте и на сервере. Для того чтобы система знала, к данным и методам, клиента или сервера, в данный момент следует обращаться, существует 4 директивы, предваряющие любые процедуры и функции, описанные в модуле формы: &НаКлиенте: доступны все элементы и реквизиты формы на стороне клиента, нет доступа к базе данных – необходим серверный вызов; &НаСервере: доступны все реквизиты формы на стороне сервера, есть доступ к базе данных; &НаСервереБезКонтекста: доступны только те реквизиты формы на стороне сервера, которые были явно переданы в качестве параметров вызова, есть доступ к базе данных; &НаКлиентеНаСервереБезКонтекста: доступны все элементы формы и те реквизиты формы, которые были явно переданы, есть доступ к базе данных; Основное отличие в директивах &НаСервере и &НаСервереБезКонтекста – это объем передаваемых данных. При контекстном вызове передаются все данные и описание формы. При безконтекстном вызове передаются лишь необходимые данные, без описания. Это обеспечивает сокращение передаваемых по сети данных и, как следствие, увеличение быстродействия системы. |