1c общую команду обычные формы. Унифицируем интерфейсы выполнения команд. Объединение объектов в группы

Большая часть современного ПО разрабатывается группами программистов. Кто-то отвечает за пользовательский интерфейс, кто-то за ядро, а кто-то за дополнительные модули. Чтобы работа всех этих людей не пропала даром, нужно грамотно объединить разные части проекта, не забыв при этом о возможном его расширении. Для этого нам пригодится паттерн проектирования «Команда», который инкапсулирует в себе исполнителя задачи и ее условия.

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

Казалось бы, всё просто: накодил большой блок switch, который при нажатии разных сочетаний кнопок вызывает ту или иную функцию какого-либо модуля, и радуйся. Но, во-первых, такой подход не отличается гибкостью. Когда проект пополнится новыми модулями или hotkeys, нам придется менять код этого раздутого оператора ветвления, из-за чего он впоследствии раздуется еще больше. А во-вторых, начальство большими красными буквами написало, что у пользователя должна быть возможность переназначить эти горячие клавиши. Таким образом, жестко забить команды в код switch у нас точно не выйдет.

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

Интерфейсы модулей, доступные для обращения через HotKeys class Calculator { public: void runCalc(); void closeCalc(); } class Printer { public: void printDocument(); void printImage(); void printEmail(); } class Browser { public: void runBrowser(); void closeBrowser(); } // И дальше много всяких разных классов

Паттерн «Команда»

Отбросив лирику, перейдем к изучению паттерна «Команда», который должен помочь нам в этом нелегком деле. Для начала следует разобраться, что мы имеем. У нас есть множество модулей с самыми разнообразными API. Также у нас есть окошко, в котором пользователь может выбрать из списка одну из команд, предоставляемых модулями, и закрепить ее за определенным сочетанием клавиш.

Формально выражаясь, обработчик нажатий клавиатуры - это клиент, API-функции модулей, вызываемые с помощью горячих клавиш, - это задачи, а модули, предоставляющие эти задачи, - это исполнители. Окошко с настройками hotkeys представляет собой некий посредник между клиентом и исполнителем, скрывающий все детали выполняемых операций. Такая структура позволяет полностью отделить клиент от исполнителя, то есть пользователь понятия не имеет, какой модуль работает при нажатии той или иной комбинации клавиш и что он делает. И это очень хорошо, так как чем лучше изолированы друг от друга части кода, тем надежней работает программа.

Для такой изоляции нам нужно определить объект команды, а следовательно, и соответствующий интерфейс. Он достаточно прост и определяет всего один метод execute(), который должен выполнять метод какого-либо из модулей.

Интерфейс объекта «Команды» class Command { public: void execute() = 0; }

Для определения конкретного объекта мы просто объявляем новый класс, который наследует интерфейс Command, и определяем его метод execute(). Допустим, мы хотим создать команду, запускающую калькулятор. Для этого мы создадим класс RunCalcCommand, который будет наследовать интерфейс Command, и переопределим execute() для вызова метода runCalc() модуля Calculator.

Команда запуска калькулятора class RunCalcCommand: public Command { Calculator *calc; public: RunCalcCommand(Calculator *excalc) { calc = excalc; } void execute() { calc->runCalc(); } }

Если внимательно присмотреться к коду команды, то можно заметить, что в конструкторе класса RunCalcCommand передается указатель на модуль Calculator. Это сделано для большей гибкости. В будущем у нас может появиться класс ModernCalculator, вызывающий продвинутую версию расчетной программы. Используя композицию, то есть не фиксируя исполнителя жестко в коде, мы увеличиваем изолированность кода, что в будущем позволит сэкономить время.

Теперь нужно связать команду с хоткеем. Для этого можно создать массив указателей на объекты класса Command. Размер массива будет равен количеству поддерживаемых горячих клавиш. Каждый элемент массива команд сопоставляется с определенным хоткеем. В нашем случае для этого можно преобразовать значение кнопки, которая вместе с Ctrl составляет какое-либо из возможных сочетаний, в числовое значение. Если бы мы использовали сочетания, например, от ctrl-a до ctrl-k, то нам бы потребовался немного другой подход.

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

