Урок 6. Процедуры, функции и модули
Программа из одной процедуры быстро разрастается. Процедуры и функции делят код на части с понятными именами, а модули и директивы решают, где этот код выполняется — на компьютере пользователя или на сервере.
Процедура и функция
Процедура выполняет действия, функция ещё и возвращает значение словом Возврат:
&НаКлиенте
Функция СуммаСоСкидкой(Сумма, Скидка)
Возврат Сумма - Сумма * Скидка / 100;
КонецФункции
&НаКлиенте
Процедура ПоказатьИтог(Сумма)
Сообщить("К оплате: " + Сумма);
КонецПроцедуры
&НаКлиенте
Процедура Пример(Команда)
Итог = СуммаСоСкидкой(200, 10);
ПоказатьИтог(Итог);
КонецПроцедурыК оплате: 180Порядок в модуле не важен: процедура может вызывать ту, что описана ниже. Но имена в одном модуле не повторяются. Выйти из процедуры раньше конца можно словом Возврат; без значения.
Параметры: по ссылке и Знач
По умолчанию параметр передаётся по ссылке: если процедура изменит его, изменится и переменная того, кто её вызвал. Слово Знач перед параметром передаёт копию значения:
&НаКлиенте
Процедура Удвоить(Число1, Знач Число2)
Число1 = Число1 * 2;
Число2 = Число2 * 2;
КонецПроцедуры
&НаКлиенте
Процедура Пример(Команда)
А = 5;
Б = 5;
Удвоить(А, Б);
Сообщить("А = " + А + ", Б = " + Б);
КонецПроцедурыА = 10, Б = 5Параметру можно задать значение по умолчанию — тогда при вызове его можно не указывать:
Функция Приветствие(Имя, Обращение = "Здравствуйте")
Возврат Обращение + ", " + Имя + "!";
КонецФункцииВызов Приветствие("Анна") вернёт «Здравствуйте, Анна!», а Приветствие("Анна", "Добрый день") — «Добрый день, Анна!».
Клиент и сервер
1С:Предприятие работает в двух местах. Клиент — программа на компьютере пользователя: показывает формы, реагирует на кнопки. Сервер — там, где лежат данные: в файловом варианте его роль выполняет та же программа, в клиент-серверном — отдельный сервер 1С:Предприятия.
Работа с данными — справочники, документы, запросы — доступна только на сервере. Поэтому в модуле формы перед каждой процедурой стоит директива:
| Директива | Где выполняется |
|---|---|
&НаКлиенте | на клиенте: работа с формой, сообщения, диалоги |
&НаСервере | на сервере, с данными формы |
&НаСервереБезКонтекста | на сервере, без данных формы — быстрее, параметры передаются явно |
Обычная связка: обработчик кнопки на клиенте вызывает серверную процедуру, а та работает с данными.
&НаСервереБезКонтекста
Функция КоличествоТоваров()
Количество = 0;
Выборка = Справочники.Товары.Выбрать();
Пока Выборка.Следующий() Цикл
Количество = Количество + 1;
КонецЦикла;
Возврат Количество;
КонецФункции
&НаКлиенте
Процедура Пример(Команда)
Сообщить("Товаров в справочнике: " + КоличествоТоваров());
КонецПроцедурыКаждый вызов сервера — передача данных по сети. Не вызывайте сервер в цикле по одной строке: соберите всё нужное за один вызов.
Код в этом примере обращается к справочнику Товары из урока Конфигуратор: объекты конфигурации. Запустите обработку в учебной базе «Склад» — в другой базе такого справочника нет.
Общие модули и Экспорт
Общий модуль — ветка «Общие» → «Общие модули» в дереве конфигурации. В нём хранят процедуры, которые нужны в разных местах. Чтобы процедуру было видно снаружи модуля, после её заголовка пишут Экспорт:
Функция ЦенаСНДС(Цена, Ставка) Экспорт
Возврат Окр(Цена * (100 + Ставка) / 100, 2);
КонецФункцииВызов — через имя модуля: РаботаСЦенами.ЦенаСНДС(100, 20). В свойствах общего модуля флажками задают, где он доступен: Сервер, Клиент (управляемое приложение), Вызов сервера (разрешает вызывать серверный модуль прямо с клиента). Окр(Число, 2) округляет до двух знаков после запятой.
Попытка и Исключение
Если во время выполнения случается ошибка — деление на ноль, файл не найден, — платформа останавливает код и показывает сообщение. Чтобы обработать ошибку самому, код ставят в блок Попытка:
&НаКлиенте
Процедура Пример(Команда)
Делитель = 0;
Попытка
Результат = 10 / Делитель;
Сообщить(Результат);
Исключение
Сообщить("Не получилось: " + ОписаниеОшибки());
КонецПопытки;
Сообщить("Работа продолжается");
КонецПроцедурыОписаниеОшибки() возвращает текст ошибки, в нём будет «Деление на 0». Самому сообщить об ошибке и прервать работу можно инструкцией ВызватьИсключение "Не указан склад";.
Не прячьте ошибки пустым блоком Исключение: программа будет молча работать неправильно, и причину никто не найдёт. Сообщите пользователю, что случилось.
Структура и Соответствие
Два полезных вида значений, которые часто передают в процедуры и возвращают из функций:
&НаКлиенте
Процедура Пример(Команда)
Товар = Новый Структура("Наименование, Цена", "Карандаш", 2);
Товар.Вставить("Количество", 10);
Сообщить(Товар.Наименование + ": " + Товар.Цена * Товар.Количество);
Цены = Новый Соответствие;
Цены.Вставить("Ручка", 3);
Сообщить("Ручка стоит " + Цены["Ручка"]);
КонецПроцедурыКарандаш: 20
Ручка стоит 3Структура — набор именованных полей: ключи — имена, к ним обращаются через точку. Соответствие — пары «ключ — значение», где ключом может быть что угодно: строка, число, ссылка на товар. Если ключа нет, Цены["Хлеб"] вернёт Неопределено, а обращение к несуществующему полю структуры — ошибку «Поле объекта не обнаружено». Проверить поле заранее можно методом Свойство: Если Товар.Свойство("Цена") Тогда.
Коротко
- Процедура выполняет действия, функция возвращает значение через
Возврат. - Параметры передаются по ссылке;
Знач— передать копию; можно задать значение по умолчанию. - С данными работают только на сервере:
&НаСервере,&НаСервереБезКонтекста; формы и сообщения —&НаКлиенте. Экспортоткрывает процедуру общего модуля для вызова из других мест.Попытка … Исключение … КонецПопытки;перехватывает ошибки,ОписаниеОшибки()даёт их текст.