Учебник Языка программирование РФокс — различия между версиями

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
(Новая страница: « Категория:РусФокс»)
 
м
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
 +
== Содержание ==
  
[[Категория:РусФокс]]
+
* Урок 01. Знакомство с языком программирования РусскийФокс
 +
* Урок 01.1 Настраиваем Notepad++
 +
* Урок 02. Операции со строками
 +
* Урок 03. Операции с датами
 +
* Урок 04. Диалог с пользователем
 +
* Урок 05. Операции с типом Число
 +
* Урок 06. Простые одномерные массивы
 +
* Урок 07. Объектные массивы
 +
* Урок 08. Создание объектов
 +
* Урок 09. Исследование объектов
 +
* Урок 10. Рабочий стол, DBF-файлы и просмотр Курсора
 +
* Урок 11. Взаимодействие с OpenOffice и LibreOffice
 +
* Урок 12. Создаем объект для OpenOffice
 +
* Урок 13. Создание сценариев для ClickerMann
 +
* Урок 14. Создание DBF-файла, выгрузка в XML   
 +
* Урок 15. Изменение DBF-файла и назначение командных клавиш
 +
* Урок 16. Подключение модулей
 +
 
 +
== Урок 01. Знакомство с языком программирования РусскийФокс ==
 +
 
 +
Программы записываются в текстовый файл в кодировке Windows-1251. Комментарий начинается символом «//».  В файле должна быть обязательная процедура запуска программы Старт. Традиционная программа «Привет, Мир !» будет выглядеть так:
 +
 
 +
// Программа Привет, Мир  - это комментарий
 +
ПРОЦЕДУРА Старт()
 +
    Предупреждение(«Привет, Мир!»)  // Это другой вид комментария в продолжении строки
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
Как видите, ключевые слова ПРОЦЕДУРА и КОНЕЦПРОЦЕДУРЫ пишутся в верхнем регистре. Внутри процедуры «Старт» Располагается ваша 1С-подобная программа. 1С-подобная не означает, что язык программирования во многом идентичен программированию в 1С. При написании команд не используется точка с запятой «;», которая используется в 1С. Пока только в двух ключевых словах точка с запятой обязательна (КОНЕЦЦИКЛА;  КОНЕЦЕСЛИ; ). Важно знать, что все операторы должны быть написаны большими буквами.     
 +
 
 +
Результат выполнение вышеприведенной программы будет выглядеть так:
 +
 
 +
На экране появится окно с нашим сообщением «Привет, Мир!».
 +
 
 +
Мы можем определить переменную типа строка, присвоив ей текст «Привет, Переменная !»
 +
 
 +
    Переменная = "Привет, Переменная !"
 +
 
 +
Тогда текст нашей программы будет выглядеть так:
 +
 
 +
ПРОЦЕДУРА Старт
 +
      Переменная = "Привет, Переменная !"
 +
      Предупреждение(Переменная)   
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
И результат выполнения нашей программы будет выглядеть так:
 +
 
 +
Данный пример содержится в файле Lesson01.rus. Функция Сообщить() имеет аналог в языке программирования 1С и, по умолчанию, высвечивает информацию, не останавливая выполнение кода.
 +
 
 +
Запуск программы производится через командную строку командой
 +
 
 +
    RusFox  Lesson01.rus
 +
 
 +
либо удобно установить для типа файла с расширением RUS программу для запуска RusFox.exe
 +
 
 +
Задать вопрос пользователю можно 1С-подобной функцией Вопрос(Текст)
 +
 
 +
  ЕСЛИ НЕ Вопрос("Вы действительно хотите запустить Урок 01. Знакомство ?")=6
 +
    ВОЗВРАТ    // выход из процедуры, если отказ, иначе продолжим выполнять код
 +
  КОНЕЦЕСЛИ;
 +
 
 +
В результате выполнения данного кода на экране появится окно с вопросом и две кнопки «ДА» и «НЕТ». Ответ «ДА» возвратит код = 6.
 +
 
 +
В функции Предупреждение() можно высвечивать не только строки, но и число:
 +
 
 +
        Число=23
 +
        Предупреждение(Число)
 +
 
 +
Но если вы в сообщении используете строку или строковую переменную, то число следует преобразовывать функцией Строка()
 +
 
 +
  Число = 23
 +
  Число2 = 7
 +
  Предупреждение("Это число 23+7="+Строка(Число+Число2))
 +
 
 +
Строки вы можете заключать в три вида кавычек: "Двойные кавычки", ‘Одинарные кавычки’, [Квадратные скобки] и @" Особые кавычки "@
 +
 
 +
Кроме того, вы можете присваивать многострочные строки:
 +
   
 +
    МногострочнаяСтрока = @" первая строка
 +
    Вторая строка  и любой текст
 +
                    Третья строка "@
 +
 
 +
При написании программы вы можете использовать условные операторы.
 +
Условный оператор ЕСЛИ может использоваться без слова ТОГДА (в 1С слово ТОГДА обязательно), но нельзя, как в 1С, располагать операторы в одной строке. Каждый оператор должен располагаться в новой строке. Оператор «КОНЕЦЕСЛИ;» нельзя использовать без точки с запятой в конце.
 +
 
 +
  Число=21
 +
  ЕСЛИ Число=23 ТОГДА
 +
      Предупреждение("Число=23")
 +
  ИНАЧЕЕСЛИ Число=25
 +
      Предупреждение("Число="+СокрЛП(Строка(Число)))
 +
  ИНАЧЕ
 +
      Предупреждение("Число не равно 23")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
Вы можете комбинировать несколько условий после оператора «ЕСЛИ», используя при этом булевые операции И, ИЛИ, НЕ.
 +
 
 +
  ЕСЛИ Число>Число2 И (Число<>20)     
 +
    Предупреждение("Число больше Число2 и Число не равно 20")
 +
  ИНАЧЕ
 +
    Предупреждение("Условие не выполнено")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
Строки можно соединять между собой знаком «+». Команды могут переносится на другую строку, если в конце не завершенной команды поставить знак «;».  Это отличает данный язык программирования от 1С-программирования. В 1С знак «;» означает окончание команды.
 +
 
 +
  Фамилия="Ошнуров"
 +
  Имя = "Андрей"
 +
  Отчество = "Михайлович"
 +
  ФИО = Фамилия+" "+Имя+" "+;
 +
                        Отчество
 +
  Предупреждение(ФИО)
 +
 
 +
В примере строку «Отчество» мы перенесли на новую строку, для этого переноса использовали символ «;»
 +
 
 +
При программировании вы можете создавать свои функции и использовать их. Программа с функцией будет выглядеть так:
 +
 
 +
ПРОЦЕДУРА Старт
 +
    Предупреждение(СложитьЧисла(10,12))
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
ФУНКЦИЯ СложитьЧисла
 +
  ПАРАМЕТРЫ Число1, Число2
 +
      ВОЗВРАТ Число1+Число2
 +
КОНЕЦФУНКЦИИ
 +
 
 +
Здесь «СложитьЧисла» - это функция, которой передаются параметры Число1, Число2. Затем числа переданные в этих параметрах складываются и результат возвращается.
 +
 
 +
Функцию удобнее написать и так:
 +
  ФУНКЦИЯ УмножитьЧисла(Число1, Число2)
 +
  КОНЕЦФУНКЦИИ Число1*Число2
 +
 
 +
Здесь число в параметре Число1 будет умножено на число в параметре Число2.
 +
 
 +
Для организации циклов используется набор операторов ДЛЯ, ПО, КОНЕЦЦИКЛА; . Использование точки с запятой в конце оператора КОНЕЦЦИКЛА; является обязательным.
 +
 
 +
  ДЛЯ Номер=1 ПО 3
 +
    Предупреждение(Номер)
 +
  КОНЕЦЦИКЛА;
 +
 
 +
В результате выполнения данного примера высветится 3 раза окно, в котором последовательно отобразятся цифры от 1 до 3.
 +
 
 +
Целиком текст программы 1-ого урока выглядит так:
 +
 
 +
----
 +
 
 +
ПРОЦЕДУРА Старт
 +
 
 +
  Предупреждение("Привет, Мир !")
 +
 
 +
  Переменная = "Привет, Переменная !"
 +
  Предупреждение(Переменная)
 +
 
 +
  // Вы можете не преобразовывать число в сообщении
 +
  Число = 23
 +
  Предупреждение(Число)
 +
 
 +
// Но если вы в сообщении используете строку или строковую переменную, то число следует преобразовывать функцией Строка()
 +
  Число2 = 7
 +
  Предупреждение("Это число 23+7="+Строка(Число+Число2))
 +
 
 +
  // Условный оператор ЕСЛИ может использоваться без слова ТОГДА (в 1С слово ТОГДА обязательно)
 +
  Число=21
 +
  ЕСЛИ Число=23 ТОГДА
 +
    Предупреждение("Число=23")
 +
  ИНАЧЕ
 +
    Предупреждение("Число не равно 23")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
  * Число=3 
 +
  ЕСЛИ Число>Число2 И Число<>20      // Можно кроме "И" использовать булевые операции "ИЛИ" , "НЕ"
 +
    Предупреждение("Число больше Число2 и Число не равно 20")
 +
  ИНАЧЕ
 +
    Предупреждение("Условие не выполнено")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
  Фамилия="Ошнуров"
 +
  Имя = "Андрей"
 +
  Отчество = "Михайлович"
 +
  ФИО = Фамилия+" "+Имя+" "+;
 +
                        Отчество
 +
  Предупреждение(ФИО)
 +
 
 +
  Предупреждение(СложитьЧисла(10,12))
 +
 
 +
  ДЛЯ Номер=1 ПО 3
 +
    Сообщить(Номер)
 +
  КОНЕЦЦИКЛА;
 +
 
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
ФУНКЦИЯ СложитьЧисла
 +
ПАРАМЕТРЫ Число1, Число2
 +
КОНЕЦФУНКЦИИ Число1+Число2
 +
 
 +
----
 +
 
 +
=== Урок 01.1 Настраиваем Notepad++ (Устарело) ===
 +
 
 +
'''В настоящий момент в качестве среды разработки лучше использовать Среду Разработки (СР) [[Перфолента.NET]].'''
 +
 
 +
Для удобства программирования, если не желаете использовать редактор Перфолента, можно выбрать редактор Notepad++ (скачайте последнюю версию из интернета). Сейчас разберем, как этот редактор удобней настроить для работы, чтоб строки у нас сворачивались, а операторы языка программирования выделялись нужным цветом.
 +
 
 +
Сохранять текст в редакторе следует в кодировке UTF8-BOOM. В такой кодировке в начале текста устанавливаются особые невидимые символы, благодаря которым RusFox.exe распознает кодировку.
 +
 
 +
Для удобства работы настраиваем редактор. Переходим по пункту меню «Синтаксисы» → “Задать свой синтаксис...” Нажимаем кнопку «Создать...». Даем имя синтаксису «RusFox». В поле «Расшир.:» пишем «rus».  Теперь при открытия в редакторе файла с расширением “rus” будет автоматически подключаться данный синтаксис. 
 +
 
 +
Начнем настройку с легкого. На вкладке «Операторы и разделители»  в поле «Операторы 1» заносим строку « - " ( ) * , ; [ \ ] + < = > % » и нажимаем кнопку «Стиль». Выбираем цвет. Я выбрал красный.
 +
 
 +
В графе «Разделитель 1» в полях «Открытие» и «Закрытие» я записал кавычки «"». Нажал кнопку «Стиль», выбрал шрифт «Courier New» Полужирный. Цвет фона бледно-желтый, цвет шрифта темно-коричневый.  Так будет оформляться текст, заключенный в кавычки. Но кроме двойных кавычек «"» в РусскомФоксе допустимо использование одинарных кавычек «'». Поэтому аналогичные настройки я сделал в графе «Разделитель 1», но в полях «Открытие» и «Закрытие» записал одинарные кавычки «'»
 +
 
 +
На вкладке «Комментарии и Числа» ставим галочку «Разрешить сверт.комментария», в графе «Положение строки комментария» «Разрешить где угодно».  В графе «Комментарий Строки» в пункте «Открытие» записываем “//”, нажимаем кнопку «Стиль», Цвет текста — темно-зеленый, шрифт — Courier New, размер — 8, Курсив.  Так будет оформлен шрифт комментария.
 +
 
 +
На вкладке «Ключевые слова» в графе «1-я группа» ставим галочку «Префикс режим» в строку заносим слова «КОНЕЦЕСЛИ; ЕСЛИ ИНАЧЕ КОНЕЦПРОЦЕДУРЫ КОНЕЦФУНКЦИИ ТОГДА ПРОЦЕДУРА ФУНКЦИЯ ВОЗВРАТ ДЛЯ ПО КОНЕЦЦИКЛА; ЦИКЛ И ИЛИ НЕ ПЕРЕМ ПОКА КОНЕЦПОКА; ПРЕРВАТЬ; ПРОДОЛЖИТЬ; ПОПЫТКА ИСКЛЮЧЕНИЕ КОНЕЦПОПЫТКИ;»  Стиль «Полужирный» , шрифт «Courier New», Цвет текста — Красный. Это 1С-подобные операторы, написанные в верхнем регистре. Это операторы языка РФокс, имеющие аналог в 1С, которые должны быть напечатаны строго так как перечислены: с большой буквы и в конце некоторых операторов обязательный символ «;».
 +
 
 +
В графе «3-я группа» заносим слова «СтрДлина СокрЛП Сообщить СтрНачинаетсяС СтрЗаканчиваетсяНа Строка Вопрос Число ВРег НРег КодСимвола Символ ТекущийКаталог ФайлСуществует ЗакрытьФайл СтрНайти ТекущаяДата ДобавитьМесяц ДеньНедели ДеньГода НеделяГода Год Месяц День Дата Час Минута Секунда НачалоГода НачалоКвартала НачалоМесяца НачалоНедели НачалоДня НачалоЧаса НачалоМинуты КонецГода КонецКвартала КонецМесяца КонецНедели КонецДня КонецЧаса КонецМинуты ВвестиЗначение Цел Окр Предупреждение »  Полужирный, Синий, «Courier New»  Это функции имеющие аналоги в 1С.
 +
 
 +
На вкладке «Ключевые слова» в графе «4-я группа» ставим галочку «Префикс режим» в строку заносим слова «НАБОР_УСЛОВИЙ ЛПЕРЕМ ПАРАМЕТРЫ ЛОЖЬ ИСТИНА ОПИСАНИЕ_МАССИВА КАК ЗАЩИЩЕННОЕ_СВОЙСТВО ОПРЕДЕЛИТЬ_ОБЪЕКТ ЭТОТ_ОБЪЕКТ КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА БАЗОВЫЙ_ОБЪЕКТ ПУСТО _ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА _ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА КОНСТАНТА ОТМЕНИТЬ_КОНСТАНТУ МЕТОД_РОДИТЕЛЯ СКРЫТОЕ_СВОЙСТВО ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА ПРИ_УДАЛЕНИИ_ОБЪЕКТА »  Стиль «Полужирный» , шрифт «Courier New», Цвет текста — Красный. Это операторы, не имеющие 1С аналогов.
 +
 
 +
В графе «5-я группа»  заносим слова «ОбратнаяСтрока СтрокуМеждуРазделителями СтрЧислоВхождений СравнитьСтрокуПоМаске ОткрытьФайлДляЧтения ЧитатьСтрокуИзФайла ВернутьКоличествоДнейВМесяце НазваниеМесяца СтрокаЗаПериод ПолучитьТекущуюРазрядностьЧисел УстановитьРазрядностьЧисел ГрадРад РадГрад Тангенс Арктангенс Арксинус Синус Косинус Арккосинус Экспонента ЧислоПи ПсевдоСлучайноеЧисло КоличествоВМассиве КоличествоСтрокВМассиве КоличествоКолонокВМассиве ВставитьСтрокуВМассив СодержимоеМассиваВСтроку СортироватьМассив УдалитьСтрокуИзМассива ВыборИзМассива СписокФайловВМассив НовыйМассив МассивМетодовОбъекта МассивСвойствОбъекта РезультатУсловий»  Полужирный, Пурпурный, «Courier New» Это функции не имеющие аналога в 1С.
 +
 
 +
Для заполнения копируйте строки из данного документа. По мере развития языка список слов будет пополняться и вам потребуется так же заново копировать весь список в соответствующие поля.
 +
 
 +
После выполнения данных настроек, ваш текст в редакторе Notepad++ будет выглядеть примерно так:
 +
 
 +
Для свертывания строк надо настроить на вкладке «стандартный» поля «Открытие» и «Закрытие»: ФУНКЦИЯ — КОНЕЦФУНКЦИИ, ПРОЦЕДУРА — КОНЕЦПРОЦЕДУРЫ. Но свертывание после добавления строк сбивается и нормально не работает.  Оно временно восстанавливается, если в конце ключевых слов вставить перевод строки и затем вновь удалить его, но затем сбивается вновь.
 +
 
 +
== Урок 02. Операции со строками ==
 +
 
 +
Выполним следующие команды:
 +
 
 +
  Предупреждение("Преобразовать число 12.457 в строку "+Строка(12.457,10,3)+;
 +
      " Можно округлить, например, до 1 знака после запятой "+Строка(12.457,10,1))
 +
   
 +
Результат выполнения будет выглядеть так:
 +
 
 +
Функция (расширенный аналог функции 1С) Строка(12.457,10,3) преобразует число в строку с 3-мя знаками после запятой. Длина числа будет 10. В данном случае приведенное в примере число имеет 5 знаков (два знака до запятой и три после), значит впереди будет добавлено 5 пробелов при формировании строки. Но следующая функция Строка(12.457,10,1) преобразует число в строку с точностью до 1 знака после запятой, потому в результате из числа 12.457 мы получим число 12.5 (округленное до 1 знака после запятой).  В функции Строка() 2-ой и 3-ий параметры могут не применяться. Данная функция так же, кроме чисел, может преобразовывать типы Булеан, Дата, Дата и время в тип Строка. См. примеры далее.
 +
 
 +
Следующий пример показывает, как убирать пробелы с обоих сторон строки
 +
 
 +
  СтрокаСПробелами = "  Строка с пробелами    "
 +
  Предупреждение("Убираем пробелы слева и справа <<"+;
 +
                                        СокрЛП(СтрокаСПробелами)+">>")
 +
 
 +
Результат выполнения:
 +
 
 +
 
 +
В начале и конце строки специально поставлены знаки «<<» и «>>», чтоб было наглядно видно, что строка после применения функции СокрЛП() (аналогичная функция имеется в 1С) не имеет пробелов в начале и конце строки. 
 +
 
 +
Теперь производим операции над той же строкой, но сначала убираем пробелы только слева, а затем только справа.
 +
 
 +
  Предупреждение("Убираем пробелы только слева <<"+;
 +
            СокрЛ(СтрокаСПробелами)+">>  Убираем пробелы только справа”+;     
 +
                                  “<<"+СокрП(СтрокаСПробелами)+">>")
 +
   
 +
Высвечиваемый функцией Сообщить() результат будет выглядеть так:
 +
 
 +
Как видно из результатов выполнения функций, в первом случае убраны пробелы слева применением функции СокрЛ(), а во втором случае убраны пробелы справа, а левые пробелы остались. Так сработала функция СокрП().
 +
 
 +
Теперь научимся вырезать кусок строки с помощью функций СокрЛ() и СокрП().
 +
  СтрокаСНомерами = "0123456789"
 +
  Предупреждение("Получаем 6 символов слева <<"+Лев(СтрокаСНомерами,6)+;
 +
            ">>  Получаем 5 символов справа <<"+Прав(СтрокаСНомерами,5)+">>")
 +
 
 +
Результат на экране будет таким:
 +
 
 +
По результату видно, что первая функция вырезала 6 символов из строки "0123456789" слева, получилась урезанная строка "012345". А вторая функция вырезала 5 символов справа и получилась строка "56789".
 +
 
 +
Если мы имеем число в виде строки СтрокаЧисло = "13.54" (просто число присваивается так Число=13.54, без кавычек), то можем его преобразовывать в число с помощью функции Число() (аналог имеется в 1С)
 +
 
 +
  СтрокаЧисло = "13.54"
 +
  Число = Число(СтрокаЧисло) 
 +
 
 +
Для определения длины строки (количество символов в строке) применяется функция аналогичная 1С СтрДлина().
 +
  Строка = "12345"
 +
  Предупреждение("Строка <"+Строка+"> имеет длину ="+;
 +
                Строка(СтрДлина(Строка)))   
 +
 
 +
Результат данного кода:
 +
 
 +
      Функция СтрДлина() возвращает число, поэтому мы применяем функцию Строка(), чтоб число превратить в строку.
 +
 
 +
Если строка не содержит символы или содержит только пробелы, то она является пустой. Для выяснения, является ли строка пустой имеется функция ПустаяСтрока(). Данная функция возвращает ИСТИНА, если строка пустая, и ЛОЖЬ, если в строке есть хотя бы один значимый символ (пробел считается не значимым символом).
 +
 
 +
  ПустаяСтрока1 = ""
 +
  ПустаяСтрока2 = "  "
 +
  НеПустаяСтрока = " 1  "
 +
  Предупреждение("ПустаяСтрока1 = "+Строка(ПустаяСтрока(ПустаяСтрока1))) 
 +
  Предупреждение("ПустаяСтрока2 = "+Строка(ПустаяСтрока(ПустаяСтрока2))) 
 +
  Предупреждение("НеПустаяСтрока = "+Строка(ПустаяСтрока(НеПустаяСтрока)))
 +
 
 +
 
 +
Иногда бывает нужно переставить символы в строке в обратном порядке. Для этой цели существует функция  ОбратнаяСтрока()  (не имеет аналога в 1С). 
 +
 
 +
  СтрокаСЦифрами = "123456789"
 +
  Предупреждение("Для строки <"+СтрокаСЦифрами+;
 +
    "> обратная строка выглядит так <"+ОбратнаяСтрока(СтрокаСЦифрами)+">")
 +
 
 +
Результат выполнения данного кода будет таким:
 +
 
 +
 
 +
Часто бывает нужно найти какой-то символ или несколько символов в заданной строке. Для этих целей существует функция
 +
 
 +
СтрНайти(Строка,ПодстрокаПоиска,НаправлениеПоиска,НачальнаяПозиция,НомерВхождения)
 +
 
 +
Эта функция возвратит номер позиции искомой строки. Параметры она имеет следующие:
 +
 
 +
* Строка — это там, где ищем, 
 +
* ПодстрокаПоиска — это символ или несколько символов (выражение), которое ищем.
 +
* Направление поиска — это одно из значений: Направление.СНачала или  Направление.СКонца. Направление поиска определяет слава направо мы ищем или наоборот справа на лево, но при этом номер позиции всегда возвращается с отсчетом слева направо.
 +
* НачальнаяПозиция – это номер позиции, с которой начинаем поиск. Например, мы можем начать поиск с 5-ого символа, а не с первого. При этом, если направление поиска  Направление.СКонца, то номер Начальной позиции будет считаться с права на лево (с конца строки на начало), а номер возвращаемой позиции найденного символа или подстроки (набора символов) всегда указывается слева на право (с начала строки).
 +
* НомерВхождения указывает, какой по счету найденный символ или подстрока нам нужны.
 +
 
 +
Рассмотрим примеры:
 +
 
 +
  СтрокаДляПоиска = "12345678901234567890123456789"
 +
  Предупреждение("Ищем первое вхождение цифры 3 с начала "+;
 +
                                              Строка(СтрНайти(СтрокаДляПоиска,"3")))
 +
Здесь функция возвратить число 3, так как отсчитывая слева на право первая встретившаяся цифра «3» имеет 3-ю позицию.
 +
    Предупреждение("Ищем первое вхождение цифры 3 с конца "+;
 +
                                Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца)))
 +
