Учебно-методические материалы для студентов кафедры АСОИУ

Тема 3.6 Входной язык 1С. Общий синтаксис

Встроенный язык системы 1С: Предприятие 7.7 предназначен для описания алгоритмов функционирования прикладной задачи. Синтаксис языка напоминает смесь Паскаля и Бэйсика, причем на русском языке.

Язык 1С поддерживает структурное программирование и вся программа состоит из набора модулей, содержащих исходный код - операторы языка и комментарии.

Программные модули

Программные модули в конфигурации не являются самостоятельными программами, поскольку являются частью всей конфигурации задачи. Программный модуль – это «контейнер» для размещения текстов процедур и функций, вызываемых системой во время исполнения в определенные моменты времени.

Место размещения конкретного программного модуля предоставляется конфигуратором в тех точках конфигурации задачи, которые требуют описания специфических алгоритмов функционирования.

Виды программных модулей:

Каждый отдельный модуль воспринимается системой как единое целое, поэтому все процедуры и функции программного модуля выполняются в одном контексте.

Структура программного модуля

Программный модуль 1С состоит из следующих разделов: Разделы не требуют явного описания с использованием каких-либо ключевых слов (в отличие от, например, языка Паскаль), однако нарушение структуры модуля приведет к ошибке компиляции.

Контекст выполнения программного модуля

Глобальный контекст: Локальный контекст образуется тем конкретным местом конфигурации задачи, для которого использован этот конкретный модуль.

Формат операторов

Общий синтаксис операторов языка 1С:Предприятие:
[~метка:]Оператор [(Параметры)][ДобавочноеКлючевоеСлово];

Идентификаторы

Именем переменной, процедуры или функции может быть любая последовательность букв, цифр и знаков подчеркивания, начинающаяся с буквы или с подчеркивания. Регистр букв не учитывается. Вновь создаваемые имена не должны совпадать с уже существующими именами, доступными на момент выполнения модуля.

Типизация переменных в языке не жесткая, т.е. тип переменной определяется ее значением. Чтобы определить, является ли слово зарезервированным, нужно воспользоваться поиском в синтакс-помощнике: установить курсор на проверяемое слово и одновременно нажать клавиши СTRL+F1. Таким же способом можно узнать синтаксис системной процедуры или функции: количество и назначение параметров, значения по умолчанию.

Пример правильных идентификаторов в 1C:

// Определение переменных Перем ЭтоПеременная; Перем ЭтоВтораяПеременная; // Процедуры и функции Процедура ЭтоПроцедура() // текст процедуры КонецПроцедуры Функция ЭтоФункция() // текст функции КонецФункции // Раздел основной программы ЭтоПременная = "123";

Процедуры и функции программного модуля

Синтаксис объявления процедуры:
Процедура <Имя_проц>([Знач] <Парам1> [=<ДефЗнач>] , …) [Экспорт] // Объявления локальных переменных; // Операторы; … [Возврат;] // Операторы; КонецПроцедуры

После ключевого слова «КонецПроцедуры» точка с запятой не ставится. Ключевое слово «Знач» означает, что переменные передаются по значению. Ключевое слово «Экспорт» имеет смысл только в глобальном модуле и означает, что процедура будет доступна в любом программном модуле. Функция, в отличие от процедуры должна возвращать значение

Для передачи локального контекста используется ключевое слово «Контекст» в качестве параметра.

Пример. Допустим, у нас есть несколько различных документов, причем у всех есть реквизит "Склад". В каждом программном модуле формы редактирования документа нужна процедура выбора склада. В глобальном программном модуле напишем процедуру (листинг 36):

Листинг 36. Пример описания процедуры

Процедура УстСклада(Конт) Экспорт // создаем объект типа "справочник" Скл = СоздатьОбъект("Справочник.Склады"); // вызываем диалог для выбора элемента Справочника Скл.Выбрать("Выберите Склад", ""); Если Скл.Выбран() = 1 Тогда // если в диалоге элемент Справочника был выбран, // то присваиваем его значение реквизиту Документа, // который доступен по локальному контексту Конт.Склад = Скл.ТекущийЭлемент(); КонецЕсли; КонецПроцедуры

Здесь переменная Конт является формальным параметром, которому при вызове процедуры будет присвоен локальный контекст. В данном примере обращение к реквизитам и методам локального контекста происходит «через точку» после идентификатора Конт, например:

Конт.Склад = Скл.ТекущийЭлемент();

Теперь в любом программном модуле конфигурации (в данном примере в любом Модуле формы документа) для выбора склада можно вызвать процедуру, передав ей свой локальный контекст в качестве параметра:

УстСклад(Контекст);

С примерами программных модулей можно ознакомиться в типовой конфигурации «Бухгалтерский учет».

Типы данных

