Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

ИнфоСофт использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. Вы можете запретить обработку сookies в настройках браузера. Пожалуйста, ознакомьтесь с политикой использования cookies.
Оставаясь на сайте, вы соглашаетесь с политикой использования cookies.

«1С:Исполнитель» и «1С:Предприятие.Элемент»: собственные типы, «настойчивые» операции и другие возможности языка на практике

Воякин Данил Посмотреть все статьи >> Старший программист 1С франчайзинговой сети "ИнфоСофт".
14.03.2024
891
Время прочтения - 7 мин.
Заказать консультацию

В данной статье продолжим знакомиться с быстро развивающимся языком программирования от 1С, используемом в технологиях «1С:Предприятие.Элемент» и «1С:Исполнитель”. Первая часть статьи опубликована в блоге.

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

При написании материала использовался «1С:Исполнитель» версии 4.0.6.7.


Описание задачи

Мне всегда было неудобно искать по системе информационные базы, которые я удалил из списка баз. Особенно если это файловые базы, разворачиваемые для подготовки к экзаменам или для тестирования, в таком случае они могут называться «InfoBase 12767», что усложняет спустя время принятие решение о удалении – тяжело вспомнить используется ли эта база у меня сейчас в разработке, или она была создана просто так.

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

 

Конкретизирую требования к самому себе, будем искать:

1. Базы, отсутствующие в списке баз – если я удалил файловую из списка, значит я не захочу больше к ней никогда возвращаться

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

3. И для объема проверим на наличие файла базы данных внутри директории – если его нет, то и база нам в списке не нужна

 

Решаем задачу

Заглянем в содержимое файла ibases.v8i, он содержит список баз настроенных в «стартере».

1.png

Рисунок 1 – Содержимое файла ibases.v8i


Сразу видим признак, по которому можем определить, что база в списке файловая – символы от каждого вхождения подстроки «Connect=File=» и до последующего «;» в наш файл однозначно являются адресом файловой базы, содержащейся в списке.

Прочитав этот файл, сразу сможем получить список потенциальных «жертв» (папок подлежащих удалению). В первую очередь опишем метод «СтрокиФайловыхБаз».

2.png

Рисунок 2 – Метод возвращает строки всех файловых баз из файла «ibases»


В чем отличие между «знч» «пер» и «исп»

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

«пер» (сокращение от «переменная») – переменная доступная для чтения и записи.

«исп» (сокращение от «использование») – переменная тип, которой является потомком типа «Закрываемое».


Для чего нужен тип «Закрываемое»?

Согласно документации: «Закрываемый ресурс — это значение некоторого типа, которое получается от операционной системы. Для использования этот ресурс необходимо получить у операционной системы, а после окончания использования - вернуть.»

Для решения таких задач разработчиками был объявлен тип «Закрываемое». У всех его потомков есть метод «Закрыть()», который дает инструкцию языку, что ресурс больше не требуется программе. Также важная особенность этого типа: если разработчик не вызвал «Закрыть()» явно, вызов произойдет автоматически при выходе из зоны видимости переменной.

Например, для решения нашей задачи нет необходимости читать файл постоянно, достаточно один раз прочитать содержимое и «запомнить».

Если бы я не вызвал «ПотокЧтенияФайла.Закрыть()», тогда поток чтения закрылся бы после выполнения всего метода автоматически.

 

Что такое «Строка?» в объявлении переменных? Знак вопроса выражает неуверенность?

Так и есть. Но здесь система немного интересней.

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

пер МояПеременная: Строка|Число

пер МояПеременная: Строка|Число|Неопределено

Поскольку часто возникает потребность объявить переменную с возможным типом «Неопределено», авторы языка сделали для этого короткую запись. Запись «пер РезультатПоиска: Строка?» - это краткая форма «Пер РезультатПоиска: Строка|Неопределено», где «?» означает, что переменная может иметь тип «Неопределено».

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

В дальнейшем при работе с этой переменной разработчик получит предупреждение:

3.png

Рисунок 3 – Язык подсказывает что следует обработать тип «Неопределено»