Назначение команды на hotkey и ее запуск // Код инициализации команды и хоткея const int comCount = 10; Command* commands; Calculator *calc = new Calculator(); commands = new RunCalcCommand(calc); // Код в обработчике нажатий клавиатуры // Получаем нажатые клавиши hotkey = catchHotKey(); // Преобразовываем их в индекс и запускаем команду int index = hotkey2index(hotkey); commands->execute();

Всё довольно-таки просто. Можно определить еще несколько наследников Command, которые будут выполнять определенные действия, и связать их с горячими клавишами. Такая архитектура позволяет полностью отделить клиент от исполнителей. Обработчик клавиатуры понятия не имеет, какой модуль обрабатывает команду и что именно он делает, а модули, в свою очередь, не подозревают, что обращение к ним осуществляется с помощью hotkeys, а не каким-то другим способом.

Отмена команды

Вроде бы всё хорошо, но мы совсем забыли про отмену. Сочетание клавиш ctrl-z должно откатывать действие последней команды. Реализовать отмену довольно просто, хотя на первый взгляд может показаться, что это совсем не так. Для этого мы немного изменим интерфейс Command.

Класс Command, поддерживающий отмену class Command { public: void execute() = 0; void undo() = 0; } class RunCalcCommand: public Command { Calculator *calc; public: RunCalcCommand(Calculator *excalc) { calc = excalc; } void execute() { calc->runCalc(); } void undo() { calc->closeCalc(); } }

Мы просто добавили метод undo(), который должен быть переопределен в классах-наследниках. Программист сам решает, какую именно функцию модуля будет использовать метод отмены. Так, метод undo() для RunCalcCommand будет обращаться к функции closeCalc() модуля Calculator. Нам также потребуется немного подправить код обработчика клавиатуры.


Wikipedia про паттерн «Команда». Обработчик клавиатуры с поддержкой отмены // Код инициализации команды и хоткея const int comCount = 10; Command* commands; Command *lastCommand = new NoCommand(); Calculator *calc = new Calculator(); commands = new RunCalcCommand(calc); // Код в обработчике нажатий клавиатуры // Получаем нажатые клавиши HotKey *hotkey = catchHotKey(); // Если это отмена, то вызываем соответствующий метод if (hotkey->str() == "ctrl-z") { lastCommand->undo(); } // Обработка остальных сочетаний

Здесь мы просто запоминаем в переменной lastCommand указатель на последнюю использованную команду и при нажатии ctrl-z вызываем соответствующий метод. Дополнительно мы прибегаем к небольшому трюку, используя объект пустой команды NoCommand. Код этого класса выглядит так:

Пустая команда NoCommand class NoCommand: public Command { public: void execute() {}; void undo() {}; }

Такие объекты-заглушки используются довольно часто. Они нужны, чтобы уменьшить количество проверок нулевого указателя. Если бы lastCommand был равен NULL, то перед вызовом метода undo() нам пришлось бы проверять корректность значения этого указателя, что нежелательно, так как однажды мы можем забыть это сделать, в результате чего программа с грохотом упадет. Такие же объекты-заглушки рекомендуется использовать и для остальных хоткеев, которым не назначены соответствующие команды.

Кстати, код обработчика клавиатуры можно модифицировать так, чтобы он поддерживал отмену не только последней операции, но и вообще всех цепочек выполненных команд. Для этого вместо простого указателя на последнюю команду следует использовать стек. При обработке какого-либо хоткея в стек будет добавляться указатель на соответствующую команду. Таким образом, мы получим полную историю вызовов команд, что позволит нам последовательно все отменить при помощи ctrl-z.


Макрокоманды

Макросы - одно из величайших изобретений человечества, помогающее ему экономить тонны времени. Наш паттерн позволяет реализовывать макрокоманды всего лишь с помощью нескольких дополнительных строк кода. Для начала определим класс, отвечающий за логику группового выполнения операций.