Здесь функция возвратить число 23, так как отсчитывая справо на лево первая встретившаяся цифра «3» имеет 23-ю позицию.
 +
 
 +
  Предупреждение("Ищем второе вхождение цифры 3 с начала "+;
 +
                            Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СНачала,1,2)))
 +
Здесь функция возвратить число 13, так как, отсчитывая с начала строки, вторая (2-ое вхождение) встретившаяся цифра «3» имеет 13-ю позицию. 
 +
 
 +
Предупреждение("Ищем второе вхождение цифры 3 с конца ";
 +
              +Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца,1,2)))
 +
Здесь функция возвратить число 13, так как, отсчитывая с конца строки, вторая (2-ое вхождение) встретившаяся цифра «3» имеет 13-ю позицию. 
 +
 
 +
Если нам надо подсчитать, сколько раз символ «3» встречается в строке  СтрокаДляПоиска, то мы можем использовать аналог функции 1С СтрЧислоВхождений()
 +
 
 +
  Предупреждение("Сколько раз встречается цифра 3 в строке "+;
 +
                                      Строка(СтрЧислоВхождений(СтрокаДляПоиска,"3")))
 +
В данном случае мы получим результат 3, так как цифра «3» содержится в трех местах строки  СтрокаДляПоиска.
 +
 
 +
Если нам надо во всей строке заменить символ «3» на символ «2», то можно использовать аналогичную 1С функцию СтрЗаменить()
 +
 +
  Предупреждение("В строке "+СтрокаДляПоиска+" заменяем цифру 3 на цифру 2 "+;
 +
                                                            СтрЗаменить(СтрокаДляПоиска,"3","2"))
 +
В результате применения функции СтрЗаменить() мы получим строку "12245678901224567890122456789"  из строки "12345678901234567890123456789".
 +
 
 +
Мы можем преобразовать строку в верхний регистр 1С-подобной функцией Врег() (все буквы в строке будут заглавными) или в нижний регистр Нрег() (все буквы будут маленькими), либо сделать так, чтоб каждое слово начиналось с заглавной буквы, а остальные буквы в слове были маленькие  ТРег().
 +
 
 +
  Строка = "иВаН ИваНыч"
 +
  Предупреждение("Переводим строку "+Строка+" в верхний регистр "+ВРег(Строка))
 +
  Предупреждение("Переводим строку "+Строка+" в нижний регистр "+НРег(Строка))
 +
  Предупреждение("Переводим строку "+Строка+" первые символы каждого слова в “+;
 +
          “верхний регистр "+ТРег(Строка))
 +
 
 +
В первом сообщении строка "иВаН ИваНыч" будет выглядеть так: «ИВАН ИВАНЫЧ», во втором так «иван иваныч», а в третьем так «Иван Иваныч».
 +
 
 +
Все символы отображаемые на экране имеют код, который у каждого символа уникален. Чтоб посмотреть код любого символа (в примере символа «A») используем 1С-подобную функцию КодСимвола(), а чтоб из определенного кода получить символ, используем 1С-подобную функцию Символ().
 +
 
 +
  Предупреждение(" Код символа А = "+Строка(КодСимвола("А",1))+;
 +
                            " Символ с кодом 190 = "+Символ(190))
 +
 
 +
Результат выполнения данных функций будет таким:
 +
 
 +
 
 +
При создании программ часто требуется получить часть строки, которая находится между определенными символами. Для этих целей имеется не имеющая аналога в 1С функция СтрокуМеждуРазделителями(Строка, НачальныйРазделитель, КонечныйРазделитель, Сномера)
 +
Строка — там где ищем нужную подстроку. Нужная нам подстрока начинается с разделителя  НачальныйРазделитель и заканчивается разделителем  КонечныйРазделитель. Параметр Сномера указывает, какую подстроку из находящихся между  НачальныйРазделитель и  КонечныйРазделитель мы хотим получить.
 +
 
 +
  Строка = "=Строка1=Строка2=Строка3=Строка4="
 +
  Предупреждение("Получаем 3-ий элемент из "+Строка+;
 +
                                                "  "+СтрокуМеждуРазделителями(Строка,"=","=",3))
 +
 
 +
Третья подстрока между разделителями «=» - Это «Строка3».
 +
 
 +
Если вам надо подсчитать количество какого-либо символа или набора символов в строке, то вы можете использовать функцию СтрЧислоВхождений(Строка, "=")
 +
 
 +
    Предупреждение("Количество знаков '=' в строке равно "+;
 +
                                      СокрЛП(Строка(СтрЧислоВхождений(Строка, "=")))) 
 +
 
 +
Если вам надо заменить какой-либо символ (или набор символов) другим символом, тогда используйте функцию СтрЗаменить(Строка,"=","-")
 +
 
 +
  Предупреждение('Заменим в строке <'+Строка+;
 +
              '> символы "=" на символы "-". Результат: <'+СтрЗаменить(Строка,"=","-")+'>')
 +
 
 +
Вы можете выяснить, начинается строка с указанного символа или нет, с помощью функции СтрНачинаетсяС(Строка, "=") либо, заканчивается ли строка указанным символом или набором символов, 
 +
 
 +
  ЕСЛИ СтрНачинаетсяС(Строка, "=") И СтрЗаканчиваетсяНа(Строка, "=")
 +
    Предупреждение("Строка <"+Строка+"> начинается и заканчивается символом '='")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
Вы можете открыть файл для чтения и прочитать содержимое файла в строку. Каждая строка заканчивается символом перевода строки Символ(13).
 +
 
 +
  ИмяФайла = ТекущийКаталог()+"Lesson02.txt"
 +
  СтрокаИзФайла = ''
 +
  ЕСЛИ ФайлСуществует(ИмяФайла)
 +
      УкФайл = ОткрытьФайлДляЧтения(ИмяФайла)
 +
      ПОКА НЕ КОНЕЦФАЙЛА(УкФайл)
 +
        СтрокаИзФайла = СтрокаИзФайла+ЧитатьСтрокуИзФайла(УкФайл)+Символ(13)
 +
      КОНЕЦПОКА;
 +
      ЗакрытьФайл(УкФайл)
 +
      Предупреждение(СтрокаИзФайла)
 +
  ИНАЧЕ      Предупреждение("Файл "+ИмяФайла+" не существует.")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
После этого можно подсчитать количество закаченных строк СтрЧислоСтрок(СтрокаИзФайла) или получить любую строку по номеру строки
 +
СтрПолучитьСтроку(СтрокаИзФайла, 2).
 +
 
 +
    Предупреждение('В предыдущей высвеченной строке '+;
 +
                Предупреждение(СтрЧислоСтрок(СтрокаИзФайла))+;
 +
                    ' строк. Вторая строка = '+СтрПолучитьСтроку(СтрокаИзФайла, 2))
 +
   
 +
Вы можете сравнивать строки по заданной маске, где символ «*» означает наличие произвольного числа символов, а символ «?» означает один произвольный символ.
 +
 
 +
    Предупреждение(Строка(СравнитьСтрокуПоМаске("*др?г","Хороший друг")))
 +
 
 +
    Исходный текст 2-ого урока выглядит так:
 +
 
 +
ПРОЦЕДУРА Старт
 +
 
 +
  Предупреждение("Преобразовать число 12.457 в строку "+Строка(12.457,10,3)+;
 +
        " Можно округлить, например, до 1 знака после запятой "+Строка(12.457,10,1))
 +
 
 +
  СтрокаСПробелами = "  Строка с пробелами    "
 +
  Предупреждение("Убираем пробелы слева и справа <<"+СокрЛП(СтрокаСПробелами)+">>")
 +
  Предупреждение("Убираем пробелы только слева <<"+СокрЛ(СтрокаСПробелами)+;
 +
                      ">>  Убираем пробелы только справа <<"+СокрП(СтрокаСПробелами)+">>")
 +
 
 +
  СтрокаСНомерами = "0123456789"
 +
  Предупреждение("Получаем 6 символов слева <<"+Лев(СтрокаСНомерами,6)+;
 +
                                              ">>  Получаем 5 символов справа <<"+Прав(СтрокаСНомерами,5)+">>")
 +
 
 +
  СтрокаЧисло = "13.54"
 +
  Число = Число(СтрокаЧисло)  // Так из строкового значения делаем числовое
 +
  Предупреждение(Число)
 +
 
 +
  Строка = "12345"
 +
  Предупреждение("Строка <"+Строка+"> имеет длину ="+Строка(СтрДлина(Строка)))
 +
 
 +
  ПустаяСтрока1 = ""
 +
  ПустаяСтрока2 = "  "
 +
  НеПустаяСтрока = " 1  "
 +
  Предупреждение("ПустаяСтрока1 = "+Строка(ПустаяСтрока(ПустаяСтрока1)))  // Возвращает .T.  ИСТИНА
 +
  Предупреждение("ПустаяСтрока2 = "+Строка(ПустаяСтрока(ПустаяСтрока2)))  // Возвращает .T.  ИСТИНА
 +
  Предупреждение("НеПустаяСтрока = "+Строка(ПустаяСтрока(НеПустаяСтрока))) // Возвращает .F.  ЛОЖЬ
 +
 
 +
  СтрокаСЦифрами = "123456789"
 +
  Сообщить("Для строки <"+СтрокаСЦифрами+"> обратная строка выглядит так <"+;
 +
                                                                                        ОбратнаяСтрока(СтрокаСЦифрами)+">")
 +
 
 +
  СтрокаДляПоиска = "123456789012345678901234567893"
 +
  Предупреждение("Ищем первое вхождение цифры 3 с начала "+Строка(СтрНайти(СтрокаДляПоиска,"3")))
 +
  Предупреждение("Ищем первое вхождение цифры 3 с конца "+;
 +
                                                                      Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца)))
 +
  Предупреждение("Ищем второе вхождение цифры 3 с начала "+;
 +
                                                                Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СНачала,1,2)))
 +
  Предупреждение("Ищем второе вхождение цифры 3 с конца "+;
 +
                                                                  Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца,1,2)))
 +
  Предупреждение("Сколько раз встречается цифра 3 в строке "+Строка(СтрЧислоВхождений(СтрокаДляПоиска,"3")))
 +
  Предупреждение("В строке "+СтрокаДляПоиска+" заменяем цифру 3 на цифру 2 "+;
 +
                    СтрЗаменить(СтрокаДляПоиска,"3","2"))
 +
 
 +
  Строка = "иВаН ИваНыч"
 +
  Предупреждение("Переводим строку "+Строка+" в верхний регистр "+ВРег(Строка))
 +
  Предупреждение("Переводим строку "+Строка+" в нижний регистр "+НРег(Строка))
 +
  Предупреждение("Переводим строку "+Строка+" первые символы каждого слова в верхний регистр "+ТРег(Строка))
 +
 
 +
  Предупреждение(" Код символа А = "+Строка(КодСимвола("А",1))+" Символ с кодом 190 = "+Символ(190))
 +
 
 +
  Строка = "=Строка1=Строка2=Строка3=Строка4="
 +
  Предупреждение("Получаем 3-ий элемент из "+Строка+"  "+СтрокуМеждуРазделителями(Строка,"=","=",3))
 +
 
 +
  Предупреждение("Количество знаков '=' в строке равно "+СокрЛП(Строка(СтрЧислоВхождений(Строка, "="))))
 +
 
 +
  Предупреждение('Заменим в строке <'+Строка+'> символы "=" на символы "-". Результат: <'+;
 +
                          СтрЗаменить(Строка,"=","-")+'>')
 +
 
 +
  ЕСЛИ СтрНачинаетсяС(Строка, "=") И СтрЗаканчиваетсяНа(Строка, "=")
 +
    Предупреждение("Строка <"+Строка+"> начинается и заканчивается символом '='")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
  ИмяФайла = ТекущийКаталог()+"Lesson02.txt"
 +
  СтрокаИзФайла = ''
 +
  ЕСЛИ ФайлСуществует(ИмяФайла)
 +
      УкФайл = ОткрытьФайлДляЧтения(ИмяФайла)
 +
      ПОКА НЕ КОНЕЦФАЙЛА(УкФайл)
 +
        СтрокаИзФайла = СтрокаИзФайла+ЧитатьСтрокуИзФайла(УкФайл)+Символ(13)
 +
      КОНЕЦПОКА;
 +
      ЗакрытьФайл(УкФайл)
 +
      Предупреждение(СтрокаИзФайла)
 +
  ИНАЧЕ      Предупреждение("Файл "+ИмяФайла+" не существует.")
 +
  КОНЕЦЕСЛИ;
 +
  Предупреждение('В предыдущей высвеченной строке '+Строка(СтрЧислоСтрок(СтрокаИзФайла))+;
 +
            ' строк. Вторая строка = '+СтрПолучитьСтроку(СтрокаИзФайла, 2))
 +
 
 +
  Предупреждение(Строка(СравнитьСтрокуПоМаске("*др?г","Хороший друг")))
 +
 
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
== Урок 03. Операции с датами ==
 +
 
 +
Если вам надо получить текущую системную дату, то используйте 1С-подобную функцию ТекущаяДата().
 +
 
 +
Вы можете к любой дате добавить или удалить несколько месяцев с помощью 1С-подобной функции ДобавитьМесяц(Дата,КоличествоМесяцев).  Если КоличествоМесяцев — отрицательное число, то даты вычитаются. Пример вызова данной функции:
 +
 
 +
  Предупреждение(ДобавитьМесяц(ТекущаяДата(),1))
 +
 
 +
Чтоб получить номер дня в неделе можно использовать 1С-подобную функцию  ДеньНедели(Дата).
 +
 
 +
  Предупреждение(ДеньНедели(ТекущаяДата()))
 +
 
 +
Получить день года (количество дней с начала года до указанной даты) можно с помощью 1С-подобной функции ДеньГода(Дата)
 +
 
 +
  Предупреждение(ДеньГода(ТекущаяДата()))
 +
 
 +
Получить номер недели, которая соответствует указанной дате, в году можно 1С-подобной функции НеделяГода(Дата)
 +
 
 +
  Предупреждение(НеделяГода(ТекущаяДата()))
 +
 
 +
Так же можете получить из даты год 1С-подобной функцией Год(Дата)
 +
 
 +
  Предупреждение(Год(ТекущаяДата()))
 +
 
 +
Можно получить номер месяца, используя 1С-подобную функцию Месяц(Дата)
 +
 
 +
  Предупреждение(Месяц(ТекущаяДата()))
 +
 
 +
Можно получить день,  используя 1С-подобную функцию День(Дата)
 +
 
 +
  Предупреждение(День(ТекущаяДата()))
 +
 
 +
Дату вы можете присвоить 1С-подобной функцией Дата(Год,Месяц,День,Час,Минута,Секунда)
 +
 
 +
  Дата1 = Дата(2018,6,7,8,15,23)
 +
 
 +
Вы можете записать в укороченном виде без времени Дата(2018,7,12)    Можете передать 1 параметр в виде строки Дата('20180712')  либо в виде строки с записью времени Дата('20180712101230'). Если вы допустите ошибку при записи параметра для данной функции, то вернется цифра -1.
 +
 
 +
С помощью 1С-подобных функций можно получить из даты час, минуту, секунду
 +
 
 +
  Дата1 = Дата(2018,6,7,8,15,23)
 +
  Предупреждение(Час(Дата1))
 +
  Предупреждение(Минута(Дата1))
 +
  Предупреждение(Секунда(Дата1))
 +
 
 +
С помощью 1С-подобных функций можно получить из даты начало года, начало квартала, начало месяца, начало недели, начало дня, начало часа и начало минуты.
 +
 
 +
  Предупреждение(НачалоГода(Дата1))
 +
  Предупреждение(НачалоКвартала(Дата1))
 +
  Предупреждение(НачалоМесяца(Дата1))
 +
  Предупреждение(НачалоНедели(Дата1))
 +
  Предупреждение(НачалоДня(Дата1))
 +
 
 +
С помощью 1С-подобных функций можно получить из даты конец года, конец квартала, конец         
 +
месяца, конец недели, конец дня, конец часа и конец минуты.
 +
 
 +
  Предупреждение(КонецГода(Дата1))
 +
  Предупреждение(КонецКвартала(Дата1))
 +
  Предупреждение(КонецМесяца(Дата1))
 +
  Предупреждение(КонецНедели(Дата1))
 +
  Предупреждение(КонецДня(Дата1))
 +
  Предупреждение(КонецЧаса(Дата1))
 +
  Предупреждение(КонецМинуты(Дата1))   
 +
 
 +
Функция, не имеющая аналога в 1С, ВернутьКоличествоДнейВМесяце() возвращает количество дней в месяце текущей даты с учетом високосных годов.
 +
 
 +
Предупреждение("Количество дней в месяце у даты "+Строка(Дата1)+;
 +
                                " = "+Строка(ВернутьКоличествоДнейВМесяце(Дата1)))
 +
 
 +
С помощью функции, не имеющей аналога в языке программирования 1С,  НазваниеМесяца(НомерМесяца, Падеж) можно получать русское название месяца в различных падежах:
 +
 
 +
Предупреждение("Названия месяцев в падежах: Именительный и Винительный (январь) "+;
 +
                    НазваниеМесяца(1)+"  Родительный (февраль) "+;
 +
                      НазваниеМесяца(2,Падеж.Родительный)+"  Дательный (Март) "+;
 +
                                                      НазваниеМесяца(3,Падеж.Дательный)+;
 +
      "  Творительный (апрель) "+НазваниеМесяца(4,Падеж.Творительный)+;
 +
              "  Предложный (май) "+НазваниеМесяца(5,Падеж.Предложный)) 
 +
 
 +
Результат выполнения данной функции будет выглядеть так:
 +
 
 +
 
 +
Если вам надо сформировать русскоязычную строку для указания периода в пределах одного месяца, то используйте функцию СтрокаЗаПериод(ДеньНачалаПериода, ДеньКонцаПериода, НомерМесяцаПериода, ГодПериода) (аналог в 1С отсутствует). Например, в ведомости на аванс указывается период с 1 по 15 число месяца май 2018 года.
 +
 
 +
  Предупреждение(СтрокаЗаПериод(1,15,5,2018))
 +
 
 +
Результат выполнения данной функции будет таким:
 +
 
 +
== Урок 04. Диалог с пользователем ==
 +
 
 +
Глобальную переменную можно определить командой
 +
 
 +
ПЕРЕМ Знач
 +
 +
Так мы определи глобальную переменную Знач, которая будет доступна из всех функций программы. По возможности, следует избегать назначения лишних глобальных переменных. Для текущих операций следует определять локальные переменные, которые существуют только внутри функции. Все переменные внутри функции следует описывать через ЛПЕРЕМ  Перем1, Перем2 и т. д., чтоб случайно не изменить глобальную переменную с таким же именем.
 +
ЛПЕРЕМ Лзнач,  Лзнач2
 +
 
 +
В обоих случаях мы создали переменную, которая пока не имеет типа. Типы бывают: строковые, числовые, булиан и т.д.  Тип значению задается, когда мы присваиваем значению какие-либо данные.
 +
 
 +
Например, если присвоим Знач=25.5, то тип будет числовым, а если присвоим Знач=«25.5», то тип будет строковым. Тип булеан может иметь только два значения: ИСТИНА или ЛОЖЬ.
 +
 
 +
Если вам надо предоставить пользователю ввести некоторые значения в программу, то для этого вы можете использовать 1С-подобную функцию  ВвестиЗначение(Значение, СтрокаКомментарий).
 +
 
 +
СтрокаКомментарий — это произвольный текст, который высветится в окне ввода значения. Вы можете присваивать переменной Значение некое первоначальное значение нужного типа. Например, если желаете, чтоб пользователь ввел значение Булеан, то присваивайте первоначальное значение типа Булеан.
 +
  Знач=ИСТИНА
 +
  Знач = ВвестиЗначение(Знач, "Ввести значение ИСТИНА или ЛОЖЬ")
 +
 
 +
В результате выполнения данной команды пользователь увидит следующее окно для ввода данных
 +
 
 +
Если нажмете клавишу «Отмена», то вернется ЛОЖЬ
 +
 
 +
Если вы значение будете высвечивать переменную Знач командой Сообщить(Знач), то получите один из результатов .T. Либо .F. (.T. - это ИСТИНА, а .F. - это ЛОЖЬ). А если вы используете команду преобразования значения к типу строка Сообщить(Строка(Знач)), то в результате высветится либо ИСТИНА, либо ЛОЖЬ.
 +
 
 +
Теперь попросим пользователя ввести число.
 +
  Знач=-23.4378
 +
  Знач = ВвестиЗначение(Знач, "Ввести")
 +
  Предупреждение(Знач)
 +
  Предупреждение("Текущая разрядность чисел в системе "+;
 +
                      Строка(ПолучитьТекущуюРазрядностьЧисел(),1,0))
 +
 
 +
Если нажмете клавишу «Отмена», то вернется 0.
 +
 
 +
Первоначально мы присваиваем переменной Знач значение = -23.4378, но пользователь в окне ввода сможет ввести любое другое число. Если мы высветим введенное пользователем число на экоран командой Сообщить(Знач), то число высветится с точностью до двух знаков, потому что так установлено в системе по умолчанию. Посмотреть сколько знаков после запятой по умолчанию установлено в системе можно командой ПолучитьТекущуюРазрядностьЧисел().
 +
 
 +
Если нам нужна разрядность чисел в 4 знака после запятой, то мы можем ее задать командой УстановитьРазрядностьЧисел(4) (В 1С данные команды отсутствуют).
 +
  УстановитьРазрядностьЧисел(4)
 +
  Предупреждение("Текущая разрядность чисел в системе "+;
 +
                          Строка(ПолучитьТекущуюРазрядностьЧисел(),1,0))
 +
  Знач=-23.4378
 +
  Предупреждение(Знач)
 +
  УстановитьРазрядностьЧисел(2)
 +
 
 +
В данном примере по команде Сообщить(Знач) высветится 4 знака после запятой.
 +
 
 +
Если мы желаем, чтоб пользователь ввел строку, то можем написать подобное
 +
  Знач="Проверка ввода строки"
 +
  Знач = ВвестиЗначение(Знач, "Ввести")
 +
  Предупреждение(Знач)
 +
 
 +
Если нажмете клавишу «Отмена», то вернется пустая строка.
 +
 
 +
== Урок 05. Операции с типом Число ==
 +
 
 +
Знаки операций  + (сложение),- (вычитание), ** и ^ (возведение в степень), * (умножить), / (деление), % (остаток деления). 
 +
 
 +
Вы можете получить целую часть числа 1С-подобной функцией Цел()
 +
 
 +
  Предупреждение("Целая часть числа 12.32 = "+Строка(Цел(12.32),10,2) )
 +
 
 +
Вы можете округлить число 1С-подобной функцией Окр()
 +
 
 +
  Предупреждение("Округляем число 12.355 до разрядности 2 = "+Строка(Окр(12.355, 2, 0),10,3))
 +
 
 +
Можете переводить градусы в радианы и наоборот.
 +
 
 +
  Предупреждение("Переводим 30 градусов в радианы "+Строка(ГрадРад(30),7,4)+;
 +
                        " и обратно радианы в градусы "+Строка(РадГрад(ГрадРад(30)),7,4))
 +
 
 +
Можете рассчитывать тангенс (либо TAN()), арктангенс (ATAN()), синус (SIN()), косинус(COS()), арксинус (ASIN()), арккосинус (ACOS()).
 +
 
 +
  Предупреждение("Тангенс числа 30  TAN(30) = "+Строка(Тангенс(30),7,4)+;
 +
                                                  "  Арктангенс ATAN(30) = "+Строка(Арктангенс(30),7,4))
 +
  Предупреждение("Синус числа 30 SIN(30) = "+Строка(Синус(30),7,4)+;
 +
                              "  Арксинус числа -0.9 ASIN(-0.9) = "+Строка(Арксинус(-0.9),7,4))
 +
  Предупреждение("Косинус числа 30 COS(30) = "+Строка(Косинус(30),7,4)+;
 +
                              "  Арккосинус числа 0.15 ACOS(0.15) = "+Строка(Арккосинус(0.15),7,4))
 +
 
 +
