Бонусы. Формы. Новый взгляд…
Предлагаем вам очередной бонусный материал.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Заинтересовала возможность управлять оформлением полей отображаемой в форме табличной части.
Повод для этого возник в процессе работы над ДЗ №9 базового курса, поэтому пример оттуда.
Когда в документе (например “Поступление товаров”) выбираем услугу, то поля “Единица измерения” и “Коэфициент” не должны заполняться.
В свойстве реквизита “Проверка заполнения” у нас указано “Выдавать ошибку”, поэтому, во-первых, добавляем соответствующую обработку в процедуре ОбработкаПроверкиЗаполнения(): удаляем имя реквизита из массива проверяемых реквизитов и проверяем заполненность реквизита вручную – после этого при проведении документ правильно реагирует на заполненность полей.
Однако хотелось бы, чтобы в форме документа в строках с услугами в колонках “Единица измерения” и “Коэфициент” не показывалась отметка незаполненного, кроме того они должны отображаться в режиме “Только просмотр”.
В видеоуроках по управляемым формам объясняется настройка условного оформления для динамического списка – здесь же мы имеем другой случай. В синтакс-помощнике находим, что условное оформление можно настраивать также для самой управляемой формы. Настройку можно осуществить двумя способами.
1. В редакторе формы открываем свойства формы, так выбираем УсловноеОфрмление –> Открыть. Для начала я попробовал настроить какое-либо оформление вообще. Неожиданно обнаружилось (и довольно долго с этим промучился), что если не выбрать определенные поля (казалось бы, в этом случае оформление должно примениться ко всем полям) и не выбрать отбор (казалось бы в этом случае оформление должно применяться всегда), то ничего не получается – оформление не работает.
Выбрал поля, выбрал отбор (другой) – например:
Объект.Товары.Количество Больше “1”
– в этом случае работает. Кстати, интересный эффект: если отбор наложен на поля табличной части, а в качестве полей выбрать также и реквизиты документа (не табличной части), то они тоже получают выбранное оформление – но в зависимости от того, какая строка активизирована (правда, ещё бы придумать, как это могло бы быть применено в реальных задачах).
Все это хорошо, но наложить отбор на вид номенклатуры не удаётся – и это в отличие от динамического списка, где в качестве полей для отбора можно выбирать реквизиты реквизитов через точку. Попробовал вытащить вид номенклатуры на форму в виде колонки – на форме он отображается, даже может участвовать в оформлении в виде выбранного поля ТоварыНоменклатураВидНоменклатуры.
Однако в качестве поля для отбора Номенклатура.ВидНоменклатуры не может быть выбран – его просто нет в списке доступных полей.
Такое поведение не вполне понятно – ведь на форме есть информация необходимая для отбора. Между прочим, в динамическом списке удается организовать отбор даже по неотображаемому реквизиту рекизита через точку.
В конце концов, пришлось сделать по-простому: добавил в табличную часть документа реквизит ВидНоменклатуры, сделал его в форме недоступным и заполняемым при изменении реквизита Номенклатура.
2. Программный способ настройки условного оформления в процедуре ПриСозданииНаСервере():
<code>
ЭлементУсловногоОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(“ОтметкаНезаполненного”, Ложь);
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(“ТолькоПросмотр”, Истина);
ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Объект.Товары.ВидНоменклатуры”);
ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыНоменклатуры.Услуга;
ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ПолеОформления.Использование = Истина;
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(“ТоварыЕдиницаИзмерения”);
ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ПолеОформления.Использование = Истина;
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(“ТоварыКоэффициент”);
</code>
> если не выбрать определенные поля (казалось бы, в этом случае оформление должно примениться ко всем полям) и не выбрать отбор (казалось бы в этом случае оформление должно применяться всегда), то ничего не получается
Да, это отличие оформления формы от оформления динамического списка.
>сли отбор наложен на поля табличной части, а в качестве полей выбрать также и реквизиты документа, то они тоже получают выбранное оформление
Замечательное наблюдение!
>добавил в табличную часть документа реквизит ВидНоменклатуры, сделал его в форме недоступным и заполняемым при изменении реквизита Номенклатура.
Можно не модифицировать объект БД, а добавить новую колонку в реквизитах объекта (см. рис.)
Но у этого способа есть одна неприятная особенность, которую рассмотрим в ближайшей “Осторожно, 1С”.
> а добавить новую колонку в реквизитах объекта
До сих пор не встречался с такой возможностью. Очень интересно! Жду следующий выпуск “Осторожно, 1С”.
Здравствуйте. Евгений возник такой вопросик. Допустим возникает событие в модуле внешнего соединения и в зависимости от полученных данных данные должны открыться в форме на клиенте. Метод глоб. контекста доступен на клиенте, а мод. внеш.соединения компилируется на сервере. подскажите путь решения ?
метод – ОткрытьФорму(…)
В этом случае открывать форму нужно на вызывающей стороне, откуда было инициировано внешнее соединение.
Например, в зависимости от результата возвращенного функцией внешнего соединения открывается та или иная форма.
данные поступают из внешней программы (не на платформе 1С Предприятие х), тогда получается никак не открыть так чтобы сразу? Вариант с сохранением данных в базу и слежением за изменениями есть, но тяжеловатое решение мне кажется.
Все разобрался. Спасибо Евгений. Правильно этот модуль предназначен для другого. Надо через Оле соединение открывать.
Вот здорово и тематическая сессия по этому поводу уже была.
Возник вопрос, как правильно реализовать? Условие такое : есть документ “Общий договор”, к нему создаем еще один документ “Приложение к договору”, в котором делаем поле Родитель со ссылкой на ОбщийДоговор. К одному Общему договору может быть несколько приложений, соотношение один ко многим. Нужно чтоб при открытии в форме ОбщегоДоговора, выводилась списком информация по всем созданным к этому договору приложениям. Я получаю запросом в модуле формы ОбщегоДоговора в серверной процедуре ТЗ с нужными данными. Как ее правильно отразить на форме ОбщегоДоговора??? Ведь на клиенте ТЗ не работает.
Нужно создать реквизит формы с типом данных “Динамический список”, и описать произвольный запрос.
А в событии “ПриСозданииНаСервере” устанавливать параметр этого динамического списка, например так Список.УстановитьЗначениеПараметра(“Родитель”, Параметры.Ключ).
Спасибо за подсказку! :) Все заработало! Кстати, в представленном выше коде ошибочка есть, пропущено обращение к параметрам динамического списка
Список.Параметры.УстановитьЗначениеПараметра(«Родитель», Параметры.Ключ).
Ок.
Столкнулся с такими проблемами..
Дано: Толстый, Управляемое
1. Внешняя обработка (Упр. ф.)..
Почему-то при изменении модуля формы обработки – изменения вступают в силу только после перезапуска конфигуратора..
2. При создании из формы (Обыч. ф.) документа – обработки (Встроенной в конф.) и получении формы (Упр. ф.) – возвращается Неопределено..
А при получении формы (Упр. ф.) из менеджера – открывается..
1. Это торчат уши кэширования метаданных.
Бывают и более клинические случаи. Стабильно не воспроизводится.
На время помогает чистка кэша метаданных.
2. Флаг “Использовать управляемые формы в толстом клиенте в обычном режиме” установлен?
Приведите пример кода.
1. Как очистить кэш метаданных?!..
2. Флаг конечно стоит – как бы тогда открывалась из менеджера?!..
Работает:
Форма = Обработки.ПодборИзделий.ПолучитьФорму(, ЭтаФорма);
Форма.Открыть();
НЕ работает:
ВыборИзделий = Обработки.ПодборИзделий.Создать();
Форма = ВыборИзделий.ПолучитьФорму(, ЭтаФорма);
Форма.Открыть();
P.S.: Спасибо, за – оперативность !..
1. Ошибся, внешние обработки не кэшируются.
Это проблема другого уровня. Выход – только ждать когда разработчики поправят.
2. Сейчас проверим.
2. Приведенный пример действительно выдает значение Неопределено.
Однако, вот такой код работает:
ТипыДанных = Обработки.ТипыДанных.Создать();
Форма = ТипыДанных.ПолучитьФорму(“Обработка.ТипыДанных.Форма”);
ОткрытьФорму(“Обработка.ТипыДанных.Форма”);
Будем называть это особенностью, о которой не знает документация :)
Матерится на 2 параметр
И при открытии начал лезть в Модуле объекта в ПриЗаписи – эт нормально?!..
Кто его просит – записывать?!..
Вернее начал компилировать ВЕСЬ модуль объекта – и начал плюватся на ХЗ какие ХЗ кем – сделанные изменения.. ;))
Для чистоты эксперимента лучше создать новые “чистые” объекты.
>И при открытии начал лезть в Модуле объекта в ПриЗаписи
Кажется это не нормально :)
>Матерится на 2 параметр
Какой второй параметр? Не вижу в моем коде передачи второго параметра..
В СП написано – владельца нужно передавать 2 параметром – на самом деле третьим..
Тут надо быть внимательным.
Есть метод ОткрытьФорму() глобального контекста, там владелец 3-ий параметр.
Есть ОткрытьФорму() различных объектов (для толстого клиента), там владелец 2-ой параметр.
Верно?
Не получается: Суть задачи – из формы (Обыч.) док. открыть обработку (Упр. ф.) и из нее вернуть/заполнить ТЧ документа..
Получается только ч/з открытие формы менеджера обработок и передачу в качестве владельца форму документа..
Давайте продолжим.
Приведите неработающий код.
Выкрутился, методом ПолучитьФорму() ТРЕТИМ параметром передал в качестве владельца форму документа.. В обработке в форме владельца – заполнял ТЧ..
Пробовал ч/з ЗначениеВДанныеФормы() передавать ДокОбъект в реквизит обработки – в обработке РеквизитФормыВЗначение, у полученного объекта менял ТЧ – в Документе не заполнялась..
интересный ps, а что раньше можно было распространять?))
Это напоминание…
Присоединяюсь к благодарностям. Материал действительно полезен.
Спасибо)
Огромное спасибо!
Огромное спасибо! После изучения базового курса, материал вызвал такое же чувство умиротворение от полного осознание некоторых вещей по платформе, как в свое время пере прочтение Евгения Онегина после возвращение из армии :-)
БОЛЬШОЕ ВАМ СПАСИБО ЗА МАТЕРИАЛ !!!
Материал черезвычайно полезен. Самое искреннее спасибо!!!
:)
В очередной раз – спасибо за полезный материал.
Всегда рады :)
Спасибо! Когда Вы только успеваете все это делать…..
урррра! вот это да! спасибо!
Спасибо.