В системе поддерживаются базовые и агрегатные типы данных. К базовым типам относятся числа, строки и даты. Агрегатные типы данных – это специализированные типы данных, предназначенные для работы с объектами 1С:Предприятия. Агрегатными типами данных называются следующие типы данных: Следующие типы данных доступны только при наличии компоненты «Бухгалтерский учет»: Каждый агрегатный тип данных, как правило, имеет набор атрибутов и методов. Атрибуты по свойствам напоминают переменные, т. е. им можно присваивать или читать их значения. Методы – это те действия, которые может выполнять агрегатный тип данных. Методы могут иметь или не иметь возвращаемое значение. Если метод имеет возвращаемое значение, то он может размещаться в правой части оператора присваивания, в выражениях, в описании фактических параметров других вызываемых методов, процедур или функций.

Типичная последовательность работы с объектом агрегатного типа данных выглядит следующим образом:

  1. С помощью функции СоздатьОбъект создается объект агрегатного типа данных, и какой-либо переменной присваивается ссылка на него;
  2. Объект позиционируется на нужном элементе данных;
  3. Производятся различные манипуляции с объектом агрегатного типа данных через вызовы методов и обращения к его атрибутам.
  4. В случае, если объект агрегатного типа данных больше не нужен, он может быть отсоединен от переменной посредством переприсваивания переменной какого-либо значения базового типа (например, числа 0). Отсоединение объекта выполнять не обязательно.
Пример:
// Создаем объект Сотр = СоздатьОбъект(“Справочник.Сотрудники”); // Позиционируем созданный объект по наименованию Сотр.НайтиПоНаименованию(“Петров”); Если Сотр.Выбран()=1 Тогда Сообщить(“Петров ”+Строка(Сотр.Оклад)); Иначе Сообщить(“Петров не найден”); КонецЕсли;

Для преобразования значения одного базового типа в другой используются функции Строка(<Значение>), Число(<Значение>), Дата(<Значение>).


Символы

Символ Значение
[ ] В квадратных скобках заключаются необязательные синтаксические элементы.
( ) Круглые скобки заключают в себе список параметров.
| Вертикальной линией разделяются синтаксические элементы, среди которых нужно выбрать только один.



Специальные символы, используемые в исходном тексте

// Двумя знаками «косая черта» начинается комментарий. Комментарием считается весь текст от знака "//" до конца текущей строки.
| Вертикальная черта в начале строки используется только в строковых константах и означает, что данная строка является продолжением предыдущей (перенос строки), (см. «Строковые константы»).
~ Знаком тильда начинается метка оператора.
: Двоеточием заканчивается метка оператора.
; Точка с запятой является символом разделения операторов.
( ) В круглые скобки заключается список параметров методов, процедур и функций.
[ ] В квадратные скобки заключается размерность массивов.
, Запятая разделяет параметры в списке параметров методов, процедур и функций.
" " В двойные кавычки заключаются строковые константы.
' ' В одинарные кавычки заключаются константы даты.
. Десятичная точка в числовых константах. Разделитель, используемый в описаниях агрегатных типов данных.
+ Символ «плюс» обозначает операцию сложения.
- Символ «минус» обозначает операцию вычитания.
* Символ «звездочка» обозначает операцию умножения.
/ Символ «косая черта» обозначает операцию деления.
> Правая угловая скобка обозначает логическую операцию «больше».
>= Логическая операция «больше или равно».
< Левая угловая скобка обозначает логическую операцию «меньше».
<= Логическая операция «меньше или равно».
= Знак равенства обозначает присвоение или логическую операцию «равно».
<> Две угловые скобки обозначают логическую операцию «не равно».


Управляющие операторы

Для управления логикой выполнения программы используются логические выражения и управляющие операторы. Логическое выражение записывается с помощью символов сравнения = (равно), <> (не равно), > (больше), < (меньше), <= (меньше либо равно), >=(больше или равно), при этом сравнение производится только над значениями одинаковых типов (то есть нельзя, например, сравнивать число и строку). Из нескольких сравнений можно построить более сложное условие с помощью булевых операций «и», «или», «не». Порядок сравнений можно определять с помощью круглых скобок.

Оператор ветвления

Если <Логическое_выражение> Тогда

ИначеЕсли <Логическое_выражение> Тогда

Иначе

КонецЕсли;

Циклы

Пока <Логическое_выражение> Цикл … [Прервать] … [Продолжить] … КонецЦикла; Для <Имя_переменной> = <Выражение1> По <Выражение2> Цикл … [Прервать] … [Продолжить] … КонецЦикла;

Величина приращения счетчика при каждом выполнении цикла равна 1. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.

Обработка ошибок

Попытка … [Исключение] … КонецПопытки;

Работа с транзакциями

Транзакции применяются для выполнения длительных и критических для функционирования системы операций. В некоторых случаях система сама начинает транзакцию и специально описывать ее не надо. Например, это происходит при проведении документов: так как в программе могут работать одновременно несколько пользователей, то при записи документа (например, продажа товара со склада) недопустима ситуация «одновременного» проведения двух документов – все равно один из них должен быть проведен раньше, чем другой (иначе можно продать один и тот же товар два раза!). Поэтому система выполняет проведение документа в режиме транзакции, – база данных становится недоступной для записи остальных пользователей. Естественно, что при большом количестве пользователей, которые активно вводят данные в программу, работа системы замедляется. Одним из решений этой проблемы может быть установка версии для SQL, в этом случае процедуры записи выполняется на отдельном компьютере (сервере базы данных) с помощью MS SQL Server 7.0.

