График : Пн-Пт: 9.30 - 18.00
На данную тему уже написаны многочисленные и очень полезные статьи, книги и публикации. В этой же статье вкратце описаны основные моменты, наиболее важные для понимания общей концепции 1С:Предприятие 8.
Во-первых, «1С:Предприятие» - это «экономическое ПО», т.е. программные продукты предназначенные прежде всего для управления бизнеса. Во-вторых, 1С:Предприятие - это мощная система управления базами данных, т.е. к этой системы применимы все правила работы с БД. С точки зрения программиста платформу «1С:Предприятие 8» можно представить следующими способами:
Объекты могут быть как составными частями метаданных (описание структуры и свойств), так и вспомогательными элементами. Так, например, объект метаданных содержит информацию о дне рождения сотрудника, а для доступа и редактирования пользователем этой информации служит вспомогательный объект Форма, которая включает средства управления, в т.ч. и элемент Дата рождения.
Таблица БД необязательно является единым объектом и ее полями невозможно манипулировать на прямую, поэтому табличные данные доступны только для чтения, а обращение к ним осуществляется посредством запросов системы. Таким образом, любые действия над базой данных производится в рамках объектной модели.
Основное отличие версий 8.х заключается в возможности организации трехзвенной архитектуры - "клиент" - "сервер приложений 1С" - "сервер баз данных". Таким образом организация существенно облегчает процесс масштабирования и использования в предприятиях с большим числом пользователей. Мы более подробно остановимся на каждой из версий и особенности реализации аппаратного обеспечения для разного типа компаний.
Итак, с помощью документации к платформе «1С:Предприятие» из базовой поставки, вы установили систему с пустой конфигурацией.
Далее откройте дерево конфигурации (меню Конфигурация - Открыть Конфигурацию).
То что вы видите в дереве метаданных - это и есть составляющие метаданные типы объектов, они определяют структуру БД. Иногда язык программирования 1С называют объектно-ориентированным, хотя правильней будет назвать его «почти объектно-ориентированным. Дерево метаданных можно рассматривать как классы объектов и они жестко заданы. Встроенными средствами языка невозможно создать новые типы объектов, но можно создать неограниченное количество объектов определенного класса с уникальными свойствами.
На рисунке изображены свойства объекта Справочник. На закладке Данные можно создать описание структуры базы данных, для этого в свойствах объекта необходимо указать необходимые табличные части и реквизиты. В большинстве случаев объект уже имеет определенный реквизитный состав, например, справочник уже содержит таблицу с реквизитами Код и Наименование, длина которых можно настроить на закладке Данные.
Помимо структуры базы данных, в справочнике содержится описание интерактивной работы пользователя, которое заключается в формировании форм для редактирования и просмотра записей, и в описании событий форм (запись, чтение, открытие, закрытие и т.д.). Свойства и число форм являются только свойством конфигурации и никак не влияют на структуру базы данных.
В модуле описываются неинтерактивные события объекта. Структуру объекта метаданных можно представить в виде следующей формы:
На данной схеме впервые представлены модули. Именно в них системы описано поведение системы при различных событиях.
Общие модули. Эти модули включают общие для всей системы функции и процедуры (но могут содержать и некоторые локальные процедуры и функции доступные в пределах только этого модуля), имеют доступ к процедурам и функциям другого общего модуля, не содержат область инициализации и описание переменных, основного текста программы. Общие модули подразделяются на глобальные и не глобальные. Функции и процедуры, описанные в глобальных модулях могут вызываться просто по имени, а описанные в неглобальных модулях вызываются путем обращения: НазваниеМодуля.НазваниеПроцедуры().
Специализированные модули приложения. К ним относятся модуль внешнего соединения, модуль приложения и модуль сеанса. Они предназначены для COM-событий или интерактивных событий старта и завершения работы системы. Эти модули могут вызывать функции и процедуры общих модулей.
Модули объектов. Они принадлежат объектам, имеют описание функций и процедур для манипулирования определенным объектом, могут вызывать процедуры и функции общих модулей.
Модули форм. Включают описание событий деятельности пользователя в форме. Могут вызывать функции и процедуры как модуля объекта, так и общих модулей.
Следует отметить, что в модуле любого объекта существует возможность описывать "Экспортные" процедуры и функции и обращаться к ним, но для этого сначала необходимо "получить" сам объект.
Практически в любом модуле (есть исключения) можно выделить несколько частей:
Область объявления переменных. Эдесь находится описание переменных, «областью жизни» которых является весь модуль. Таким образом, значение переменной доступно из любой процедуры и функции модуля.
Область описания функций и процедур. Правила описания процедур и функций не зависят от места вызова. Тем не менее рекомендуется процедуры-обработчики событий описывать в порядке их вызова системой ( открытие, запись, закрытие). Внутри функций и процедур можно объявлять локальные переменные, причем их объявление должно находиться до их основного текста.
Область инициализации переменных (основной текст программы). За описанием процедур и функций находится текст программы, вызов которого производится непосредственно при запросе к текущему модулю. В этой части может находиться тот текст программы, который, например, должен быть выполнен, при открытии объекта. Но не стоит забывать что платформа «1С:Предприятие 8» представляет собой «событийный» язык, т.е. вызов определенных процедур и функций будет организуется системой самостоятельно, а в этой части модуля обычно только присваивают значения переменным, которые были описаны в первой части модуля.
Все эти части модуля не являются обязательными. В общих модулях нельзя объявлять и инициализировать переменные, таким образом, общие модули - это своеобразные «репозитарии общих процедур и функций».
Рассмотрим основные синтаксические конструкции. Синтаксис в системе 1с двуязычный: английский и русский, но все типовые конфигурации и большая часть авторских решений написаны русским синтаксисом.
Явное объявление переменных.
Для объявления переменных служит оператор Перем, за которым следует имя переменной, соответствующее правилам идентификаторов системы (только символы, цифры и знаки подчеркивания, не превышает 255 знаков, не начинается с цифры). Оператор завершается точкой с запятой (";").
Перем ИмяПеременной;
В самом простом случае описание процедуры заключается в указании ее имени, перед которым стоит ключевое слово Процедура. После имени в атрибутных скобках могут быть указаны принимаемые атрибуты переменных, после описания процедуры КонецПроцедуры. В конце описания процедуры точка с запятой не ставится.
Процедура ИмяПроцедуры()
КонецПроцедуры
Вызвать процедуру также можно указанием ее имени с атрибутными скобками и точкой с запятой в конце. Например:
ИмяПроцедуры();
Для получения атрибутов, в скобках указываются названия переменных. Если они определены на уровне модуля, в них попадет атрибут, заменив собой переменную. В противном случае, описанные для приема параметров атрибуты объявляют свои переменные уровня процедуры.
Параметры передаются «по ссылке»,т.е. принимающий атрибут принимает не значение, а саму переменную.
Пример описания процедуры и атрибутами и ее вызов:
Процедура МояПроцедура(Парам1, Парам2)
КонецПроцедуры
МояПроцедура(10,20);
Если необходимо принять атрибут по значению, то в атрибутных скобках указывается ключевое слово ЗНАЧ до названия принимаемой переменной :
Процедура МояПроцедура(Парам1, ЗНАЧ Парам2)
КонецПроцедуры
Кроме того, для принимаемых атрибутов можно указать значение по умолчанию, то есть, в случае если значение не будет передано, переменная примет это значение:
Процедура МояПроцедура(Парам1, Парам2 = 0)
КонецПроцедуры
Для вызова процедуры из других модулей системы, в описании за атрибутными скобками ставится ключевое слово ЭКСПОРТ:
Процедура МояПроцедура(Парам1, Парам2 = 0) Экспорт
КонецПроцедуры
Для прерывания процедуры используют оператор Возврат внутри нее. Все это также относится к функциям. Для описания функций служат ключевые слова Функция и КонецФункции. В отличие от процедуры, функция всегда должна возвращать значение в точку вызова, для чего используется оператор Возврат.
Функция МояФункция(Парам1, Знач Парам2, Парам3 = 0) Экспорт
Возврат Парам3;
КонецФункции
Рассмотрим основные типы значений. К ним относятся примитивные, служебные типы и коллекции значений.
Булевый тип переменных
Переменная с булевым типом принимает одно из 2-х значений: Истина или Ложь. Тип переменной устанавливается в момент присвоения ей значения. значение переменной присваивается знаком равно: «=». Если переменная не была объявлена до присвоения ей значения, она может быть объявлена в момент присвоения ей значения, в этом случае объявление переменных называют неявным.
Переменная1 = Истина; Переменная2 = Ложь;
Для булевого типа значений возможно только одна операция - инвертирование ключевым словом НЕ:
Переменная3 = НЕ Переменная2;
Для присвоения числового значения переменной не используется никаких специальных знаков, просто указывается присваиваемое число. Например:
// *** Переменная4 = 5; Переменная5 = -124; Переменная6 = 0.789; // ***
Для числового типа данных доступны все основные математические операции:
// *** Переменная7 = 5 + 10; Переменная8 = 3 - 48.36; Переменная9 = 29 * 45; Переменная10 = 16 / 8; // ***
Также имеется оператор получения остатка от деления: «%» (процент):
// *** Переменная11 = 8%3; // ***
В результате переменная примет значение 2 (остаток от деления 8 на 3).
Переменная, содержащая дату всегда хранит время с точностью до секунды! Обозначается дата и время знаком « ' » (одинарными кавычками). Возможны различные варианты написания:
// *** Переменная12 = '20120806'; Переменная13 = '2012-08-06'; Переменная14 = '20120806203000'; Переменная15 = '2006-11-06 20:00:00'; // ***
Если время не указано, система вставляет нули. Например, переменная 12 хранит ноль часов ноль минут ноль секунд. С датами можно производить основные математические операции, при чем результатом операции будет дата, отличающаяся от исходной на указанное число секунд.
// *** Переменная16 = '20101123' - '20081103'; Переменная17 = '20071015' + 85320; // ***
Строковый тип значения может содержать все доступные символы, для их описания используется Знак двойные кавычки: «"». Возможно описание строки, состоящей из нескольких строк, при этом для описания новой строки в начале указывают знак «|», а кавычки ставят только в начале первой и конце последней строки:
// *** Переменная18 = "Любая строка"; Переменная19 = "Первая строка |Вторая строка |Третья строка"; // ***
Для строк доступна только одна операция - конкатенация (объединение строк):
// *** Переменная20 = "Строка 1" + "Строка 2"; // ***
Служебные типы представляют собой следующие типы переменных:
Неопределено - этот тип чаще всего возвращают методы объектов, а также до присвоения переменной значения, она имеет тип «Неопределено».
NULL - этот тип значения используется при запросах к базе данных, когда система не возвращает значение и не обнаруживает его в таблице.
К этим типам значений можно отнести:
Массив
Таблица значений
Список значений
Соответствие
Структура
Условия
Основа любого алгоритма - ветвления и условия. Условный оператор «Если» имеет следующее описание:
// *** Если <условие> Тогда КонецЕсли; // ***
Условие - это логическое выражение, которое может содержать различные математические знаки =, <>, <, >, <=, >= , и возвращающее булевый тип значения:
Ветвления во встроенном языке можно указывать непосредственно в условном операторе, в конструкции «Иначе»:
// *** Если 2 = 0 Тогда Б = 2; Иначе Б = 14; КонецЕсли; // ***
Существует еще одна возможность ветвления с условием:
// *** Если 2 = 0 Тогда А = 2; ИначеЕсли 2 = 4 Тогда А = 5; ИначеЕсли 25 < 60 Тогда А = 87; Иначе А = 0; КонецЕсли; // ***
Конструкция «ИначеЕсли» может повторяться неограниченное число раз.
Циклы
Можно выделить несколько конструкций цикла:
Цикл с условием:
// *** Пока <Условие> цикл КонецЦикла; // ***
Операции цикла будут повторяться до тех пор, пока выполняется условие, например:
// *** Б = 0; Пока А < 50 Цикл Б = Б + 1; КонецЦикла; // ***
Данный цикл будет выполнен 50 раз.
Цикл со счетчиком.
// *** Для А = 0 По 50 Цикл КонецЦикла; // ***
Цикл выполнится от 0 до 50 раз (шаг всегда равен единице) т.е. 51.
Плюс еще один цикл - обхода коллекций.
// *** Для каждого ПеременнаяПринимающаяЭлементКоллекции Из Коллекция Цикл КонецЦикла; // ***
В цикле каждый элемент последовательно передается в описанную переменную.
Вернемся к нашему справочнику. Найдите модуль объекта (на последней закладке в свойствах справочника ). Модуль можно разделить комментариями на три части:
*** // Область объявления переменных Перем Переменная1; // Область описания процедур и функций Функция Факториал(Парам1) Если Парам1 <= 0 Тогда Возврат 0; КонецЕсли; РезультатФункции = 1; Для Ном = 1 По Парам1 Цикл РезультатФункции = РезультатФункции * Ном; КонецЦикла; Возврат РезультатФункции; КонецФункции // Область инициализации переменных Переменная1 = 5; ФакториалИзЧисла = Факториал(Переменная1); Сообщить(ФакториалИзЧисла); ***
Небольшой комментарий к данному тексту: Символом // (двойной слеш) обозначает начало комментария. Методом «Сообщить» выводится пользователю то, что было передано в виде параметра, (в нашем случае это факториал числа 5).
Запустите систему нажатием F5 на клавиатуре, затем откройте Справочник1. Ничего не произойдет, и это нормально, т.к. вы открыли только форму списка справочника, а код программы расположен в модуле объекта. То есть вам для начала необходимо этот объект получить. В форме необходимо или создать новый элемент, или открыть уже существующий, в этом случае Вы будете работать с объектом «справочник» и модуль выполнится.