nano29.ru – Личность. Саморазвитие. Успех и удача. Свой бизнес

Личность. Саморазвитие. Успех и удача. Свой бизнес

Под капотом управляемых форм. СтавАналит. Контактная информация Что такое управляемые формы 1с

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

Следует заменить, что условное оформление форм работает только в конфигурациях использующих управляемое приложение (Бухгалтерия 3.0, ЗУП 3.0/3.1, Управление торговлей 11 и т.п.)

Условное оформление 1с. Интерактивная настройка

Еще один плюс условного оформления — его можно настроить не написав ни строчки кода. Для этого в форме необходимо:

  • Открыть свойства формы -> вкладка оформление -> УсловноеОформление Открыть;
  • Откроется таблица ;
  • В первом столбце необходимо выбрать оформление (или сразу несколько);
  • Во втором столбце задать условие, по которому будет срабатывать выбранное оформление;
  • С третьем столбце необходимо выбрать элементы формы на которые будет действовать выбранное оформление.

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

Условное оформление формы. Пример интерактивной настройки

Для примера мной была написана простейшая обработка, на формы которой добавлен реквизит с типом ТаблицаЗначений , с тремя колонками. А также три реквизита с типом булево . Скачать обработку можно .

Форма обработки выглядит так:

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

  • Откроем настройку условного оформления формы;
  • Добавим в таблицу новую строку;
  • В колонке Оформление нажмем на кнопку с тремя точками и выберем параметр Видимость , значение Нет ;

  • В колонке Условие нажмем на кнопку с тремя точками, в открывшемся окне добавим новый отбор. Пропишем туда следующие значения: Левое значение — СкрытьКолонку1, Вид сравнения — Равно, Правое значение — Да ;

  • В колонке Оформляемые поля нажмем на кнопку с тремя точками, в открывшемся окне добавим новый элемент, и выберем значение ТаблицаФормыКолонка1 ;
  • В итоге у нас должна получиться настройка условного оформления, такая же как на следующем рисунке;

  • Нажмем кнопку Ок , сохраним нашу обработку и запустим ее в режиме 1С Предприятие ;
  • При установке флажка Скрыть колонку 1 , будут происходить следующие изменения в оформлении формы.


Условное оформление 8.3. Пример программной настройки

Используя ту же внешнюю обработку, что и в предыдущем пункте, приведем пример программной настройки условного оформления. Необходимо сделать следующее: при установке реквизита ПоменятьЦветКолонки2 в значение Истина , в таблице формы раскрашивать фон Колонки 2 , при установке реквизита СделатьНедоступнойКолонку3 в значение Истина , в таблице формы делать недоступным реквизит Колонка3 .

В модуле формы создадим серверную процедуру, назовем ее УстановитьУсловноеОформление и сразу же допишем ее вызов в процедуре ПриСозданииНаСервере .

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УстановитьУсловноеОформление(); КонецПроцедуры &НаСервере Процедура УстановитьУсловноеОформление() КонецПроцедуры

Весь следующий код будем писать в процедуре УстановитьУсловноеОформление . Нам необходимо добавить новый элемент условного оформления формы, для этого используем стандартную коллекцию формы УсловноеОформление.

Элемент = УсловноеОформление.Элементы.Добавить();

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

Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаФормыКолонка2.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоменятьЦветКолонки2"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 0, 0));

Таким образом мы создали оформление для второй колонки таблицы. Для третьей колонки оно делается аналогичным образом, поэтому не будем на нем подробно останавливаться. Итоговый код процедуры УстановитьУсловноеОформление будет выглядеть следующим образом:

&НаСервере Процедура УстановитьУсловноеОформление() Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаФормыКолонка2.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоменятьЦветКолонки2"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 0, 0)); Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаФормыКолонка3.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СделатьНедоступнойКолонку3"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); КонецПроцедуры

Напомню, что скачать обработку написанную на основе разобранных примеров можно .

Доброго времени суток.