Макрокоманда class MacroCommand: public Command { Command *commands; int comCount; public: MacroCommand(Command *comArray, int elemCount) { commands = comArray; comCount = elemCount; } void execute() { for (int i = 0; i < comCount; i++) { commands[i]->execute(); } } void undo() { for (int i = 0; i < comCount; i++) { commands[i]->undo(); } } }

Как видно, класс MacroCommand является наследником Command и переопределяет всё те же методы execute и undo. В интерфейсе от обычной команды он отличается лишь конструктором. Этот класс принимает не указатель на исполняющий модуль, а массив указателей на простые команды. Код execute() просто проходит по элементам массива и вызывает каждый из них. Так же ведет себя и undo(). Обработчик клавиатуры при обращении к объекту команды понятия не имеет, макрос это или обычная единичная операция, - главное, что все они предоставляют функции execute() и undo().

Расширенные возможности паттерна «Команда»

Наш паттерн можно использовать не только для обработки горячих сочетаний клавиш. С помощью него можно организовывать очереди запросов. Допустим, что у нас есть пул потоков, который должен выполнять некоторые задания. Все задания представляют собой объекты, реализующие уже знакомый нам интерфейс Command. Команды выстраиваются в очередь, к которой последовательно обращаются потоки. Они забирают команды из этой очереди и запускают их методы execute(). Потокам не важно, что делают эти объекты - главное, чтобы они поддерживали вызов execute(). Команды можно сохранять на жестком диске и восстанавливать их оттуда. Для этого следует немного расширить их базовый интерфейс.

Command с поддержкой сохранения и загрузки class Command { public: void execute() = 0; void undo() = 0; void load() = 0; void store() = 0; }

Метод load() предназначен для сохранения команды в журнале, а store() - для ее восстановления оттуда. Код этих методов может использовать механизмы сериализации языка программирования, если таковые в нем есть. Такая функциональность нужна для работы с большими объемами данных, которые невозможно сохранять после совершения с ними каждого действия. При сбое программы мы сможем загрузить сохраненные команды и последовательно применить их к имеющейся копии данных для приведения этих данных в актуальное состояние.

Заключение

С помощью паттерна «Команда» нам удалось полностью отделить разношерстные модули-исполнители от клиента - обработчика клавиатуры. Если в будущем в программе появятся новые модули, мы сможем легко добавить соответствующие команды и назначить им горячие клавиши. Это будет простое, изящное и эффективное решение.

С помощью команды BREAK (РАЗОРВИ) объект разрывается в точке или точках, определенных пользователем. С помощью команд CHAMFER (ФАСКА) и FILLET (СОПРЯГИ ) создаются фаски и сопряжения

Зачастую бывает проще вычертить один длинный отрезок, а затем разорвать его на два и более, чем вычерчивать несколько отрезков. Команда BREAK (РАЗОРВИ) чаще всего используется при создании архитектурных планов для разрыва стен в местах дверных и оконных проемов. Если задать на объекте две точки, AutoCAD сотрет все, что находится между ними. Обычно для определения этих точек используется объектная привязка. Иногда для этого можно использовать команду TRIM (ОБРЕЖЬ), но если имеются затруднения с указанием режущих кромок, предпочтительно использовать команду BREAK (РАЗОРВИ).

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

С помощью команды CHAMFER (ФАСКА) создаются фаски на углах, образованных двумя непараллельными отрезками. Эта команда может оперировать также с прямыми, лучами и полилиниями. Угол можно создать простым удлинением отрезков до их пресечения или создать фаску. Если создается фаска, она определяется либо двумя катетами, либо одним катетом и углом фаски по отношению к одной из кромок.

Процесс создания фаски состоит из двух шагов. Сначала задаются параметры фаски. Это могут быть либо два катета, либо один катет и один угол фаски. После ввода значений AutoCAD завершит команду CHAMFER (ФАСКА). После этого нужно снова запустить эту команду и выбрать два отрезка, представляющие кромки, между которыми создается фаска. AutoCAD создаст фаску, используя полученную на предыдущем этапе информацию.

