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;
НовЭл.Записать(); // именно в этот момент происходит запись в базу данных

3. Создание и запись новой группы справочника (для иерархического справочника)

Нов Справочники.Сотрудники.СоздатьГруппу();
Нов.Наименование "Работающие";
Нов.Записать();  
// или 2 вариант 
Нов Справочники["Сотрудники"].СоздатьГруппу();
Нов.Наименование "Работающие";
Нов.Записать();

4. Поиск элемента справочника

// если элемент найден, то он возвращается, иначе возвращается значение Неопределено
СпрСотр Справочники.Сотрудники;
НайденныйСотр СпрСотр.НайтиПоКоду(123);   //ищем по коду
НайденныйСотр СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович"); //по наименованию
НайденныйСотр СпрСотр.НайтиПоРеквизиту("Оклад", 5000);    //по реквизиту
//далее нужно проверить найденное значение
Если НайденныйСотр = Неопределено Тогда
    //элемент не найден
КонецЕсли;

5. Удаление элемента справочника

СпрСотр Справочники.Сотрудники;
СпрСотр.Удалить(); //непосредственное удаление текущего элемента справочника
СпрСотр.УстановитьПометкуУдаления (Истина); //пометка на удаление
СпрСотр.УстановитьПометкуУдаления (Ложь); //снять пометку на удаление
//можно проверить, помечен ли элемент на удаление
//свойство ПометкаУдаления имеет тип Булево (Истина или Ложь)
Пометка СпрСотр.ПометкаУдаления//обратите внимание: это свойство
Если Пометка = Истина Тогда
    //элемент помечен на удаление
КонецЕсли;

6. Перебор элементов справочника

Выборка Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() = Цикл // начало перебора элементов справочника в цикле
//действия с очередным элементом ...
Сообщить("Сотрудник " Выборка.Наименование);
КонецЦикла;

7. Родитель. 

Перебор элементов внутри группы. Группа в терминах 1С - это "родитель".

СпрСотр Справочники.Сотрудники;
ГруппаРаботающие СпрСотр.НайтиПоНаименованию("Работающие");
Выборка СпрСотр.Выбрать(ГруппаРаботающие);
Пока Выборка.Следующий() = Цикл
   //действия с очередным элементом
   Сообщить("Сотрудник " Выборка.Наименование);
КонецЦикла;

8. Владелец. 

Перебор элементов справочника, принадлежащих элементу другого справочника. Один справочник подчинен другому справочнику, например справочник НалоговыеЛьготы подчинен справочнику Сотрудники.

Выборка Справочники.НалоговыеЛьготы.Выбрать( ,Сотрудник); //тут сотрудник - ссылка на элемент справочника сотрудники
Пока Выборка.Следующий() = Цикл
   //действия с очередным элементом
   Сообщить("льгота " + Выборка.Наименование);
КонецЦикла;

9. Транзакция 

При создании множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное создание всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). При использовании транзакций действие будет либо выполнено целиком (созданы все элементы справочника), либо не выполнено совсем (в случае какого-либо сбоя не будет создано ни одного нового элемента, все останется также, как до запуска транзакции). Транзакции широко применяются в банковской сфере. Ведь никто не хочет, чтобы при отправке денег, они благополучно списались с вашего счета, но из-за какого-либо сбоя не дошли до адресата.

СпрСотр Справочники.Сотрудники;
НачатьТранзакцию();
Для Ном По 100 Цикл
   Нов СпрСотр.СоздатьЭлемент();
   Нов.Наименование "Новый " + Строка(Ном);
   Нов.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();

Комментарии

Популярные сообщения