Вот список того, что тут можно будет почерпнуть:

  1. Отображение табличной части документа в виде дерева и обратное преобразование в табличную часть.
  2. Работа с условным оформлением и его программное использование.
  3. Динамическое изменение состава реквизитов формы
  4. Удобный интерфейс по редактированию дерева

А теперь вот исходные данные решаемой задачи:

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

Т.е. у нас вырисовывается следующая структура табличной части документа:

этаж - пока не понятно что это такое

объем работ - число 15.3

количество материалов - число 15.3

Вроде бы просто, но на практике мы получаем много повторяющейся информации. Например у нас две работы, в каждой 10 материалов, и 9 этажей. Это будет 180 строк в документе, в которых колонка "работа" везде почти одинаковая, каждый материал повторяется по 9 раз.

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

Второй вариант явно экономит место на экране. В первом у нас 150 ячеек с информацией, во втором - 52. Причем, чем больше этажей, материалов в работе, тем экономия сильнее.

Вот второй вариант мы с Вами в этом уроке и реализуем.

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

  • Справочник "Работы"
  • Справочник "Материалы" (или номенклатура - не важно)
  • Документ "..." (можете назвать его "Смета" или еще как)
  • Регистр сведений, периодический, в котором измерения: работа, материал; ресурс: к.расхода (можете для него сбацать регистратор, можете оставить непосредственное редактирование)

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

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

Тут у нас не хватает третьей аналитики - этаж. В нашем случае это будет целое положительно число. Для удобства, добавим в шапку поле "Количество этажей". Это поле нам сильно упростит жизнь. Случай, когда в таб.части есть этаж №9, а максимум этажей - 8, считаем не допустимым, эти строки будут пропавшими безвести.

Следующим шагом избавимся от поля "ОбъемРабот" и оставим только количество. В строках, где НомерМатериалаВРаботе = 0 будем считать количество - объемом работ.

Со структурой - все, идем в форму. Создадим форму по умолчанию, в которой разместим все, что есть.

Первое - номер и дату сделаем в одну строку, это действие надо делать на автомате всегда, это уже как лесенка в коде.

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

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

Вот её синтаксис:

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


НовыйРеквизитФормы = Новый РеквизитФормы("Кол"+НовыйНомер, Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,3)), "ДеревоРабот", "к "+НовыйНомер);
РеквизитыКДобавлению.Добавить(НовыйРеквизитФормы);
КонецЦикла;
//4.
ИзменитьРеквизиты(РеквизитыКДобавлению,РеквизитыКУдалению);
//5. Рисуем новые элементы формы, добавлять их надо после создания ревизитов
Для ж=1 По объект.КоличествоЭтажей - МаксНомерКолонки Цикл
НовыйНомер = МаксНомерКолонки + ж;
НоваяКолонка = Элементы.Добавить("ДеревоРаботКол"+НовыйНомер, Тип("ПолеФормы"), Элементы.ДеревоРабот);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "ДеревоРабот.Кол"+НовыйНомер;
НоваяКолонка.Ширина = 7;
НоваяКолонка.УстановитьДействие("ПриИзменении", "КоличествоПриИзменении");
НоваяКолонка.Заголовок = "к " + ж;
КонецЦикла;
КонецПроцедуры

Прокомментируем этапы её работы:

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

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

3. Создаем список колонок, которые надо создать.

4. Вызываем встроенную процедуру ИзменитьРеквизиты, после этого у нас уже нет лишних колонок и появились недостающие.

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

-нельзя удалять реквизиты, созданные не программно

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

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

Теперь напишем процедуру преобразования таблицы в дерево. Для теста заполним в документе табличную часть как на рисунке:

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