Команда FILLET (СОПРЯГИ) используется для построения плавного сопряжения двух отрезков дугой. К этой операции часто обращаются при создании чертежей механических конструкций. В некоторых случаях команда FILLET (СОПРЯГИ) может применяться вместо команды ARC (ДУГА) для создания дуг. Как и при использовании команды CHAMFER (ФАСКА), при помощи команды FILLET (СОПРЯГИ) можно сопрягать отрезки, прямые, лучи или полилинии, которые могут быть и параллельными. Но, кроме этих объектов, сопрягать можно и окружности, дуги и эллипсы. В команде для формирования сопрягающей дуги нужно задать ее радиус

Процесс сопряжения также двухшаговый. Сначала определяется радиус сопрягающей дуги. После этой операции AutoCAD завершает выполнение команды. Теперь необходимо снова начать команду FILLET (СОПРЯГИ) и выбрать два сопрягаемых отрезка. AutoCAD выполнит сопряжение отрезковы в соответствии с имеющейся информацией.

Группы .


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

Создание и изменение групп. Чтобы создать или изменить группу, нужно ввести в командную строку group и открыть таким образом диалоговое окно Object Grouping (Группирование объектов).

Для создания новой группы выполните ряд операций.

1. В поле ввода Group Name (Имя группы) введите имя группы. Для имени можно использовать не более 31 символа без пробелов. В любом месте вводимого имени можно использовать дефис (-) и подчеркивание (_).

2. При желании в поле Description (Описание) можно ввести комментарий длиной не более 64 символов. В комментарий можно включать пробелы.

3. Щелкните на кнопке New (Новая). AutoCAD возвращается к чертежу и выводит в командную строку приглашение Select objects: (Выберите объект:). В ответ на это приглашение выберите объекты, которые предполагается включить в группу. Завершите выбор объектов, нажав . AutoCAD возвращает диалоговое окно на экран.

4. Щелкните на ОК .

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

Один объект может принадлежать нескольким группам.

В зоне Group identification (Идентификация группы) диалогового окна Object Grouping (Группировка объектов) также имеется кнопка Find Name (Найти имя). Эта кнопка используется для поиска имени группы, к которой принадлежит выбранный объект. AutoCAD позволяет выбрать объект, а затем выводит имя соответствующей группы (или групп).

Щелчок на кнопке Highlight (Подсветить) позволяет зрительно выделить заданную группу. Сначала из списка Group Name (Имя группы) выбирается группа, а после щелчка на кнопке Highlight AutoCAD возвращается к чертежу и выделяет все объекты в группе. После щелчка на кнопке Continue (Продолжить) AutoCAD возвращается в диалоговое окно. Кнопка Highlight используется в тех случаях, когда нет уверенности в правильности выбора из списка группы для дальнейшей работы.

Зона Change Group (Изменение группы) диалогового окна Object Grouping (Группирование объектов) обеспечивает гибкость управления группами. Чтобы изменить группу, нужно в списке групп Group Name в верхней части диалогового окна щелкнуть на любом имени группы. После этого все кнопки в зоне Change Group (Изменение группы) становятся доступными. Опишем их назначение.

Remove (Удалить). Если задать эту опцию, AutoCAD переключается на вывод чертежа в графическую зону экрана и выводит в командную строку приглашение Select objects to remove from group... (Выберите объект для удаления из группы...) . Выберите объекты, которые должны быть исключены из чертежа. Для завершения операции нажмите . ОК .

Add (Добавить). Если задать эту опцию, AutoCAD переключается в область чертежа и выводит в командную строку приглашение Select objects to add to group. . . (Выберите объекты для добавления в группу...). Выберите объекты, которые должны быть добавлены в группу. Для завершения операции нажмите . AutoCAD возвратится в диалоговое окно. Щелкните на ОК .

Rename (Переименовать). При задании этой опции выбирается группа, которая должна быть переименована, и в поле ввода Group Name изменяется ее имя. Щелкните на кнопке Rename (Переименуй). Имя группы в списке Group Name (Имя группы) также должно измениться. Щелкните на ОК .