Можно рассчитать экспоненту числа (либо EXP()).
 +
 
 +
  Предупреждение("Экспонента числа 30 EXP(30) = "+Строка(Экспонента(30),7,4))
 +
 
 +
Можно получить число Пи (либо PI()).
 +
 
 +
  Предупреждение("Число ПИ PI() = "+Строка(ЧислоПи(),7,4))
 +
 
 +
Вы можете генерировать псевдослучайное число в любом диапазоне.
 +
 
 +
              Предупреждение("Генерация псевдослучайного числа в диапазоне от 1 до 20 = "+;
 +
                                                          Строка(ПсевдоСлучайноеЧисло(1, 20)))
 +
 
 +
Вы можете обрабатывать ошибки используя операторы: ПОПЫТКА, ИСКЛЮЧЕНИЕ, КОНЕЦПОПЫТКИ;
 +
 
 +
  Число = 1237
 +
  ПОПЫТКА
 +
      Предупреждение("Строка плюс число "+Число)
 +
  ИСКЛЮЧЕНИЕ
 +
    Предупреждение("Строку нельзя соединять с числом. Преобразуйте число в строку.")
 +
  КОНЕЦПОПЫТКИ;
 +
 
 +
Вычислить квадратный корень КвадратныйКорень(Число) (либо SQRT(Число))
 +
 
 +
Для вычисления остатка от деления можно использовать функцию ОстатокОтДеления(Делимое, Делитель)  (либо Делимое%Делитель))
 +
 
 +
Возвести число в степень POW(Основание, Показатель) (либо Основание^Показатель)
 +
 
 +
Для определения типа переменной используйте функцию ТипЗнч(Значение), которая возвращает тип в одном из значений: «Строка», «Число», «Булево», «Объект», «Пусто».
 +
 
 +
Можно определить ближайшее меньшее целое число БлижМеньшееЦел(Число), ближайшее большее целое число  БлижБольшееЦел(Число), абсолютное число  Абсолютное(Число).
 +
 
 +
Если надо выяснить знак числа то используйте функцию ЗнакЧисла(Число), она возвращает одно из значений: 1 — число положительное, -1 — число отрицательное, 0 — число = 0.
 +
 
 +
== Урок 06. Простые массивы ==
 +
 
 +
Создадим массив на 7 элементов.
 +
 
 +
  РазмерМассива = 7
 +
  ОПИСАНИЕ_МАССИВА Массивчик(РазмерМассива)
 +
 
 +
Получить количество элементов в массиве можно с помощью функции КоличествоВМассиве(ИмяМассива)
 +
 
 +
  Предупреждение(КоличествоВМассиве('Массивчик'))
 +
 
 +
Массив хорош тем, что может содержать нетипизированные значения и тип значения задается при присваивании.
 +
 
 +
  Массивчик(3) = 'текстовая строка'
 +
  Массивчик(5) = 3 
 +
 
 +
Чтоб изменить размерность массива, его надо переопределить. Все прежние значения сохраняться, если вы не уменьшаете размерность массива.  Как работать с двухмерными массивами будет описано позже, но двухмерный простой массив (далее будет описан объектный массив, который организован иначе) — это фактически одномерный массив, для которого используются функции, позволяющие оперировать им, как двухмерным массивом. Например, можно узнать количество колонок или количество строк двухмерного массива. 
 +
 
 +
  ОПИСАНИЕ_МАССИВА Массивчик(РазмерМассива+1)
 +
  Предупреждение(КоличествоСтрокВМассиве('Массивчик'))
 +
  Предупреждение(КоличествоКолонокВМассиве('Массивчик'))
 +
  РазмерМассива = РазмерМассива+1
 +
 
 +
Вы можете оперировать двухмерным массивом, как одномерным, где количество элементов  будет равно количеству строк умноженному на количество колонок. Чтоб получить из двухмерного массива порядковый номер ячейки, как из одномерного, надо использовать функцию НомерЭлементаВМассиве(Массив,НомерСтроки,НомерКолонки)
 +
 
 +
Мы можем перебирать элементы массива.
 +
 
 +
  ДЛЯ К=1 ПО КоличествоВМассиве('Массивчик')
 +
      Массивчик(К) = К
 +
  КОНЕЦЦИКЛА;            // точка с запятой в операторе КОНЕЦЦИКЛА; обязательна
 +
 
 +
Можно вставлять строки, с указанной позиции
 +
 
 +
  ВставитьСтрокуВМассив('Массивчик', 3)
 +
      Массивчик(3) = 11
 +
 
 +
Содержимое массива можно просматривать в виде строки
 +
 
 +
  Сообщить(СодержимоеМассиваВСтроку('Массивчик'))
 +
 
 +
Можно удалить элемент массива с указанной позиции.
 +
 
 +
  УдалитьСтрокуИзМассива('Массивчик', 3)
 +
 
 +
Сортировать элементы в массиве можно по возрастанию и убыванию.
 +
 
 +
  СортироватьМассив('Массивчик',1)
 +
 
 +
Просмотреть содержимое массива удобнее в виде списка функцией ВыборИзМассива(ИмяМассива), Данная функция возвращает номер выбранного элемента из списка.
 +
 
 +
  Предупреждение(ВыборИзМассива('Массивчик'))
 +
 
 +
Массив можно сформировать из списка файлов на диске по заданной маске (например, «*.rus»)   
 +
  СписокФайловВМассив('Массивчик','*.rus')
 +
 
 +
В результате в массиве «Массивчик» будет содержаться список файлов, полученных командой.
 +
 
 +
== Урок 07. Объектные массивы ==
 +
 
 +
В отличие от простого массива, который имеет заданное вами имя, объектный массив имеет ссылку на объект, а имя внутри объекта присваивается случайным образом и не используется программистом (хотя его можно посмотреть в соответствующем поле объекта). Преимущество объектного массива в том, что указатель на такой массив может присваиваться элементам другого массива, либо переменной.  При вставке строк или колонок размерность массива изменяется автоматически, а в простом массиве вам следует переопределять массив при изменении его размера.
 +
 
 +
Новый массив создается так:
 +
 
 +
    Мас =  НовыйМассив(2)  // Одномерный объектный массив с 2-мя элементами
 +
   
 +
Номер последнего элемента массива можно посмотреть так:
 +
 
 +
    Предупреждение(Мас.ВГраница())
 +
 
 +
В последнюю ячейку массива запишем число 22
 +
    Мас.Установить(Мас4.ВГраница(),22) 
 +
 
 +
== Урок 08. Создание объектов ==
 +
 
 +
Описание объекта начинается с оператора ОПРЕДЕЛИТЬ_ОБЪЕКТ, а заканчивается оператором  КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА
 +
 
 +
  ОПРЕДЕЛИТЬ_ОБЪЕКТ Объект1 КАК БАЗОВЫЙ_ОБЪЕКТ 
 +
 
 +
  ЗАЩИЩЕННОЕ_СВОЙСТВО Свойство2  // К этому совойству нельзя обратиться извне, но можно из потомков
 +
  СКРЫТОЕ_СВОЙСТВО Свойство4  // К этому совойству нельзя обратиться извне и нельзя из потомков
 +
  Свойство1 = 'Любой текст'
 +
  Свойство2 = 2    // Это защищенное свойство
 +
  Свойство3 = 3
 +
  Свойство4 = 4    //  Это скрытое свойство
 +
 
 +
  ФУНКЦИЯ КтоЭто()
 +
  КОНЕЦФУНКЦИИ "Это Объект1"
 +
 
 +
  ФУНКЦИЯ ПростаяФункцияОбъекта
 +
  КОНЕЦФУНКЦИИ 'Это простая функция'
 +
 
 +
  ФУНКЦИЯ Свойство3_ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА
 +
      Предупреждение('Это особая функция, которая вызывается, если вы пытаетесь '+;
 +
                                    'получить значение свойства Свойство3')
 +
      ВОЗВРАТ ЭТОТ_ОБЪЕКТ.Свойство3  // вы можете не возвращать свойство и его значение извне нельзя будет получить
 +
  КОНЕЦФУНКЦИИ
 +
 
 +
  ФУНКЦИЯ Свойство3_ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА(Значение)
 +
      Предупреждение('Это особая функция, которая вызывается, если вы пытаетесь '+;
 +
                          'присвоить значение свойству Свойство3')
 +
      ЭТОТ_ОБЪЕКТ.Свойство3 = Значение  // Вы можете не присваивать, тогда изменить свойство извне будет невозможно
 +
  КОНЕЦФУНКЦИИ
 +
 
 +
  ФУНКЦИЯ ИзменитьСвойство2(Значение)
 +
      ЭТОТ_ОБЪЕКТ.Свойство2 = Значение
 +
  КОНЕЦФУНКЦИИ
 +
 
 +
  ФУНКЦИЯ ПрочитатьСвойство2
 +
  КОНЕЦФУНКЦИИ ЭТОТ_ОБЪЕКТ.Свойство2
 +
 
 +
    КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА     
 +
 
 +
Оператор ЗАЩИЩЕННОЕ_СВОЙСТВО  запрещает доступ и изменение перечисленных после него свойств за пределами класса, сам класс и потомки доступ имеют.
 +
 
 +
Оператор  СКРЫТОЕ_СВОЙСТВО  запрещает доступ вне класса даже потомкам.
 +
 
 +
Оператор _ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА вынуждает вызывать данную функцию для свойства, которое названо вначале названия функции (в данном случае Свойство3). Когда кто-то извне пытается прочитать значение свойства, будет вызвана данная функция.
 +
 
 +
Оператор _ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА  вынуждает вызывать данную функцию для свойства, если кто-то извне пытается записать значение в свойство.
 +
 
 +
Для защищенного свойства2  мы вынуждены написать функции доступа, иначе к нему нельзя будет обратиться извне.
 +
 
 +
Создадим потомка объекта «Объект1»
 +
 
 +
  ОПРЕДЕЛИТЬ_ОБЪЕКТ Объект2 КАК  Объект1
 +
      ФУНКЦИЯ ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА()
 +
          Предупреждение("При создании объекта вызывается данная функция")
 +
        КОНЕЦФУНКЦИИ
 +
        ФУНКЦИЯ КтоЭто()
 +
        КОНЕЦФУНКЦИИ "Это Объект2, который создан от "+МЕТОД_РОДИТЕЛЯ()
 +
        ФУНКЦИЯ ПРИ_УДАЛЕНИИ_ОБЪЕКТА()
 +
            Предупреждение("При удалении объекта вызывается данная функция")
 +
        КОНЕЦФУНКЦИИ
 +
  КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА     
 +
 
 +
В объекте потомке мы переопределили метод КтоЭто(), но внутри его вызвали метод родителя оператором МЕТОД_РОДИТЕЛЯ()
 +
 
 +
В объекте потомке мы создали функцию ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА(), которая будет вызываться всякий раз при создании объекта2. Еще мы создали функцию ПРИ_УДАЛЕНИИ_ОБЪЕКТА(), которая будет вызываться при удалении объекта.
 +
 
 +
== Урок 09. Исследование объектов ==
 +
 
 +
В РусскийФокс вы можете просмотреть содержимое любого объекта (какие свойства, методы и события он имеет) с помощью специальных функций: МассивМетодовОбъекта(Объект), МассивСвойствОбъекта(Объект),  МассивСобытийОбъекта(Объект)
 +
 
 +
Каждая из этих функций возвращает объектный массив с соответствующим списком информации об объекте. Например, для просмотра списка методов объекта «ОбъектСтрока» можно использовать следующий код.
 +
 
 +
  ОбМассив = МассивМетодовОбъекта(ОбъектСтрока)
 +
  ОбМассив.ВыборИзМассива("Для_строк")
 +
  УдалитьОбъект(ОбМассив)
 +
 
 +
В Уроке 09 (Lesson.rus) вы можете посмотреть код программы по просмотру содержимого различных объектов имеющихся в Русском Фоксе и создаваемых программистом.
 +
 
 +
== Урок 10. Рабочий стол, DBF-файлы и просмотр Курсора ==
 +
 
 +
В программе РусскийФокс Рабочий Стол присутствует всегда, но он скрыт по умолчанию. Некоторые объекты могут быть активизированы и показаны на экране только в том случае, когда Рабочий стол не скрыт. Поэтому эти объекты перед своей активизацией делают Рабочий стол видимым, если Рабочий стол скрыт.
 +
 
 +
Для управления Рабочим Столом создаем объект «РабочийСтол».  (см.Урок 10)
 +
 
 +
  Экран = НовыйОбъект("РабочийСтол") 
 +
  Экран.Показать()  // Делаем скрытый рабочий стол видимым     
 +
 
 +
Меняем размеры Рабочего Стола
 +
 
 +
  Экран.Координаты(3,15,50,150)
 +
  Экран.ИзменитьОкно()
 +
  Экран.ЦветФона(ЦветФормы.Зеленый)  // Делаем зеленый фон
 +
  Экран.Заголовок("НовыйЗаголовок")    //  Устанавливаем новый заголовок
 +
 
 +
Данные могут хранится в DBF-файлах. Для открытия и использования DBF-файла следует применять объект «ФайлDBF»
 +
 
 +
  Файл1 = НовыйОбъект("ФайлDBF")
 +
  ЕСЛИ НЕ Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Departm.dbf",1)
 +
      Предупреждение("Ошибка открытия файла")
 +
  КОНЕЦЕСЛИ;   
 +
 
 +
В метод объекта «ФайлDBF» ОткрытьФайл() передаются два параметра: 1) полный путь и имя DBF-файла с расширением  2) режим открытия (0 — только чтение, 1 — запись и чтение, 2 — монопольный режим, 3 — повторное открытие файла только для чтения)
 +
 
 +
Закрыть файл можно, удалив объект.  Как программно создавать DBF-файлы, корректировать их структуру, связывать между собой мы будем рассматривать позже.
 +
 
 +
Но после открытия DBF-файла возникает потребность просмотреть на экране содержимое файла, добавить или удалить записи, либо отредактировать какие-то данные. Для данной цели можно использовать объект «ПросмотрКурсора».
 +
  Просмотр = НовыйОбъект("ПросмотрКурсора")
 +
    Просмотр.Показать(Файл1)
 +
 
 +
После выполнения данного кода, на экране появится Рабочий Стол (если он был скрыт) и таблица, в которой можно будет производить манипуляции с данными DBF-файла.
 +
 
 +
Названия колонок в данной таблице будут соответствовать именам полей DBF-файла. Для разработчика такой просмотр может быть достаточным, но для пользователя программы он не удобен. Потому в объекте «ПросмотрКурсора» вы можете производить дополнительные настройки:
 +
 
 +
  Просмотр = НовыйОбъект("ПросмотрКурсора")
 +
  Просмотр.СписокПолей = "1=>Kod:R,2=>Name"
 +
  Просмотр.ШиринаКолонок = "1=>20,2=>70"
 +
  Просмотр.ЗаголовокКолонок  = '1=>"Код",2=>"Наименование"'
 +
  Просмотр.ДопНастройкаТаблицы = Просмотр.ЗапретитьИзменятьДанные()+;
 +
          Просмотр.ЗапретитьДобавлять()+Просмотр.ЗапретитьУдалять()+;
 +
                                Просмотр.СправаКарточка(ИСТИНА)+Просмотр.ЗакрепитьКолонки(2)
 +
  Просмотр.Заголовок = "Список отделов"
 +
  Просмотр.Подсказка = "(F4 - Карточка отдела, F5-Список отделов, Alt+F4-Выход)" 
 +
    Просмотр.Показать(Файл1)
 +
 
 +
Вы можете выводить в таблицу только нужные поля, перечислив их в свойстве  «СписокПолей» объекта «ПросмотрКурсора». Например, "1=>Kod:R,2=>Name". Но если вы перечислили поля, то вам придется указать и ширину колонки каждого поля: Просмотр.ШиринаКолонок = "1=>20,2=>70"  (ширина 1-ой колонки = 20, а 2-ой = 70)
 +
 
 +
При желании вы можете указать и свои названия колонок в таблице:
 +
 
 +
* Просмотр.ЗаголовокКолонок  = '1=>"Код",2=>"Наименование" '
 +
 
 +
Можете изменить заголовок и подсказку окна таблицы:
 +
* Просмотр.Заголовок = "Список отделов"
 +
* Просмотр.Подсказка = "(F4 - Карточка отдела, F5-Список отделов, Alt+F4-Выход)" 
 +
 
 +
Так же можно выполнить дополнительные настройки таблицы:
 +
 
 +
* ЗапретитьИзменятьДанные() - записав данную функцию, таблица откроется только в режиме просмотра данных, даже если DBF-файл вы открыли в режиме изменения данных.
 +
* ЗапретитьДобавлять() - запрещено добавлять новые записи в таблицу.
 +
* ЗапретитьУдалять() - запрещено удалять записи из таблицы.
 +
* ЗакрепитьКолонки(2) — Закрепить 2 колонки слева, которые при перемещении будут оставаться видимыми.
 +
 
 +
Таким образом, если вам надо, чтоб пользователь мог только изменять данные, но не мог добавлять или удалять их, то вы можете написать: Просмотр.ЗапретитьДобавлять()+Просмотр.ЗапретитьУдалять(). 
 +
 
 +
Все данные функции (ЗапретитьДобавлять(), ЗапретитьУдалять(), ЗакрепитьКолонки(2), ЗапретитьИзменятьДанные(), СправаКарточка(ИСТИНА)) могут применяться только в таком виде для заполнения Свойства «ДопНастройкаТаблицы» до выполнения метода Показать() и они не могут использоваться, как самостоятельные функции после запуска метода Показать() или для заполнения других свойств объекта.
 +
   
 +
Если вы включаете функцию СправаКарточка(ИСТИНА), то это означает, что таблицу можно будет разделить на две части по вертикали: слева будет обычный табличный список, а справа  каждая запись будет представлена в виде карточки, где поля будут расположены не в колонках, а друг за другом сверху вниз.  Таким образом, слева будет таблица, в которой удобно перемещаться по записям, а справа подобие карточки, где удобно перемещаться по полям строки таблицы. Если вы передадите параметр ЛОЖЬ, то слева будет карточка, а справа таблица.
 +
 
 +
Для разделения окна таким образом следует «мышкой» потянуть вправо за черную метку в левом нижнем углу.  Вы можете переключаться между режимами карточка и список, нажимая F4 или F5.
 +
 
 +
Таким образом, теперь у вас есть инструмент редактирования DBF-файла для не привередливых пользователей.
 +
 
 +
== Урок 11. Взаимодействие с LibreOffice (либо OpenOffice) ==
 +
 
 +
Для формирования отчетных форм в программах удобно использовать шаблоны, сформированные в программе LibreOffice, которые заполняются из программы РусскийФокс. 
 +
 
 +
Для работы с LibreOffice используйте объект «RepOpenOffice».
 +
 
 +
    ОтчетПользователя = НовыйОбъект(«RepOpenOffice»)
 +
 
 +
После создания объекта  ОтчетПользователя, вы можете соединиться с LibreOffice
 +
 
 +
      ОтчетПользователя.Соединиться(ТекущийКаталог(),"Отчеты.ods","Урок11")
 +
 
 +
здесь ТекущийКаталог() - это каталог, в котором расположен файл с шаблоном  Отчеты.ods, в котором мы будем использовать Лист «Урок11»
 +
 
 +
Чтоб оставить в файле  Отчеты.ods все листы, кроме нужного вызываем метод
 +
 
 +
  ОтчетПользователя.УдалитьВсеЛистыКромеНужного()
 +
 
 +
смотрите работающий пример урока 11 в файле Lesson11.rus. Для получения данных, записанных в ячейках шаблона используйте метод объекта
 +
 
 +
  ОтчетПользователя.ПолучитьСтрокуИзЯчейки(НомКолонки, НомСтроки)
 +
 
 +
а для записи значения в ячейку шаблона LibreOffice
 +
 
 +
      ОтчетПользователя.ЗаписатьСтрокуВЯчейку(Колонка1,Строка1,Значение)
 +
 
 +
следует знать, что нумерация колонок и строк в шаблоне начинается с 0. Потому ячейке A1 будет соответствовать номер колонки = 0 и номер строки = 0.
 +
 
 +
Вы можете управлять видимостью отчета методом
 +
 
 +
  ОтчетПользователя.ВидимостьОтчета(ИСТИНА)
 +
 
 +
ИСТИНА в параметре покажет отчет на экране, а ЛОЖЬ — скроет. При заполнении шаблона отчет разумнее скрыть, чтоб экран пользователя не мелькал при записи данных в шаблон.
 +
 
 +
В примере урока 11 (см.файл Lesson11.rus) представлена программа, которая считывает ячейки шаблона, находит особые записи (поля типа «<<поле>>»), собирает их координаты расположения (номер колонки и строки), затем в эти поля записывает определенный текст.
 +
 
 +
== Урок 12. Создание объекта LibreOffice (либо OpenOffice) ==
 +
 
 +
== Урок 13. Создание сценариев для ClickerMann ==
 +
 
 +
Программа ClickerMann.exe генерирует нажатия клавиатуры по программному сценарию, имитируя работу пользователя. Это можно использовать для заполнения справочников в различных программах. Например, в уроке 13 показано, как в Русском Фоксе формировать сценарий к программе ClickerMann для создания новых карточек по основным средствам для программы 1С. У меня возникла необходимость ввести более 13000 карточек в программе 1С, при этом данные для заполнения полей в карточках содержатся в таблице Calc OpenOffice.
 +
 
 +
ClickerMann выполнит эту работу, а РусскийФокс напишет ему сценарий для выполнения.
 +
 
 +
Создаем два объекта  (см. Lesson13.rus)
 +
  Офис = НовыйОбъект("RepOpenOffice")
 +
    Об = НовыйОбъект("clickermann")
 +
 
 +
Объект «Офис» будет читать данные из таблицы Calc, а объект «Об» будет формировать файл со сценарием для  ClickerMann.exe.
 +
    Об.НачатьЗаписьСценария("test","Больница")
 +
 
 +
Здесь  test – это задаваемое нами имя файла со сценарием (он будет иметь расширение “.cms”). Больница — это слово, которое содержится в заголовке окна открытой программы 1С. В программе 1С мы должны сами открыть справочник «Основные средства» до запуска сценария.  ClickerMann, выполняя наш сценарий, сам активизирует окно 1С (в заголовке которого есть слово «Больница»), так как в сценарии будут соответствующие команды.
 +
 
 +
Используя объект «Офис» мы получаем содержимое нужных нам ячеек и заполняем нужные переменные.
 +
 
 +
  Наименование = Офис.ПолучитьСтрокуИзЯчейки(1, Начало)
 +
 
 +
Нужные переменные мы передаем в функцию
 +
 
 +
    ДобавитьОсновноеСредство(Наименование,ИнвНомер,Сумма,Номер,Об)
 +
 
 +
Данная функция производит запись команд в файл сценария (“test.cms”), которые произведут создание новой карточки в программе 1С, внесут в нее нужные данные и нажмут кнопку «Записать». Таким образом, нужные данные попадут в справочник 1С.
 +
 
 +
Имитируя нажатие клавиши INS, робот  ClickerMann создаст новую карточку основного средства в списке основных средств.
 +
 
 +
    Об.КлавишаINS()
 +
 
 +
После этой команды, на всякий случай, сделаем задержку 500 миллисекунд, чтоб команда нормально отработала (для надежности я делаю заведомо большую задержку).
 +
 
 +
    Об.Задержка(500)
 +
 
 +
