Бонусы. Формы. Новый взгляд…

Предлагаем вам очередной бонусный материал.

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

комментариев 40 на “Бонусы. Формы. Новый взгляд…”

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

    Когда в документе (например “Поступление товаров”) выбираем услугу, то поля “Единица измерения” и “Коэфициент” не должны заполняться.
    В свойстве реквизита “Проверка заполнения” у нас указано “Выдавать ошибку”, поэтому, во-первых, добавляем соответствующую обработку в процедуре ОбработкаПроверкиЗаполнения(): удаляем имя реквизита из массива проверяемых реквизитов и проверяем заполненность реквизита вручную – после этого при проведении документ правильно реагирует на заполненность полей.
    Однако хотелось бы, чтобы в форме документа в строках с услугами в колонках “Единица измерения” и “Коэфициент” не показывалась отметка незаполненного, кроме того они должны отображаться в режиме “Только просмотр”.
    В видеоуроках по управляемым формам объясняется настройка условного оформления для динамического списка – здесь же мы имеем другой случай. В синтакс-помощнике находим, что условное оформление можно настраивать также для самой управляемой формы. Настройку можно осуществить двумя способами.

    1. В редакторе формы открываем свойства формы, так выбираем УсловноеОфрмление –> Открыть. Для начала я попробовал настроить какое-либо оформление вообще. Неожиданно обнаружилось (и довольно долго с этим промучился), что если не выбрать определенные поля (казалось бы, в этом случае оформление должно примениться ко всем полям) и не выбрать отбор (казалось бы в этом случае оформление должно применяться всегда), то ничего не получается – оформление не работает.
    Выбрал поля, выбрал отбор (другой) – например:
    Объект.Товары.Количество Больше “1”
    – в этом случае работает. Кстати, интересный эффект: если отбор наложен на поля табличной части, а в качестве полей выбрать также и реквизиты документа (не табличной части), то они тоже получают выбранное оформление – но в зависимости от того, какая строка активизирована (правда, ещё бы придумать, как это могло бы быть применено в реальных задачах).

    Все это хорошо, но наложить отбор на вид номенклатуры не удаётся – и это в отличие от динамического списка, где в качестве полей для отбора можно выбирать реквизиты реквизитов через точку. Попробовал вытащить вид номенклатуры на форму в виде колонки – на форме он отображается, даже может участвовать в оформлении в виде выбранного поля ТоварыНоменклатураВидНоменклатуры.
    Однако в качестве поля для отбора Номенклатура.ВидНоменклатуры не может быть выбран – его просто нет в списке доступных полей.
    Такое поведение не вполне понятно – ведь на форме есть информация необходимая для отбора. Между прочим, в динамическом списке удается организовать отбор даже по неотображаемому реквизиту рекизита через точку.

    В конце концов, пришлось сделать по-простому: добавил в табличную часть документа реквизит ВидНоменклатуры, сделал его в форме недоступным и заполняемым при изменении реквизита Номенклатура.

    2. Программный способ настройки условного оформления в процедуре ПриСозданииНаСервере():

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

    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(“ОтметкаНезаполненного”, Ложь);
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(“ТолькоПросмотр”, Истина);

    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Объект.Товары.ВидНоменклатуры”);
    ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыНоменклатуры.Услуга;

    ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
    ПолеОформления.Использование = Истина;
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(“ТоварыЕдиницаИзмерения”);

    ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
    ПолеОформления.Использование = Истина;
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(“ТоварыКоэффициент”);
    </code>

    • > если не выбрать определенные поля (казалось бы, в этом случае оформление должно примениться ко всем полям) и не выбрать отбор (казалось бы в этом случае оформление должно применяться всегда), то ничего не получается
      Да, это отличие оформления формы от оформления динамического списка.
      >сли отбор наложен на поля табличной части, а в качестве полей выбрать также и реквизиты документа, то они тоже получают выбранное оформление
      Замечательное наблюдение!
      >добавил в табличную часть документа реквизит ВидНоменклатуры, сделал его в форме недоступным и заполняемым при изменении реквизита Номенклатура.
      Можно не модифицировать объект БД, а добавить новую колонку в реквизитах объекта (см. рис.)
      Но у этого способа есть одна неприятная особенность, которую рассмотрим в ближайшей “Осторожно, 1С”.

      Настройка условного оформления формы

      • > а добавить новую колонку в реквизитах объекта
        До сих пор не встречался с такой возможностью. Очень интересно! Жду следующий выпуск “Осторожно, 1С”.

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

    • метод  – ОткрытьФорму(…)

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

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

      • Все разобрался. Спасибо Евгений. Правильно  этот модуль предназначен для другого. Надо  через  Оле соединение открывать. 
        Вот здорово и тематическая сессия по этому поводу уже была.  

  3. Возник вопрос, как правильно реализовать? Условие такое : есть документ “Общий договор”, к нему создаем еще один документ “Приложение к договору”, в котором делаем поле Родитель со ссылкой на ОбщийДоговор. К одному Общему договору может быть несколько приложений, соотношение один ко многим. Нужно чтоб при  открытии  в форме ОбщегоДоговора, выводилась списком информация по всем созданным к этому договору приложениям.  Я  получаю запросом в модуле формы ОбщегоДоговора в серверной  процедуре ТЗ с нужными данными. Как ее правильно отразить на форме ОбщегоДоговора??? Ведь на клиенте ТЗ не работает.

    • Нужно создать реквизит формы с типом данных “Динамический список”, и описать произвольный запрос.
      А в событии “ПриСозданииНаСервере” устанавливать параметр этого динамического списка, например так Список.УстановитьЗначениеПараметра(“Родитель”, Параметры.Ключ).

      • Спасибо за подсказку! :) Все заработало!  Кстати, в представленном выше коде ошибочка есть, пропущено обращение к параметрам динамического списка
        Список.Параметры.УстановитьЗначениеПараметра(«Родитель», Параметры.Ключ).

  4. Столкнулся с такими проблемами..
    Дано: Толстый, Управляемое
    1. Внешняя обработка (Упр. ф.)..
    Почему-то при изменении модуля формы обработки – изменения вступают в силу только после перезапуска конфигуратора..
    2. При создании из формы (Обыч. ф.) документа – обработки (Встроенной в конф.) и получении формы (Упр. ф.) – возвращается Неопределено..
    А при получении формы (Упр. ф.) из менеджера – открывается..

    • 1. Это торчат уши кэширования метаданных.
      Бывают и более клинические случаи. Стабильно не воспроизводится.
      На время помогает чистка кэша метаданных.
      2. Флаг “Использовать управляемые формы в толстом клиенте в обычном режиме” установлен?
      Приведите пример кода.

      • 1. Как очистить кэш метаданных?!..
        2. Флаг конечно стоит – как бы тогда открывалась из менеджера?!..
        Работает:
        Форма    = Обработки.ПодборИзделий.ПолучитьФорму(, ЭтаФорма);
        Форма.Открыть();
        НЕ работает:
        ВыборИзделий    = Обработки.ПодборИзделий.Создать();
        Форма            = ВыборИзделий.ПолучитьФорму(, ЭтаФорма);
        Форма.Открыть();

        P.S.: Спасибо, за – оперативность !..

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

          2. Сейчас проверим.

        • 2. Приведенный пример действительно выдает значение Неопределено.

          Однако, вот такой код работает:

          ТипыДанных = Обработки.ТипыДанных.Создать();
          Форма = ТипыДанных.ПолучитьФорму(“Обработка.ТипыДанных.Форма”);
          ОткрытьФорму(“Обработка.ТипыДанных.Форма”);

          Будем называть это особенностью, о которой не знает документация :)

          • Матерится на 2 параметр
            И при открытии начал лезть в Модуле объекта в ПриЗаписи – эт нормально?!..
            Кто его просит – записывать?!..

            • Вернее начал компилировать ВЕСЬ модуль объекта – и начал плюватся на ХЗ какие ХЗ кем – сделанные изменения..  ;))

              • Для чистоты эксперимента лучше создать новые “чистые” объекты.

            • >И при открытии начал лезть в Модуле объекта в ПриЗаписи
              Кажется это не нормально :)

              >Матерится на 2 параметр
              Какой второй параметр? Не вижу в моем коде передачи второго параметра..

              •  В СП написано – владельца нужно передавать 2 параметром – на самом деле третьим..

                • Тут надо быть внимательным.
                  Есть метод ОткрытьФорму() глобального контекста, там владелец 3-ий параметр.
                  Есть ОткрытьФорму() различных объектов (для толстого клиента), там владелец 2-ой параметр.
                  Верно?

          • Не получается: Суть задачи – из формы (Обыч.) док. открыть обработку (Упр. ф.) и из нее вернуть/заполнить ТЧ документа..
            Получается только ч/з открытие формы менеджера обработок и передачу в качестве владельца форму документа..

            • Давайте продолжим.
              Приведите неработающий код.

              •  Выкрутился, методом ПолучитьФорму() ТРЕТИМ параметром передал в качестве владельца форму документа.. В обработке в форме владельца – заполнял ТЧ..
                Пробовал ч/з ЗначениеВДанныеФормы() передавать ДокОбъект в реквизит обработки – в обработке РеквизитФормыВЗначение, у полученного объекта менял ТЧ – в Документе не заполнялась..

  5. интересный ps, а что раньше можно было распространять?))

  6. Присоединяюсь к благодарностям. Материал действительно полезен.

  7. Спасибо)

  8. Огромное спасибо!

  9. Огромное  спасибо! После изучения базового курса, материал вызвал такое же чувство умиротворение от полного осознание некоторых вещей по платформе, как в свое время пере прочтение Евгения Онегина   после возвращение из армии :-)

  10. БОЛЬШОЕ ВАМ СПАСИБО ЗА МАТЕРИАЛ !!!

  11. Материал черезвычайно полезен. Самое искреннее спасибо!!!

  12. В очередной раз – спасибо за полезный материал.

  13. Игорь Серков 11.11.2010 в 23:08

    Спасибо! Когда Вы только успеваете все это делать…..

  14. урррра! вот это да! спасибо!

  15. Спасибо.