Re-order (Упорядочить). Каждому объекту в группе присвоены номера, начиная с 0. В некоторых случаях имеет значение порядок размещения объектов в группе (например, при выполнении программы, оперирующей объектами группы). Выберите группу, в которой должен быть изменен порядок расположения объектов. AutoCAD откроет диалоговое окноOrder Group (Порядок группы). Если нужно расположить объекты в группе в порядке, обратном существующему, щелкните на кнопках Reverse Order (Обратный порядок). В ином случае щелкните на кнопках Highlight (Подсветить) и Previous (Предыдущий) . В правом нижнем углу этого окна

Description (Описание) . Эта опция обновляет описание группы.

Explode (Расчленить). Эта опция расчленяет группу на составляющие. Все объекты остаются на чертеже, но они перестают быть группой.

Selectable (Выбираемая). Если группа выбираема, выбор одного объекта группы означает выбор всей группы. Эта опция допускает временное переключение в режим манипуляций одиночными объектами без расчленения группы.

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Создание конфигураций 1С: добавляем команду

Продолжаем изучение азов создания конфигураций на 1С.

Вернёмся в конфигуратор и откроем дерево конфигурации:

Где находится форма у обработки

Откроем окно настроек обработки "УдалениеУволенныхСотрудников":

Открылось окно с закладками во многом повторяющими закладки из справочника "Сотрудники". Это совершенно нормально, ведь настройки объектов в конфигураторе во многом похожи друг на друга.

На этот раз нас интересует закладка "Формы" - откроем её:

Найдите на этой закладке объект с именем "Форма" - это и есть наше визуальное представление обработки:

Давайте откроем его двойным щелчком:

Открылось окно со множеством панелей. И нам сейчас очень важно для будущих уроков разобраться что здесь за что отвечает.

Меняем код на встроенном языке 1С для формы

Ну прежде всего обратим внимание в самый низ открывшегося окна. Там мы найдём две закладки "Форма" и "Модуль".

Закладка "Форма" - это и есть визуальное представление. Сейчас на форме находится всего лишь одна кнопка "Удалить сотрудников".

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

Попробуем переключиться на закладку "Модуль":

Здесь присутствует всего одна процедура с именем "УдалитьСотрудников". Очевидно именно она и вызывается при нажатии на кнопку.

Код процедуры сейчас свёрнут - нажмём на плюсик, чтобы развернуть его (не поместился на рисунке справа):

Точно, так и есть. Вот оно место, где выдаётся сообщение о том, что я не стал писать код этой обработки

Изменим этот код следующим образом:

Снова запустим режим 1С:Предприятие (меню "Отладка"->"Начать отладку"), откроем обработку и нажмём кнопку "Удалить сотрудников":

И получим то самое сообщение, которое написали только что:

Закладка "Элементы" у формы

Вернёмся в конфигуратор в нашу форму на закладку "Форма":

Обратите внимание на закладку "Элементы" в верхней части формы. Содержимое этой закладки дублирует визуальное представление формы. Вы читаете ознакомительную версию урока, полноценные уроки находятся . Можно сказать ещё, что всё, что вы видите в визуальной части формы можно найти на закладке "Элементы".

Например, чтобы открыть свойства кнопки "Удалить сотрудников" на форме - найдём эту кнопку на закладке "Элементы" и сделаем на ней двойной щелчок:

Откроется окно со свойствами кнопки:

Давайте установим для кнопки заголовок "БАХ":

Форма теперь будет выглядеть так:

Закладка "Реквизиты" у формы

Теперь перейдём к закладке "Реквизиты":

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

Но если бы мы перешли на аналогичную закладку в форме справочника "Сотрудники", то обнаружили бы тут реквизиты "ДатаРождения", "НомерПаспорта" и "СерияПаспорта". Это означало бы, что мы можем их использовать в коде модуля формы.

Закладка "Команды" у формы

Заключительная закладка, которую мы рассмотрим сегодня это закладка "Команды":