После создания новой карточки курсор будет находится в поле «Наименование». В это поле мы заносим наше значение.
 +
 
 +
  Об.ПечататьСтроку(Наименование)
 +
 
 +
Теперь нам надо перейти на поле для ввода инвентарного номера. Для этого надо нажать три раза клавишу TAB
 +
 
 +
    Об.КлавишаTAB()
 +
 
 +
После задержки вставляем нужные данные в это поле. Затем вновь нажимаем TAB. Вводим норму амортизации (в данном случае во всех карточках вводим 100). После этого вновь нажимаем TAB. Вносим количество часов работы оборудования в год (во всех карточках 1925). Затем нажимаем 9 раз клавишу TAB, чтоб попасть на строку «Примечание». В нее  записываем порядковый номер карточки. Вновь нажмем TAB и окажемся на кнопке «Записать». Чтоб «нажать» кнопку вводим команду
 +
 
 +
    Об.КлавишаВВОД()
 +
 
 +
В конце вновь добавляем задержку, чтоб карточка успела сохраниться перед тем как мы вновь начнем повторять эти процедуры для ввода новой карточки.
 +
 
 +
Для закрытия файла «test.cms» после окончательной записи сценария вызываем
 +
 
 +
    Об.ЗакончитьЗапись()
 +
 
 +
После выполнения данной программы мы получим файл сценария для ClickerMann.exe. Запустив данный сценарий мы увидим, как робот ClickerMann будет создавать новые записи в программе 1С и заносить в них наши данные.
 +
 
 +
== Урок 14. Создание DBF-файла, выгрузка в XML ==
 +
 
 +
Для просмотра DBF-файлов мы создаем объект "ПросмотрКурсора".
 +
 
 +
  Просмотр = НовыйОбъект("ПросмотрКурсора")     
 +
 
 +
Открываем DBF-файл
 +
 
 +
  Файл1 = НовыйОбъект("ФайлDBF")
 +
  ЕСЛИ НЕ Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Departm.dbf",1)
 +
      Предупреждение("Ошибка открытия файла Departm.dbf")
 +
  КОНЕЦЕСЛИ;
 +
 
 +
Смотрим DBF-файл
 +
 
 +
      Просмотр.Показать(Файл1)
 +
 
 +
Для создания нового DBF-файла используем функцию СоздатьТаблицу() объекта "ФайлDBF"
 +
 
 +
  Файл1.СоздатьТаблицу(ТекущийКаталог()+"DBF\","|Doljnost | Kod|C|10|0| Name|C|30|0|")   
 +
 
 +
Строка "|Doljnost | Kod|C|10|0| Name|C|30|0|" описывает структуру таблицы Doljnost.dbf. В таблице будут созданы следующие поля:  1) Kod – строка длинной 10 символов,  2) Name – строка в 30 символов.    Число мы бы задали так :  |n|7|2|  (7-знаков, 2 знака после запятой)  Дату определили бы так: |d|0|0|  Если вы ошибочно вместо латинской «C» наберете русскую «С», то программа сообщит вам об ошибке, что буква при определении поля не соответствует.
 +
 
 +
Чтоб добавить новое поле в существующий DBF-файл следует вызвать функцию ПроверитьСтруктуру()  объекта "ФайлDBF"
 +
 
 +
  Файл1.ПроверитьСтруктуру("|Doljnost | Kod|C|10|0| Name|C|30|0| Departm|C|10|0|")
 +
  УдалитьОбъект(Файл1)
 +
 
 +
После вызова данной функции объект "ФайлDBF" следует удалять и открывать заново. Учитывая, что изменять структуру приходится редко, как правило при обновлении версии программы, то переоткрыть DBF-файл — это не сложно.
 +
 
 +
В уроке 14 умышлено в примере делаемся попытка показа DBF-файла после вызова функции ПроверитьСтруктуру(),  чтоб показать, какая ошибка при этом будет высвечена. Здесь показано, как изменить структуру существующего поля. Поле «Name» имело размер в 30 символов, а мы его меняем на размер в 100 символов.
 +
 
 +
  Файл1.ПроверитьСтруктуру("|Doljnost | Name|C|100|0|") 
 +
  Предупреждение("Попытка показа объекта после выполнения функции ПроверитьСтруктуру()")
 +
  Просмотр.Показать(Файл1) 
 +
  УдалитьОбъект(Файл1)
 +
 
 +
Объект «ПросмотрКурсора» кроме просмотра способен сформировать XML-файл из данных DBF-файла. Для этого вы можете вызвать одну из функций:
 +
 
 +
  Просмотр.КурсорВXMLФайл(Файл1.ИмяОбласти,"XMLDepartm")
 +
  Просмотр.КурсорВXMLФайл2(Файл1.ИмяОбласти,"XMLDepartm2")
 +
 
 +
Объект «ФайлDBF» имеет свойства:
 +
 
 +
1)  ИмяФайла – имя dbf-файла, открытого в объекте 
 +
 
 +
2) ПутьФайла — полный путь каталога, где находится файл 
 +
 
 +
3) ИмяОбласти — это уникальное имя, если области с именем = ИмяФайла нет, то ИмяОбласти будет = Имени файла, если такая область есть (например, такое случится, когда файл будет открыт снова в другом объекте), то ИмяОбласти = ИмяФайла+ уникальный код. 
 +
 
 +
4) Режим указывает, как был открыт файл (0-только чтение, 1- чтение и запись, 2 — монопольно, 3- повторно, только для чтения)   
 +
 
 +
5) СтрокаОписанияПоле — это текстовое описание структуры файла (типа "|Doljnost | Kod|C|10|0| Name|C|30|0| Departm|C|10|0|"). Данное свойство заполняется только при вызове функции создания DBF-файла.
 +
 
 +
== Урок 15. Изменение DBF-файла и назначение командных клавиш ==
 +
 
 +
Для добавления записей в DBF-файл следует использовать функцию ДобавитьЗапись() объекта "ФайлDBF" (см.пример урока 15 в файле «Lesson15.rus»)
 +
  Файл1 = НовыйОбъект("ФайлDBF")
 +
  Файл1.ДобавитьЗапись()
 +
 
 +
А для присвоения значений полям DBF-файла используйте функцию ИзменитьПоле(ИмяПоля, Значение)
 +
 
 +
  Файл1.ИзменитьПоле("Kod", "01")
 +
 
 +
Для перемещения по записям следует использовать функции, которые возвращают номер записи:
 +
    НомерЗаписи = Файл1.ПоследняяЗапись()    // на последнюю запись в файле
 +
    НомерЗаписи = Файл1.Начало()                      // на первую запись в файле
 +
    НомерЗаписи = Файл1.ПерейтиВперед(1)  //  на одну запись вперед
 +
    НомерЗаписи = Файл1.ПерейтиВперед(-1)  //  на одну запись назад
 +
    НомерЗаписи = Файл1.ПерейтиНаНомер(НомерЗаписи)    //  перейти на указанный номер записи
 +
 
 +
Для удаления записей вы можете сначала пометить текущую запись для удаления
 +
 
 +
    Файл1.ПометитьНаУдаление()   
 +
 
 +
а затем полностью удалить помеченные записи
 +
 
 +
      Файл1.УдалитьПомеченныеНаУдаление()
 +
   
 +
Но следует помнить, что после выполнения функции УдалитьПомеченныеНаУдаление() DBF-файл закрывается и для продолжения работы с ним следует вновь открыть данный файл
 +
 
 +
    Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Doljnost.dbf",1)
 +
 
 +
Для DBF-файла вы можете создать индексный файл с расширением CDX, в котором могут содержаться несколько индексов по разным полям DBF-файла.
 +
  Файл1.СоздатьИндекс("TAG_Kod","Kod")      // сортирует по коду
 +
  Файл1.СоздатьИндекс("TAG_Name","Name")    // сортирует по наименованию
 +
 
 +
Текущий индекс всегда один. Изменять его можно, если у вас несколько индексов, функцией УстановитьТекущийИндекс(ИмяИндекса) объекта  "ФайлDBF"
 +
 
 +
    Файл1.УстановитьТекущийИндекс("TAG_Kod")  // сортировать по коду
 +
 
 +
Напоминаю, как можно настроить показ DBF-файла (см.урок 10)
 +
 
 +
  Просмотр.СписокПолей = "1=>Kod:R,2=>Name"
 +
  Просмотр.ШиринаКолонок = "1=>20,2=>70"
 +
  Просмотр.ЗаголовокКолонок  = '1=>"Код",2=>"Наименование"'
 +
  Просмотр.ДопНастройкаТаблицы = Просмотр.ЗапретитьИзменятьДанные()+;
 +
            Просмотр.ЗапретитьДобавлять()+;
 +
              Просмотр.ЗапретитьУдалять()+Просмотр.СправаКарточка(ИСТИНА)+;
 +
                        Просмотр.ЗакрепитьКолонки(2)
 +
  Просмотр.Заголовок = "Список Должностей"
 +
  Просмотр.Подсказка = "(F4 - Карточка, F5-Список, ПравКнМышки - Меню, Alt+F4-Выход)" 
 +
  Просмотр.Показать(Файл1)
 +
 
 +
При показе определяются функциональные клавиши для команд перехода в режим «Карточка» F4 и в режим «Список» F5. Но вы можете назначить и свои функциональные клавиши, например, для вызова меню по нажатию правой кнопки мышки. Для этого следует использовать функцию УстановитьКоманднуюКлавишу(НазваниеКлавиши, Команда) объекта "ПросмотрКурсора"
 +
 
 +
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "ВызватьМеню(Просмотр,Файл1)")   
 +
 
 +
Для установки вызова команд доступно программирование следующих функциональных клавиш
 +
Функций объекта "ПросмотрКурсора" : ПраваяКнопкаМышки() - нажатие правой кнопки мышки, ЛеваяКнопкаМышки() - нажатие левой кнопки мышки, КнопкаМышки() - просто кнопка мышки, СтрелкаВлево(), СтрелкаВправо(), СтрелкаВверх(), СтрелкаВниз(), УдалениеНазад() - BACKSPACE, Пробел(), Shift_TAB().  Напоминаю, что данные функции находятся внутри объекта "ПросмотрКурсора", потому их вызов происходит через указатель на созданный объект "ПросмотрКурсора"  Например, Просмотр.СтрелкаВверх()
 +
 
 +
Кроме перечисленных назначений вы можете использовать все функциональные клавиши от F1 до F12, передавая их в функцию УстановитьКоманднуюКлавишу(«F1», «СтрокаСКомандой»). Имена прочих клавиш: DEL, INS, TAB, ENTER, ESC, 0...9, A...Z. Еще можно добавлять сочетания CTRL+, ALT+, SHIFT+.  Например, «CTRL+1», «ALT+TAB», «SHIFT+A»,  «ALT+F3» и т.д.
 +
 
 +
Например, мы запрограммировали вызов меню по нажатию правой кнопки мышки при просмотре DBF-файла с использованием функции Просмотр.Показать(Файл1). Тогда функция такого меню может выглядеть так:
 +
 
 +
ФУНКЦИЯ ВызватьМеню(Просмотр,Файл1)
 +
  ЛПЕРЕМ Результат, Команда
 +
  // На время выполнения данной функции отключаем повторный вызов данной функции по правой клавише мышки
 +
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "")
 +
  Мас4 = НовыйМассив(6)
 +
  Мас4.Установить(1,"Пометить к удалению") 
 +
  Мас4.Установить(2,"ДобавитьЗапись") 
 +
  Мас4.Установить(3,"Вверх") 
 +
  Мас4.Установить(4,"Вниз") 
 +
  Мас4.Установить(5,"В конец списка") 
 +
  Мас4.Установить(6,"В начало списка") 
 +
  Результат = Мас4.ВыборИзМассива()
 +
Команда = РезультатУсловий(Результат,'Параметр1=1,"Файл1.ПометитьНаУдаление()",Параметр1=2,"Файл1.ДобавитьЗапись()",'+;
 +
    'Параметр1=3,"Файл1.ПерейтиВперед(-1)",Параметр1=4,"Файл1.ПерейтиВперед(1)",""')
 +
  ЕСЛИ СтрДлина(Команда)=0  // если Команда = пустая строка
 +
    Команда = РезультатУсловий(Результат,'Параметр1=5,"Файл1.ПоследняяЗапись()",""')
 +
  КОНЕЦЕСЛИ; 
 +
  &Команда
 +
  ЕСЛИ Результат = 6
 +
    Файл1.Начало() 
 +
  КОНЕЦЕСЛИ;
 +
  // Восстанавливаем вызов функции по нажатию правой кнопки мышки
 +
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "ВызватьМеню(Просмотр,Файл1)")
 +
КОНЕЦФУНКЦИИ
 +
     
 +
Важно при начале запуска функции отключать возможность повторного вызова функции, пока вызванная функция не отработает. Для этого мы в начале функции вызываем
 +
 
 +
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "")
 +
 +
Чтоб при нажатии правой кнопки мышки ни чего не вызывалось. А в конце функции вновь устанавливаем вызов данной функции по нажатию правой кнопки мышки.
 +
 
 +
В этой функции, чтоб сформировать строки меню мы заполняем массив Мас4 нужными строками. После присваиваем результат выбора переменной «Результат»
 +
          Результат = Мас4.ВыборИзМассива()
 +
 
 +
Затем нам надо по числу (фактически номер выбранной строки), которое попадет в переменную «Результат» вызвать нужную команду. Для этого можно использовать конструкцию ЕСЛИ, но тогда код получится слишком длинным. Потому мы применяем функцию РезультатУсловий(), в которой в качестве первого параметра передаем переменную «Результат», а затем вторым параметром в виде строки передаем наборы условий при этом, чтоб использовать двойные кавычки для возврата строк типа «Файл1.ДобавитьЗапись()» вся строка заключена в одинарные кавычки «'». При этом мы не можем написать в условии «Результат=1», так как условие будет выполняться внутри функции, потому мы пишем «Параметр1=1», а поскольку в качестве первого параметра мы передаем «Результат», то данная запись  соответствует условию «Результат=1». При выполнении какого-либо условия в переменную «Команда» будет возвращена соответствующая строка с вызываемой командой, а если ни одно условие не выполнится, то возвратится пустая строка, так как в конце строки у нас запись «""» (пустая строка). Далее я показал (хотя такой вызов не эффективен при небольшом числе условий), что мы можем проверить переменную «Команда», если в ней пустая строка, то вновь вызвать функцию РезультатУсловий() с проверкой других условий.
 +
 
 +
В итоге мы запускаем содержимое строки «Команда» на исполнение той функции, которая содержится в ней в виде строки вызова.  Если переменная «Команда» останется пустой строкой, то ни какого вызова функции не произойдет.  Далее я вынуждено использую конструкцию ЕСЛИ, из-за наличия в команде одинарных и двойных кавычек.
 +
  ЕСЛИ Результат = 7
 +
        Файл1.УстановитьФильтр('СравнитьСтрокуПоМаске("*Фокс*",Name)')
 +
  КОНЕЦЕСЛИ;
 +
 
 +
Аналогично пришлось бы поступить, если мы использовали не одну строку команды, а несколько строк. Но так же можно было бы создать функцию с простым вызовом типа «Функ1()», а в ней уже вызывать любые команды.
 +
 
 +
== Урок 17. Подключение модулей ==
 +
 
 +
Большие программы тяжело создавать в одном текстовом файле. Требуется разделение программного кода на модуле. Работа с модулями в РусскомФоксе имеет ряд особенностей, которые важно понимать. Все модули, которые можно подключить имеют расширение «fxp». Любая программа РусскогоФокса может стать модулем для другой программы. В РусскомФоксе нет деления на «exe» и «dll» (хотя dll РусскийФокс так же может использовать), все запускаемые файлы имеют расширение «fxp» и содержат упакованные строки для интерпретатора. Для подключения модуля достаточно выполнить команду
 +
 
 +
  ПодключитьМодуль("BootStrap")
 +
 
 +
После этой команды можно использовать все функции и объекты данного модуля. Но если вы подключаете несколько модулей, которые содержат одноименные функции, то у вас могут возникнуть проблемы: будет запускаться та функция, которая содержится в модуле подключенным первым. Поэтому рекомендуется избегать свободных функций, а все функции заключать внутрь объекта с заведомо уникальным именем.
 +
 
 +
 
 +
При использовании нескольких модулей единственным способом вызвать функцию из нужного модуля при наличие одноименных функций в нескольких модулях — это отключить все модули и подключить их в нужном порядке. Такой проблемы не возникает, если вы имеете одноименные названия объектов в разных модулях. Вы можете подключить нужный модуль, создать нужный объект, затем отключить все модули. Объекты после отключения модулей остаются доступными.
 +
 
 +
Демонстрация этих особенностей при использовании модулей содержится в уроке 17.
 +
 
 +
В примере два модуля «BootStrap» и  «Модуль1» имеют одноименную функцию ИмяМодуля(). На примере вызова этой функции показана данная особенность подключения модулей. Так же показано, что работоспособность созданного из модуля объекта сохраняется и после закрытия всех модулей командой
 +
 
 +
ПодключитьМодуль()
 +
 
 +
Пока нет возможности отключать модуля по отдельности. Но пока это не создает особых проблем, я предпочитаю сосредоточится на более важных направлениях развития Русского Фокса.
 +
 
 +
 
 +
== Урок 18. BootStrap-объект. ==     
 +
 
 +
Если скрестить ежа с ужом, то получится либо колючий уж, либо очень длинный еж.
 +
 
 +
РусскийФокс вносит новый технологический подход в сайтостроение. Теперь вы можете ограничится знанием Русского Фокса и не иметь знаний по HTML, CSS, JavaScript, PHP, чтоб создавать сайты. Генерировать нужные коды в HTML-файл можно на Русском Фоксе, используя объект «BootStrap». Знания языков программирования для создания сайтов вам потребуются только, если вы захотите создать свои объекты на Русском Фоксе или дополнить существующие объекты.
 +
 
 +
Объект «BootStrap» содержится в модуле bootstrap.fxp и полностью написан на Русском Фоксе без применения Visual FoxPro 9 (родителя Русского Фокса).
 +
 
 +
В модуле BootStrap.fxp версии 1.0  содержатся следующие объекты:
 +
 
 +
1. BootStrap 
 +
 
 +
2) BootStrap_Навигатор
 +
 
 +
3) BootStrap_Карусель
 +
 
 +
4) BootStrap_Призыв
 +
 
 +
5) BootStrap_ЗаголовокСПараграфом
 +
 
 +
6) BootStrap_ТриКолонки
 +
 
 +
7) BootStrap_ДвеКолонки
 +
 
 +
8) BootStrap_Вкладки
 +
 
 +
9) BootStrap_МодальноеОкно
 +
 
 +
10) BootStrap_ГруппаПараграфов
 +
 
 +
11) BootStrap_СсылкаСПодсказкой
 +
 
 +
12) BootStrap_Функции 
 +
 
 +
13) BootStrap_Объект
 +
 
 +
14) НавМенюВертикальноеОдинУровень
 +
 
 +
15) BootStrap_Таблица
 +
 
 +
16) Генератор_CSS
 +
 
 +
Объект  «BootStrap» имеет один значимый метод '''СоздатьПроект'''(). После запуска этой функции создается файл index.html, содержащий HTML, CSS, JavaScript коды. Но перед тем, как запустить метод  СоздатьПроект() следует присвоить свойству «Контейнер» массив с объектами для BootStrap.  Далее я приведу краткое описание созданных объектов и постепенно буду описывать, как работать с каждым объектом.   
 +
 
 +
Создание сайта теперь выглядит так:
 +
 
 +
ПРОЦЕДУРА Старт
 +
  ПодключитьМодуль("BootStrap")  // Подключаем модуль BootStrap
 +
  Об = НовыйОбъект("BootStrap")    // Создаем объект BootStrap
 +
  Об.ИмяПроекта = "УфЛи"          // Задаем заголовок и имя проекта ЛитКлуба г.Уфы
 +
  Об.Заголовок = "УфЛи"
 +
  Сайт = НовыйОбъект("СайтУфЛи")          // Создаем объект нашего сайта
 +
  Ф = НовыйОбъект("BootStrap_Функции")  // Создаем объект с функциями из модуля
 +
  Г = НовыйОбъект("Генератор_CSS")                // функции для генерации CSS
 +
  Об.Контейнер = Сайт.ПолучитьОбъекты(Ф,Г)  // Получаем список объектов
 +
  Об.СоздатьПроект()    //  Создаем HTML-файл
 +
Предупреждение("index.html создан c помощью объекта BootStrap ")
 +
КОНЕЦПРОЦЕДУРЫ
 +
 
 +
Примерно так выглядит сайт с объектами навигатор и карусель.
 +
 
 +
Каждый сайт удобно оформлять в виде единого объекта, типа "СайтУфЛи". В зависимости от того, какой объект мы подключим, такой файл HTML и будет создан.  Десятки наших сайтов могут быть в одном каталоге и перекомпилироваться после усовершенствования объектов. Благодаря этому себестоимость сопровождения и обновления большого числа разработок снижается.
 +
 
 +
Мы подключаем объект "BootStrap_Функции", так как я рекомендую не создавать свободных функций, а создавать функции внутри объекта. Таким образом, для функций обеспечивается свое пространство имен, которое позволяет избежать проблемы с одинаковым названием функций в различных модулях.  Мы можем создавать и переменные внутри объекта так же не беспокоясь о повторении в названии.
 +
 
 +
Существует объект "Генератор_CSS" для тех кому лень писать CSS-коды руками. Позже я расскажу, как им пользоваться. Свои CSS-коды теперь придется писать только, если вы желаете усовершенствовать объекты и создавать специфичное оформление.
 +
 
 +
Кратко расскажу о назначении каталогов в данных проектах создания сайтов.
 +
 
 +
Каталог «BootStrap» содержит внешние файлы с CSS-кодами, JS-кодами и шрифтами, которые взяты из проекта BootStrap. При обновлении версии BootStrap можно обновлять и файлы в данном каталоге, если вы любите последние версии библиотек. В корневом каталоге содержится сгенерированный файл Index.html и исходные коды на Русском Фоксе для генерации различных сайтов (файлы с расширением RUS). В каталоге RusFox содержатся общие файлы картинок, нужные для объектов из модуля «BootStrap». В каталоге Projects содержатся каталоги cо специфичными файлами для каждого проекта. В основном требуется по каждому сайту хранить свои особенные изображения, так как CSS-коды и коды JavaScrip в основном содержатся в сгенерированным Русским Фоксом файле HTML, но при желании вы можете создавать и отдельные файлы с JS и CSS-кодами. В каталоги каждого проекта рекомендую копировать для сохранности резервную копию файла с расширением «RUS», в котором содержится алгоритм формирования соответствующего HTML-файла.
 +
 
 +
Так я рекомендую работать с проектами по созданию сайтов, но вы можете организовать каталоги иначе, прописав нужные пути в создаваемых объектах.
 +
 
 +
Объект для вашего сайта на Русском Фоксе будет выглядеть так:
 +
 
 +
=== Пример Сайта на Русском Фоксе и BootStrap (из-за HTML тегов код нормально отображается только в режиме редактирования) ===
 +
 
 +
ОПРЕДЕЛИТЬ_ОБЪЕКТ СайтУфЛи КАК БАЗОВЫЙ_ОБЪЕКТ
 +
    Каталог='Projects/UfLi/'
 +
   
 +
    ФУНКЦИЯ ПолучитьОбъекты(Ф,Г)
 +
      Объекты = НовыйМассив(1)
 +
          Объекты.Добавить(ЭТОТ_ОБЪЕКТ.Навигатор()) 
 +
          Объекты.Добавить(ЭТОТ_ОБЪЕКТ.АнонсКарусели(Г)) 
 +
          Объекты.Добавить(ЭТОТ_ОБЪЕКТ.Карусель()) 
 +
          ВОЗВРАТ Объекты   
 +
    КОНЕЦФУНКЦИИ
 +
