Работа с примитивными типами данных и системными функциями
Начнем изучение встроенного языка 1С с программирования работы с примитивными типами данных.
Примитивными типами данных в системе 1С являются следующие типы:
- Число;
- Строка;
- Дата;
- Булево и др.
В данном курсе мы ограничимся рассмотрением указанных четырех типов данных.
Для изучения программных походов к работе с примитивными типами данных создадим новую обработку “ПримитивныеДанные”:
Настроим форму обработки (пока она будет пустой):
Предварительно в начале модуля формы объявим переменные:
Перем Число1, Число2;
Перем Строка1;
Перем Дата1, Дата2, Дата3, Дата4, Дата5, Дата6;
Перем Булево1;
Перем A;
Попробуем программным способом ввести в систему данные примитивного типа. Для моделирования такого ввода добавим на форму обработки “ПримитивныеДанные” кнопку “ВводПрограммно” (Форма – Вставить элемент управления… – Кнопка).
Свяжем кнопку “ВводПрограммно” по событию “Нажатие” с процедурой “ВводПрограммноНажатие” и введем следующий код процедуры:
Процедура ВводПрограммноНажатие(Элемент)
Процедура должна активизироваться при нажатии кнопки “ВводПрограммно”, вводить значения переменных разных типов в тексте программы и выводить типы и значения этих переменных в окне “Служебные сообщения”.
Обратите внимание на ввод дат разными способами и на использование функции ТипЗнч для определения типа значения переменной. Необходимо также обратить внимание на то, что:
- при вводе строковых данных используются двойные кавычки (для ввода символа “двойные кавычки” в строку данных используется повторное использование двойных кавычек),
- при непосредственном вводе дат используются одинарные кавычки,
- при вводе чисел и булевых данных кавычки не требуются.
Проверим работу процедуры в пользовательском режиме:
Далее продемонстрируем моделирование ввода значения переменной интерактивно, через поле ввода. Для этого создадим на форме поле ввода переменной А (Форма – Вставить элемент управления… – Поле ввода) и собщим этой переменной составной тип данных:
Кроме того, создадим на форме кнопку “ВводИнтерактивно”, свяжем ее по событию “Нажатие” с процедурой “ВводИнтерактивноНажатие” и введем следующий код процедуры:
Процедура ВводИнтерактивноНажатие(Элемент)
Проверим работу процедуры в пользовательском режиме. Введем в поле ввода какое-либо значение примитивного типа и после нажатия кнопки “ВводИнтерактивно” увидим в окне “Служебные сообщения” выводить тип и значение введенной переменной.
Упражнение: Попробуйте оставить поле ввода незаполненным и нажать на кнопку “Ввод интерактивно”. Что выводится в окне “Служебные сообщения”? Как сделать так, чтобы в этом случае никакого сообщения не появлялось?
Проверка даты на “пустое значение”
Если значение переменной типа Дата не задано, то эта переменная по умолчанию имеет значение 01.01.0001 0:00:00 (начало первого дня первого месяца первого года).
Проверку даты на “пустое значение” можно сделать так:
Если ДатаПроверяемая = Дата(1, 1, 1) Тогда
Реализуем эту проверку на практике, используя введенные нами программно даты Дата1, Дата2, Дата3, Дата4 и Дата5.
Для этого создадим на форме кнопку “ПустаяДата”, свяжем ее по событию “Нажатие” с процедурой “ПустаяДатаНажатие” и введем следующий код процедуры:
Процедура ПустаяДатаНажатие(Элемент)
Проверим работу процедуры в пользовательском режиме:
Переменные Дата2 и Дата4 совершенно справедливо определены как пустые.
Теперь, не определяя переменную Дата6, добавим в конец процедуры “ПустаяДатаНажатие” следующий код:
Если Дата6 = Дата(1, 1, 1) Тогда
Что получилось?
Как мы видим, программа ошибочно выдала сообщение: “Дата6 не является пустой!”.
Почему?
Поставьте на начало вставленного кода точку останова и проверьте, какой тип данных присвоен переменной Дата6. Это тип “Неопределено”.
Нам необходимо, чтобы переменная Дата6 имела тип “Дата”. Одним из способов такого присвоения является создание поля ввода переменной Дата6 с указанием типа “Дата”:
Также уберем переменную Дата6 из объявления переменных и запустим пользовательский режим.
Не вводя никакого значения в поле ввода Дата6, нажмем кнопку “Пустая дата”. Теперь относительно переменной Дата6 мы получим корректное сообщение: “Дата6 является пустой!”. Если же мы введем в поле ввода Дата6 какое-то значение даты, то мы получим сообщение: “Дата6 не является пустой!”.
Упражнение: Из процедуры “ПустаяДатаНажатие” выделите процедуры “ВводДанных” и “ПроверкаНаПустоеЗначение”.
Из одной процедуры получатся примерно следующие три:
Процедура ВводДанных()
Процедура ПустаяДатаНажатие(Элемент)
Процедура ПроверкаНаПустоеЗначение(ПроверяемаяДата)
Проверим работу созданной программы в пользовательском режиме.
В будущем мы будем стараться оформлять учебные примеры в виде процедур или функций.
Определение соответствия переменной указанному типу данных
Иногда перед программистом 1С ставится задача программно определить, соответствует ли тип данных используемой переменной указанному типу (или типам) и, в зависимости от этого, выполнять с этой переменной те или иные действия.
В следующем примере мы проверим, имеет ли анализируемая переменная тип Дата. Для этого создадим процедуру “АнализТипа”:
Процедура АнализТипа(АнализируемаяПеременная, НаименованиеТипа)
На форме обработки “ПримитивныеДанные” создадим кнопку “ПроверкаТипа”, свяжем ее по событию “Нажатие” с процедурой “ПроверкаТипаНажатие” и введем следующий код процедуры, которая будет, в свою очередь, несколько раз вызывать процедуру “АнализТипа”:
Процедура АнализТипаНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Сравнение двух дат
Обратим внимание на то, что переменные Дата3 и Дата5 обозначают один день, но разное время. Для того, чтобы выполнить сравнение дат с точностью до дня, их рекомендуется привести к началу дня. Для этого используется встроенная функция НачалоДня.
Итак, сравним между собой несколько дат с точностью до дня. Для сравнения создадим процедуру “СравнениеДат”:
Процедура СравнениеДат(ПерваяДата, ВтораяДата)
На форме обработки “ПримитивныеДанные” создадим кнопку “СравниваемДаты”, свяжем ее по событию “Нажатие” с процедурой “СравниваемДатыНажатие” и введем следующий код процедуры, которая будет, в свою очередь, несколько раз вызывать процедуру “СравнениеДат”:
Процедура СравниваемДатыНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Изменение даты на некоторое количество дней
Изменить дату на некоторое количество дней можно разными способами.
Самый простой способ – добавить или отнять некоторое количество секунд, соответствующее указанному количеству дней:
Процедура ИзменениеДаты1(ИзменяемаяДата, КоличествоДней)
Для выполнения данной процедуры создадим на форме обработки “ПримитивныеДанные” кнопку “ИзменяемДаты1”, свяжем ее по событию “Нажатие” с процедурой “ИзменяемДаты1Нажатие” и введем следующий код процедуры:
Процедура ИзменяемДаты1Нажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Для добавления месяцев можно использовать встроенную функцию ДобавитьМесяц:
Процедура ИзменениеДаты2(ИзменяемаяДата, КоличествоМесяцев)
Для выполнения данной процедуры создадим на форме обработки “ПримитивныеДанные” кнопку “ИзменяемДаты2”, свяжем ее по событию “Нажатие” с процедурой “ИзменяемДаты2Нажатие” и введем следующий код процедуры:
Процедура ИзменяемДаты2Нажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
А.П. Габец и Д.И. Гончаров, авторы книги “1С:Предприятие 8.0 Простые примеры разработки”, предлагают также изменять дату с помощью запроса и встроенной функции ДобавитьКДате. Для этого они рекомендуют создать функцию следующего вида:
Функция ИзменениеДаты3(ИзменяемаяДата, КоличествоДней)
Для выполнения данной процедуры создадим на форме обработки “ПримитивныеДанные” кнопку “ИзменяемДаты3”, свяжем ее по событию “Нажатие” с процедурой “ИзменяемДаты3Нажатие” и введем следующий код процедуры:
Процедура ИзменяемДаты3Нажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Выбор значения составного типа
Для программирования выбора значения составного типа создадим процедуру “СоставнойТип”:
Процедура СоставнойТип()
В данной процедуре используется конструктор ОписаниеТипов. В качестве параметра ему необходимо передать массив допустимых типов значений. Затем используется встроенная функция диалога ввода данных ВвестиЗначение(). Эта функция имеет три параметра:
1) имя переменной, которой передается введенное значение;
2) заголовок открываемого окна;
3) объект ОписаниеТипов.
После ввода значения в пользовательском режиме программа выводит в окно “Служебные сообщения” значение, переданное переменной, указанной в качестве первого параметра функции ВвестиЗначение().
Для выполнения данной процедуры создадим на форме обработки “ПримитивныеДанные” кнопку “ВыбираемТипы”, свяжем ее по событию “Нажатие” с процедурой “ВыбираемТипыНажатие” и введем следующий код процедуры:
Процедура ВыбираемТипыНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Передача значения переменной из одной процедуры в другую
До сих пор мы выводили в окно “Служебные сообщения” значение переменной в той процедуре, где она формировалась.
А что делать, если мы хотим передать это значение в другую процедуру?
Вернемся к предыдущему примеру и перенесем строку
Процедура ВыбираемТипыНажатие(Элемент)
Процедура СоставнойТип()
При компиляции система 1С выдает сообщение о том, что в процедуре ВыбираемТипыНажатие переменная ПолученноеЗначение не определена.
Это происходит потому, что в настоящее время область действия переменной ПолученноеЗначение ограничена процедурой СоставнойТип.
Для того, чтобы распространить область действия переменной ПолученноеЗначение на весь модуль формы необходимо объявить ее в начале этого модуля:
Перем ПолученноеЗначение;
Проверьте корректность работы созданного механизма в пользовательском режиме.
Вывод многострочного предупреждения
Для вывода на экран предупреждения используется процедура глобального контекста Предупреждение(). Процедуре передаются три параметра:
1) текст предупреждения (тип Строка);
2) таймаут в секундах (время, через которое окно самостоятельно закроется);
3) текст заголовка окна (тип Строка).
Чтобы вывести многострочное предупреждение, необходимо в соответствующих местах добавить символ перевода строки:
Для иллюстрации вывода многострочного предупреждения создадим на форме обработки “ПримитивныеДанные” кнопку “Предупреждение”, свяжем ее по событию “Нажатие” с процедурой “ПредупреждениеНажатие” и введем следующий код процедуры:
Процедура ПредупреждениеНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Если пользователь не закрывает окно предупреждения, то через 5 сек. оно должно закрыться само.
Вывод текущего времени
Для определения системной (текущей) даты и времени в системе 1С используется стандартный метод ТекущаяДата(). Для того, чтобы получить данные только о текущем времени можно применить встроенную функцию Формат() с параметром формата "ДЛФ=В" (о других параметрах функции Формат можно подробнее проситать в Синтакс-Помощнике (Общее описание встроенного языка/Встроенные функции/Функции форматирования/Формат)).
Создадим на форме обработки “ПримитивныеДанные” кнопку “ТекущееВремя”, свяжем ее по событию “Нажатие” с процедурой “ТекущееВремяНажатие” и введем следующий код процедуры:
Процедура ТекущееВремяНажатие(Элемент)
Проверим корректность работы созданного механизма в пользовательском режиме:
Вывод числа прописью на русском и английском языках
Пусть мы имеем некоторое число (например, 123456,789). Нужно вывести его значение по-русски и по-английски.
Для выполнения этой задачи используется функция глобального контекста ЧислоПрописью.Эта функция имеет три параметра:
1) число, которое необходимо преобразовать;
2) форматная строка, включающая в себя параметры форматирования (в частности, код локализации, язык записи числа и наличие дробной части);
3) параметры предмета исчисления (предметы исчисления указываются через запятую в формах единственного числа именительного падежа, единственного числа родительного падежа и множественного числа родительного падежа; также указываются род предмета исчисления и количество разрядов дробной части).
Примеры форматной строки:
ФорматнаяСтрока = "Л=ru_RU";
ФорматнаяСтрока = "Л=ru_RU; ДП=Истина";
ФорматнаяСтрока = "Л=en_US";
Примеры строки параметров предмета исчисления
ПараметрыПредметаИсчисления = " , , , , , , , , 0";
ПараметрыПредметаИсчисления = "килограмм, килограмма, килограммов, м, грамм, грамма, граммов, м, 3";
ПараметрыПредметаИсчисления = "dollar, dollars, cent, cents, 2";
Создадим на форме обработки “ПримитивныеДанные” кнопку “ЧислаПрописью”, свяжем ее по событию “Нажатие” с процедурой “ЧислаПрописьюНажатие” и введем следующий код процедуры:
Процедура ЧислаПрописьюНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Упражнение: Добавьте в созданную нами процедуру форматные строки для вывода прописью числа в рублях и в долларах на русском языке.
Округление числа
Правильное выполнение округления очень важно в бухгалтерии, где даже незначительные “ошибки округления” могут помешать сведению баланса.
Округление числа может быть выполнено различными способами. Ниже будет описано выполнение округления с помощью встроенной функции Окр(). Функция имеет три параметра:
1) исходное число;
2) разрядность – число, определяющее число знаков дробной части, до которых производится округление (параметр необязательный);
3) режим округления (параметр необязательный).
Для выполнения примера округления создадим на форме обработки “ПримитивныеДанные” кнопку “Округление”, свяжем ее по событию “Нажатие” с процедурой “ОкруглениеНажатие” и введем следующий код процедуры:
Процедура ОкруглениеНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Генерация случайных чисел
Программисты 1С имеют возможность использовать генерацию случайных чисел, которая производится с помощью объекта ГенераторСлучайныхЧисел. Этот объект имеет метод СлучайноеЧисло, имеющий два параметра: нижний и верхний диапазоны.
Создадим на форме обработки “ПримитивныеДанные” кнопку “СлучайноеЧисло”, свяжем ее по событию “Нажатие” с процедурой “СлучайноеЧислоНажатие” и введем следующий код процедуры:
Процедура СлучайноеЧислоНажатие(Элемент)
Проверим корректность работы созданного механизма в пользовательском режиме:
Упражнение: Выведите с помощью цикла 10 случайных значений от 0 до 100.
Проверка заполненности значения
Для проверки заполненности значений переменных используется функция ЗначениеЗаполнено(), которая проверяет, отличается ли переданное значение от значения по умолчанию для данного типа. Проверка заполненности данных осуществляется в процедуре “ПроверкаЗаполненности”:
Процедура ПроверкаЗаполненности(ПроверяемоеЗначение)
Для выполнения данной процедуры создадим на форме обработки “ПримитивныеДанные” кнопку “Заполненность”, свяжем ее по событию “Нажатие” с процедурой “ЗаполненностьНажатие” и введем следующий код процедуры, которая будет, в свою очередь, несколько раз вызывать процедуру “ПроверкаЗаполненности”:
Процедура ЗаполненностьНажатие(Элемент)
Проверим работу созданной программы в пользовательском режиме и убедимся, что созданная нами процедура работает корректно:
Обратим внимание на то, что переменные типа Дата, в которые внесены значения Дата(1, 1, 1) ('00010101000000'), будут считаться незаполненными, так как значение переменной типа Дата по умолчанию равняется именно Дата(1, 1, 1) ('00010101000000').
Преобразование данных
Наконец, рассмотрим подробнее способы преобразования данных из одного типа в другой.
Для такого преобразования данных в системе 1С используются встроенные функции Число(), Строка(), Дата(), Булево(), а также функция форматирования Формат().
Многие из этих функций имеют определенные ограничения обрабатываемых значений (задаваемых параметров) и особенности использования. О них можно будет более подробно узнать в технической документации или в справочной системе “Синтакс-Помощник” программы 1С.
Приведем учебный пример некоторых часто встречающихся преобразований:
- Число –> Строка –> Число;
- Число –> Булево –> Число;
- Булево –> Строка –> Булево;
- Дата –> Строка –> Дата.
Для реализации указанного примера создадим четыре процедуры:
Процедура ЧислоСтрокаЧисло(а)
Процедура ЧислоБулевоЧисло(а)
Процедура БулевоСтрокаБулево(а)
Процедура ДатаСтрокаДата(а)
Также создадим кнопку “ПреобразованиеДанных”, свяжем ее по событию “Нажатие” с процедурой “ПреобразованиеДанныхНажатие” и введем код процедуры:
Процедура ПреобразованиеДанныхНажатие(Элемент)
Результат выполнения процедуры в пользовательском режиме: