Продолжаем вникать в 1С и теперь настало время поговорить о коде 1С и о том как он устроен, о его синтаксисе. Вы уже успели посмотреть как работает то или иное действие в документах и вот стоит слегка разобраться в подробностях.
Программный код можно разместить в разных местах 1С и для каждого существует своё назначение, а разделение носит сугубо условный характер. Код разносится по различным модулям исключительно для логической организации работы и зависит только от степени фантазии программистов его делающих. Однако, есть некоторые негласные правила, о которых поговорим позже.
Общий модуль. Код, который размещается в общих модулях условно виден из всех остальных модулях, справочников, документов, прочих объектов. Почему условно будет понятно далее.
И если дать ему имя, то будет как-то так:
Модуль объекта. С этим модулем мы столкнулись когда делали обработку проведения документов. Программный код условно виден из модуля того объекта, которому принадлежит.
Модуль формы. С этим модулем мы столкнулись, когда делали подсчет суммы как произведения цены на количество в табличной части документа поступления товаров/услуг. Условно виден из той формы, в которой он расположен.
Каждый модуль состоит из программного кода, но не просто линейного от начала модуля и до конца, а структурированного – модуль состоит из процедур и функций, комментариев и ряда служебных слов, о которых говорить пока рано. Выглядит в общем примерно так:
Тут есть примерно всё из перечисленного. Т.е. как вы понимаете, программный код располагается внутри модуля, но не просто где попало, а внутри процедур и функций.
Функции – части программного кода, предназначенные для выполнения каких-либо задач и возвращающие какой либо результат. Например, типичные функции – расчет максимального или минимального значения среди множества. В математике функции аналогичны – например, расчет синуса или косинуса. Но главное – это возврат какого-либо результата.
Процедуры – части программного кода, предназначенные для выполнения каких-либо задач или расчетов, но не предназначенные для возврата какого-либо результата. Отличает процедуры от функций только одно, они не могут возвращать никакой результат.
В примере выше, функция МояПерваяФункция() возвращает сумму значений, находящихся в двух переменных. В результате выполнения переменная ЗначениеМоейПервойФункции будет равно числу 9.
Когда говорят о функции или процедуре принято после её наименования писать две круглые скобки без параметров – открывающую и закрывающую. Это позволяет сразу понять, что речь идет не по какой-то переменной МояПерваяФункция, а именно о функции МояПерваяФукнция(). К сожалению этим способом нельзя отличить функцию от процедуры, по этому об этом говорят явно.
Процедуры и функции начинаются с ключевого слова “Процедура” или “Функция”, далее следует её наименование и список параметров, которые заключены в круглые скобки. Заканчивается определение процедур и функции соответствующими ключевыми словами “КонецПроцедуры” и “КонецФункции”. Начало процедуры или функции ещё принято называть её определением (в различных языках программирования, не только в 1С).
Иногда могут сказать, что функция была объявлена, но это не совсем верная терминология, ну в смысле, объявил функцию. Дело в том, что во многих других языках определение и объявление функций и процедур это разные конструкции кода, несущие вполне самостоятельное значение и не имеющих между собой ничего общего, т.е. это разные термины с различным смыслом.
Процедуры и функции могут быть стандартными (встроенными) уже самой платформой 1С, например, максимум из числе:
Т.е. я нигде не определял функции Макс(), но программа знает что нужно делать при её вызове – посчитать максимальное значение среди параметров.
А могут быть и пользовательскими, пардон, созданными программистами (но это всё равно в терминологии – пользовательские). МояПерваяФункция() и МояПерваяПроцедура() – это типичный пример пользовательской функции и процедуры.
Внутри пользовательских процедур и функций, или как и называют без слова “пользовательские”, а просто – процедур и функций, располагаются выражения.
Выражение – часть программного кода, несущего вполне самостоятельное действие и является близким аналогом математического выражения. Выражения разделяются между собой знаком “;” (точка с запятой). Например, в моей первой процедуре два выражения. Выражения в процедурах и функциях выполняются от начала и до конца, если не встречают на своём пути условий ограничивающих их выполнение. Такое выполнение иногда называют “сверху вниз” и оно принято во всех языках программирования. Выражения состоят из логически, математически или конкатенально организованных действий из функций, процедур, переменных и констант. Выражение оформляется следующим образом:
Если выражение предполагает наличие результата – указывается переменная, куда будет помещен результат, затем знак “=” (знак равенства) , а после него формула.
Если выражение не предполагает наличие результата – указывается необходимая процедура вызова.
Переменная – аналог математической переменной. Предназначена для хранения какого-либо значения. Значением могут выступать число, строка, дата, объект и т.п. Каждая переменная содержит в себе тип того значения, которое хранит. Например:
МояПеременная1 = 4; // Хранит число, следовательно у неё тип “Число”
МояПеременная2 = “Моя какая-то строка”; // Хранит строку, следовательно у тип “Строка”
МояПеременная3 = Истина; // Хранит значение только Истина или Ложь, следовательно у неё тип “Булево”
Задание значения переменной строго определенным значением, как в этих примерах, называется инициализацией переменной.
Существует ещё большое множество типов, которые может принимать переменная. Однако можно выделить среди них несколько стандартных (имеется ввиду для разных языков программирования):
Булево – принимает только одно из двух значений ИСТИНА или ЛОЖЬ. Со значением булево доступны логическое умножение, сложение, а также отрицание (моя статья “Программирование вообще с нуля“), например:
КакойтоРезультат = НЕ ЭтоЗабалансовыйСчет И ЭтоСчетТоваров
Мы уже делали операции с булево:
Число – принимает числовое значение пригодное для выполнения математических операций, например:
ЧислоТочекНаЭкране = 1920 * РазмерМонитораПоИгрек + РазмерМонитораПоИкс
Мы уже делали операции с числами:
Строка – принимает текстовую информацию. Строки можно складывать между собой, но это не математическое сложение, а строковое (сложение строк), которое ещё иногда называют “конкатенация”.
Мы уже делали конкатенацию:
Строковые переменные можно переносить по строкам, извините за тавтологию, но вы наверно уже обратили внимание как я это делал; правильно, нужно просто вначале строки поставить знак “|” (вертикальная черта):
Эта вертикальная черта будет проигнорирована платформой, а строки будут представлены их так, будто всё написано без переноса на новую строку (будто всё было написано в одну строку).
Строку можно сложить с числом, тогда будет выполнена конкатенация, при этом число будет предварительно представлено тоже строкой. Для этого перед числом должна конкатенироваться строка или оно принудительно должно быть преобразовано в строку:
Результат = 95 + ” кг”; // НЕПРАВИЛЬНО! Будет ошибка
Результат = “”+95+” кг”; // ПРАВИЛЬНО! Ошибки не будет, т.к. “” – это тоже строка и она конкатенируется к числу
Результат = Строка(95)+ ” кг”; // ПРАВИЛЬНО! Ошибки не будет, т.к. выполнена встроенная в платформу функция Строка() преобразующая параметр к строке.
Дата – Этот тип переменных индивидуальное свойство 1С. Это вполне самостоятельный тип переменной, однако я решил указать его тоже. Дело в том, что во многих других языках программирования, дата – это просто строка представленная в определенном формате, но в 1С – это отдельный тип.
Неопределено – переменная в специальной форме значения, тип которого не был определен. Если кто знает другие языки программирования – это некий аналог значения null из Java или NULL из Си. Для тех, кто не знает других языков, для простоты можно сказать, что значение “неопределено” используется тогда, когда нужно объявить в коде переменную без какого-либо значения (не число, не строка или ещё что-то). Такое нужно для того, чтобы по итогам выполнения кода после такой инициализации, стало понятно, выполнился код по определению этой переменной или по каким-то причинам этого не произошло. С этой переменной нельзя производить никакие действия, кроме присвоения и сравнения.
С переменными всех типов можно производить следующие действия в выражениях:
- Присвоение значения (инициализация)
- Сравнение (меньше, больше, равно, неравно и т.д.)
Вообще, работа с переменными сводится в два этапа – сначала она объявляется, затем используется. Использовать необъявленную переменную нельзя.
Иногда при выполнении кода, как я только что сказал, нужно ограничивать выполнение той или иной его части. Для этого в программный код встраиваются условия.
Мы уже использовали условия в документе реализации:
Структура условий выглядит так:
Если ТутКакоетоУсловие Тогда
// Тут что-то выполняется
ИначеЕсли ТутДругоеКакоетоУсловие Тогда
// Тут что-то другое выполняется
ИначеЕсли ТутЕщёДругоеКакоетоУсловие Тогда
// Тут что-то ещё другое выполняется
………………… и так ещё сколько угодно раз ………..
Иначе
// Тут выполняется в том случае, если никакое из условий выше так и не выполнилось
КонецЕсли;
С условиями вопросов, по идее, быть не должно, но если всё же появились, то задавайте в комментах.
Если вы на прошлых уроках следовали рекомендации и прочитали мою статьи “Программирование вообще с нуля“, то уже знакомы, что в любом языке программирования есть циклы. Видов циклов в 1С три, два из них (тип 2 и тип 3) мы уже использовали.
Тип 1:
Для Н = 1 ПО 25 Цикл
// Что-то тут делать 25 раз. При каждой итерации переменная Н будет увеличиваться на 1.
КонецЦикла;
Тип 2:
Для СтрТ ИЗ НекаяТаблицаЗначенийИлиМассивИлиДругойИтератор Цикл
// Что-то тут делать пока удаётся получить в переменную СтрТ значение очередной строки из переменной НекаяТаблицаЗначений , хранящей объект ТаблицаЗначений.
КонецЦикла;
Тип 3:
Пока Выборка.Следующий() Цикл
// Тут что-то делать пока результат итерации равен ИСТИНА
КонецЦикла;
Как вы наверно уже успели заметить, я обычный текст внутри кода пишу после двух правых слэшей:
// Тут какой-то текст не на языке программирования, а по-русски
Так в 1С объявляются комментарии. Как можно понять, всё что после // и до конца строки, может быть любой текст. Платформа 1С его просто будет игнорировать. Комментарии нужны чтобы потом ускорить понимание того, что вы написали в той или иной части кода, ведь сам код может быть очень сложен. Но если описать простым языком что он делает и когда используется, то через полгода возвратившись к нему, проблем с пониманием и вспоминанием скорее всего не возникнет.
Задание по уроку:
1. Самостоятельно найдите в поисковых системах функции работы с числом и строками, такими как Число(), Строка(), Сред(), Лев(), Прав(), ВРег(), НРег(), СтрНайти().
2. Самостоятельно найдите способы преобразования даты в строку и наоборот – из строки в дату.
3. В справочник БытоваяТехника добавьте реквизит “Бренд”, указывающий фирму производителя со ссылкой на новый справочник “ПроизводителиТехники” и заполните этот реквизит для уже внесенных данных:
Т.е. убрать из названия фирму производителя и сделать это отдельным реквизитом:
Если всё получилось как нужно – молодцы! Если нет, давайте разберёмся что не так.