==== ФУНКЦИЯ Навигатор() ====
 +
    ФУНКЦИЯ Навигатор()
 +
        Навигатор = НовыйОбъект("BootStrap_Навигатор")
 +
        Меню = НовыйМассив(1)
 +
          Меню.Добавить("|#|Главная|Актив|") 
 +
          Меню.Добавить("|#|Пункт 1|Меню|/#/ПодМеню 1.1/#/ПодМеню 1.2/|") 
 +
          Меню.Добавить("|#|Пункт 2|Меню|/#/ПодМеню 2.1/#/ПодМеню 2.2/#/ПодМеню 2.3/|") 
 +
          Меню.Добавить("|#|Это демонстрационная страница|||") 
 +
          Навигатор.ПунктыМеню = Меню
 +
        Профиль = НовыйМассив(1)
 +
          Профиль.Добавить("|#myModal|Установки|wrench|")    //   
 +
          Профиль.Добавить("|#|РазделительМеню||") 
 +
        Профиль.Добавить("|#|Выход|off|") 
 +
        Навигатор.МенюПрофиля = Профиль
 +
        Навигатор.Логотип = "RusFox/images/RusFox2.ico"
 +
      ВОЗВРАТ Навигатор   
 +
    КОНЕЦФУНКЦИИ
 +
 
 +
==== ФУНКЦИЯ АнонсКарусели ====
 +
 
 +
    ФУНКЦИЯ АнонсКарусели(Г)
 +
      ЛПЕРЕМ КодCSS
 +
      АнонсКарусели = НовыйОбъект("BootStrap_ЗаголовокСПараграфом")
 +
      КодCSS = Г.ЦветФона("#777777")+Г.ЦветСимволов("#FFFFFF")+Г.СкруглитьУглы(10)+;
 +
                                                                            Г.ТеньЭлемента(1,1,10,"rgba(0,0,0,0.5)")+Г.Отступ("2 4 6 7px")
 +
      АнонсКарусели.ТекстCSS = Г.ВыдатьCSS(КодCSS)
 +
      АнонсКарусели.Заголовок = '<br><br><br><br><h2><span class="'+Г.Имя+;
 +
                                                                      '">. Литературный клуб города Уфы "УфЛи" .</span></h2>'
 +
      АнонсКарусели.ТекстПараграфа = 'Просматривайте видео заседаний клуба.<br> Кратко о клубе'+;
 +
        ' <details> Литературный клуб "УфЛи" создан в .... году <br></details><br>'
 +
      ВОЗВРАТ АнонсКарусели   
 +
    КОНЕЦФУНКЦИИ
 +
 
 +
==== ФУНКЦИЯ Карусель() ====
 +
 
 +
    ФУНКЦИЯ Карусель()
 +
      Карусель = НовыйОбъект("BootStrap_Карусель")
 +
      Карусель.КаталогКартинок = ЭТОТ_ОБЪЕКТ.Каталог+'images/'
 +
      СписокСлайдов = НовыйМассив(1)  //  слайд 725х310 | слайд 940х410 | слайд 1170х502 |  три размера jpg для разных экранов 
 +
      СписокСлайдов.Добавить("|180530_УфЛи_m.jpg|180530_УфЛи_s.jpg|180530_УфЛи.jpg|<h5>30 мая 2018 г.</h5>"+;
 +
                                                                    "<p>Смотреть <a href='https:/"+"/youtu.be/2CAbmfyVbZs'>видео</a></p>|") 
 +
      СписокСлайдов.Добавить("|180516_УфЛи_m.jpg|180516_УфЛи_s.jpg|180516_УфЛи.jpg|<h5>16 мая 2018 г.</h5>"+;
 +
                                                                "<p>Смотреть <a href='https:/"+"/youtu.be/2CAbmfyVbZs'>видео</a></p>|") 
 +
      СписокСлайдов.Добавить("|180510_УфЛи_m.jpg|180510_УфЛи_s.jpg|180510_УфЛи.jpg|<h5>10 мая 2018 г.</h5>"+;
 +
                                                              "<p>Смотреть <a href='https:/"+"/youtu.be/_z3T91XqeF0'>видео</a></p>|") 
 +
      СписокСлайдов.Добавить("|180418_УфЛи_m.jpg|180418_УфЛи_s.jpg|180418_УфЛи.jpg|<h5>18 апреля 2018 г.</h5>"+;
 +
                                                          "<p>Смотреть <a href='https:/"+"/youtu.be/0oMp2d1VD7A'>видео</a></p>|") 
 +
      СписокСлайдов.Добавить("|180411_УфЛи_m.jpg|180411_УфЛи_s.jpg|180411_УфЛи.jpg|<h5>14 апреля 2018 г.</h5>"+;
 +
                                                          "<p>Смотреть <a href='https:/"+"/youtu.be/uV0GIdUKZys'>видео</a></p>|") 
 +
      СписокСлайдов.Добавить("|180404_УфЛи_m.jpg|180404_УфЛи_s.jpg|180404_УфЛи.jpg|<h5>04 апреля 2018 г.</h5>"+;
 +
                                                          "<p>Смотреть <a href='https:/"+"/youtu.be/uV0GIdUKZys'>видео</a></p>|") 
 +
      Карусель.СписокСлайдов = СписокСлайдов
 +
      ВОЗВРАТ Карусель   
 +
    КОНЕЦФУНКЦИИ
 +
КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА
 +
 
 +
----
 +
 
 +
В методе ПолучитьОбъекты(Ф,Г) устанавливается порядок следования объектов в HTML-файле. Для примера приведено только 3 объекта.
 +
 
 +
Указатель Ф указывает на полезные функции модуля BootStrap. Указатель Г указывает на набор функций для генерации кода CSS.
 +
 
 +
Метод Навигатор() создает верхнее двухуровневое меню с логотипом, строкой поиска и командами «Мой профиль». Подробней о настройках данного объекта я расскажу в будущем, но и просто, глядя на код, можно понять что к чему.
 +
 
 +
Метод Карусель() создает адаптивную «карусель слайдов», у надписи под  каждым фото есть ссылка на видео материал YouTube.
 +
 
 +
Из данного краткого объяснения у вас должно сложится представление о новом технологическом подходе используемом в создании сайтов на Русском Фоксе. Показано, как использовать готовые объекты, наполняя их своим содержимым. В следующих уроках будет показано, как создавать объекты для объекта BootStrap.
 +
 
 +
Планирую в будущем скрестить BootStrap с Joomla, научив Русский Фокс создавать адаптивные шаблоны для Joomla. В свое время я это уже пробовал сделать (но правда без использования BootStrap) на [[OneScript]]. На Русском Фоксе реализовать это будет проще.
 +
 
 +
Дальнейшее описание модуля BootStrap смотрите в «[[РусскийФокс. Модуль BootStrap]]»
 +
 
 +
== См. также ==
 +
* [[Объектно-Ориентированное программирование на РФокс]]
 +
 
 +
[[Категория:РФокс]]

Текущая версия на 16:22, 7 декабря 2020

Содержание

Содержание

  • Урок 01. Знакомство с языком программирования РусскийФокс
  • Урок 01.1 Настраиваем Notepad++
  • Урок 02. Операции со строками
  • Урок 03. Операции с датами
  • Урок 04. Диалог с пользователем
  • Урок 05. Операции с типом Число
  • Урок 06. Простые одномерные массивы
  • Урок 07. Объектные массивы
  • Урок 08. Создание объектов
  • Урок 09. Исследование объектов
  • Урок 10. Рабочий стол, DBF-файлы и просмотр Курсора
  • Урок 11. Взаимодействие с OpenOffice и LibreOffice
  • Урок 12. Создаем объект для OpenOffice
  • Урок 13. Создание сценариев для ClickerMann
  • Урок 14. Создание DBF-файла, выгрузка в XML
  • Урок 15. Изменение DBF-файла и назначение командных клавиш
  • Урок 16. Подключение модулей

Урок 01. Знакомство с языком программирования РусскийФокс

Программы записываются в текстовый файл в кодировке Windows-1251. Комментарий начинается символом «//». В файле должна быть обязательная процедура запуска программы Старт. Традиционная программа «Привет, Мир !» будет выглядеть так:

// Программа Привет, Мир   - это комментарий
ПРОЦЕДУРА Старт()
   Предупреждение(«Привет, Мир!»)   // Это другой вид комментария в продолжении строки
КОНЕЦПРОЦЕДУРЫ

Как видите, ключевые слова ПРОЦЕДУРА и КОНЕЦПРОЦЕДУРЫ пишутся в верхнем регистре. Внутри процедуры «Старт» Располагается ваша 1С-подобная программа. 1С-подобная не означает, что язык программирования во многом идентичен программированию в 1С. При написании команд не используется точка с запятой «;», которая используется в 1С. Пока только в двух ключевых словах точка с запятой обязательна (КОНЕЦЦИКЛА; КОНЕЦЕСЛИ; ). Важно знать, что все операторы должны быть написаны большими буквами.

Результат выполнение вышеприведенной программы будет выглядеть так:

На экране появится окно с нашим сообщением «Привет, Мир!».

Мы можем определить переменную типа строка, присвоив ей текст «Привет, Переменная !»

   Переменная = "Привет, Переменная !"

Тогда текст нашей программы будет выглядеть так:

ПРОЦЕДУРА Старт
     Переменная = "Привет, Переменная !"
     Предупреждение(Переменная)    
КОНЕЦПРОЦЕДУРЫ

И результат выполнения нашей программы будет выглядеть так:

Данный пример содержится в файле Lesson01.rus. Функция Сообщить() имеет аналог в языке программирования 1С и, по умолчанию, высвечивает информацию, не останавливая выполнение кода.

Запуск программы производится через командную строку командой

    RusFox  Lesson01.rus

либо удобно установить для типа файла с расширением RUS программу для запуска RusFox.exe

Задать вопрос пользователю можно 1С-подобной функцией Вопрос(Текст)

 ЕСЛИ НЕ Вопрос("Вы действительно хотите запустить Урок 01. Знакомство ?")=6 
   ВОЗВРАТ    // выход из процедуры, если отказ, иначе продолжим выполнять код 
 КОНЕЦЕСЛИ;

В результате выполнения данного кода на экране появится окно с вопросом и две кнопки «ДА» и «НЕТ». Ответ «ДА» возвратит код = 6.

В функции Предупреждение() можно высвечивать не только строки, но и число:

       Число=23
       Предупреждение(Число)

Но если вы в сообщении используете строку или строковую переменную, то число следует преобразовывать функцией Строка()

 Число = 23
 Число2 = 7
 Предупреждение("Это число 23+7="+Строка(Число+Число2))

Строки вы можете заключать в три вида кавычек: "Двойные кавычки", ‘Одинарные кавычки’, [Квадратные скобки] и @" Особые кавычки "@

Кроме того, вы можете присваивать многострочные строки:

    МногострочнаяСтрока = @" первая строка
    Вторая строка  и любой текст
                   Третья строка "@

При написании программы вы можете использовать условные операторы. Условный оператор ЕСЛИ может использоваться без слова ТОГДА (в 1С слово ТОГДА обязательно), но нельзя, как в 1С, располагать операторы в одной строке. Каждый оператор должен располагаться в новой строке. Оператор «КОНЕЦЕСЛИ;» нельзя использовать без точки с запятой в конце.

 Число=21
 ЕСЛИ Число=23 ТОГДА
     Предупреждение("Число=23")
  ИНАЧЕЕСЛИ Число=25
     Предупреждение("Число="+СокрЛП(Строка(Число)))
  ИНАЧЕ
      Предупреждение("Число не равно 23")
 КОНЕЦЕСЛИ;

Вы можете комбинировать несколько условий после оператора «ЕСЛИ», используя при этом булевые операции И, ИЛИ, НЕ.

 ЕСЛИ Число>Число2 И (Число<>20)      
    Предупреждение("Число больше Число2 и Число не равно 20")
 ИНАЧЕ
    Предупреждение("Условие не выполнено")
 КОНЕЦЕСЛИ;

Строки можно соединять между собой знаком «+». Команды могут переносится на другую строку, если в конце не завершенной команды поставить знак «;». Это отличает данный язык программирования от 1С-программирования. В 1С знак «;» означает окончание команды.

 Фамилия="Ошнуров"
 Имя = "Андрей"
 Отчество = "Михайлович"
 ФИО = Фамилия+" "+Имя+" "+;
                       Отчество
 Предупреждение(ФИО) 

В примере строку «Отчество» мы перенесли на новую строку, для этого переноса использовали символ «;»

При программировании вы можете создавать свои функции и использовать их. Программа с функцией будет выглядеть так:

ПРОЦЕДУРА Старт
    Предупреждение(СложитьЧисла(10,12))
КОНЕЦПРОЦЕДУРЫ
ФУНКЦИЯ СложитьЧисла
  ПАРАМЕТРЫ Число1, Число2
     ВОЗВРАТ Число1+Число2
КОНЕЦФУНКЦИИ 

Здесь «СложитьЧисла» - это функция, которой передаются параметры Число1, Число2. Затем числа переданные в этих параметрах складываются и результат возвращается.

Функцию удобнее написать и так:

 ФУНКЦИЯ УмножитьЧисла(Число1, Число2)
 КОНЕЦФУНКЦИИ Число1*Число2

Здесь число в параметре Число1 будет умножено на число в параметре Число2.

Для организации циклов используется набор операторов ДЛЯ, ПО, КОНЕЦЦИКЛА; . Использование точки с запятой в конце оператора КОНЕЦЦИКЛА; является обязательным.

 ДЛЯ Номер=1 ПО 3
   Предупреждение(Номер)
 КОНЕЦЦИКЛА;

В результате выполнения данного примера высветится 3 раза окно, в котором последовательно отобразятся цифры от 1 до 3.

Целиком текст программы 1-ого урока выглядит так:


ПРОЦЕДУРА Старт
 Предупреждение("Привет, Мир !")
 Переменная = "Привет, Переменная !"
 Предупреждение(Переменная)
 // Вы можете не преобразовывать число в сообщении
 Число = 23
 Предупреждение(Число)
// Но если вы в сообщении используете строку или строковую переменную, то число следует преобразовывать функцией Строка() 
 Число2 = 7
 Предупреждение("Это число 23+7="+Строка(Число+Число2))
 // Условный оператор ЕСЛИ может использоваться без слова ТОГДА (в 1С слово ТОГДА обязательно)
 Число=21
 ЕСЛИ Число=23 ТОГДА
   Предупреждение("Число=23")
 ИНАЧЕ
   Предупреждение("Число не равно 23")
 КОНЕЦЕСЛИ;
 * Число=3   
 ЕСЛИ Число>Число2 И Число<>20      // Можно кроме "И" использовать булевые операции "ИЛИ" , "НЕ" 
    Предупреждение("Число больше Число2 и Число не равно 20")
 ИНАЧЕ
    Предупреждение("Условие не выполнено")
 КОНЕЦЕСЛИ;
 Фамилия="Ошнуров"
 Имя = "Андрей"
 Отчество = "Михайлович"
 ФИО = Фамилия+" "+Имя+" "+;
                       Отчество
 Предупреждение(ФИО) 
 Предупреждение(СложитьЧисла(10,12))
 ДЛЯ Номер=1 ПО 3
    Сообщить(Номер)
 КОНЕЦЦИКЛА;
КОНЕЦПРОЦЕДУРЫ
ФУНКЦИЯ СложитьЧисла
ПАРАМЕТРЫ Число1, Число2
КОНЕЦФУНКЦИИ Число1+Число2

Урок 01.1 Настраиваем Notepad++ (Устарело)

В настоящий момент в качестве среды разработки лучше использовать Среду Разработки (СР) Перфолента.NET.

Для удобства программирования, если не желаете использовать редактор Перфолента, можно выбрать редактор Notepad++ (скачайте последнюю версию из интернета). Сейчас разберем, как этот редактор удобней настроить для работы, чтоб строки у нас сворачивались, а операторы языка программирования выделялись нужным цветом.

Сохранять текст в редакторе следует в кодировке UTF8-BOOM. В такой кодировке в начале текста устанавливаются особые невидимые символы, благодаря которым RusFox.exe распознает кодировку.

Для удобства работы настраиваем редактор. Переходим по пункту меню «Синтаксисы» → “Задать свой синтаксис...” Нажимаем кнопку «Создать...». Даем имя синтаксису «RusFox». В поле «Расшир.:» пишем «rus». Теперь при открытия в редакторе файла с расширением “rus” будет автоматически подключаться данный синтаксис.

Начнем настройку с легкого. На вкладке «Операторы и разделители» в поле «Операторы 1» заносим строку « - " ( ) * , ; [ \ ] + < = > % » и нажимаем кнопку «Стиль». Выбираем цвет. Я выбрал красный.

В графе «Разделитель 1» в полях «Открытие» и «Закрытие» я записал кавычки «"». Нажал кнопку «Стиль», выбрал шрифт «Courier New» Полужирный. Цвет фона бледно-желтый, цвет шрифта темно-коричневый. Так будет оформляться текст, заключенный в кавычки. Но кроме двойных кавычек «"» в РусскомФоксе допустимо использование одинарных кавычек «'». Поэтому аналогичные настройки я сделал в графе «Разделитель 1», но в полях «Открытие» и «Закрытие» записал одинарные кавычки «'»

На вкладке «Комментарии и Числа» ставим галочку «Разрешить сверт.комментария», в графе «Положение строки комментария» «Разрешить где угодно». В графе «Комментарий Строки» в пункте «Открытие» записываем “//”, нажимаем кнопку «Стиль», Цвет текста — темно-зеленый, шрифт — Courier New, размер — 8, Курсив. Так будет оформлен шрифт комментария.

На вкладке «Ключевые слова» в графе «1-я группа» ставим галочку «Префикс режим» в строку заносим слова «КОНЕЦЕСЛИ; ЕСЛИ ИНАЧЕ КОНЕЦПРОЦЕДУРЫ КОНЕЦФУНКЦИИ ТОГДА ПРОЦЕДУРА ФУНКЦИЯ ВОЗВРАТ ДЛЯ ПО КОНЕЦЦИКЛА; ЦИКЛ И ИЛИ НЕ ПЕРЕМ ПОКА КОНЕЦПОКА; ПРЕРВАТЬ; ПРОДОЛЖИТЬ; ПОПЫТКА ИСКЛЮЧЕНИЕ КОНЕЦПОПЫТКИ;» Стиль «Полужирный» , шрифт «Courier New», Цвет текста — Красный. Это 1С-подобные операторы, написанные в верхнем регистре. Это операторы языка РФокс, имеющие аналог в 1С, которые должны быть напечатаны строго так как перечислены: с большой буквы и в конце некоторых операторов обязательный символ «;».

В графе «3-я группа» заносим слова «СтрДлина СокрЛП Сообщить СтрНачинаетсяС СтрЗаканчиваетсяНа Строка Вопрос Число ВРег НРег КодСимвола Символ ТекущийКаталог ФайлСуществует ЗакрытьФайл СтрНайти ТекущаяДата ДобавитьМесяц ДеньНедели ДеньГода НеделяГода Год Месяц День Дата Час Минута Секунда НачалоГода НачалоКвартала НачалоМесяца НачалоНедели НачалоДня НачалоЧаса НачалоМинуты КонецГода КонецКвартала КонецМесяца КонецНедели КонецДня КонецЧаса КонецМинуты ВвестиЗначение Цел Окр Предупреждение » Полужирный, Синий, «Courier New» Это функции имеющие аналоги в 1С.

На вкладке «Ключевые слова» в графе «4-я группа» ставим галочку «Префикс режим» в строку заносим слова «НАБОР_УСЛОВИЙ ЛПЕРЕМ ПАРАМЕТРЫ ЛОЖЬ ИСТИНА ОПИСАНИЕ_МАССИВА КАК ЗАЩИЩЕННОЕ_СВОЙСТВО ОПРЕДЕЛИТЬ_ОБЪЕКТ ЭТОТ_ОБЪЕКТ КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА БАЗОВЫЙ_ОБЪЕКТ ПУСТО _ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА _ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА КОНСТАНТА ОТМЕНИТЬ_КОНСТАНТУ МЕТОД_РОДИТЕЛЯ СКРЫТОЕ_СВОЙСТВО ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА ПРИ_УДАЛЕНИИ_ОБЪЕКТА » Стиль «Полужирный» , шрифт «Courier New», Цвет текста — Красный. Это операторы, не имеющие 1С аналогов.

В графе «5-я группа» заносим слова «ОбратнаяСтрока СтрокуМеждуРазделителями СтрЧислоВхождений СравнитьСтрокуПоМаске ОткрытьФайлДляЧтения ЧитатьСтрокуИзФайла ВернутьКоличествоДнейВМесяце НазваниеМесяца СтрокаЗаПериод ПолучитьТекущуюРазрядностьЧисел УстановитьРазрядностьЧисел ГрадРад РадГрад Тангенс Арктангенс Арксинус Синус Косинус Арккосинус Экспонента ЧислоПи ПсевдоСлучайноеЧисло КоличествоВМассиве КоличествоСтрокВМассиве КоличествоКолонокВМассиве ВставитьСтрокуВМассив СодержимоеМассиваВСтроку СортироватьМассив УдалитьСтрокуИзМассива ВыборИзМассива СписокФайловВМассив НовыйМассив МассивМетодовОбъекта МассивСвойствОбъекта РезультатУсловий» Полужирный, Пурпурный, «Courier New» Это функции не имеющие аналога в 1С.

Для заполнения копируйте строки из данного документа. По мере развития языка список слов будет пополняться и вам потребуется так же заново копировать весь список в соответствующие поля.

После выполнения данных настроек, ваш текст в редакторе Notepad++ будет выглядеть примерно так:

Для свертывания строк надо настроить на вкладке «стандартный» поля «Открытие» и «Закрытие»: ФУНКЦИЯ — КОНЕЦФУНКЦИИ, ПРОЦЕДУРА — КОНЕЦПРОЦЕДУРЫ. Но свертывание после добавления строк сбивается и нормально не работает. Оно временно восстанавливается, если в конце ключевых слов вставить перевод строки и затем вновь удалить его, но затем сбивается вновь.

Урок 02. Операции со строками

Выполним следующие команды:

  Предупреждение("Преобразовать число 12.457 в строку "+Строка(12.457,10,3)+;
     " Можно округлить, например, до 1 знака после запятой "+Строка(12.457,10,1))
    

Результат выполнения будет выглядеть так:

Функция (расширенный аналог функции 1С) Строка(12.457,10,3) преобразует число в строку с 3-мя знаками после запятой. Длина числа будет 10. В данном случае приведенное в примере число имеет 5 знаков (два знака до запятой и три после), значит впереди будет добавлено 5 пробелов при формировании строки. Но следующая функция Строка(12.457,10,1) преобразует число в строку с точностью до 1 знака после запятой, потому в результате из числа 12.457 мы получим число 12.5 (округленное до 1 знака после запятой). В функции Строка() 2-ой и 3-ий параметры могут не применяться. Данная функция так же, кроме чисел, может преобразовывать типы Булеан, Дата, Дата и время в тип Строка. См. примеры далее.

Следующий пример показывает, как убирать пробелы с обоих сторон строки

  СтрокаСПробелами = "   Строка с пробелами     "
  Предупреждение("Убираем пробелы слева и справа <<"+;
                                       СокрЛП(СтрокаСПробелами)+">>")

Результат выполнения:


В начале и конце строки специально поставлены знаки «<<» и «>>», чтоб было наглядно видно, что строка после применения функции СокрЛП() (аналогичная функция имеется в 1С) не имеет пробелов в начале и конце строки.

