1C: Предприятие. Модули и язык программирования. Часть 2
Модули в 1С: Предприятие 8.3
Модули - это те объекты, где содержится программный код.
Некоторые модули могут быть скомпилированы как на Клиенте, так и на Сервере, а некоторые только на Сервере.
Модуль может состоять из нескольких разделов. Раздел объявления переменных и основной программы существуют не для всех модулей, а раздел описания процедур и функций может быть абсолютно в любом.
Типы модулей:
- Модуль приложения
- Модуль внешнего соединения
- Модуль сеанса
- Общие модули
- Модуль формы
- Модуль объекта
- Модуль менеджера
Модуль приложения
Предназначен для того, чтобы обработать события запуска приложений и завершения его работы. Например, при запуске приложения можно загружать курсы валют из Интернета. При завершении приложения можно удостовериться у пользователя о его намерениях завершить работу. Также в модуле приложения существуют специальные обработчики, которые позволяют перехватить внешние события от оборудования.
В модуле приложения отслеживается именно интерактивный запуск системы.
Модуль формы
Предназначен для того, чтобы обработать действия пользователя. Например, описать алгоритм реакции программы при нажатии кнопки. Или в момент ввода в поле значения сразу же выполнять проверку на корректность. Кроме событий, связанных с элементами управления формы (кнопки, поля ввода) существуют события, связанные с самой формой. Можно обработать событие открытия формы и произвести некую начальную инициализацию. Существуют формы управляемые и формы обычные. В обычной форме весь код исполняется на Клиенте.
Модуль объекта
Предназначен для обработки стандартных событий. Например, событие на ввод элемента справочника, событие на запись элемента, удаление, проведение документа и т.д. Модуль данного объекта можно вызывать через контекстное меню, из Палитры свойств объекта и из окна редактирования объекта.
У некоторых объектов конфигурации не существует Модулей объектов. Это связано с особенностями самих объектов. К таким объектам относятся Константы и Регистры.
Язык программирования 1C
Язык программирования 1С не имеет названия, на официальных источниках обозначен как "встроенный язык программирования". Предварительно компилируемый предметно-ориентированным язык высокого уровня. По синтаксису напоминает VisualBasic в сочетании с языком запросов T-SQL. Создание новых классов программно в языке 1С:8.3 запрещено (нет наследования, инкапсуляции, полиморфизма).
Хорошо подходит для работы с календарем, для обработки текстовых данных, но имеет слабые математические функции, а также невнятную обработку времени.
Особенностью является двуязычный синтаксис команд: русский и английский.
Конструкция языка | Примечание |
---|---|
//Это комментарий | Так оформляются комментарии. Комментарий - это подсказки, пометки разработчика, которые помогают разобраться или вспомнить логику работы программного кода. Каждая новая строка комментария должна начинаться с символов //. |
Перем ФИО; | Явное объявление переменной. ФИО - имя переменной. |
А = 3; | Переменную можно не объявлять явно. При первом присвоении значения система создает данную переменную. |
ЭтоЧисло = 23.5+12*2; | Переменной ЭтоЧисло присваивается числовое значение. С данными числового типа можно выполнять арифметические операции: сложение, вычитание, умножение и деление. В качестве разделителя целой и дробной части используется точка! |
А = -0.123; | Числовые значения могут быть отрицательными. |
А = (2+7) * 3; // в результате А=27 | Приоритет выполнения арифметических операций: А = Сначала вычисляем 2 + 7, затем полученное значение умножаем на 3; |
В = 2 * ((2+7) - 4); // в результате В = 10 | Приоритет выполнения арифметических операций: В = Сначала вычисляем 2 + 7, затем от полученного значения отнимаем 4, затем полученное значение умножаем на 2. |
ЭтоСтрока = "Пугачева"; | Переменной ЭтоСтрока присваиваем строковое значение. Значение строкового типа пишется в кавычках. |
ФИО = "Пугачёва" + " " + "Алла" + " "+"Борисовна"; // результат: ФИО = "Пугачёва Алла Борисовна" | Сложение строк. Символ " " мы прибавляем, чтобы между фамилией, именем и отчеством были пробелы. Вторая строчка кода это просто комментарий. |
ДатаОтчета = '2013.01.01'; | Переменная, которая хранит дату. Значение типа Дата записывается в одинарных кавычках. |
НоваяДата = '2013.01.01'+86400; //НоваяДата = '2013.01.02' | К дате можно прибавлять и вычитать число. В результате к дате либо прибавится, либо отнимется число секунд. |
Процедура РассчитатьЦену (Товар) КонецПроцедуры | Простая процедура. Между словами Процедура и КонецПроцедуры записывается текст процедуры. |
Функция РассчитатьНалог(Сотрудник, НекаяДата) Возврат Налог; КонецФункции | Функция должна возвращать результат в место ее вызова. |
Если Доход > 20000 Тогда Результат = "Жить можно"; Иначе Результат = "Так жить нельзя!"; КонецЕсли; | Простое условие. После слова КонецЕсли должна быть точка с запятой, потому что так заканчивается оператор Если. |
Результат = ?(Доход > 20000, "Жить можно ", "Так жить нельзя!"); | Сокращенное Если. Краткая запись предыдущего простого условия. |
Если Доход > 20000 Тогда Результат = "Жить можно"; ИначеЕсли Доход > 10000 Тогда Результат = "Плохо"; Иначе Результат = "Так жить нельзя!"; КонецЕсли; | Множественное условие. Если первое условие не выполняется, то проверяется второе. Если ни одно из условий не выполняется то выполняется блок Иначе. |
Если (Доход > 20000) И (КодКатегории = 2) Тогда КонецЕсли; | Составное логическое выражение. |
Пока Номер <= 15 Цикл КонецЦикла; | Простой цикл Пока (с неизвестным числом повторений). После слова КонецЦикла должна быть точка с запятой, потому что так заканчивается оператор Пока. |
Для Номер = 1 По 15 Цикл КонецЦикла; | Простой цикл Для (цикл с известным числом повторений). |
Для каждого СтрокаТаблицы Из Таблицы Цикл КонецЦикла; | Еще одна разновидность цикла. Оператор цикла Для каждого предназначен для циклического обхода коллекций значений (табличных частей справочников, документов и т.д.). При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции. |
Пока <условие> Цикл Если <условие> Тогда Продолжить; КонецЕсли; КонецЦикла; | Оператор Продолжить передает управление в начало цикла. |
Пока <условие> Цикл Если <условие> Тогда Прервать; КонецЕсли; КонецЦикла; | Пока <условие> Цикл Если <условие> Тогда Прервать; КонецЕсли; КонецЦикла; |
Структура программных модулей
Обычно программный модуль состоит из трех разделов:
- Область объявление переменных;
- Область описания процедур и функций;
- Основной текст программы.
Пример
//***************** ОБЛАСТЬ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ **********************
Перем Фамилия Экспорт; //это глобальная переменная
Перем Имя, Отчество; //это переменная модуля
Перем ФИО; //это тоже переменная модуля и к ней можно обращаться
Перем Имя, Отчество; //это переменная модуля
Перем ФИО; //это тоже переменная модуля и к ней можно обращаться
//из любой процедуры и функции нашего модуля
//*************** ОБЛАСТЬ ОПИСАНИЯ ПРОЦЕДУР И ФУНКЦИЙ ****************
Процедура Процедура1( )
Перем Итог; //Итог это локальная переменная (переменная процедуры)
Перем Итог; //Итог это локальная переменная (переменная процедуры)
Итог = Фамилия+" "+Имя+" "+Отчество;
КонецПроцедуры
КонецПроцедуры
Функция Функция1( )
// операторы функции
Возврат(Фамилия + " "+ Имя);
КонецФункции
//******************* ОСНОВНОЙ ТЕКСТ ПРОГРАММЫ ***********************
Фамилия ="Иванов";
Имя = "Иван";
Отчество = "Иванович";
Имя = "Иван";
Отчество = "Иванович";
//******************************************************************************
Операции с константами
1. Чтение значения константы
Мы можем прочитать значение константы с помощью метода Получить():
Название = Константы.НазваниеОрганизации.Получить();
2. Запись нового значения константы
Для записи (установки) нового значения константы используется метод Установить():
Константы.НазваниеОрганизации.Установить("ООО Рога и копыта");
3. Работа с набором констант
Все входящие в набор константы считываются и записываются вместе в одной транзакции:
//создаем набор из трех констант
//обратите внимание, что мы лишь создаем набор констант и пока не знаем их значения
Набор = Константы.СоздатьНабор("Руководитель,НазваниеОрганизации,АдресОрганизации");
//теперь с помощью метода Прочитать() мы можем прочитать значения констант нашего набора
Набор.Прочитать(); //прочитать из базы сразу три константы
Так как при работе с набором констант мы может изменить (записать) значения всех констант набора одновременно, то сначал нам необходимо установить каждой константе новое значение, а затем с помощью метода Записать() произвести их одновременную запись.
//устанавливаем значение констант в наборе (не в базе)
Набор.Руководитель = "Иванов И.И.";
Набор.НазваниеОрганизации = "ООО Новые рога и копыта";
Набор.АдресОрганизации = "Россия, г. Москва, Кремль";
Набор.Записать(); //записываем в базу сразу значения трех констант
Набор.Руководитель = "Иванов И.И.";
Набор.НазваниеОрганизации = "ООО Новые рога и копыта";
Набор.АдресОрганизации = "Россия, г. Москва, Кремль";
Набор.Записать(); //записываем в базу сразу значения трех констант
4. Сравнение со значением константы в запросах
Иногда нам может потребоваться в запросе сравнить данные со значением константы. В данном примере мы выбираем записи из справочника Напоминания, у которых значение реквизита Код равно значению нашей константы НашеЧисло."ВЫБРАТЬ
| НашеЧ.Значение,
| Напоминания.Код,
|ИЗ
| Константа.НашеЧисло КАК НашеЧ,
| Справочник.Напоминания КАК Напоминания
|ГДЕ
| Напоминания.Код = НашеЧ.Значение"
Операции со справочниками
1. Ссылка на справочник
Для работы со справочником из какого-либо модуля требуется сначала создать ссылку на этот справочник.СпрСотрудники = Справочники.Сотрудники; // или 2 вариант
СпрДолжности = Справочники["Должности"];
2. Создание и запись нового элемента справочника
НовЭл = Справочники.Сотрудники.СоздатьЭлемент();
НовЭл.Наименование = "Петров Петр Петрович";
НовЭл.Оклад = 25000;
НовЭл.Записать(); // именно в этот момент происходит запись в базу данных
НовЭл.Наименование = "Петров Петр Петрович";
НовЭл.Оклад = 25000;
НовЭл.Записать(); // именно в этот момент происходит запись в базу данных
3. Создание и запись новой группы справочника (для иерархического справочника)
Нов = Справочники.Сотрудники.СоздатьГруппу();
Нов.Наименование = "Работающие";
Нов.Записать();
// или 2 вариант
Нов = Справочники["Сотрудники"].СоздатьГруппу();
Нов.Наименование = "Работающие";
Нов.Записать();
Нов.Наименование = "Работающие";
Нов.Записать();
// или 2 вариант
Нов = Справочники["Сотрудники"].СоздатьГруппу();
Нов.Наименование = "Работающие";
Нов.Записать();
4. Поиск элемента справочника
// если элемент найден, то он возвращается, иначе возвращается значение Неопределено
СпрСотр = Справочники.Сотрудники;
НайденныйСотр = СпрСотр.НайтиПоКоду(123); //ищем по коду
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович"); //по наименованию
НайденныйСотр = СпрСотр.НайтиПоРеквизиту("Оклад", 5000); //по реквизиту
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович"); //по наименованию
НайденныйСотр = СпрСотр.НайтиПоРеквизиту("Оклад", 5000); //по реквизиту
//далее нужно проверить найденное значение
Если НайденныйСотр = Неопределено Тогда
//элемент не найден
КонецЕсли;
//элемент не найден
КонецЕсли;
5. Удаление элемента справочника
СпрСотр = Справочники.Сотрудники;
СпрСотр.Удалить(); //непосредственное удаление текущего элемента справочника
СпрСотр.УстановитьПометкуУдаления (Истина); //пометка на удаление
СпрСотр.УстановитьПометкуУдаления (Ложь); //снять пометку на удаление
СпрСотр.УстановитьПометкуУдаления (Ложь); //снять пометку на удаление
//можно проверить, помечен ли элемент на удаление
//свойство ПометкаУдаления имеет тип Булево (Истина или Ложь)
//свойство ПометкаУдаления имеет тип Булево (Истина или Ложь)
Пометка = СпрСотр.ПометкаУдаления; //обратите внимание: это свойство
Если Пометка = Истина Тогда
//элемент помечен на удаление
КонецЕсли;
Если Пометка = Истина Тогда
//элемент помечен на удаление
КонецЕсли;
6. Перебор элементов справочника
Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() = 1 Цикл // начало перебора элементов справочника в цикле
//действия с очередным элементом ...
Сообщить("Сотрудник " + Выборка.Наименование);
КонецЦикла;
Пока Выборка.Следующий() = 1 Цикл // начало перебора элементов справочника в цикле
//действия с очередным элементом ...
Сообщить("Сотрудник " + Выборка.Наименование);
КонецЦикла;
7. Родитель.
Перебор элементов внутри группы. Группа в терминах 1С - это "родитель".СпрСотр = Справочники.Сотрудники;
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию("Работающие");
Выборка = СпрСотр.Выбрать(ГруппаРаботающие);
Пока Выборка.Следующий() = 1 Цикл
//действия с очередным элементом
Сообщить("Сотрудник " + Выборка.Наименование);
КонецЦикла;
8. Владелец.
Перебор элементов справочника, принадлежащих элементу другого справочника. Один справочник подчинен другому справочнику, например справочник НалоговыеЛьготы подчинен справочнику Сотрудники.Выборка = Справочники.НалоговыеЛьготы.Выбрать( ,Сотрудник); //тут сотрудник - ссылка на элемент справочника сотрудники
Пока Выборка.Следующий() = 1 Цикл
//действия с очередным элементом
Сообщить("льгота " + Выборка.Наименование);
КонецЦикла;
9. Транзакция
При создании множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное создание всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). При использовании транзакций действие будет либо выполнено целиком (созданы все элементы справочника), либо не выполнено совсем (в случае какого-либо сбоя не будет создано ни одного нового элемента, все останется также, как до запуска транзакции). Транзакции широко применяются в банковской сфере. Ведь никто не хочет, чтобы при отправке денег, они благополучно списались с вашего счета, но из-за какого-либо сбоя не дошли до адресата.
СпрСотр = Справочники.Сотрудники;
НачатьТранзакцию();
НачатьТранзакцию();
Для Ном = 1 По 100 Цикл
Нов = СпрСотр.СоздатьЭлемент();
Нов.Наименование = "Новый " + Строка(Ном);
Нов.Записать();
КонецЦикла;
Нов = СпрСотр.СоздатьЭлемент();
Нов.Наименование = "Новый " + Строка(Ном);
Нов.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Комментарии
Отправить комментарий