Вообще все команды, которые вы видите на одной из закладок ("Команды формы", "Стандартные команды" и "Глобальные команды"), можно смело перетаскивать на закладку "Элементы" и они "волшебным образом" превратятся в кнопки на форме.

Как вы понимаете, нажатие на эти кнопки, будет приводить к выполнению этих команд.

Ну, например, перейдём на закладку "Стандартные команды" и перетащим на закладку "Элементы" команду "Закрыть":

На форме появилась кнопка закрыть. Запустим 1С:Предприятие (меню "Отладка"->"Начать отладку"), откроем обработку и убедимся, что кнопка работает:


Вернёмся в конфигуратор в форму обработки и перейдём на закладку "Команды формы":

На этой закладке мы видим команды формы, которые мы определили сами. В том числе мы можем видеть здесь команду, которую я определил ещё в самом начале с именем "УдалитьСотрудников".

Откроем свойства этой команды (двойным щелчком).

Нас интересует прежде всего поле "Действие", нажмите на кнопку с лупой рядом с ним:

Нас перенесло в процедуру "УдалитьСотрудников" в модуле формы. Это означает, эта команда и эта процедура связаны между собой. И выполнение команды (например, при нажатии на кнопку, в которую она превратилась) приведёт к выполнению кода процедуры.

Добавляем новую команду для формы

Давайте создадим ещё одну команду формы. Для этого вернёмся на закладку "Команды формы" и нажмём зелёную кнопку с плюсом:

Откроем её свойства и установим имя "Привет", а затем нажмём на лупу рядом с полем "Действие":

Нас спрашивают какой именно вид обработчика мы хотим создать.

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

Выбираем вариант "НаКлиенте" и нажимаем "ОК":

Нас перенесло в модуль формы в автоматически созданную процедуру "Привет". Теперь эта процедура связана с командой формы "Привет":

Давайте напишем в ней вывод строки привет пользователю:

Но как нам теперь заставить выполнять команду (а значит и процедуру) "Привет"? Для этого вернёмся на закладку "Команды формы" и перетащим наш "Привет" на форму, так как мы это сделали ранее с командой "Закрыть":

На форме появилась ещё одна кнопка. Запустим 1С:Предприятие, откроем обработку и нажмём на кнопку "Привет". Должно получиться вот так:

Вводим от пользователя имя и говорим ему привет

А теперь давайте поставим себе такую задачу. Нужно, чтобы пользователь ввёл своё имя, мы нажали на кнопку и вывелось, например, "Привет, Алексей".

Чтобы мы смогли разместить на форме элементы для ввода данных нам потребуется реквизит формы (закладка "Реквизиты") с которым этот элемент будет связан.
Так как закладка "Реквизиты" у нас практически пустая - создадим новый реквизит.

Переходим на закладку "Реквизиты" и нажимаем зелёную кнопку плюс:

В окне свойств этого реквизита установим имя "Имя" и тип "Строка":

После этого перетащим уже привычным образом реквизит "Имя" на закладку "Элементы":

Ага, на форме появился элемент для ввода строки! Что нам и требовалось

Запустим 1С:Предприятие, откроем обработку и попробуем туда ввести своё имя:

Всё получилось, но вот нажатие на кнопку "Привет" пока работает по-прежнему.

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

Перепишем её таким образом, чтобы к строке "Привет, " добавлялось значение реквизита "Имя", который связан с элементом ввода на форме:

Теперь снова запустим 1С:Предприятие, обработку, введём своё имя и нажмём кнопку "Привет":

То что надо!

Команды, элементы, реквизиты, объект... вы ещё не запутались?

Думаю запутались Спешу вас успокоить, что не стоит переживать по этому поводу. Со временем ситуация прояснится.

А пока я попробую более простыми словами описать вам эти составные части любой формы. А вы после этого можете ещё раз перечитать урок - уверен, многое станет более понятным.

Итак, форма - это визуальное представление нашей программы: кнопки, надписи, рисунки, списки... да много чего! Всё это ЭЛЕМЕНТЫ формы.