Теперь производим операции над той же строкой, но сначала убираем пробелы только слева, а затем только справа.

  Предупреждение("Убираем пробелы только слева <<"+;
            СокрЛ(СтрокаСПробелами)+">>   Убираем пробелы только справа”+;      
                                  “<<"+СокрП(СтрокаСПробелами)+">>")
   

Высвечиваемый функцией Сообщить() результат будет выглядеть так:

Как видно из результатов выполнения функций, в первом случае убраны пробелы слева применением функции СокрЛ(), а во втором случае убраны пробелы справа, а левые пробелы остались. Так сработала функция СокрП().

Теперь научимся вырезать кусок строки с помощью функций СокрЛ() и СокрП().

  СтрокаСНомерами = "0123456789"
  Предупреждение("Получаем 6 символов слева <<"+Лев(СтрокаСНомерами,6)+;
            ">>   Получаем 5 символов справа <<"+Прав(СтрокаСНомерами,5)+">>")

Результат на экране будет таким:

По результату видно, что первая функция вырезала 6 символов из строки "0123456789" слева, получилась урезанная строка "012345". А вторая функция вырезала 5 символов справа и получилась строка "56789".

Если мы имеем число в виде строки СтрокаЧисло = "13.54" (просто число присваивается так Число=13.54, без кавычек), то можем его преобразовывать в число с помощью функции Число() (аналог имеется в 1С)

  СтрокаЧисло = "13.54"
  Число = Число(СтрокаЧисло)  

Для определения длины строки (количество символов в строке) применяется функция аналогичная 1С СтрДлина().

  Строка = "12345"
  Предупреждение("Строка <"+Строка+"> имеет длину ="+;
                Строка(СтрДлина(Строка)))    

Результат данного кода:

     Функция СтрДлина() возвращает число, поэтому мы применяем функцию Строка(), чтоб число превратить в строку.

Если строка не содержит символы или содержит только пробелы, то она является пустой. Для выяснения, является ли строка пустой имеется функция ПустаяСтрока(). Данная функция возвращает ИСТИНА, если строка пустая, и ЛОЖЬ, если в строке есть хотя бы один значимый символ (пробел считается не значимым символом).

  ПустаяСтрока1 = ""
  ПустаяСтрока2 = "   "
  НеПустаяСтрока = " 1  "
  Предупреждение("ПустаяСтрока1 = "+Строка(ПустаяСтрока(ПустаяСтрока1)))   
  Предупреждение("ПустаяСтрока2 = "+Строка(ПустаяСтрока(ПустаяСтрока2)))   
  Предупреждение("НеПустаяСтрока = "+Строка(ПустаяСтрока(НеПустаяСтрока))) 


Иногда бывает нужно переставить символы в строке в обратном порядке. Для этой цели существует функция ОбратнаяСтрока() (не имеет аналога в 1С).

  СтрокаСЦифрами = "123456789"
  Предупреждение("Для строки <"+СтрокаСЦифрами+;
    "> обратная строка выглядит так <"+ОбратнаяСтрока(СтрокаСЦифрами)+">")

Результат выполнения данного кода будет таким:


Часто бывает нужно найти какой-то символ или несколько символов в заданной строке. Для этих целей существует функция

СтрНайти(Строка,ПодстрокаПоиска,НаправлениеПоиска,НачальнаяПозиция,НомерВхождения)

Эта функция возвратит номер позиции искомой строки. Параметры она имеет следующие:

  • Строка — это там, где ищем,
  • ПодстрокаПоиска — это символ или несколько символов (выражение), которое ищем.
  • Направление поиска — это одно из значений: Направление.СНачала или Направление.СКонца. Направление поиска определяет слава направо мы ищем или наоборот справа на лево, но при этом номер позиции всегда возвращается с отсчетом слева направо.
  • НачальнаяПозиция – это номер позиции, с которой начинаем поиск. Например, мы можем начать поиск с 5-ого символа, а не с первого. При этом, если направление поиска Направление.СКонца, то номер Начальной позиции будет считаться с права на лево (с конца строки на начало), а номер возвращаемой позиции найденного символа или подстроки (набора символов) всегда указывается слева на право (с начала строки).
  • НомерВхождения указывает, какой по счету найденный символ или подстрока нам нужны.

Рассмотрим примеры:

  СтрокаДляПоиска = "12345678901234567890123456789"
  Предупреждение("Ищем первое вхождение цифры 3 с начала "+; 
                                             Строка(СтрНайти(СтрокаДляПоиска,"3")))

Здесь функция возвратить число 3, так как отсчитывая слева на право первая встретившаяся цифра «3» имеет 3-ю позицию.

   Предупреждение("Ищем первое вхождение цифры 3 с конца "+; 
                               Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца))) 

Здесь функция возвратить число 23, так как отсчитывая справо на лево первая встретившаяся цифра «3» имеет 23-ю позицию.

  Предупреждение("Ищем второе вхождение цифры 3 с начала "+;
                            Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СНачала,1,2))) 

Здесь функция возвратить число 13, так как, отсчитывая с начала строки, вторая (2-ое вхождение) встретившаяся цифра «3» имеет 13-ю позицию.

Предупреждение("Ищем второе вхождение цифры 3 с конца ";

              +Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца,1,2))) 

Здесь функция возвратить число 13, так как, отсчитывая с конца строки, вторая (2-ое вхождение) встретившаяся цифра «3» имеет 13-ю позицию.

Если нам надо подсчитать, сколько раз символ «3» встречается в строке СтрокаДляПоиска, то мы можем использовать аналог функции 1С СтрЧислоВхождений()

  Предупреждение("Сколько раз встречается цифра 3 в строке "+;
                                      Строка(СтрЧислоВхождений(СтрокаДляПоиска,"3")))

В данном случае мы получим результат 3, так как цифра «3» содержится в трех местах строки СтрокаДляПоиска.

Если нам надо во всей строке заменить символ «3» на символ «2», то можно использовать аналогичную 1С функцию СтрЗаменить()

 Предупреждение("В строке "+СтрокаДляПоиска+" заменяем цифру 3 на цифру 2 "+;
                                                           СтрЗаменить(СтрокаДляПоиска,"3","2")) 

В результате применения функции СтрЗаменить() мы получим строку "12245678901224567890122456789" из строки "12345678901234567890123456789".

Мы можем преобразовать строку в верхний регистр 1С-подобной функцией Врег() (все буквы в строке будут заглавными) или в нижний регистр Нрег() (все буквы будут маленькими), либо сделать так, чтоб каждое слово начиналось с заглавной буквы, а остальные буквы в слове были маленькие ТРег().

  Строка = "иВаН ИваНыч"
  Предупреждение("Переводим строку "+Строка+" в верхний регистр "+ВРег(Строка))
  Предупреждение("Переводим строку "+Строка+" в нижний регистр "+НРег(Строка))
  Предупреждение("Переводим строку "+Строка+" первые символы каждого слова в “+;
          “верхний регистр "+ТРег(Строка))

В первом сообщении строка "иВаН ИваНыч" будет выглядеть так: «ИВАН ИВАНЫЧ», во втором так «иван иваныч», а в третьем так «Иван Иваныч».

Все символы отображаемые на экране имеют код, который у каждого символа уникален. Чтоб посмотреть код любого символа (в примере символа «A») используем 1С-подобную функцию КодСимвола(), а чтоб из определенного кода получить символ, используем 1С-подобную функцию Символ().

  Предупреждение(" Код символа А = "+Строка(КодСимвола("А",1))+;
                           " Символ с кодом 190 = "+Символ(190))

Результат выполнения данных функций будет таким:


При создании программ часто требуется получить часть строки, которая находится между определенными символами. Для этих целей имеется не имеющая аналога в 1С функция СтрокуМеждуРазделителями(Строка, НачальныйРазделитель, КонечныйРазделитель, Сномера) Строка — там где ищем нужную подстроку. Нужная нам подстрока начинается с разделителя НачальныйРазделитель и заканчивается разделителем КонечныйРазделитель. Параметр Сномера указывает, какую подстроку из находящихся между НачальныйРазделитель и КонечныйРазделитель мы хотим получить.

  Строка = "=Строка1=Строка2=Строка3=Строка4="
  Предупреждение("Получаем 3-ий элемент из "+Строка+;
                                               "  "+СтрокуМеждуРазделителями(Строка,"=","=",3))

Третья подстрока между разделителями «=» - Это «Строка3».

Если вам надо подсчитать количество какого-либо символа или набора символов в строке, то вы можете использовать функцию СтрЧислоВхождений(Строка, "=")

    Предупреждение("Количество знаков '=' в строке равно "+;
                                     СокрЛП(Строка(СтрЧислоВхождений(Строка, "="))))  

Если вам надо заменить какой-либо символ (или набор символов) другим символом, тогда используйте функцию СтрЗаменить(Строка,"=","-")

  Предупреждение('Заменим в строке <'+Строка+;
             '> символы "=" на символы "-". Результат: <'+СтрЗаменить(Строка,"=","-")+'>')

Вы можете выяснить, начинается строка с указанного символа или нет, с помощью функции СтрНачинаетсяС(Строка, "=") либо, заканчивается ли строка указанным символом или набором символов,

  ЕСЛИ СтрНачинаетсяС(Строка, "=") И СтрЗаканчиваетсяНа(Строка, "=")
    Предупреждение("Строка <"+Строка+"> начинается и заканчивается символом '='")
  КОНЕЦЕСЛИ;

Вы можете открыть файл для чтения и прочитать содержимое файла в строку. Каждая строка заканчивается символом перевода строки Символ(13).

  ИмяФайла = ТекущийКаталог()+"Lesson02.txt"
  СтрокаИзФайла = 
  ЕСЛИ ФайлСуществует(ИмяФайла)
     УкФайл = ОткрытьФайлДляЧтения(ИмяФайла)
     ПОКА НЕ КОНЕЦФАЙЛА(УкФайл)
       СтрокаИзФайла = СтрокаИзФайла+ЧитатьСтрокуИзФайла(УкФайл)+Символ(13)
     КОНЕЦПОКА;
     ЗакрытьФайл(УкФайл) 
     Предупреждение(СтрокаИзФайла)
  ИНАЧЕ      Предупреждение("Файл "+ИмяФайла+" не существует.")
  КОНЕЦЕСЛИ;

После этого можно подсчитать количество закаченных строк СтрЧислоСтрок(СтрокаИзФайла) или получить любую строку по номеру строки СтрПолучитьСтроку(СтрокаИзФайла, 2).

   Предупреждение('В предыдущей высвеченной строке '+;
                Предупреждение(СтрЧислоСтрок(СтрокаИзФайла))+;
                    ' строк. Вторая строка = '+СтрПолучитьСтроку(СтрокаИзФайла, 2))
   

Вы можете сравнивать строки по заданной маске, где символ «*» означает наличие произвольного числа символов, а символ «?» означает один произвольный символ.

   Предупреждение(Строка(СравнитьСтрокуПоМаске("*др?г","Хороший друг")))
   Исходный текст 2-ого урока выглядит так:
ПРОЦЕДУРА Старт
  Предупреждение("Преобразовать число 12.457 в строку "+Строка(12.457,10,3)+;
       " Можно округлить, например, до 1 знака после запятой "+Строка(12.457,10,1))
  
  СтрокаСПробелами = "   Строка с пробелами     "
  Предупреждение("Убираем пробелы слева и справа <<"+СокрЛП(СтрокаСПробелами)+">>")
  Предупреждение("Убираем пробелы только слева <<"+СокрЛ(СтрокаСПробелами)+;
                      ">>   Убираем пробелы только справа <<"+СокрП(СтрокаСПробелами)+">>")
  СтрокаСНомерами = "0123456789"
  Предупреждение("Получаем 6 символов слева <<"+Лев(СтрокаСНомерами,6)+;
                                              ">>   Получаем 5 символов справа <<"+Прав(СтрокаСНомерами,5)+">>")
  СтрокаЧисло = "13.54"
  Число = Число(СтрокаЧисло)  // Так из строкового значения делаем числовое
  Предупреждение(Число)
  Строка = "12345"
  Предупреждение("Строка <"+Строка+"> имеет длину ="+Строка(СтрДлина(Строка)))
  ПустаяСтрока1 = ""
  ПустаяСтрока2 = "   "
  НеПустаяСтрока = " 1  "
  Предупреждение("ПустаяСтрока1 = "+Строка(ПустаяСтрока(ПустаяСтрока1)))   // Возвращает .T.   ИСТИНА
  Предупреждение("ПустаяСтрока2 = "+Строка(ПустаяСтрока(ПустаяСтрока2)))   // Возвращает .T.   ИСТИНА
  Предупреждение("НеПустаяСтрока = "+Строка(ПустаяСтрока(НеПустаяСтрока))) // Возвращает .F.   ЛОЖЬ 
  СтрокаСЦифрами = "123456789"
  Сообщить("Для строки <"+СтрокаСЦифрами+"> обратная строка выглядит так <"+;
                                                                                       ОбратнаяСтрока(СтрокаСЦифрами)+">")
  СтрокаДляПоиска = "123456789012345678901234567893"
  Предупреждение("Ищем первое вхождение цифры 3 с начала "+Строка(СтрНайти(СтрокаДляПоиска,"3"))) 
  Предупреждение("Ищем первое вхождение цифры 3 с конца "+;
                                                                     Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца))) 
  Предупреждение("Ищем второе вхождение цифры 3 с начала "+;
                                                               Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СНачала,1,2))) 
  Предупреждение("Ищем второе вхождение цифры 3 с конца "+;
                                                                  Строка(СтрНайти(СтрокаДляПоиска,"3",Направление.СКонца,1,2))) 
  Предупреждение("Сколько раз встречается цифра 3 в строке "+Строка(СтрЧислоВхождений(СтрокаДляПоиска,"3")))
  Предупреждение("В строке "+СтрокаДляПоиска+" заменяем цифру 3 на цифру 2 "+;
                   СтрЗаменить(СтрокаДляПоиска,"3","2")) 
  Строка = "иВаН ИваНыч"
  Предупреждение("Переводим строку "+Строка+" в верхний регистр "+ВРег(Строка))
  Предупреждение("Переводим строку "+Строка+" в нижний регистр "+НРег(Строка))
  Предупреждение("Переводим строку "+Строка+" первые символы каждого слова в верхний регистр "+ТРег(Строка))
  Предупреждение(" Код символа А = "+Строка(КодСимвола("А",1))+" Символ с кодом 190 = "+Символ(190))
  Строка = "=Строка1=Строка2=Строка3=Строка4="
  Предупреждение("Получаем 3-ий элемент из "+Строка+"  "+СтрокуМеждуРазделителями(Строка,"=","=",3))
  Предупреждение("Количество знаков '=' в строке равно "+СокрЛП(Строка(СтрЧислоВхождений(Строка, "="))))
  Предупреждение('Заменим в строке <'+Строка+'> символы "=" на символы "-". Результат: <'+;
                         СтрЗаменить(Строка,"=","-")+'>')
  ЕСЛИ СтрНачинаетсяС(Строка, "=") И СтрЗаканчиваетсяНа(Строка, "=")
    Предупреждение("Строка <"+Строка+"> начинается и заканчивается символом '='")
  КОНЕЦЕСЛИ;
  ИмяФайла = ТекущийКаталог()+"Lesson02.txt"
  СтрокаИзФайла = 
  ЕСЛИ ФайлСуществует(ИмяФайла)
     УкФайл = ОткрытьФайлДляЧтения(ИмяФайла)
     ПОКА НЕ КОНЕЦФАЙЛА(УкФайл)
       СтрокаИзФайла = СтрокаИзФайла+ЧитатьСтрокуИзФайла(УкФайл)+Символ(13)
     КОНЕЦПОКА;
     ЗакрытьФайл(УкФайл) 
     Предупреждение(СтрокаИзФайла)
  ИНАЧЕ       Предупреждение("Файл "+ИмяФайла+" не существует.")
  КОНЕЦЕСЛИ;
  Предупреждение('В предыдущей высвеченной строке '+Строка(СтрЧислоСтрок(СтрокаИзФайла))+;
           ' строк. Вторая строка = '+СтрПолучитьСтроку(СтрокаИзФайла, 2))
  Предупреждение(Строка(СравнитьСтрокуПоМаске("*др?г","Хороший друг")))
КОНЕЦПРОЦЕДУРЫ

Урок 03. Операции с датами

Если вам надо получить текущую системную дату, то используйте 1С-подобную функцию ТекущаяДата().

Вы можете к любой дате добавить или удалить несколько месяцев с помощью 1С-подобной функции ДобавитьМесяц(Дата,КоличествоМесяцев). Если КоличествоМесяцев — отрицательное число, то даты вычитаются. Пример вызова данной функции:

  Предупреждение(ДобавитьМесяц(ТекущаяДата(),1))

Чтоб получить номер дня в неделе можно использовать 1С-подобную функцию ДеньНедели(Дата).

  Предупреждение(ДеньНедели(ТекущаяДата()))

Получить день года (количество дней с начала года до указанной даты) можно с помощью 1С-подобной функции ДеньГода(Дата)

  Предупреждение(ДеньГода(ТекущаяДата()))

Получить номер недели, которая соответствует указанной дате, в году можно 1С-подобной функции НеделяГода(Дата)

  Предупреждение(НеделяГода(ТекущаяДата()))

Так же можете получить из даты год 1С-подобной функцией Год(Дата)

  Предупреждение(Год(ТекущаяДата()))

Можно получить номер месяца, используя 1С-подобную функцию Месяц(Дата)

  Предупреждение(Месяц(ТекущаяДата()))

Можно получить день, используя 1С-подобную функцию День(Дата)

  Предупреждение(День(ТекущаяДата()))

Дату вы можете присвоить 1С-подобной функцией Дата(Год,Месяц,День,Час,Минута,Секунда)

  Дата1 = Дата(2018,6,7,8,15,23)

Вы можете записать в укороченном виде без времени Дата(2018,7,12) Можете передать 1 параметр в виде строки Дата('20180712') либо в виде строки с записью времени Дата('20180712101230'). Если вы допустите ошибку при записи параметра для данной функции, то вернется цифра -1.

С помощью 1С-подобных функций можно получить из даты час, минуту, секунду

  Дата1 = Дата(2018,6,7,8,15,23)
  Предупреждение(Час(Дата1))
  Предупреждение(Минута(Дата1))
  Предупреждение(Секунда(Дата1))

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

  Предупреждение(НачалоГода(Дата1))
  Предупреждение(НачалоКвартала(Дата1))
  Предупреждение(НачалоМесяца(Дата1))
  Предупреждение(НачалоНедели(Дата1))
  Предупреждение(НачалоДня(Дата1))

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

  Предупреждение(КонецГода(Дата1))
  Предупреждение(КонецКвартала(Дата1))
  Предупреждение(КонецМесяца(Дата1))
  Предупреждение(КонецНедели(Дата1))
  Предупреждение(КонецДня(Дата1))
  Предупреждение(КонецЧаса(Дата1))
  Предупреждение(КонецМинуты(Дата1))     

Функция, не имеющая аналога в 1С, ВернутьКоличествоДнейВМесяце() возвращает количество дней в месяце текущей даты с учетом високосных годов.

Предупреждение("Количество дней в месяце у даты "+Строка(Дата1)+;
                               " = "+Строка(ВернутьКоличествоДнейВМесяце(Дата1)))

С помощью функции, не имеющей аналога в языке программирования 1С, НазваниеМесяца(НомерМесяца, Падеж) можно получать русское название месяца в различных падежах:

Предупреждение("Названия месяцев в падежах: Именительный и Винительный (январь) "+;
                    НазваниеМесяца(1)+"  Родительный (февраль) "+;
                     НазваниеМесяца(2,Падеж.Родительный)+"  Дательный (Март) "+;
                                                     НазваниеМесяца(3,Падеж.Дательный)+;
     "  Творительный (апрель) "+НазваниеМесяца(4,Падеж.Творительный)+;
              "  Предложный (май) "+НазваниеМесяца(5,Падеж.Предложный))   

Результат выполнения данной функции будет выглядеть так:


Если вам надо сформировать русскоязычную строку для указания периода в пределах одного месяца, то используйте функцию СтрокаЗаПериод(ДеньНачалаПериода, ДеньКонцаПериода, НомерМесяцаПериода, ГодПериода) (аналог в 1С отсутствует). Например, в ведомости на аванс указывается период с 1 по 15 число месяца май 2018 года.

  Предупреждение(СтрокаЗаПериод(1,15,5,2018))

Результат выполнения данной функции будет таким:

Урок 04. Диалог с пользователем

Глобальную переменную можно определить командой

ПЕРЕМ Знач

Так мы определи глобальную переменную Знач, которая будет доступна из всех функций программы. По возможности, следует избегать назначения лишних глобальных переменных. Для текущих операций следует определять локальные переменные, которые существуют только внутри функции. Все переменные внутри функции следует описывать через ЛПЕРЕМ Перем1, Перем2 и т. д., чтоб случайно не изменить глобальную переменную с таким же именем. ЛПЕРЕМ Лзнач, Лзнач2

В обоих случаях мы создали переменную, которая пока не имеет типа. Типы бывают: строковые, числовые, булиан и т.д. Тип значению задается, когда мы присваиваем значению какие-либо данные.

Например, если присвоим Знач=25.5, то тип будет числовым, а если присвоим Знач=«25.5», то тип будет строковым. Тип булеан может иметь только два значения: ИСТИНА или ЛОЖЬ.

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

СтрокаКомментарий — это произвольный текст, который высветится в окне ввода значения. Вы можете присваивать переменной Значение некое первоначальное значение нужного типа. Например, если желаете, чтоб пользователь ввел значение Булеан, то присваивайте первоначальное значение типа Булеан.

 Знач=ИСТИНА
 Знач = ВвестиЗначение(Знач, "Ввести значение ИСТИНА или ЛОЖЬ")

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

Если нажмете клавишу «Отмена», то вернется ЛОЖЬ

Если вы значение будете высвечивать переменную Знач командой Сообщить(Знач), то получите один из результатов .T. Либо .F. (.T. - это ИСТИНА, а .F. - это ЛОЖЬ). А если вы используете команду преобразования значения к типу строка Сообщить(Строка(Знач)), то в результате высветится либо ИСТИНА, либо ЛОЖЬ.

Теперь попросим пользователя ввести число.

 Знач=-23.4378
 Знач = ВвестиЗначение(Знач, "Ввести")
 Предупреждение(Знач) 
 Предупреждение("Текущая разрядность чисел в системе "+; 
                     Строка(ПолучитьТекущуюРазрядностьЧисел(),1,0))

Если нажмете клавишу «Отмена», то вернется 0.

Первоначально мы присваиваем переменной Знач значение = -23.4378, но пользователь в окне ввода сможет ввести любое другое число. Если мы высветим введенное пользователем число на экоран командой Сообщить(Знач), то число высветится с точностью до двух знаков, потому что так установлено в системе по умолчанию. Посмотреть сколько знаков после запятой по умолчанию установлено в системе можно командой ПолучитьТекущуюРазрядностьЧисел().

Если нам нужна разрядность чисел в 4 знака после запятой, то мы можем ее задать командой УстановитьРазрядностьЧисел(4) (В 1С данные команды отсутствуют).

 УстановитьРазрядностьЧисел(4) 
 Предупреждение("Текущая разрядность чисел в системе "+;
                         Строка(ПолучитьТекущуюРазрядностьЧисел(),1,0))
 Знач=-23.4378
 Предупреждение(Знач)
 УстановитьРазрядностьЧисел(2) 

В данном примере по команде Сообщить(Знач) высветится 4 знака после запятой.