Это помогает избежать ошибок ещё перед внесением изменений в базу/скрипт. Во встроенном языке «1С:Предприятия» такой возможности не было, поскольку платформе чаще всего неизвестен тип и контекст используемой переменной.

Также воспользуемся этой возможностью в методе для вычисления директории с установленными базами:

4.png

Рисунок 4 – Метод ищет путь до общей директории у всех найденных папок. Это необходимо, чтобы определить папку, куда мы обычно устанавливаем файловые базы


В методе «ДиректорияДляФайловыхБаз» определяем как «Строка?» уже возвращаемое значение. Если метод не смог найти общую директорию, пусть он скажет об этом разработчику через тип «Неопределено».

 5.png

Рисунок 5 – Метод приводит строки к виду, который «поймет» файловая система, а также возвращает только уникальные значения

Подпишитесь на дайджест!
Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

Почему на входе «Массив» а на выходе «Множество»?

В языке «Исполнителя» есть два важных отличия Множества от Массива:

1. Множество не может иметь дубли. При этом метод «Добавить» не вернет исключение, если добавлять уже существующий элемент. Таким образом, можно быть уверенным, что после выполнения этого метода пути до баз становятся уникальными, даже если в списке фактически присутствовали дубли.

2. Обходить множество можно только через цикл. Функция обращения к отдельному элементу по индексу не предусмотрена. Это также устраивает, потому что не требуется задачей.

6.png

Рисунок 6 – Метод вычисляет и классифицирует файловые базы, необходимые для удаления. Возвращает множество элементов собственного типа «ФайловаяБазаДляУдаления»


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


Откуда новый «ФайловаяБазаДляУдаления»?

ФайловаяБазаДляУдаления – тип, который я определил самостоятельно, является произвольным от стандартного типа «Структура» и объявляется с помощью ключевого слова «структура». Я сделал это для повышения читаемости кода. Также для этой цели был определено перечисление «ПричинаУдаления».

7.png

Рисунок 7 – Объявление собственного типа и перечисления. Ключевое слово «обз» указывает, что поле обязательно указывать при вызове конструкторе типа


Обращение через точку к результату выполнения конструктора?

8.png

Рисунок 8 – Новый подход к «конструированию» типов


В данном случае нововведение касается не столько самого языка, сколько стандартной библиотеки. Идея подхода заключается в том, что каждый метод возвращает сам себя в результате выполнения. Соответственно, появляется возможность вдобавок к использованию перегрузки методов, именованных параметров и необязательных полей в конструкторе более гибко настраивать объект при инициализации. Условно, то, что во встроенной библиотеке «1С:Предприятия» оформлялось как процедура, в «Исполнителе» и «Элементе» написано как функция. В результате становится возможной, например, следующая конструкция:

9.png

Рисунок 9 – Инициализация настроек поиска, можно сразу задать необходимые настройки


Безопасное получение через точку «?.» и настойчивая операция «!»

«?.» - операция безопасного получения поля объекта через точку. Если мы обратимся к полю переменной составного типа, и в момент выполнения программы тип переменной окажется «Неопределено», тогда получим ошибку. Чтобы избежать получение исключений можно использовать «?.», тогда вместо исключения получим всего лишь результат «Неопределено» для всей цепочки вызовов.

«!» - «настойчивая» операция - указывает языку, что в данном месте не может быть «Неопределено»

10.png

Рисунок 10 – «Настойчивая» операция


За счет постановки реальной задачи мы рассмотрели ещё больше возможностей языка программирования, используемого в технологиях «1С:Исполнитель» и «1С:Предприятие.Элемент». Нововведения делают работу программиста комфортнее и позволяют избегать многих ошибок при разработке алгоритмов, синтаксические особенности «Исполнителя» хорошо применимы на практике.

Полный код примера скрипта для самостоятельного изучения доступен и выложен в репозиторий на GitHub


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку
Рассказать друзьям
Для разработчиков 1С 1С:Предприятие.Элемент
Вам может быть интересно: