Содержание:
У многих начинающих программистов, особенно у тех, кто впервые сталкивается с управляемым приложением в 1С, возникает вопрос: как программным способом открыть управляемую форму. Еще больше вопросов возникает с передачей данных, когда одна форма открывается с другой формы. Многих этот момент ставит в тупик.
В этой статье я разберу оба этих момента.
Для тренировки создадим в конфигураторе 1С внешнюю обработку, в которой сделаем две формы. Назовем их: Данные и Расчёт. Причем форма Данные это основная форма обработки, т.е. будет открываться при запуске обработки.
В этой тренировке в форме Данные будем вводить некоторые числовые значения, которые потом используем в форме Расчёт. Сделаем простой пример: решим линейное уравнение тип ax + b = c. Для этого на форме Данные зададим величины a,b и с соответственно, а при открытии формы Расчёт вычислим значение x. Пример больше учебный, нужный для того, чтобы показать, как передавать данные с одной формы на другую. a, b и с – это реквизиты управляемой формы Данные с типом число (10,2). Создадим эти реквизиты и перетащим их на форму.
Следующим шагом создадим команду на форме Данные, при выполнении которой откроется форма Расчёт, где мы увидим решение линейного уравнения. Назовем команду«Решить уравнение» и поместим её на форму в виде простой кнопки.
Открывать управляемые формы следует в клиентском контексте. Причем не важно, какой это будет клиент: тонкий, толстый или веб-клиент.
Подробно о клиентском и серверном контексте управляемой формы читайте в статье:
Поэтому создадим обработчик команды «Решить уравнение» на клиенте.
В процедуре-обработчике этой команды откроем форму Расчёт, для этого необходимо использовать метод глобального контекста ОткрытьФорму.
&НаКлиенте
Процедура РешитьУравнение ( Команда )
Синтаксис этого метода имеет много параметров, но обязательным является только один – первый, в котором задается путь к управляемой форме.
При работе с этим методом, можно воспользоваться контекстными подсказками: достаточно написать после открывающей скобки параметров кавычки, и выйдут различные варианты, по которым можно получить нужную форму.
Причем в контекстной подсказке можно выбрать, как конкретную форму, так и какую-то основную форму нужного объекта.
В нашем случае мы выбираем форму Расчет обработки.
Подготовим форму Расчёт – создадим у этой формы реквизит x, который поместим на форму.
А так же установим у формы в свойство Режим открытия окна значение Блокировать окно владельца. Тогда форма Расчёт будет открываться в отдельном окне.
Всё! Если мы сейчас сохраним обработку, запустим её и выполним команду «Решить уравнение» формы Данные, то откроется форма Расчёт. На которой, естественно, ни чего пока ещё не рассчитано.
И первое что нам бросается в глаза, это заголовок в названии управляемой формы. Переименуем. Для этого в палитре свойств формы нужно снять флаг у свойства Автозаголовок и написать какой-то заголовок в свойстве Заголовок.
С открытием форм все просто и понятно. Но как передать данные с одной формы на другую? Для этого у управляемой формы 1С есть закладка Параметры. В этой закладке перечисляются данные, которые будут использоваться при создании управляемой формы на сервере.
Создадим у управляемой формы Расчёт параметры a,b,c.
Замечу, что к параметрам можно обращаться только в событии управляемой формы ПриСозданииНаСервере. Это событие возникает тогда, когда форма была создана на сервере, но еще не была передана в клиентский контекст.
Если Вы хотите, чтобы параметр был доступен все время существования формы, то у него необходимо установить свойство Ключевой параметр.
У формы Расчёт создадим событие формы ПриСозданиеНаСервере. Для этого в палитре свойств формы нужно найти это событие и кликнуть на кнопку «Лупа».
Решим в этом событие линейное уравнение. Для того, чтобы обратиться к нужному параметру формы, необходимо использовать коллекцию Параметры. И через точку получать значение интересующего нас параметра.
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
x = ( Параметры . c — Параметры . b )/ Параметры . a ;
Теперь нам осталось передать параметры при открытии формы. Для этого на форме Данные в обработчике команды «Решить уравнение» создадим структуру, в которой перечислим все передаваемые параметры. Ключ этой структуры должен соответствовать названию параметра в открываемой форме.
И эту структуру будем указывать в качестве второго параметра метода ОткрытьФорму.
&НаКлиенте
Процедура РешитьУравнение ( Команда )
Если a = 0 Тогда
Возврат;
КонецЕсли;
СтруктураПараметров = Новый Структура ;
СтруктураПараметров . Вставить ( «a» , a );
СтруктураПараметров . Вставить ( «b» , b );
СтруктураПараметров . Вставить ( «c» , c );
ОткрытьФорму ( «ВнешняяОбработка.ОткрытиеУправляемойФормы.Форма.Расчёт» ,
СтруктураПараметров );
Посмотрим, как будет работать этот код.
Как видите, в управляемом приложении 1С нет ничего сложного в передачи данных с одной формы на другую. Для этого просто необходимо использовать параметры управляемой формы.
Подробно вопросы работы с управляемыми формами в частности и с управляемым приложением в целом рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомится с разработкой управляемого приложения.
Книга «Основы разработки в 1С: Такси» отлично подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С
- Без сложных технических терминов;
- Более 600 страниц практического материала;
- Каждый пример сопровождается рисунком (скриншот);
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
Промо-код на скидку в 15% — 48PVXHeYu
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы в соцсетях, и будьте в курсе всех новостей
Все параметры формы можно разделить на две группы: стандартные и заданные разработчиком. Большим плюсом стандартных параметров является отсутствие необходимости какой-либо обработки: задал параметр — получил результат. Список этих параметров, определяется типом объекта.
Например, параметр «ТекущееЗначение», позволяет позиционировать форму выбора справочника на определенном элементе. Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.
Также у разработчика есть возможность определять свои параметры на вкладке «Параметры» конструктора управляемой формы. Время жизни параметров ограничено обработчиком ПриСозданииНаСервере() , что логично т.к. параметры требуются только при создании формы. Но, если данный параметр определяет уникальность формы (установлен флаг «ключевой параметр» в свойствах параметра), он будет доступен и в других обработчиках.
Передача параметров при открытии формы:
Обработка передаваемого параметра в модуле открываемой формы:
Стандартные параметры
Стандартные параметры формы динамического списка
- ВыборГруппИЭлементов . Тип: ИспользованиеГруппИЭлементов . По данному параметру устанавливается свойство ВыборГруппИЭлементов таблицы основного реквизита формы.
- ДополнительныеПараметры . Тип: Структура . Дополнительные параметры формы, открываемой при нажатии кнопки «Создать».
- КлючПользовательскихНастроек . Тип: Произвольный . Содержит ключ пользовательских настроек, которые нужно использовать для основного динамического списка формы. Если не установлен параметр ПользовательскиеНастройки , то будут загружены пользовательские настройки по указанному ключу.
- МножественныйВыбор . Тип: Булево . Устанавливает для основной таблицы свойства МножественныйВыбор и РежимВыделения .
- Отбор . Тип: Структура . Используется для установки отбора в динамическом списке. Ключ структуры — имя поля основной таблицы. Значение элемента структуры содержит значение отбора. Если значение является массивом, фиксированным массивом или списком значений с не одним элементом, то отбор будет применяться с видом сравнения ВСписке .
- ПользовательскиеНастройки . Тип: ПользовательскиеНастройкиКомпоновкиДанных . Пользовательские настройки, которые будут использоваться в основном динамическом списке формы.
- РазрешитьВыборКорня . Тип: Булево . Определяет возможность выбора корня в форме с динамическим списком, отображаемом в виде дерева.
- РежимВыбора . Тип: Булево . Открывать форму в режиме выбора.
- ТекущаяСтрока . Строка динамического списка, на которую будет установлен курсор после открытия формы. В качестве значения для параметра используются значения ссылок на объекты, которые содержит главная таблица динамического списка. Например, СправочникСсылка.Товары .
- ФиксированныеНастройки . Тип : НастройкиКомпоновкиДанных. Настройки, помещаемые в фиксированные настройки отчета.
Стандартные параметры формы документа
- ДополнительныеПараметры . Тип: Структура . Дополнительные параметры формы, открываемой при нажатии кнопки «Создать».
- ЗначениеКопирования . Значение для копирования. Тип параметра соответствует типу объекта, копия которого будет создана.
- ЗначенияЗаполнения . Тип: Структура . Параметры заполнения нового объекта. Ключ структуры — имя реквизита формы, значение — заполняемое значение.
- Ключ . Тип: ДокументСсылка.ИмяДокумента . Ключ объекта. В случае отсутствия или неверного значения создается новый объект с использованием остальных параметров.
- Основание . Тип: Произвольный . Объект, являющийся основанием для создания нового объекта.
- ПараметрыВыбора . Тип: Структура . Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
- РежимВыбора . Тип: Булево . Позволяет открывать форму в режиме выбора.
- ТекстЗаполнения . Тип: Строка . Текст, введенный в поле ввода, при открытии формы в режиме выбора.
Стандартные параметры формы справочника
- ДополнительныеПараметры . Тип: Структура . Дополнительные параметры формы, открываемой при нажатии кнопки «Создать».
- ЗначениеКопирования . Значение для копирования. Тип параметра соответствует типу объекта, копия которого будет создана.
- ЗначенияЗаполнения . Тип: Структура . Параметры заполнения нового объекта.
- Ключ . Тип: СправочникСсылка.ИмяСправочника . Ключ объекта. В случае отсутствия или неверного значения создается новый объект с использованием остальных параметров.
- Основание . Тип: Произвольный . Объект, являющийся основанием для создания нового объекта.
- ПараметрыВыбора . Тип: Структура . Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
- РежимВыбора . Тип: Булево . Позволяет открывать форму в режиме выбора.
- ТекстЗаполнения . Тип: Строка . Текст, введенный в поле ввода, при открытии формы в режиме выбора.
- ЭтоГруппа . Тип: Булево . Определяет вид нового объекта — группа или элемент.
Стандартные параметры формы плана видов характеристик
- ДополнительныеПараметры . Тип: Структура . Дополнительные параметры формы, открываемой при нажатии кнопки «Создать».
- ЗначениеКопирования . Значение для копирования. Тип параметра соответствует типу объекта, копия которого будет создана.
- ЗначенияЗаполнения . Тип: Структура . Параметры заполнения нового объекта.
- Ключ . Тип: ПланВидовХарактеристикСсылка.ИмяПВХ . Ключ объекта. В случае отсутствия или неверного значения создается новый объект с использованием остальных параметров.
- ОбъектОтбораВидовХарактеристик . Тип: Произвольный . Содержит объект отбора видов характеристик. Если значение данного параметра не равно Неопределено , то определяется тип значения.
- Основание . Тип: Произвольный . Объект, являющийся основанием для создания нового объекта.
- ПараметрыВыбора . Тип: Структура . Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
- РежимВыбора . Тип: Булево . Позволяет открывать форму в режиме выбора.
- ТекстЗаполнения . Тип: Строка . Текст, введенный в поле ввода, при открытии формы в режиме выбора.
- ЭтоГруппа . Тип: Булево . Определяет вид нового объекта — группа или элемент.
Справка
- ИмяФормы (обязательный, тип: Строка ). Образуется как полный путь к объекту метаданных Форма (например, "Справочник.Контрагенты.Форма.ФормаОбъекта" , "ОбщаяФорма.ФормаСохраненияФайла" ) или как полный путь к прикладному объекту, дополненный именем формы по умолчанию (например, "Справочник.Товары.ФормаВыбора" ).
- Параметры (необязательный, тип: Структура ). Ключ структуры — имя параметра, а значение — значение параметра формы. Имя элемента должно совпадать с именем параметра структуры.
- Владелец (необязательный). Форма или элемент управления другой формы.
- Уникальность (необязательный, тип: Произвольный ). В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
- Ложь — искать форму с ключом уникальности по умолчанию
- Истина — не искать форму вообще, любое другое значение устанавливает ключ уникальности, по которому будет произведен поиск
- Значение по умолчанию: Ложь
- Тип: Форма ; УправляемаяФорма ; Неопределено . Неопределено — если в обработчике ПриСозданииНаСервере установлен признак отказа от создания формы.
- Получает форму или управляемую форму. Перед получением осуществляется поиск уже открытой такой же формы. Поиск осуществляется по типу формы, значениям ключевых параметров формы, владельцу формы, пользовательскому ключу уникальности. Если в параметре Уникальность передано значение Истина , то поиск уже открытых форм не осуществляется.
- Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение (клиент). Вызов метода выполняет обращение к серверу.
- Отказ (Тип: Булево ). Признак отказа от создания формы. Если в теле процедуры-обработчика установить данному параметру значение Истина , то форма создана не будет. Значение по умолчанию: Ложь .
- СтандартнаяОбработка (Тип: Булево ). В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь , стандартная обработка события производиться не будет. Значение по умолчанию: Истина .
- Возникает на сервере при создании формы.
Цель статьи – показать применение шаблонов Remote Facade и Data Transfer Object к структуризации кода, управляемой формы в среде 1С 8.2.
Введение
Начнем с небольшого описания понятия «управляемая форма» и связанных концепций платформы 1С. Знатоки платформы могут пропустить этот раздел.
В 2008 году стала доступна новая версия платформы 1С: Предприятие 8.2 (далее Управляемое приложение), которая полностью меняет весь слой работы с интерфейсом. Сюда относится и командный интерфейс, и формы, и оконная система. При этом не только меняется модель разработки пользовательского интерфейса в конфигурации, но и предлагается новая архитектура разделения функциональности между клиентским приложением и сервером.
Управляемое приложение поддерживает следующие типы клиентов:
- Толстый клиент (обычный и управляемый режим запуска)
- Тонкий клиент
- Веб-клиент
В управляемом приложении используются формы, построенные на новой технологии. Они называются Управляемые формы. Для облегчения перехода прежние формы (т.н. Обычные формы) также поддерживаются, но их функциональность не развивается и они доступны только в режиме запуска толстого клиента.
Основные отличия управляемых форм для разработчика:
- Декларативное, а не «по пикселям» описание структуры. Конкретное размещение элементов выполняется системой автоматически при отображении формы.
- Вся функциональность формы описывается в виде реквизитов и команд. Реквизиты – это данные, с которыми работает форма, а команды – выполняемые действия.
- Форма выполняется и на сервере и на клиенте.
- В контексте клиента, недоступны практически все прикладные типы, и соответственно невозможно изменить данные в информационной базе.
- Для каждого метода или переменной формы обязательно должна быть указана директива компиляции, определяющая, место выполнения (клиент или сервер) и доступ к контексту формы.
Перечислим директивы компиляции методов формы:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста
Проиллюстрируем перечисленное. На скриншоте пример управляемой формы и ее модуля в режиме разработки. Найдите декларативное описание, реквизиты, директивы компиляции и т.д.
Все дальнейшие рассуждения будут о правой части иллюстрации, о том, как структурировать код модуля и какие принципы позволят реализовать эффективное клиент-серверное взаимодействие.
Обозначим проблему
Прошло уже несколько лет как новая версия платформы 1С активно используется и выпущено множество решений (конфигураций) как фирмой 1С, так и ее многочисленными партнерами.
Сложилось ли за это время у разработчиков единое понимание принципов клиент-серверного взаимодействия при создании форм, и изменился ли подход к реализации программных модулей в новых архитектурных реалиях?
Рассмотрим структуру кода (модуль формы) в нескольких формах одной типовой конфигурации и попробуем найти закономерности.
Под структурой будем понимать секции кода (чаще всего это блоки комментариев) выделенные разработчиком для группировки методов и директивы компиляции этих методов.
Пример 1:
По сути, структура кода отсутствует, или мягче говоря, она аналогична тому, что было в формах 8.1:
- Неинформативные слова «Общие, Служебные, Вспомогательные».
- Робкие попытки разделить клиентские и серверные методы.
- Часто методы группируются по интерфейсным элементам «Работа с табличной частью Товары, Контактной информацией».
- Произвольное расположение методов и групп кода. Например, Обработчики событий могут быть в одной форме вверху, в другой внизу, в третьей вообще не выделены и т.д.
- И не будем забывать, что это все в рамках одной конфигурации.
- Да бывают конфигурации, в которых слова «Общие, Служебные, Вспомогательные» всегда находятся на одних и тех же местах но…
Зачем нужна структура кода?
Почему существующий стандарт разработки от фирмы 1С не помогает?
Посмотрим опубликованные на дисках ИТС и в различных «Пособиях разработчика…» принципы, рекомендуемые при написании управляемой формы.
- Минимизируйте число серверных вызовов.
- Максимум вычислений на сервере.
- Неконтекстные вызовы сервера быстрее контекстных.
- Программируйте с учетом клиент-серверного взаимодействия.
- и т.п.
Это лозунги, абсолютно верные, но как их реализовать? Как минимизировать число вызовов, что значит программировать в клиент-серверном режиме?
Шаблоны проектирования или мудрость поколений
Клиент-серверное взаимодействие используется в различных программных технологиях не один десяток лет. Ответ на обозначенные в предыдущем разделе вопросы давно известен и суммирован в двух базовых принципах.
- Remote Facade (далее Интерфейс удаленного доступа)
- Data Transfer Object (далее Объект переноса данных)
Слово Мартину Фаулеру, его описание данных принципов:
- … каждый объект, потенциально предназначенный для удаленного доступа, должен иметь интерфейс с низкой степенью детализации, что позволит максимально уменьшить количество вызовов, необходимых для выполнения определенной процедуры. … Вместо того, чтобы запрашивать счёт и все его пункты отдельно, надо считать и обновить все пункты счёта за одно обращение. Это влияет на всю структуру объекта.…Запомните: интерфейс удаленного доступа не содержит логики домена.
- …если бы я был заботливой мамой, то обязательно сказал бы своему ребенку: «Никогда не пиши объекты переноса данных!» В большинстве случаев объекты переноса данных представляют собой не более чем раздутый набор полей … Ценность этого омерзительного монстра состоит исключительно в возможности передавать по сети несколько элементов информации за один вызов — прием, который имеет большое значение для распределенных систем.
Примеры шаблонов в платформе 1С
Прикладной программный интерфейс доступный разработчику при разработке управляемой формы, содержит много примеров данных принципов.
Например метод ОткрытьФорму(), типичный «огрубленный» интерфейс.
Сравните с принятым в v8.1 стилем.
В контексте управляемой формы множество «Объектов переноса данных». Можно выделить системные и определяемые разработчиком.
Системные моделируют на клиенте прикладной объект, в виде одного или несколько элементов данных формы. Создать их вне привязки к реквизитам формы нельзя.
- ДанныеФормыСтруктура
- ДанныеФормыКоллекция
- ДанныеФормыСтруктураСКоллекцией
- ДанныеФормыДерево
Преобразование системных объектов переноса данных в прикладные типы и обратно выполняется методами:
- ЗначениеВДанныеФормы()
- ДанныеФормыВЗначение()
- КопироватьДанныеФормы()
- ЗначениеВРеквизитФормы()
- РеквизитФормыВЗначение()
Часто явное преобразование используется при адаптации существующего решения. Методы могут ожидать (использовать особенности) входные параметры, например ТаблицаЗначений, а не ДанныеФормыКоллекция, или метод был определен в контексте прикладного объекта и стал недоступен для прямого вызова из формы.
Пример 1С v8.1:
Объекты переноса данных, структура которых определяется разработчиком это небольшое подмножество типов доступных и на клиенте и на сервере. Наиболее часто в качестве параметров и результатов методов «огрубленного» интерфейса используются:
- Примитивные типы (строка, число, булево)
- Структура
- Соответствие
- Массив
- Ссылки на прикладные объекты (уникальный идентификатор и текстовое представление)
Пример: метод принимает список заказов для изменения статуса и возвращает клиенту описание ошибок.
Структурируем код
Главные цели, которые должен отражать модуль управляемой формы и подходы к решению.
- Четкое разделение клиентского и серверного кода. Не будем забывать, в момент выполнения это два взаимодействующих процесса, в каждом из которых существенно отличается доступный функционал.
- Четкое выделение интерфейса удаленного доступа, какие методы сервера можно вызывать с клиента, а какие нельзя? Названия методов удаленного интерфейса начинаются с префикса «Сервер». Это позволяет, читая код сразу видеть переход управления на сервер, и упрощает использование контекстной подсказки. Отметим, что официальная рекомендация (ИТС) предлагает именовать методы с постфиксами, например, так ИзменитьСтатусЗаказовНаСервере(). Однако повторим не все серверные методы можно вызывать с клиента, и поэтому более важна логическая доступность, а не место компиляции. Поэтому префиксом «Сервер» отмечаем только методы доступные для клиента, метод-пример назовем СерверИзменитьСтатусЗаказов().
- Удобочитаемость. Дело вкуса, принимаем порядок, когда модуль начинается с процедур создания формы на сервере и методов удаленного доступа.
- Сопровождаемость. Должно быть однозначно определено место для добавления нового кода. Важный момент, автоматически создаваемые конфигуратором заготовки методов добавляются в конец модуля. Т.к чаще всего автоматически создаются обработчики событий элементов формы, то соответствующий блок расположен последним, чтобы не перетаскивать каждый обработчик в другое место модуля.
Ниже приведена базовая структура модуля, реализующая перечисленные цели.
- Графический вариант – наглядно показывает основной поток выполнения.
- Текстовый вариант — это пример оформления шаблона для быстрой вставки структуры в новый модуль формы.