В остальных случаях транзакцию начать и зафиксировать с помощью следующих функций:

НачатьТранзакцию(); … [ОтменитьТранзакцию();] … ЗафиксироватьТранзакцию();

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

Работа с объектом «СписокЗначений»

Объект «СписокЗначений» применяется для создания динамических списков (не сохраняемых в БД), которые могут отображаться в диалоговых формах (элемент «Список» и «Поле со списком») для выбора одного или нескольких значений из списка. Список создается с помощью функции СоздатьОбъект(«СписокЗначений»), либо визуально при добавлении на форму элементов «Список» или «Поле со списком».

Элемент списка содержит три поля – значение, представление и пометка. Значение может принимать значение любого типа, представление же всегда имеет тип «Строка». В форме диалога отображается представление (если оно задано). Пометка означает, помечено данное значение или нет.

Основные функции работы со списком следующие:

  • ДобавитьЗначение(<Знач>,<Строка>)
  • НайтиЗначение(<Знач>)
  • ПолучитьЗначение(<Позиция>,<Перем>)
  • Получить(<Строка>)
  • УдалитьЗначение(<Позиция>,<Колич>)
  • УдалитьВсе()
  • РазмерСписка()
  • Сортировать(<Направление>)
  • СортироватьПоПредставлению(<Направление>)
  • Принадлежит(<Знач>)
  • Пометка (<Позиция>,<Отметка >)
  • ИзСтрокиСРазделителями(<Строка>)
  • ВСтрокуСРазделителями()

Работа с объектом «ТаблицаЗначений»

Объект «ТаблицаЗначений» применяется для создания динамических массивов (не сохраняемых в БД), которые могут отображаться в диалоговых формах (элемент «Таблица значений»). Таблица значений создается с помощью функции СоздатьОбъект(«ТаблицаЗначений»), либо визуально при добавлении  на форму элементов «Таблица значений». Пример.
Т=СоздатьОбъект(«ТаблицаЗначений») // Определяем идентификаторы и параметры колонок Т.НоваяКолонка(«Товар», «Строка», 30,, «Наименование товара», 20); Т.НоваяКолонка(«Цена», «Число», 10, 2 , «Цена», 10); Т.НоваяКолонка(«Количество», «Число», 10, 3, «Кол.», 10); Т.НоваяКолонка(«Сумма», «Число», 15, 3, «Сумма», 10); // Создаем новую строку Т.НоваяСтрока(); Т.Товар= «Сыр»; Т.Цена= 50; Т.Количество= 10; Т.Сумма= Т.Цена* Т.Количество;

Основные функции работы с таблице следующие:

  • НоваяКолонка(<Идентификатор>,<Тип>,<Длина>,<Точность>,<Заголовок>,<Ширина>, <Формат>,<Положение>)
  • НоваяСтрока()
  • УдалитьСтроку(<НомерСтроки>)
  • УдалитьСтроки()
  • ПолучитьСтрокуПоНомеру(<НомерСтроки>)
  • ПолучитьЗначение(<НомерСтроки>,<Колонка>) <Колонка> - это либо номер колонки либо идентификатор колонки
  • НайтиЗначение(<Знач>,<Строка>,<Колонка>) <Строка> – идентификатор переменной, в которую возвращается номер найденной строки, <Колонка> – идентификатор переменной, в которую возвращается колонка найденной строки.
  • ВыбратьСтроки() – открыть выборку строк из таблицы
  • ПолучитьСтроку() – получить следующую строку из выборки
  • Сортировать(<Колонки>) <Колонки> - это строка, содержащая список идентификаторов или номеров колонок, разделенных запятой, по которым выполняется сортировка строк таблицы значений
  • Свернуть(<ГрупКолонки>,<СумКолонки>) <ГрупКолонки> - это строка, содержащая список идентификаторов или номеров колонок, разделенных запятой, по которым выполняется группировка строк таблицы значений (то есть если имеется несколько строк с одинаковыми значениями в группируемых колонках, то в результате свертки останется одна такая строка). <СумКолонки> - это строка, содержащая список идентификаторов или номеров колонок, разделенных запятой, в которых выполняется суммирование значений строк таблицы значений (то есть, если группируется несколько строк, то значения суммируемых колонок будут складываться).

Запуск внешних приложений из 1С.

Для запуска внешнего приложения можно использовать функцию ЗапуститьПриложение(). Эта функция использует средства OLE-Automation и позволяет использовать серверы автоматизации в приложениях 1С. Небольшой пример интеграции 1С и Excel приведен в листинге 37.

Листинг 37. Запуск внешнего приложения из программы 1С

Окно = СоздатьОбъект(«Excel.Application»); Окно.Visible = 1; // делаем окно видимым Окно.Caption = “Отчет”; // задаем имя окну Окно.Workbooks.Add(); // создаем новую рабочую книгу Для Н=1 По 10 Цикл Ячейка = Окно.Cells(Н,1); Ячейка.Value = Н; КонецЦикла; 

CC-BY-CA Анатольев А.Г., 23.04.2014