Кнопка - элемент. Надпись - элемент. Поле ввода - тоже элемент

То есть элемент формы - это прежде всего часть её визуального представления. А значит у элемента бывают такие характеристики как цвет, шрифт, положение на форме, размер и многие другие.

Элементы позволяют нам некоторым образом взаимодействовать с формой: читать, нажимать, проматывать и т.п.

Вот например.

Кнопка

Очевидно, что кнопка не может быть сама по себе. Когда пользователь нажимает на неё - должно произойти некоторое действо, задуманное программистом.

Это действо и называется командой

Команды бывают встроенные (закладки "Стандартные команды" и "Глобальные команды") и те, что программист придумывает сам (закладка "Команды формы").

Ну встроенные команды - они на то и встроенные. Что их действие придумано уже до нас. Мы можем лишь перетащить эти команды на форму и превратить их в кнопки. К таким командам относится, например, команда закрытия формы. Нам не нужно ничего программировать - достаточно перетащить стандартную команду "Закрыть" на форму и всё

А команда формы - это команда придуманная нами самими. Это та команда, которую мы сами добавили на закладку "Команды формы", затем нашли в её свойствах пункт "Действие", ткнули на него и запрограммировали код на встроенном языке в автоматически созданном обработчике в модуле формы (например, команда "Привет" из этого урока).

Ну в общем вы поняли: команда - это некоторое действие, запрограммированное на языке 1С (или уже встроенное в программу). А кнопка - это визуальный элемент формы, который при своём нажатии запускает связанную с собой команду.

Надпись

Это просто текст на форме. У такого элемента есть свойство "Заголовок", значение которого мы задаём в редакторе и оно отображается в виде текста.

Поле

А вот это уже интересно. Потому что это такой особый элемент, который не сам по себе (как надпись), а обязательно должен быть связан с какими-то данными или по-другому РЕКВИЗИТАМИ (закладка "Реквизиты").

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

Ну вот представьте, что у нас на форме есть поле для ввода числа. Если бы не было реквизитов - как бы мы из кода узнали, какое число ввёл пользователь? Мы бы обратились к элементу ввода по имени и прочитали некоторое его свойство, отвечающее за значение введённое пользователем.

Так вот в 1С так нельзя. Тут (начиная с "управляемых" форм) представление данных отделено от самих данных.

Получается, что элемент ввода - это элемент формы. А число, которое вводит пользователь, хранится не в самом элементе, а в реквизите, который связан с этим элементом.

Ещё раз. Реквизит - это именно данные (строка, число, дата) . Не визуальное представление (надпись с текстом, поле для ввода числа, поле для ввода даты). Визуальным представлением реквизита является как раз элемент формы "Поле".

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

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

Какие преимущества даёт такое отделение элементов формы от данных (реквизитов)? Большие! Программист создает нужные ему реквизиты (для хранения, отображения и ввода некоторых полей на форме) и пишет программный код работая только с этими реквизитами (данными). Он совершенно не задумывается пока как всё это будет выглядеть на форме. Оно ему и не надо! Он пока пишет только программный код.

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

Ещё пример. Пусть у нас есть реквизит "Возраст" с типом "Число". Этот реквизит хранит только само число, больше ничего. Он не отвечает за то, как будет выглядеть это число, и в каком месте (или на какой закладке) будет располагаться элемент ввода на форме, связанный с этим числом. Реквизит - это только число! Обращаясь к реквизиту мы никак не сможем поменять размер элемента ввода на форме, цвет, видимость... За всё это отвечает не реквизит, а элемент! Меняя реквизит, мы меняем только число, которое отображается в элементе ввода на форме.

В общем: РЕКВИЗИТ - это переменная формы . Поэтому все данные храним в реквизитах (переменных), а для их вывода на форму (или ввода с формы) используем элементы. Именно это отделение логики от представления позволяет 1С с легкостью отображать одни и те же формы на разных клиентах: "толстый", "тонкий", "веб-браузер".