&НаСервере
Процедура ТабЧастьВДерево()
Дерево = РеквизитФормыВЗначение("ДеревоРабот");
Дерево.Строки.Очистить();
строкаРаботы = "";
НомерРаботы = "";
НомерМатериала = "";
Объект.ТабличнаяЧасть1.Сортировать("НомерРаботы,НомерМатериалаВРаботе");
Для Каждого Выб Из Объект.ТабличнаяЧасть1 Цикл
//Контроль количества этажей
Этаж = Выб.Этаж;
Если Этаж > Объект.КоличествоЭтажей Тогда
Продолжить;
КонецЕсли;
Если Этаж = 0 Тогда
Продолжить;
КонецЕсли;
Если НомерРаботы<>Выб.НомерРаботы Тогда
строкаРаботы = Дерево.Строки.Добавить();
строкаРаботы.Номер = Выб.НомерРаботы;
строкаРаботы.РаботаМатериал = Выб.Работа;
строкаРаботы.ЭтоРабота = Истина;
//началась следующая работа, отсчет материалов начнем с начала
НомерМатериала = "";
НомерРаботы = Выб.НомерРаботы;
КонецЕсли;
Если Выб.НомерМатериалаВРаботе = 0 тогда//это строка работы
строкаРаботы["Кол"+Этаж] = Выб.Количество;
Иначе//это строка с материалом
Если НомерМатериала<>Выб.НомерМатериалаВРаботе тогда
строкаМатериала = строкаРаботы.Строки.Добавить();
строкаМатериала.Номер = Выб.НомерМатериалаВРаботе;
строкаМатериала.РаботаМатериал = Выб.Материал;
строкаМатериала.КРасхода = Выб.КРасхода;
строкаМатериала.ЭтоРабота = Ложь;
НомерМатериала=Выб.НомерМатериалаВРаботе;
КонецЕсли;
строкаМатериала["Кол"+Этаж] = Выб.Количество;
КонецЕсли;
КонецЦикла;
ЗначениеВРеквизитФормы(Дерево,"ДеревоРабот");
КонецПроцедуры

Комментировать тут особо нечего. С помощью полей "номерРаботы" и "НомерМатериалаВРаботе" определяю, что перед нами, строка с работой или материалом, соответственно добавляем строку в корень или в работу. Если сменился только этаж, то берем только количество. Лишние этажи обрубаются, пропущенные этажи - не испортят структуру дерева.

Вызываем эту процедуру при создании на сервере после "ОбновитьСоставКолонок()".

Теперь можно её протестировать запустив предприятие и открыв созданный ранее документ.

Теперь нам надо перед записью документа сделать наоборот, дерево сохранить в табличную часть. Пишем процедуру:

&НаКлиенте
Процедура ПоместитьДеревоВТабЧасть()
Объект.Материалы.Очистить();
Для Каждого стрРаботы Из ДеревоРабот.ПолучитьЭлементы() Цикл


стр.Этаж = ж;
стр.Количество = стрРаботы["Кол"+ж];
КонецЦикла;
Для Каждого стрМатериала Из стрРаботы.ПолучитьЭлементы() Цикл
Для ж=1 По Объект.КоличествоЭтажей Цикл
стр = Объект.Материалы.Добавить();
стр.НомерРаботы = стрРаботы.Номер;
стр.НомерМатериалаВРаботе = стрМатериала.Номер;
стр.Работа = стрРаботы.РаботаМатериал;
стр.Материал = стрМатериала.РаботаМатериал;
стр.КРасхода = стрМатериала.КРасхода;
стр.Этаж = ж;
стр.Количество = стрМатериала["Кол"+ж];
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

В прошлом уроке мы с Вами рассмотрели для обычного (толстого) клиента. В версии платформы 1С 8.2 . В них используются новые экранные формы 1С 8.2. Их называют управляемые формы 1С 8.2.

Управляемые формы 1С 8.2 – это будущее 1С. Они отличаются от обычных форм 1С 8.2 тем, что генерируются системой автоматически на основе специальных настроек («обычные» формы просто рисуются программистом по своему желанию).

Различия в разработке управляемых форм 1С 8.2 от обычных – значительны. Поэтому мы собрались сегодня отдельно обсудить создание и изменение управляемых форм 1С 8.2.

Управляемые формы 1С 8.2

Если Вы занимались разработкой конфигураций 1С ранее – при открытии редактора управляемой формы 1С 8.2 Вас сразу поставит в тупик то, что мышкой невозможно повлиять на форму 1С 8.2 вообще.

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

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