Если мы желаем, чтоб пользователь ввел строку, то можем написать подобное

 Знач="Проверка ввода строки"
 Знач = ВвестиЗначение(Знач, "Ввести")
 Предупреждение(Знач)

Если нажмете клавишу «Отмена», то вернется пустая строка.

Урок 05. Операции с типом Число

Знаки операций + (сложение),- (вычитание), ** и ^ (возведение в степень), * (умножить), / (деление), % (остаток деления).

Вы можете получить целую часть числа 1С-подобной функцией Цел()

  Предупреждение("Целая часть числа 12.32 = "+Строка(Цел(12.32),10,2) )

Вы можете округлить число 1С-подобной функцией Окр()

  Предупреждение("Округляем число 12.355 до разрядности 2 = "+Строка(Окр(12.355, 2, 0),10,3))

Можете переводить градусы в радианы и наоборот.

  Предупреждение("Переводим 30 градусов в радианы "+Строка(ГрадРад(30),7,4)+;
                        " и обратно радианы в градусы "+Строка(РадГрад(ГрадРад(30)),7,4))

Можете рассчитывать тангенс (либо TAN()), арктангенс (ATAN()), синус (SIN()), косинус(COS()), арксинус (ASIN()), арккосинус (ACOS()).

  Предупреждение("Тангенс числа 30  TAN(30) = "+Строка(Тангенс(30),7,4)+;
                                                 "  Арктангенс ATAN(30) = "+Строка(Арктангенс(30),7,4))
  Предупреждение("Синус числа 30 SIN(30) = "+Строка(Синус(30),7,4)+;
                              "  Арксинус числа -0.9 ASIN(-0.9) = "+Строка(Арксинус(-0.9),7,4))
  Предупреждение("Косинус числа 30 COS(30) = "+Строка(Косинус(30),7,4)+;
                             "  Арккосинус числа 0.15 ACOS(0.15) = "+Строка(Арккосинус(0.15),7,4))

Можно рассчитать экспоненту числа (либо EXP()).

  Предупреждение("Экспонента числа 30 EXP(30) = "+Строка(Экспонента(30),7,4))

Можно получить число Пи (либо PI()).

 Предупреждение("Число ПИ PI() = "+Строка(ЧислоПи(),7,4))

Вы можете генерировать псевдослучайное число в любом диапазоне.

              Предупреждение("Генерация псевдослучайного числа в диапазоне от 1 до 20 = "+;
                                                         Строка(ПсевдоСлучайноеЧисло(1, 20)))

Вы можете обрабатывать ошибки используя операторы: ПОПЫТКА, ИСКЛЮЧЕНИЕ, КОНЕЦПОПЫТКИ;

  Число = 1237
  ПОПЫТКА
     Предупреждение("Строка плюс число "+Число)
  ИСКЛЮЧЕНИЕ
    Предупреждение("Строку нельзя соединять с числом. Преобразуйте число в строку.")
  КОНЕЦПОПЫТКИ;

Вычислить квадратный корень КвадратныйКорень(Число) (либо SQRT(Число))

Для вычисления остатка от деления можно использовать функцию ОстатокОтДеления(Делимое, Делитель) (либо Делимое%Делитель))

Возвести число в степень POW(Основание, Показатель) (либо Основание^Показатель)

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

Можно определить ближайшее меньшее целое число БлижМеньшееЦел(Число), ближайшее большее целое число БлижБольшееЦел(Число), абсолютное число Абсолютное(Число).

Если надо выяснить знак числа то используйте функцию ЗнакЧисла(Число), она возвращает одно из значений: 1 — число положительное, -1 — число отрицательное, 0 — число = 0.

Урок 06. Простые массивы

Создадим массив на 7 элементов.

  РазмерМассива = 7
  ОПИСАНИЕ_МАССИВА Массивчик(РазмерМассива)

Получить количество элементов в массиве можно с помощью функции КоличествоВМассиве(ИмяМассива)

  Предупреждение(КоличествоВМассиве('Массивчик'))

Массив хорош тем, что может содержать нетипизированные значения и тип значения задается при присваивании.

  Массивчик(3) = 'текстовая строка' 
  Массивчик(5) = 3   

Чтоб изменить размерность массива, его надо переопределить. Все прежние значения сохраняться, если вы не уменьшаете размерность массива. Как работать с двухмерными массивами будет описано позже, но двухмерный простой массив (далее будет описан объектный массив, который организован иначе) — это фактически одномерный массив, для которого используются функции, позволяющие оперировать им, как двухмерным массивом. Например, можно узнать количество колонок или количество строк двухмерного массива.

  ОПИСАНИЕ_МАССИВА Массивчик(РазмерМассива+1) 
  Предупреждение(КоличествоСтрокВМассиве('Массивчик'))
  Предупреждение(КоличествоКолонокВМассиве('Массивчик'))
  РазмерМассива = РазмерМассива+1

Вы можете оперировать двухмерным массивом, как одномерным, где количество элементов будет равно количеству строк умноженному на количество колонок. Чтоб получить из двухмерного массива порядковый номер ячейки, как из одномерного, надо использовать функцию НомерЭлементаВМассиве(Массив,НомерСтроки,НомерКолонки)

Мы можем перебирать элементы массива.

  ДЛЯ К=1 ПО КоличествоВМассиве('Массивчик')
      Массивчик(К) = К
  КОНЕЦЦИКЛА;            // точка с запятой в операторе КОНЕЦЦИКЛА; обязательна

Можно вставлять строки, с указанной позиции

  ВставитьСтрокуВМассив('Массивчик', 3)
      Массивчик(3) = 11
  

Содержимое массива можно просматривать в виде строки

  Сообщить(СодержимоеМассиваВСтроку('Массивчик'))
  

Можно удалить элемент массива с указанной позиции.

  УдалитьСтрокуИзМассива('Массивчик', 3)

Сортировать элементы в массиве можно по возрастанию и убыванию.

  СортироватьМассив('Массивчик',1)

Просмотреть содержимое массива удобнее в виде списка функцией ВыборИзМассива(ИмяМассива), Данная функция возвращает номер выбранного элемента из списка.

  Предупреждение(ВыборИзМассива('Массивчик')) 

Массив можно сформировать из списка файлов на диске по заданной маске (например, «*.rus»)

  СписокФайловВМассив('Массивчик','*.rus')

В результате в массиве «Массивчик» будет содержаться список файлов, полученных командой.

Урок 07. Объектные массивы

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

Новый массив создается так:

    Мас =  НовыйМассив(2)   // Одномерный объектный массив с 2-мя элементами
    

Номер последнего элемента массива можно посмотреть так:

    Предупреждение(Мас.ВГраница())

В последнюю ячейку массива запишем число 22

    Мас.Установить(Мас4.ВГраница(),22)   

Урок 08. Создание объектов

Описание объекта начинается с оператора ОПРЕДЕЛИТЬ_ОБЪЕКТ, а заканчивается оператором КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА

  ОПРЕДЕЛИТЬ_ОБЪЕКТ Объект1 КАК БАЗОВЫЙ_ОБЪЕКТ  
  ЗАЩИЩЕННОЕ_СВОЙСТВО Свойство2   // К этому совойству нельзя обратиться извне, но можно из потомков
  СКРЫТОЕ_СВОЙСТВО Свойство4   // К этому совойству нельзя обратиться извне и нельзя из потомков
  Свойство1 = 'Любой текст'
  Свойство2 = 2     // Это защищенное свойство
  Свойство3 = 3
  Свойство4 = 4    //  Это скрытое свойство
  ФУНКЦИЯ КтоЭто()
  КОНЕЦФУНКЦИИ "Это Объект1"
  ФУНКЦИЯ ПростаяФункцияОбъекта
  КОНЕЦФУНКЦИИ 'Это простая функция'
  ФУНКЦИЯ Свойство3_ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА
     Предупреждение('Это особая функция, которая вызывается, если вы пытаетесь '+;
                                   'получить значение свойства Свойство3')
     ВОЗВРАТ ЭТОТ_ОБЪЕКТ.Свойство3   // вы можете не возвращать свойство и его значение извне нельзя будет получить
  КОНЕЦФУНКЦИИ
  ФУНКЦИЯ Свойство3_ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА(Значение)
     Предупреждение('Это особая функция, которая вызывается, если вы пытаетесь '+;
                         'присвоить значение свойству Свойство3')
     ЭТОТ_ОБЪЕКТ.Свойство3 = Значение   // Вы можете не присваивать, тогда изменить свойство извне будет невозможно
  КОНЕЦФУНКЦИИ
  ФУНКЦИЯ ИзменитьСвойство2(Значение)
     ЭТОТ_ОБЪЕКТ.Свойство2 = Значение 
  КОНЕЦФУНКЦИИ 
  ФУНКЦИЯ ПрочитатьСвойство2
  КОНЕЦФУНКЦИИ ЭТОТ_ОБЪЕКТ.Свойство2
   КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА      

Оператор ЗАЩИЩЕННОЕ_СВОЙСТВО запрещает доступ и изменение перечисленных после него свойств за пределами класса, сам класс и потомки доступ имеют.

Оператор СКРЫТОЕ_СВОЙСТВО запрещает доступ вне класса даже потомкам.

Оператор _ПРИ_ПОЛУЧЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА вынуждает вызывать данную функцию для свойства, которое названо вначале названия функции (в данном случае Свойство3). Когда кто-то извне пытается прочитать значение свойства, будет вызвана данная функция.

Оператор _ПРИ_ИЗМЕНЕНИИ_ЗНАЧЕНИЯ_СВОЙСТВА вынуждает вызывать данную функцию для свойства, если кто-то извне пытается записать значение в свойство.

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

Создадим потомка объекта «Объект1»

  ОПРЕДЕЛИТЬ_ОБЪЕКТ Объект2 КАК  Объект1
      ФУНКЦИЯ ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА()
         Предупреждение("При создании объекта вызывается данная функция")
       КОНЕЦФУНКЦИИ 
       ФУНКЦИЯ КтоЭто()
       КОНЕЦФУНКЦИИ "Это Объект2, который создан от "+МЕТОД_РОДИТЕЛЯ()
       ФУНКЦИЯ ПРИ_УДАЛЕНИИ_ОБЪЕКТА()
           Предупреждение("При удалении объекта вызывается данная функция")
       КОНЕЦФУНКЦИИ
  КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА      

В объекте потомке мы переопределили метод КтоЭто(), но внутри его вызвали метод родителя оператором МЕТОД_РОДИТЕЛЯ()

В объекте потомке мы создали функцию ПРИ_ИНИЦИАЛИЗАЦИИ_ОБЪЕКТА(), которая будет вызываться всякий раз при создании объекта2. Еще мы создали функцию ПРИ_УДАЛЕНИИ_ОБЪЕКТА(), которая будет вызываться при удалении объекта.

Урок 09. Исследование объектов

В РусскийФокс вы можете просмотреть содержимое любого объекта (какие свойства, методы и события он имеет) с помощью специальных функций: МассивМетодовОбъекта(Объект), МассивСвойствОбъекта(Объект), МассивСобытийОбъекта(Объект)

Каждая из этих функций возвращает объектный массив с соответствующим списком информации об объекте. Например, для просмотра списка методов объекта «ОбъектСтрока» можно использовать следующий код.

 ОбМассив = МассивМетодовОбъекта(ОбъектСтрока)
 ОбМассив.ВыборИзМассива("Для_строк")
 УдалитьОбъект(ОбМассив)

В Уроке 09 (Lesson.rus) вы можете посмотреть код программы по просмотру содержимого различных объектов имеющихся в Русском Фоксе и создаваемых программистом.

Урок 10. Рабочий стол, DBF-файлы и просмотр Курсора

В программе РусскийФокс Рабочий Стол присутствует всегда, но он скрыт по умолчанию. Некоторые объекты могут быть активизированы и показаны на экране только в том случае, когда Рабочий стол не скрыт. Поэтому эти объекты перед своей активизацией делают Рабочий стол видимым, если Рабочий стол скрыт.

Для управления Рабочим Столом создаем объект «РабочийСтол». (см.Урок 10)

  Экран = НовыйОбъект("РабочийСтол")  
  Экран.Показать()   // Делаем скрытый рабочий стол видимым      

Меняем размеры Рабочего Стола

  Экран.Координаты(3,15,50,150)
  Экран.ИзменитьОкно()
  Экран.ЦветФона(ЦветФормы.Зеленый)   // Делаем зеленый фон
  Экран.Заголовок("НовыйЗаголовок")    //  Устанавливаем новый заголовок 

Данные могут хранится в DBF-файлах. Для открытия и использования DBF-файла следует применять объект «ФайлDBF»

  Файл1 = НовыйОбъект("ФайлDBF")
  ЕСЛИ НЕ Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Departm.dbf",1)
     Предупреждение("Ошибка открытия файла") 
  КОНЕЦЕСЛИ;     

В метод объекта «ФайлDBF» ОткрытьФайл() передаются два параметра: 1) полный путь и имя DBF-файла с расширением 2) режим открытия (0 — только чтение, 1 — запись и чтение, 2 — монопольный режим, 3 — повторное открытие файла только для чтения)

Закрыть файл можно, удалив объект. Как программно создавать DBF-файлы, корректировать их структуру, связывать между собой мы будем рассматривать позже.

Но после открытия DBF-файла возникает потребность просмотреть на экране содержимое файла, добавить или удалить записи, либо отредактировать какие-то данные. Для данной цели можно использовать объект «ПросмотрКурсора».

  Просмотр = НовыйОбъект("ПросмотрКурсора")
    Просмотр.Показать(Файл1)

После выполнения данного кода, на экране появится Рабочий Стол (если он был скрыт) и таблица, в которой можно будет производить манипуляции с данными DBF-файла.

Названия колонок в данной таблице будут соответствовать именам полей DBF-файла. Для разработчика такой просмотр может быть достаточным, но для пользователя программы он не удобен. Потому в объекте «ПросмотрКурсора» вы можете производить дополнительные настройки:

  Просмотр = НовыйОбъект("ПросмотрКурсора")
  Просмотр.СписокПолей = "1=>Kod:R,2=>Name"
  Просмотр.ШиринаКолонок = "1=>20,2=>70"
  Просмотр.ЗаголовокКолонок  = '1=>"Код",2=>"Наименование"'
  Просмотр.ДопНастройкаТаблицы = Просмотр.ЗапретитьИзменятьДанные()+;
         Просмотр.ЗапретитьДобавлять()+Просмотр.ЗапретитьУдалять()+;
                               Просмотр.СправаКарточка(ИСТИНА)+Просмотр.ЗакрепитьКолонки(2)
  Просмотр.Заголовок = "Список отделов"
  Просмотр.Подсказка = "(F4 - Карточка отдела, F5-Список отделов, Alt+F4-Выход)"   
    Просмотр.Показать(Файл1)

Вы можете выводить в таблицу только нужные поля, перечислив их в свойстве «СписокПолей» объекта «ПросмотрКурсора». Например, "1=>Kod:R,2=>Name". Но если вы перечислили поля, то вам придется указать и ширину колонки каждого поля: Просмотр.ШиринаКолонок = "1=>20,2=>70" (ширина 1-ой колонки = 20, а 2-ой = 70)

При желании вы можете указать и свои названия колонок в таблице:

  • Просмотр.ЗаголовокКолонок = '1=>"Код",2=>"Наименование" '

Можете изменить заголовок и подсказку окна таблицы:

  • Просмотр.Заголовок = "Список отделов"
  • Просмотр.Подсказка = "(F4 - Карточка отдела, F5-Список отделов, Alt+F4-Выход)"

Так же можно выполнить дополнительные настройки таблицы:

  • ЗапретитьИзменятьДанные() - записав данную функцию, таблица откроется только в режиме просмотра данных, даже если DBF-файл вы открыли в режиме изменения данных.
  • ЗапретитьДобавлять() - запрещено добавлять новые записи в таблицу.
  • ЗапретитьУдалять() - запрещено удалять записи из таблицы.
  • ЗакрепитьКолонки(2) — Закрепить 2 колонки слева, которые при перемещении будут оставаться видимыми.

Таким образом, если вам надо, чтоб пользователь мог только изменять данные, но не мог добавлять или удалять их, то вы можете написать: Просмотр.ЗапретитьДобавлять()+Просмотр.ЗапретитьУдалять().

Все данные функции (ЗапретитьДобавлять(), ЗапретитьУдалять(), ЗакрепитьКолонки(2), ЗапретитьИзменятьДанные(), СправаКарточка(ИСТИНА)) могут применяться только в таком виде для заполнения Свойства «ДопНастройкаТаблицы» до выполнения метода Показать() и они не могут использоваться, как самостоятельные функции после запуска метода Показать() или для заполнения других свойств объекта.

Если вы включаете функцию СправаКарточка(ИСТИНА), то это означает, что таблицу можно будет разделить на две части по вертикали: слева будет обычный табличный список, а справа каждая запись будет представлена в виде карточки, где поля будут расположены не в колонках, а друг за другом сверху вниз. Таким образом, слева будет таблица, в которой удобно перемещаться по записям, а справа подобие карточки, где удобно перемещаться по полям строки таблицы. Если вы передадите параметр ЛОЖЬ, то слева будет карточка, а справа таблица.

Для разделения окна таким образом следует «мышкой» потянуть вправо за черную метку в левом нижнем углу. Вы можете переключаться между режимами карточка и список, нажимая F4 или F5.

Таким образом, теперь у вас есть инструмент редактирования DBF-файла для не привередливых пользователей.

Урок 11. Взаимодействие с LibreOffice (либо OpenOffice)

Для формирования отчетных форм в программах удобно использовать шаблоны, сформированные в программе LibreOffice, которые заполняются из программы РусскийФокс.

Для работы с LibreOffice используйте объект «RepOpenOffice».

    ОтчетПользователя = НовыйОбъект(«RepOpenOffice»)

После создания объекта ОтчетПользователя, вы можете соединиться с LibreOffice

     ОтчетПользователя.Соединиться(ТекущийКаталог(),"Отчеты.ods","Урок11")
  

здесь ТекущийКаталог() - это каталог, в котором расположен файл с шаблоном Отчеты.ods, в котором мы будем использовать Лист «Урок11»

Чтоб оставить в файле Отчеты.ods все листы, кроме нужного вызываем метод

 ОтчетПользователя.УдалитьВсеЛистыКромеНужного()

смотрите работающий пример урока 11 в файле Lesson11.rus. Для получения данных, записанных в ячейках шаблона используйте метод объекта

 ОтчетПользователя.ПолучитьСтрокуИзЯчейки(НомКолонки, НомСтроки)

а для записи значения в ячейку шаблона LibreOffice

      ОтчетПользователя.ЗаписатьСтрокуВЯчейку(Колонка1,Строка1,Значение)

следует знать, что нумерация колонок и строк в шаблоне начинается с 0. Потому ячейке A1 будет соответствовать номер колонки = 0 и номер строки = 0.

Вы можете управлять видимостью отчета методом

  ОтчетПользователя.ВидимостьОтчета(ИСТИНА)

ИСТИНА в параметре покажет отчет на экране, а ЛОЖЬ — скроет. При заполнении шаблона отчет разумнее скрыть, чтоб экран пользователя не мелькал при записи данных в шаблон.

В примере урока 11 (см.файл Lesson11.rus) представлена программа, которая считывает ячейки шаблона, находит особые записи (поля типа «<<поле>>»), собирает их координаты расположения (номер колонки и строки), затем в эти поля записывает определенный текст.

Урок 12. Создание объекта LibreOffice (либо OpenOffice)

Урок 13. Создание сценариев для ClickerMann

Программа ClickerMann.exe генерирует нажатия клавиатуры по программному сценарию, имитируя работу пользователя. Это можно использовать для заполнения справочников в различных программах. Например, в уроке 13 показано, как в Русском Фоксе формировать сценарий к программе ClickerMann для создания новых карточек по основным средствам для программы 1С. У меня возникла необходимость ввести более 13000 карточек в программе 1С, при этом данные для заполнения полей в карточках содержатся в таблице Calc OpenOffice.

ClickerMann выполнит эту работу, а РусскийФокс напишет ему сценарий для выполнения.

Создаем два объекта (см. Lesson13.rus)

  Офис = НовыйОбъект("RepOpenOffice") 
    Об = НовыйОбъект("clickermann")

Объект «Офис» будет читать данные из таблицы Calc, а объект «Об» будет формировать файл со сценарием для ClickerMann.exe.

    Об.НачатьЗаписьСценария("test","Больница")

Здесь test – это задаваемое нами имя файла со сценарием (он будет иметь расширение “.cms”). Больница — это слово, которое содержится в заголовке окна открытой программы 1С. В программе 1С мы должны сами открыть справочник «Основные средства» до запуска сценария. ClickerMann, выполняя наш сценарий, сам активизирует окно 1С (в заголовке которого есть слово «Больница»), так как в сценарии будут соответствующие команды.

Используя объект «Офис» мы получаем содержимое нужных нам ячеек и заполняем нужные переменные.

  Наименование = Офис.ПолучитьСтрокуИзЯчейки(1, Начало)

Нужные переменные мы передаем в функцию

   ДобавитьОсновноеСредство(Наименование,ИнвНомер,Сумма,Номер,Об)

Данная функция производит запись команд в файл сценария (“test.cms”), которые произведут создание новой карточки в программе 1С, внесут в нее нужные данные и нажмут кнопку «Записать». Таким образом, нужные данные попадут в справочник 1С.

Имитируя нажатие клавиши INS, робот ClickerMann создаст новую карточку основного средства в списке основных средств.

   Об.КлавишаINS()

После этой команды, на всякий случай, сделаем задержку 500 миллисекунд, чтоб команда нормально отработала (для надежности я делаю заведомо большую задержку).

   Об.Задержка(500)

После создания новой карточки курсор будет находится в поле «Наименование». В это поле мы заносим наше значение.

  Об.ПечататьСтроку(Наименование)

Теперь нам надо перейти на поле для ввода инвентарного номера. Для этого надо нажать три раза клавишу TAB

   Об.КлавишаTAB()

После задержки вставляем нужные данные в это поле. Затем вновь нажимаем TAB. Вводим норму амортизации (в данном случае во всех карточках вводим 100). После этого вновь нажимаем TAB. Вносим количество часов работы оборудования в год (во всех карточках 1925). Затем нажимаем 9 раз клавишу TAB, чтоб попасть на строку «Примечание». В нее записываем порядковый номер карточки. Вновь нажмем TAB и окажемся на кнопке «Записать». Чтоб «нажать» кнопку вводим команду

   Об.КлавишаВВОД()

В конце вновь добавляем задержку, чтоб карточка успела сохраниться перед тем как мы вновь начнем повторять эти процедуры для ввода новой карточки.

Для закрытия файла «test.cms» после окончательной записи сценария вызываем

    Об.ЗакончитьЗапись()

После выполнения данной программы мы получим файл сценария для ClickerMann.exe. Запустив данный сценарий мы увидим, как робот ClickerMann будет создавать новые записи в программе 1С и заносить в них наши данные.

Урок 14. Создание DBF-файла, выгрузка в XML

Для просмотра DBF-файлов мы создаем объект "ПросмотрКурсора".

  Просмотр = НовыйОбъект("ПросмотрКурсора")      

Открываем DBF-файл

  Файл1 = НовыйОбъект("ФайлDBF")
  ЕСЛИ НЕ Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Departm.dbf",1)
     Предупреждение("Ошибка открытия файла Departm.dbf") 
  КОНЕЦЕСЛИ;

Смотрим DBF-файл

     Просмотр.Показать(Файл1)