Чтобы обратиться к реквизиту "Возраст" из модуля формы достаточно сразу использовать его имя:

Что такое Объект?

Ну и, наконец, объект. Судя по-тому, что он находится на закладке "Реквизиты" - это тоже реквизит. Всё верно. Но он особенный.

Этот реквизит мы не создаём - он сам появляется на закладке "Реквизиты". В случае с обработкой он пустой, но если бы мы программировали форму какого-нибудь справочника, то реквизит объект как раз и представлял бы из себя поля этого справочника из базы.

Рядом с ним бы появился плюсик и мы могли бы его раскрывать и перетаскивать отдельные его части на форму и они бы также превращались в элементы.

Пройдите тест

Начать тест

1. Форма обработки может содержать

2. Форма у обработки находится на закладке

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

Для того, чтобы расположить на форме кнопку, раньше, в версии 8.1, нужно было:

  • Перетащить на панель кнопку
  • Добавить функцию — кнопки
  • В данной функции прописать код на языке 1С, который выполнит требуемые действия.

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

Например, если перетащить просто на форму – будет кнопка, если в группу командной панели – то кнопка командной панели (плоская), а можно перетащить в меню – тогда это будет пункт меню.

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

Стандартные команды 1С

Но мы знаем также действия, которые не нужно программировать на языке 1С, так как они уже доступны в платформе 1С. Например, для справочников стандартные действия – это возможность создания элемента. Для формы справочника – возможность записать, а для документа – провести. Это тоже действия?

Да, и теперь они называются – стандартные команды 1С. Свои стандартные команды 1С есть у справочников, документов, форм и прочих .

Стандартные команды 1С можно отключить у конкретного с помощью галочки «Использовать стандартные команды 1С» в 1С на закладке «Команды 1С».

Владелец команды 1С

Команды 1С находятся во вложенной ветке своего владельца. Например, Справочники/Контрагенты/Команды 1С.

Также есть команды 1С, которые не имеют владельца, так как они являются общими. Такие команды 1С не привязаны к объектам и находятся в ветке Общие/Общие команды 1С.

Параметры команды 1С

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

Например, для справочника Контрагенты, юридический и физический адрес хранятся в связанном регистре Контактные данные. Чтобы перейти в него, необходимо было выбрать меню в форме контрагента(ов) — Перейти/Контактные данные.

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

В свойствах команды 1С возможно указать:

  • Тип параметра команды 1С – тип объекта 1С, который будет использован в качестве параметра, например, справочник Контрагенты
  • Режим использования параметры – нужно одно значение или список (массив).

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

Или просто перетащить команду в список элементов формы.

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

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

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

Настройка и свойства общей команды в 1С

Добавить новую команду и настроить общую форму достаточно просто, рассмотрим этот процесс подробнее:

Получите 267 видеоуроков по 1С бесплатно:

  • Группа — расположение будущей команды на интерфейсе.
  • Тип параметра команды — определяет набор объектов, в котором будет отображаться будущая команда.
  • Режим использования параметра — задает возможность передать в качестве параметра команды одно или несколько значений.
  • Изменяет данные — если галка установлена, то при выполнение команды форма будет пересчитана с сервера.
  • Модуль команды — обработчик выполнения команды, выполняется на клиенте.

Пример модуля команды:

&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Если ЗначениеЗаполнено(ПараметрКоманды) Тогда ОткрытьФорму("ОбщаяФорма.СтруктураПодчиненности" , Новый Структура("ОбъектОтбора" , ПараметрКоманды) , ПараметрыВыполненияКоманды. Источник, ПараметрыВыполненияКоманды. Источник. КлючУникальности, ПараметрыВыполненияКоманды. Окно) ; КонецЕсли ; КонецПроцедуры

Здесь ПараметрКоманды — объект, вызывающий команду. А в ПараметрыВыполненияКоманды структура, в которой описан Источник (вызываемая Форма), Окно (ОкноКлиентскогоПриложения), Уникальность, указывает, искать ли уже открытую форму или нет.

Группы команд 1С

Публикации по теме