Настройки состоят из списка элементов формы 1С 8.2, расположенных в редакторе в верхнем левом углу. В элементы формы 1С 8.2 входят:

  • Реквизиты
  • Команды (новое понятие 1С 8.2, могут выглядеть как кнопки или пункты меню)
  • Группы (для объединения реквизитов и команд).

Соответственно настройки этих элементов находятся не в свойствах полей, а в свойствах этих элементов настройки (меню по правой кнопке мыши, пункт Свойства).

Как работают управляемые формы 1С 8.2

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

В первую очередь отличается расположение привычных элементов на форме 1С 8.2. Командная панель всегда находится вверху.

Левая часть командной панели настраиваемая. В ней обычно находятся такие типовые кнопки как Записать и Провести.

Правая часть командной панели – новое стандартное меню формы 1С Все действия. Это меню позволяет управлять формой 1С 8.2 по своему желанию, наподобии, как в отчете СКД настройки позволяют значительно изменить вид отчета.

Произвольные пункты меню 1С Все действия

В зависимости от принадлежности данной формы 1С 8.1 к тому или иному , меню наполнено пунктами, позволяющими управлять этим объектом. Например, если это форма списка справочника, то там будут такие команды как Создать или Редактировать.

Пункт Настроить список меню 1С Все действия

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

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

Функционал кнопки Найти конечно же не сравним с отборами, но они никуда и не делись!
Они теперь находятся в пункте меню Настроить список. Отбор теперь можно делать по любому полю, а кроме него можно сделать сортировку и условное оформление также, как это можно делать в отчетах СКД.

Пункт Изменить форму меню 1С Все действия

Пункт Изменить форму позволяет подобным образом изменить не только список на форме 1С 8.2, но и саму форму 1С 8.2.

Пользователь самостоятельно может включить или отключить видимость полей на форме 1С 8.2, ширину и высоту, активизация поля по умолчанию при открытии и т.п.

Использование управляемых форм 1С 8.2 и обычных форм 1С

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

Для этого необходимо и войти в свойства конфигурации (верхний элемент в окне конфигурации).

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

Создание управляемых форм 8.2

Добавление новой формы 1С 8.2 производится также, как и раньше – с помощью кнопки Ins на клавиатуре или кнопки Добавить. Чтобы войти в существующую – нажмите на нее два раза мышкой.

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

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

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

Редактор формы состоит из трех разделов.

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

Доступные реквизиты Вы можете перетащить влево и он станет элементом формы (полем на форме).

Если Вам нужно добавить кнопку или пункт меню – справа на закладке Команды Вам нужно создать новую Команду. Это оболочка для функции в модуле формы. Кроме указания собственно какая функция будет вызываться, Вы можете назначить представление – например, картинку, а также зависимость видимости от функциональной опции.

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

В список элементов формы (полей) можно не только перетащить реквизит объекта/формы, но и просто добавить (кнопка Добавить или Ins). В частности можно новый объект формы – Группу.

Группа может быть командной панелью (курсор должен стоять на строке Форма). Тогда Вы перетаскиваете в нее команды и они становятся кнопками.

Группа может быть «обычной». Тогда это способ группировки полей как вертикально, так и горизонтально. Наименование группы можно убрать в свойствах.

Группа может быть панелью (страницы). Верхняя добавленная группа является панелью, а вложенные группы этого типа являются страницами. На страницы перетаскиваются уже поля.

Ненужные элементы формы удаляются путем удаления элементов формы в списке.
Позиция поля на форме определяется порядком в списке элементов (вертикальная) или с помощью групп (горизонтальная). Ширина и высота задаются в свойствах элемента формы.

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

Свойства самой формы, в том числе и ее размеры задаются у корневого элемента формы с аналогичным названием Форма.

Обработчики событий (ответ на действия пользователя) теперь поделились на два вида. Старые – как и раньше указываются в свойствах формы и полей (например, ПриИзменении и ПриОткрытии формы). Новые – стали командами и используются для пунктов меню и кнопок.

Тоньше некуда. Теперь клиентское приложение не выполняет запросы к базе данных (это дело сервера). Клиентское приложение просто отображает интерфейс и данные.