Для создания нового DBF-файла используем функцию СоздатьТаблицу() объекта "ФайлDBF"

 Файл1.СоздатьТаблицу(ТекущийКаталог()+"DBF\","|Doljnost | Kod|C|10|0| Name|C|30|0|")    

Строка "|Doljnost | Kod|C|10|0| Name|C|30|0|" описывает структуру таблицы Doljnost.dbf. В таблице будут созданы следующие поля: 1) Kod – строка длинной 10 символов, 2) Name – строка в 30 символов. Число мы бы задали так : |n|7|2| (7-знаков, 2 знака после запятой) Дату определили бы так: |d|0|0| Если вы ошибочно вместо латинской «C» наберете русскую «С», то программа сообщит вам об ошибке, что буква при определении поля не соответствует.

Чтоб добавить новое поле в существующий DBF-файл следует вызвать функцию ПроверитьСтруктуру() объекта "ФайлDBF"

  Файл1.ПроверитьСтруктуру("|Doljnost | Kod|C|10|0| Name|C|30|0| Departm|C|10|0|")
  УдалитьОбъект(Файл1)

После вызова данной функции объект "ФайлDBF" следует удалять и открывать заново. Учитывая, что изменять структуру приходится редко, как правило при обновлении версии программы, то переоткрыть DBF-файл — это не сложно.

В уроке 14 умышлено в примере делаемся попытка показа DBF-файла после вызова функции ПроверитьСтруктуру(), чтоб показать, какая ошибка при этом будет высвечена. Здесь показано, как изменить структуру существующего поля. Поле «Name» имело размер в 30 символов, а мы его меняем на размер в 100 символов.

  Файл1.ПроверитьСтруктуру("|Doljnost | Name|C|100|0|")  
  Предупреждение("Попытка показа объекта после выполнения функции ПроверитьСтруктуру()") 
  Просмотр.Показать(Файл1)   
  УдалитьОбъект(Файл1)

Объект «ПросмотрКурсора» кроме просмотра способен сформировать XML-файл из данных DBF-файла. Для этого вы можете вызвать одну из функций:

  Просмотр.КурсорВXMLФайл(Файл1.ИмяОбласти,"XMLDepartm")
  Просмотр.КурсорВXMLФайл2(Файл1.ИмяОбласти,"XMLDepartm2")

Объект «ФайлDBF» имеет свойства:

1) ИмяФайла – имя dbf-файла, открытого в объекте

2) ПутьФайла — полный путь каталога, где находится файл

3) ИмяОбласти — это уникальное имя, если области с именем = ИмяФайла нет, то ИмяОбласти будет = Имени файла, если такая область есть (например, такое случится, когда файл будет открыт снова в другом объекте), то ИмяОбласти = ИмяФайла+ уникальный код.

4) Режим указывает, как был открыт файл (0-только чтение, 1- чтение и запись, 2 — монопольно, 3- повторно, только для чтения)

5) СтрокаОписанияПоле — это текстовое описание структуры файла (типа "|Doljnost | Kod|C|10|0| Name|C|30|0| Departm|C|10|0|"). Данное свойство заполняется только при вызове функции создания DBF-файла.

Урок 15. Изменение DBF-файла и назначение командных клавиш

Для добавления записей в DBF-файл следует использовать функцию ДобавитьЗапись() объекта "ФайлDBF" (см.пример урока 15 в файле «Lesson15.rus»)

  Файл1 = НовыйОбъект("ФайлDBF")
  Файл1.ДобавитьЗапись()

А для присвоения значений полям DBF-файла используйте функцию ИзменитьПоле(ИмяПоля, Значение)

  Файл1.ИзменитьПоле("Kod", "01")

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

   НомерЗаписи = Файл1.ПоследняяЗапись()    // на последнюю запись в файле
   НомерЗаписи = Файл1.Начало()                      // на первую запись в файле
   НомерЗаписи = Файл1.ПерейтиВперед(1)   //  на одну запись вперед
   НомерЗаписи = Файл1.ПерейтиВперед(-1)   //  на одну запись назад
   НомерЗаписи = Файл1.ПерейтиНаНомер(НомерЗаписи)    //  перейти на указанный номер записи

Для удаления записей вы можете сначала пометить текущую запись для удаления

   Файл1.ПометитьНаУдаление()    

а затем полностью удалить помеченные записи

      Файл1.УдалитьПомеченныеНаУдаление()
   

Но следует помнить, что после выполнения функции УдалитьПомеченныеНаУдаление() DBF-файл закрывается и для продолжения работы с ним следует вновь открыть данный файл

    Файл1.ОткрытьФайл(ТекущийКаталог()+"DBF\Doljnost.dbf",1)

Для DBF-файла вы можете создать индексный файл с расширением CDX, в котором могут содержаться несколько индексов по разным полям DBF-файла.

  Файл1.СоздатьИндекс("TAG_Kod","Kod")      // сортирует по коду
  Файл1.СоздатьИндекс("TAG_Name","Name")    // сортирует по наименованию

Текущий индекс всегда один. Изменять его можно, если у вас несколько индексов, функцией УстановитьТекущийИндекс(ИмяИндекса) объекта "ФайлDBF"

    Файл1.УстановитьТекущийИндекс("TAG_Kod")  // сортировать по коду

Напоминаю, как можно настроить показ DBF-файла (см.урок 10)

  Просмотр.СписокПолей = "1=>Kod:R,2=>Name"
  Просмотр.ШиринаКолонок = "1=>20,2=>70"
  Просмотр.ЗаголовокКолонок  = '1=>"Код",2=>"Наименование"'
  Просмотр.ДопНастройкаТаблицы = Просмотр.ЗапретитьИзменятьДанные()+;
           Просмотр.ЗапретитьДобавлять()+;
              Просмотр.ЗапретитьУдалять()+Просмотр.СправаКарточка(ИСТИНА)+;
                       Просмотр.ЗакрепитьКолонки(2)
  Просмотр.Заголовок = "Список Должностей"
  Просмотр.Подсказка = "(F4 - Карточка, F5-Список, ПравКнМышки - Меню, Alt+F4-Выход)"   
  Просмотр.Показать(Файл1)

При показе определяются функциональные клавиши для команд перехода в режим «Карточка» F4 и в режим «Список» F5. Но вы можете назначить и свои функциональные клавиши, например, для вызова меню по нажатию правой кнопки мышки. Для этого следует использовать функцию УстановитьКоманднуюКлавишу(НазваниеКлавиши, Команда) объекта "ПросмотрКурсора"

  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "ВызватьМеню(Просмотр,Файл1)")    

Для установки вызова команд доступно программирование следующих функциональных клавиш Функций объекта "ПросмотрКурсора" : ПраваяКнопкаМышки() - нажатие правой кнопки мышки, ЛеваяКнопкаМышки() - нажатие левой кнопки мышки, КнопкаМышки() - просто кнопка мышки, СтрелкаВлево(), СтрелкаВправо(), СтрелкаВверх(), СтрелкаВниз(), УдалениеНазад() - BACKSPACE, Пробел(), Shift_TAB(). Напоминаю, что данные функции находятся внутри объекта "ПросмотрКурсора", потому их вызов происходит через указатель на созданный объект "ПросмотрКурсора" Например, Просмотр.СтрелкаВверх()

Кроме перечисленных назначений вы можете использовать все функциональные клавиши от F1 до F12, передавая их в функцию УстановитьКоманднуюКлавишу(«F1», «СтрокаСКомандой»). Имена прочих клавиш: DEL, INS, TAB, ENTER, ESC, 0...9, A...Z. Еще можно добавлять сочетания CTRL+, ALT+, SHIFT+. Например, «CTRL+1», «ALT+TAB», «SHIFT+A», «ALT+F3» и т.д.

Например, мы запрограммировали вызов меню по нажатию правой кнопки мышки при просмотре DBF-файла с использованием функции Просмотр.Показать(Файл1). Тогда функция такого меню может выглядеть так:

ФУНКЦИЯ ВызватьМеню(Просмотр,Файл1)
 ЛПЕРЕМ Результат, Команда
  // На время выполнения данной функции отключаем повторный вызов данной функции по правой клавише мышки
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "")
  Мас4 = НовыйМассив(6)
  Мас4.Установить(1,"Пометить к удалению")  
  Мас4.Установить(2,"ДобавитьЗапись")  
  Мас4.Установить(3,"Вверх")  
  Мас4.Установить(4,"Вниз")  
  Мас4.Установить(5,"В конец списка")  
  Мас4.Установить(6,"В начало списка")  
  Результат = Мас4.ВыборИзМассива()
Команда = РезультатУсловий(Результат,'Параметр1=1,"Файл1.ПометитьНаУдаление()",Параметр1=2,"Файл1.ДобавитьЗапись()",'+;
    'Параметр1=3,"Файл1.ПерейтиВперед(-1)",Параметр1=4,"Файл1.ПерейтиВперед(1)",""')
  ЕСЛИ СтрДлина(Команда)=0  // если Команда = пустая строка
    Команда = РезультатУсловий(Результат,'Параметр1=5,"Файл1.ПоследняяЗапись()",""')
  КОНЕЦЕСЛИ;  
  &Команда
 ЕСЛИ Результат = 6
    Файл1.Начало()   
  КОНЕЦЕСЛИ;
  // Восстанавливаем вызов функции по нажатию правой кнопки мышки
  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "ВызватьМеню(Просмотр,Файл1)")
КОНЕЦФУНКЦИИ
     

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

  Просмотр.УстановитьКоманднуюКлавишу(Просмотр.ПраваяКнопкаМышки(), "")

Чтоб при нажатии правой кнопки мышки ни чего не вызывалось. А в конце функции вновь устанавливаем вызов данной функции по нажатию правой кнопки мышки.

В этой функции, чтоб сформировать строки меню мы заполняем массив Мас4 нужными строками. После присваиваем результат выбора переменной «Результат»

         Результат = Мас4.ВыборИзМассива()

Затем нам надо по числу (фактически номер выбранной строки), которое попадет в переменную «Результат» вызвать нужную команду. Для этого можно использовать конструкцию ЕСЛИ, но тогда код получится слишком длинным. Потому мы применяем функцию РезультатУсловий(), в которой в качестве первого параметра передаем переменную «Результат», а затем вторым параметром в виде строки передаем наборы условий при этом, чтоб использовать двойные кавычки для возврата строк типа «Файл1.ДобавитьЗапись()» вся строка заключена в одинарные кавычки «'». При этом мы не можем написать в условии «Результат=1», так как условие будет выполняться внутри функции, потому мы пишем «Параметр1=1», а поскольку в качестве первого параметра мы передаем «Результат», то данная запись соответствует условию «Результат=1». При выполнении какого-либо условия в переменную «Команда» будет возвращена соответствующая строка с вызываемой командой, а если ни одно условие не выполнится, то возвратится пустая строка, так как в конце строки у нас запись «""» (пустая строка). Далее я показал (хотя такой вызов не эффективен при небольшом числе условий), что мы можем проверить переменную «Команда», если в ней пустая строка, то вновь вызвать функцию РезультатУсловий() с проверкой других условий.

В итоге мы запускаем содержимое строки «Команда» на исполнение той функции, которая содержится в ней в виде строки вызова. Если переменная «Команда» останется пустой строкой, то ни какого вызова функции не произойдет. Далее я вынуждено использую конструкцию ЕСЛИ, из-за наличия в команде одинарных и двойных кавычек.

  ЕСЛИ Результат = 7
        Файл1.УстановитьФильтр('СравнитьСтрокуПоМаске("*Фокс*",Name)') 
  КОНЕЦЕСЛИ;

Аналогично пришлось бы поступить, если мы использовали не одну строку команды, а несколько строк. Но так же можно было бы создать функцию с простым вызовом типа «Функ1()», а в ней уже вызывать любые команды.

Урок 17. Подключение модулей

Большие программы тяжело создавать в одном текстовом файле. Требуется разделение программного кода на модуле. Работа с модулями в РусскомФоксе имеет ряд особенностей, которые важно понимать. Все модули, которые можно подключить имеют расширение «fxp». Любая программа РусскогоФокса может стать модулем для другой программы. В РусскомФоксе нет деления на «exe» и «dll» (хотя dll РусскийФокс так же может использовать), все запускаемые файлы имеют расширение «fxp» и содержат упакованные строки для интерпретатора. Для подключения модуля достаточно выполнить команду

 ПодключитьМодуль("BootStrap")

После этой команды можно использовать все функции и объекты данного модуля. Но если вы подключаете несколько модулей, которые содержат одноименные функции, то у вас могут возникнуть проблемы: будет запускаться та функция, которая содержится в модуле подключенным первым. Поэтому рекомендуется избегать свободных функций, а все функции заключать внутрь объекта с заведомо уникальным именем.


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

Демонстрация этих особенностей при использовании модулей содержится в уроке 17.

В примере два модуля «BootStrap» и «Модуль1» имеют одноименную функцию ИмяМодуля(). На примере вызова этой функции показана данная особенность подключения модулей. Так же показано, что работоспособность созданного из модуля объекта сохраняется и после закрытия всех модулей командой

ПодключитьМодуль()
Пока нет возможности отключать модуля по отдельности. Но пока это не создает особых проблем, я предпочитаю сосредоточится на более важных направлениях развития Русского Фокса.


Урок 18. BootStrap-объект.

Если скрестить ежа с ужом, то получится либо колючий уж, либо очень длинный еж.

РусскийФокс вносит новый технологический подход в сайтостроение. Теперь вы можете ограничится знанием Русского Фокса и не иметь знаний по HTML, CSS, JavaScript, PHP, чтоб создавать сайты. Генерировать нужные коды в HTML-файл можно на Русском Фоксе, используя объект «BootStrap». Знания языков программирования для создания сайтов вам потребуются только, если вы захотите создать свои объекты на Русском Фоксе или дополнить существующие объекты.

Объект «BootStrap» содержится в модуле bootstrap.fxp и полностью написан на Русском Фоксе без применения Visual FoxPro 9 (родителя Русского Фокса).

В модуле BootStrap.fxp версии 1.0 содержатся следующие объекты:

1. BootStrap

2) BootStrap_Навигатор

3) BootStrap_Карусель

4) BootStrap_Призыв

5) BootStrap_ЗаголовокСПараграфом

6) BootStrap_ТриКолонки

7) BootStrap_ДвеКолонки

8) BootStrap_Вкладки

9) BootStrap_МодальноеОкно

10) BootStrap_ГруппаПараграфов

11) BootStrap_СсылкаСПодсказкой

12) BootStrap_Функции

13) BootStrap_Объект

14) НавМенюВертикальноеОдинУровень

15) BootStrap_Таблица

16) Генератор_CSS

Объект «BootStrap» имеет один значимый метод СоздатьПроект(). После запуска этой функции создается файл index.html, содержащий HTML, CSS, JavaScript коды. Но перед тем, как запустить метод СоздатьПроект() следует присвоить свойству «Контейнер» массив с объектами для BootStrap. Далее я приведу краткое описание созданных объектов и постепенно буду описывать, как работать с каждым объектом.

Создание сайта теперь выглядит так:

ПРОЦЕДУРА Старт 
  ПодключитьМодуль("BootStrap")   // Подключаем модуль BootStrap
  Об = НовыйОбъект("BootStrap")    // Создаем объект BootStrap
  Об.ИмяПроекта = "УфЛи"          // Задаем заголовок и имя проекта ЛитКлуба г.Уфы
  Об.Заголовок = "УфЛи" 
  Сайт = НовыйОбъект("СайтУфЛи")           // Создаем объект нашего сайта
  Ф = НовыйОбъект("BootStrap_Функции")  // Создаем объект с функциями из модуля
  Г = НовыйОбъект("Генератор_CSS")                // функции для генерации CSS
  Об.Контейнер = Сайт.ПолучитьОбъекты(Ф,Г)   // Получаем список объектов 
  Об.СоздатьПроект()    //  Создаем HTML-файл
Предупреждение("index.html создан c помощью объекта BootStrap ")
КОНЕЦПРОЦЕДУРЫ

Примерно так выглядит сайт с объектами навигатор и карусель.

Каждый сайт удобно оформлять в виде единого объекта, типа "СайтУфЛи". В зависимости от того, какой объект мы подключим, такой файл HTML и будет создан. Десятки наших сайтов могут быть в одном каталоге и перекомпилироваться после усовершенствования объектов. Благодаря этому себестоимость сопровождения и обновления большого числа разработок снижается.

Мы подключаем объект "BootStrap_Функции", так как я рекомендую не создавать свободных функций, а создавать функции внутри объекта. Таким образом, для функций обеспечивается свое пространство имен, которое позволяет избежать проблемы с одинаковым названием функций в различных модулях. Мы можем создавать и переменные внутри объекта так же не беспокоясь о повторении в названии.

Существует объект "Генератор_CSS" для тех кому лень писать CSS-коды руками. Позже я расскажу, как им пользоваться. Свои CSS-коды теперь придется писать только, если вы желаете усовершенствовать объекты и создавать специфичное оформление.

Кратко расскажу о назначении каталогов в данных проектах создания сайтов.

Каталог «BootStrap» содержит внешние файлы с CSS-кодами, JS-кодами и шрифтами, которые взяты из проекта BootStrap. При обновлении версии BootStrap можно обновлять и файлы в данном каталоге, если вы любите последние версии библиотек. В корневом каталоге содержится сгенерированный файл Index.html и исходные коды на Русском Фоксе для генерации различных сайтов (файлы с расширением RUS). В каталоге RusFox содержатся общие файлы картинок, нужные для объектов из модуля «BootStrap». В каталоге Projects содержатся каталоги cо специфичными файлами для каждого проекта. В основном требуется по каждому сайту хранить свои особенные изображения, так как CSS-коды и коды JavaScrip в основном содержатся в сгенерированным Русским Фоксом файле HTML, но при желании вы можете создавать и отдельные файлы с JS и CSS-кодами. В каталоги каждого проекта рекомендую копировать для сохранности резервную копию файла с расширением «RUS», в котором содержится алгоритм формирования соответствующего HTML-файла.

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

Объект для вашего сайта на Русском Фоксе будет выглядеть так:

Пример Сайта на Русском Фоксе и BootStrap (из-за HTML тегов код нормально отображается только в режиме редактирования)

ОПРЕДЕЛИТЬ_ОБЪЕКТ СайтУфЛи КАК БАЗОВЫЙ_ОБЪЕКТ
   Каталог='Projects/UfLi/'
   
   ФУНКЦИЯ ПолучитьОбъекты(Ф,Г)
      Объекты = НовыйМассив(1)
         Объекты.Добавить(ЭТОТ_ОБЪЕКТ.Навигатор())  
         Объекты.Добавить(ЭТОТ_ОБЪЕКТ.АнонсКарусели(Г))  
         Объекты.Добавить(ЭТОТ_ОБЪЕКТ.Карусель())  
         ВОЗВРАТ Объекты    
   КОНЕЦФУНКЦИИ

ФУНКЦИЯ Навигатор()

   ФУНКЦИЯ Навигатор()
        Навигатор = НовыйОбъект("BootStrap_Навигатор")
       Меню = НовыйМассив(1)
         Меню.Добавить("|#|Главная|Актив|")  
         Меню.Добавить("|#|Пункт 1|Меню|/#/ПодМеню 1.1/#/ПодМеню 1.2/|")  
         Меню.Добавить("|#|Пункт 2|Меню|/#/ПодМеню 2.1/#/ПодМеню 2.2/#/ПодМеню 2.3/|")  
         Меню.Добавить("|#|Это демонстрационная страница|||")  
         Навигатор.ПунктыМеню = Меню
       Профиль = НовыйМассив(1)
         Профиль.Добавить("|#myModal|Установки|wrench|")    //    
         Профиль.Добавить("|#|РазделительМеню||")  
        Профиль.Добавить("|#|Выход|off|")  
        Навигатор.МенюПрофиля = Профиль
        Навигатор.Логотип = "RusFox/images/RusFox2.ico"
     ВОЗВРАТ Навигатор    
   КОНЕЦФУНКЦИИ

ФУНКЦИЯ АнонсКарусели

   ФУНКЦИЯ АнонсКарусели(Г)
     ЛПЕРЕМ КодCSS
     АнонсКарусели = НовыйОбъект("BootStrap_ЗаголовокСПараграфом")
     КодCSS = Г.ЦветФона("#777777")+Г.ЦветСимволов("#FFFFFF")+Г.СкруглитьУглы(10)+;
                                                                            Г.ТеньЭлемента(1,1,10,"rgba(0,0,0,0.5)")+Г.Отступ("2 4 6 7px")
     АнонсКарусели.ТекстCSS = Г.ВыдатьCSS(КодCSS)
АнонсКарусели.Заголовок = '



. Литературный клуб города Уфы "УфЛи" .

'
     АнонсКарусели.ТекстПараграфа = 'Просматривайте видео заседаний клуба.
Кратко о клубе'+; ' <details> Литературный клуб "УфЛи" создан в .... году
</details>
' ВОЗВРАТ АнонсКарусели КОНЕЦФУНКЦИИ

ФУНКЦИЯ Карусель()

   ФУНКЦИЯ Карусель()
     Карусель = НовыйОбъект("BootStrap_Карусель")
     Карусель.КаталогКартинок = ЭТОТ_ОБЪЕКТ.Каталог+'images/'
     СписокСлайдов = НовыйМассив(1)  //  слайд 725х310 | слайд 940х410 | слайд 1170х502 |  три размера jpg для разных экранов   
СписокСлайдов.Добавить("|180530_УфЛи_m.jpg|180530_УфЛи_s.jpg|180530_УфЛи.jpg|
30 мая 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/2CAbmfyVbZs'>видео</a>

|") СписокСлайдов.Добавить("|180516_УфЛи_m.jpg|180516_УфЛи_s.jpg|180516_УфЛи.jpg|
16 мая 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/2CAbmfyVbZs'>видео</a>

|") СписокСлайдов.Добавить("|180510_УфЛи_m.jpg|180510_УфЛи_s.jpg|180510_УфЛи.jpg|
10 мая 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/_z3T91XqeF0'>видео</a>

|") СписокСлайдов.Добавить("|180418_УфЛи_m.jpg|180418_УфЛи_s.jpg|180418_УфЛи.jpg|
18 апреля 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/0oMp2d1VD7A'>видео</a>

|") СписокСлайдов.Добавить("|180411_УфЛи_m.jpg|180411_УфЛи_s.jpg|180411_УфЛи.jpg|
14 апреля 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/uV0GIdUKZys'>видео</a>

|") СписокСлайдов.Добавить("|180404_УфЛи_m.jpg|180404_УфЛи_s.jpg|180404_УфЛи.jpg|
04 апреля 2018 г.
"+; "

Смотреть <a href='https:/"+"/youtu.be/uV0GIdUKZys'>видео</a>

|")
     Карусель.СписокСлайдов = СписокСлайдов
     ВОЗВРАТ Карусель    
   КОНЕЦФУНКЦИИ
КОНЕЦ_ОПРЕДЕЛЕНИЯ_ОБЪЕКТА 

В методе ПолучитьОбъекты(Ф,Г) устанавливается порядок следования объектов в HTML-файле. Для примера приведено только 3 объекта.

Указатель Ф указывает на полезные функции модуля BootStrap. Указатель Г указывает на набор функций для генерации кода CSS.

Метод Навигатор() создает верхнее двухуровневое меню с логотипом, строкой поиска и командами «Мой профиль». Подробней о настройках данного объекта я расскажу в будущем, но и просто, глядя на код, можно понять что к чему.

Метод Карусель() создает адаптивную «карусель слайдов», у надписи под каждым фото есть ссылка на видео материал YouTube.

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

Планирую в будущем скрестить BootStrap с Joomla, научив Русский Фокс создавать адаптивные шаблоны для Joomla. В свое время я это уже пробовал сделать (но правда без использования BootStrap) на OneScript. На Русском Фоксе реализовать это будет проще.

Дальнейшее описание модуля BootStrap смотрите в «РусскийФокс. Модуль BootStrap»

См. также