Стоит отметить, что структура кода стала сложнее из-за таких преобразований. На клиенте нет ссылок, объектов, таблицы значений... доступны только примитивные типы (строка, дата, булево, массив, структура...). А значит программист должен теперь думать, что получить на сервере, и как это сделать с минимальными затратами.

Взаимодействие клиента и сервера

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

Отсутствие контекста (состояния) на сервере

Сервер 1С работает по принципу «без состояния» (англ. state-less). Это означает что сервер только отвечает на запросы, и при этом ничего не сохраняет у себя в промежутке между двумя запросами (для этих целей есть временное хранилище).

ДанныеФормыВЗначение, ДанныеФормыКоллекция, ДанныеФормы...

Мы обратились к серверу, он для нас все выполнил, удалил данные и забыл что мы приходили. Все объекты с именами "ДанныеФормы" + "что-то там" помогут нам сохранить свои данные между двумя серверными вызовами.

Временное хранилище

Временное хранилище, это специальное место, в котором (помимо реквизитов формы) можно сохранять состояние на сервере. В хранилище можно хранить данные, которые на клиенте недоступны (т.е. которые нельзя разместить реквизитах формы).

Для работы с временным хранилищем используются методы ПоместитьВоВременноеХранилище() Синтаксис: ПоместитьВоВременноеХранилище(<Данные>, <Адрес>) Описание: Сохраняет сериализуемое значение во временное хранилище. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Вызов метода выполняет обращение к серверу. <Адрес> (необязательный) Тип: УникальныйИдентификатор; Строка. Уникальный идентификатор формы, во временное хранилище которой надо поместить данные и вернуть новый адрес. Или адрес во временном хранилище, по которому надо поместить данные. Адрес должен быть получен ранее с помощью данного метода. В случае, если передается УникальныйИдентификатор формы или адрес в хранилище, то значение будет автоматически удаленопосле закрытия этой формы. Если передан УникальныйИдентификатор, не являющийся уникальным идентификатором формы, то значение будет удалено после завершения сеанса пользователя. Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы. Примечание: Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса. Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание. Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания. и ПолучитьИзВременногоХранилища() Синтаксис: ПолучитьИзВременногоХранилища(<Адрес>) Описание: Получает значение из временного хранилища. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Вызов метода выполняет обращение к серверу. Примечание: Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.

Вызов серверного кода

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

Назначение флагов модулей

  • Флаг показывает, где будет скомпилирован код модуля (на сервере, на клиенте, во внешнем соединении)
  • Если модуль скомпилирован в нескольких местах, то он будет виден только в соответствии с флагами
  • Перенос исполнения кода возможен только если в текущем контексте исполнения нет вызываемого модуля, но он есть в другом месте (если – модуль есть только на сервере, а на клиенте его нет, то будет сделан вызов сервера)

Флаг «Вызов сервера»

Начиная с платформы "1С:Предприятие 8.2" добавился флаг «вызов сервера». Который как раз и помогает "разрулить" условия перехода на другую машину. Если модулю назначить этот флаг, то модуль будет виден с клиента, если нет – то попытка вызова с клиента приведет к ошибке. Код модуля виден не будет, как будто его нет совсем.

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

  • Установлен флажок «Сервер»
  • Установлен флажок «Вызов сервера»
  • Сняты все «клиентские» флажки

Допустим, есть внешняя обработка, написанная для версии 8.1. Можно ли запустить ее в версии 8.2 так, чтобы работать с ее старой, неуправляемой формой? Обработка нужна всего один раз, для переноса данных, и создавать для нее управляемую форму ради одного раза не хочется...

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

Обычные (неуправляемые) формы могут работать только в толстом клиенте. Тонкий и веб-клиенты поддерживают работу только с управляемыми формами.

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

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

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

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

Возможность использования обычных форм в управляемом режиме регулируется специальным свойством конфигурации - ИспользоватьОбычныеФормыВУправляемомПриложении . Это свойство нужно установить.

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

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

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




Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности и правилами сайта, изложенными в пользовательском соглашении