Картинка "проведенности" документа на форме (Управляемые формы) на примере УТ11

Как мы узнаём проведен ли документ если перед глазами его форма? А никак! Нужно либо знать тонкости конкретной формы документа, либо прибегать к дополнительным действиям, что не всегда удобно. Предлагаю добавить на форму идентификатор проведения, тремя способами:
1. Без единой "строчки кода" (но для каждого вида документов);
2. Тоже самое "программно" (для всех видов документов сразу);
3. Вообще без изменения конфигурации (через настройки пользователя, для каждого вида документов).

05.06.2013 Добавлен вариант программной настройки для УТ 11.1.х

Первый и второй способы предполагают включение возможности изменения в конфигураторе, и признак проведённости выглядит так:

Как это будет выглядеть

Первый способ (все делаем «ручками», но без «единой строчки кода»):

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

Находим в дереве метаданных, нужный документ, нужную форму (Реализация товаров и услуг, ФормаДокумента), открываем ее, и щелкаем мышью на поле «Номер» в «образе» формы (активизируется соответствующий элемент сверху):

Выбор документа

 

В свойствах Объекта находим свойство Проведен и перетаскиваем его мышью на поле Номер:

Добавление свойства на форму

Это приведет к тому что на поле «образа» появится флажек «Проведен«:

Реквизит Проведен

Далее нужно несколько скорректировать свойства вновь добавленного поля «Проведен«:

Сначала изменим Вид на «Поле картинки«:

Вид

Затем зададим картинку, которая будет отображаться в случае, если документ будет иметь статус Проведен (предлагаю использовать из Стандартных, картинку «Синтактический контроль«):

Выбор картинки

Отключаем вывод заголовка (чтобы не сильно корежить форму):

Отключение заголовка

Зададим Рамку и Размер (убираем рамку, устанавливаем Ширину: 3, Высоту: 1):

Рамка и размер

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

 

Второй способ (все делаем при помощи кода):

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

Открываем указанный модуль и находим процедуру ПриСозданииНаСервере(Форма) Экспорт, и в конце перед КонецПроцедуры, добавляем код:

Если ИмяФормыМассив[0] = «Документ» и ИмяФормыМассив[3] = «ФормаДокумента» Тогда
    Если Метаданные.Документы[ИмяФормыМассив[1]].Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить
        И Не Форма.Элементы.Найти(«Номер«) = Неопределено
    Тогда
        ПолеПроведен = Форма.Элементы.Вставить(«Проведен«, Тип(«ПолеФормы«), Форма.Элементы.Номер.РодительФорма.Элементы.Номер);
        ПолеПроведен.Вид = ВидПоляФормы.ПолеКартинки;
        ПолеПроведен.ПутьКДанным = «Объект.Проведен«;
        ПолеПроведен.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
        ПолеПроведен.КартинкаЗначений = БиблиотекаКартинок.СинтаксическийКонтроль;
        ПолеПроведен.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.БезРамки);
        ПолеПроведен.Ширина = 3;
        ПолеПроведен.Высота = 1;
        ПолеПроведен.РастягиватьПоГоризонтали = Ложь; 
        ПолеПроведен.РастягиватьПоВертикали = Ложь;
        ПолеПроведен.Подсказка = «Проведен«;
    КонецЕсли;
КонецЕсли;

(Возможно придется заменить переменную Форма на ЭтаФорма)

Даннай код делает тоже самое, что мы делали «ручками» (работоспособно в УТ11 в трех последних конфигурациях до 11.0.9.15 включительно и в последних БП3.0) в процедуре, которая вызывается из всех документов (иногда журналов). Одновременное использование первого и второго способа будет приводить к ошибке (т.к. программный код второго способа будет пытаться добавить поле с именем («Проведен»), которое уже существует по первому способу). На мой взгляд — этот способ наиболее предпочтителен, т.к. «включает» признак проведённости сразу для всех документов, причем правке подвергается один единственный общий модуль.

 

Третий способ (все делаем «ручками» в режиме Предприятие, для каждого пользователя, не нужно включать возможность изменений конфигурации, действие сохраняется при обновлении конфигурации): 

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

Вместо картинки проведенности отображаем на форме (обычно скрытую) кнопку «отмена проведения», действуем через настройки формы, непосредственно из рабочей среды из формы документа (ключевым здесь является установка свойства «Только во Все действия» кнопки «Отмена проведения» в значение «Нет«):

Включение отображения

В случае использования этого метода: если документ проведен — картинка проведенности будет «яркой» (кнопка доступной), в случае не проведенности — «тусклой» (кнопка недоступной):

Отмена проведения

Преимущества третьего способа:
 — отсутствие необходимости включать возможность изменений в конфигураторе;
 — сохранение его действия при обновлении конфигурации;

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

 

UPD: 05.06.2013 Вариант программной настройки для УТ 11.1.х (проверено на 11.1.2.8 и более ранних)

В любой процедуре, вызываемой из модуля формы ПриСозданииНаСервере документа, например в ОбщемМодуле.ДополнительныеОтчетыИОбработки в экспортной процедуре ПриСозданииНаСервере, в самом начале добавляем вызов процедуры ДобавитьПризнакПроведенностиНаФорму(ЭтаФорма), которая практически повторяет вышеописанный код:

//Добавлена вся процедура (Картинка проведенности Начало)

Процедура ДобавитьПризнакПроведенностиНаФорму(Форма
     ИмяФормыМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Форма.ИмяФормы, «.»);
     Если ИмяФормыМассив[0] = «Документ» и ИмяФормыМассив[3] = «ФормаДокумента» Тогда
         Если Метаданные.Документы[ИмяФормыМассив[1]].Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить
             И Не Форма.Элементы.Найти(«Номер») = Неопределено
         Тогда
             ГруппаПроведенИНомер = Форма.Элементы.Вставить(«ГруппаПроведенИНомер», Тип(«ГруппаФормы»), Форма.Элементы.Номер.Родитель, Форма.Элементы.Номер);
             ГруппаПроведенИНомер.Вид = ВидГруппыФормы.ОбычнаяГруппа;
             ГруппаПроведенИНомер.Отображение = ОтображениеОбычнойГруппы.Нет;
             ГруппаПроведенИНомер.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная
;
             ГруппаПроведенИНомер.РастягиватьПоГоризонтали = Форма.Элементы.Номер.РастягиватьПоГоризонтали;
             ГруппаПроведенИНомер.РастягиватьПоВертикали = Форма.Элементы.Номер.РастягиватьПоВертикали;
     
        ГруппаПроведенИНомер.ОтображатьЗаголовок = Ложь;
        
             Форма.Элементы.Переместить(Форма.Элементы.Номер, ГруппаПроведенИНомер
);   

             ПолеПроведен = Форма.Элементы.Вставить(«Проведен», Тип(«ПолеФормы»), Форма.Элементы.Номер.Родитель, Форма.Элементы.Номер);
             ПолеПроведен.Вид = ВидПоляФормы.ПолеКартинки;
             ПолеПроведен.ПутьКДанным = «Объект.Проведен»;
             ПолеПроведен.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
             ПолеПроведен.КартинкаЗначений = БиблиотекаКартинок.СинтаксическийКонтроль;    
             ПолеПроведен.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.БезРамки);
             ПолеПроведен.Ширина = 3;
             ПолеПроведен.Высота = 1;
             ПолеПроведен.РастягиватьПоГоризонтали = Ложь;
             ПолеПроведен.РастягиватьПоВертикали = Ложь;
             ПолеПроведен.Подсказка = «Проведен»;
         КонецЕсли;
     КонецЕсли;

КонецПроцедуры // Картинка проведенности Окончание

Здесь группа ГруппаПроведенИНомер обеспечивает нормальное отображение признака проведенности в формах, в которых элемент Номер входит в группу, элементы которой сгруппированы вертикально, например форма документа СчетФактураВыданный.

39 Comments

  1. TMV

    Хм.. может проще вывести кнопку «отмена проведения» на форму и по ней ориентироваться? (И включать возможность редактирования не нужно)

    Reply
  2. mxm2

    Хороший метод. Сам сначала так делал. но не слишком наглядно это. да и потом всеравно пришлсь включить возможность изиенений. Поэтому прикрутил картинку

    Reply
  3. mxm2

    (1) TMV, Спасибо за подсказку. Добавил в статью. Ваш метод имеет безусловное преимущество, если больше незачем включать возможность изменений в конфигурации. Если же возможность изменений включена, то добавление в конфигураторе имхо — нагляднее.

    Reply
  4. mxm2

    Изображение выбора картинки, которое почему-то не отображается:

    Reply
  5. w-divin

    интересненько…. влепим себе для наглядности )))

    Reply
  6. Свой

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

    — перелопатить форму КАЖДОГО документа

    — повторять эти действия при каждом обновлении

    не слишком ли большая цена за удовольствие видеть статус проведенности ?

    как насчет подписки на событие открытия формы и проставления статуса в заголовке формы ?

    Reply
  7. mxm2

    (6) Свой, Да не вопрос, подобные действия можно проделать не со всеми, а только с некоторыми документами. Т.к. у меня достаточно сильно измененная конфигурация, то для меня это — относительно небольшие временнЫе затраты (не для всех документов). Про события — чесно говоря даже не думал, а вот с использованием программирования это скорее всего можно сделать универсально. Второй способ — сохраняется даже при обновлении (в настройках пользователя). А вообще хорошо бы, что бы от 1С уже что-то подобное было.

    Reply
  8. 1cUserAndrew

    (6)

    как насчет подписки на событие открытия формы и проставления статуса в заголовке формы ?

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

    Reply
  9. mxm2

    (6) Свой, (8) 1cUserAndrew, Есть универсальный программный способ, сразу для всех документов… если получится — добавлю…

    Reply
  10. mxm2

    (6) Свой, Добавлен программный способ. теперь все просто, для всех документов сразу.

    Reply
  11. zoytsa

    пример коллективной работы сообщества! спасибо!

    Reply
  12. Поручик

    (8) Уже давно есть, начиная с версий 8.2.15. Об этом на инфостарте уже писалось и я свои комменты делал.

    Reply
  13. mxm2

    (12) Поручик, Вы имеете ввиду это http://infostart.ru/public/149181/? Тогда, позвольте процитировать Вас:

    Это одно НО сводит почти на нет ценность фичи. 1С, как всегда, к ложке мёда прилагает бочку дёгтя.

    Проще найти нечто общее при создании/открытии форм.

    Reply
  14. 1cUserAndrew

    (12) Да, про событие «ОбработкаПолученияФормы» я не подумал.)

    Имел в виду события самих форм. Не менеджеров объектов.

    Я вот что-то пока для себя не нашел применения этого события.

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

    Может и можно … наверное, просто туплю с утра 🙂

    Reply
  15. Abadonna

    (14) 1cUserAndrew, через ж… использовать можно. Один недостаток — событие серверное, ну никак из него форму не выдернешь 🙁

    А вот так получилось, но мне лично не нравится:

    &НаСервере
    Процедура ПодпискаНаСобытие1ОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
    Если ВидФормы=»ФормаОбъекта» Тогда
    Ссылка=Параметры.Ключ;
    Объект=Ссылка.ПолучитьОбъект();
    СтарыйКомментарий=Объект.Комментарий;
    Проведен=» /ПРОВЕДЕН»;
    НеПроведен=» /НЕ ПРОВЕДЕН»;
    СтарыйКомментарий=СтрЗаменить(СтарыйКомментарий,Проведен,»»);
    СтарыйКомментарий=СтрЗаменить(СтарыйКомментарий,НеПроведен,»»);
    Если Объект.Проведен Тогда
    Объект.Комментарий=СтарыйКомментарий+Проведен;
    Иначе
    Объект.Комментарий=СтарыйКомментарий+НеПроведен;
    КонецЕсли;
    Объект.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
    КонецПроцедуры
    
    

    Показать

    Reply
  16. mxm2

    (15) Abadonna, что-то как то невесело… ради информирования пользователя о проведенности, лишний раз производить запись объекта… Сама форма-то недоступна… Всетаки второй способ описанный в статье — лучше, да и обновлять его просто.

    Reply
  17. Abadonna

    (16)

    1. Я и написал, что мне не нравится

    2. Второй способ — в УТ. Процедуры, там указанной, в БП 3.0 и в помине нет. А этот будет везде работать.

    Reply
  18. mxm2

    (17) Abadonna, я прекрасно видел, что Вам не нравится, просто констатировал факт того что, реализация через запись объекта — не желательна (а иначе через события, вроде и не реализуешь)… В БП3 скорее всего тоже есть что-то общее при вызове формы документа… Нужно будет посмотреть (в крайнем случае можно будет добавить в каждый нужный докумнт)) ).

    Reply
  19. Abadonna

    (18)

    Нужно будет посмотреть (в крайнем случае можно будет добавить в каждый нужный докумнт)) ).

    Добавить в каждый нужный -тогда уж проще добавить с процедуры каждого документа, например, ПриОткрытии

    Навскидку я там как раз ни фиге не нашел. Но не особо и искал.

    Кстати, если уж так юзверю шибко надо видеть, можно и коммент не трогать, и не перезаписывать.

    Элементарное «Сообщить», оно так аккуратненько справа стыкуется.

    Reply
  20. Abadonna

    +/19/ Давно убедился, что штатными методами особо в 1С не разгонишься. ВК — милое дело.

    MiracleNative событие открытия любой формы получает без проблем.

    Reply
  21. mxm2

    (19) Abadonna, Таки развернул БП3 версии 3.0.17.10: там аналогично делается через ОбщийМодуль/Процедуру «ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере«, которая вызывается из аналогичной функции любого документа.

    Reply
  22. Abadonna

    (21) Ну и хорошо, что есть 😉

    Меня другое удивляет:

    «(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)»

    Раз ВидФормы передается, то, наверное, как-то можно было и контекст формы передать?…

    Reply
  23. mxm2

    (22) Abadonna, Если это модуль менеджера, то «по логике» — никак, сдается мне что эта фича сделана для того чтобы «подменять» стандартную форму какой-либо другой, при этом не править ни саму эту исходную форму ни места её вызовов.

    Reply
  24. Abadonna

    (23) это ж еще и подписка на событие…

    Reply
  25. mxm2

    (24) Abadonna, Все верно, подписка на событие уровня менеджера объекта, т.е. при возникновении, формы объекта как таковой, еще не существует, (есть только форма в дереве метаданных, которая, вроде как, недоступна для изменения из языка, впрочем она существует и до и после события)

    Reply
  26. ASchekachev

    Нет ничего проще, чем объяснить пользователю как пользоваться меню «Все действия», при этом ничего не нужно дорабатывать, для удобства соглашусь (1), можно просто перенести кнопку «Отмена проведения» рядом с кнопкой «Провести».

    Соглашусь с (6). Мое мнение программная доработка не имеет смысла. Но это только мое мнение и оно может не совпадать с большинством.

    Reply
  27. mxm2

    (26) ASchekachev, дочитайте до конца статью (ну или хотя бы внимательно прочитайте аннотацию).

    Там есть способ, лишенный недостатка указанного в (6). Также там есть третий способ (вывод на панель кнопки «Отмена проведения» в пользовательском режиме), который имеет свои +/-, один из «минусов» — то что если у пользователя нет права распроведения документов — то он не увидит соответствующей активной кнопки. Не призываю включать возможность изменения только ради этой «фенечки», но если изменения уже возможны — её удобно применить (приоритетно, способ 2)

    Reply
  28. ASchekachev

    (27)

    один из «минусов» — то что если у пользователя нет права распроведения документов — то он не увидит соответствующей активной кнопки

    Статью прочитал внимательно и до конца, третий способ видел. Так же видел, что Вы его добавили после комментария (1).

    «Минус», что Вы приводите на мой взгляд не актуальный для пользователя с ограниченными правами. Если он не может проводить/распроводить документ, то какой смысл видеть этот признак?

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

    Повторюсь, что это только мое мнение и это нормально, что она не совпадает, к примеру, с Вашим.

    Reply
  29. mxm2

    (28) ASchekachev,

    Статью прочитал внимательно и до конца

    но, видимо, не сразу…)))… а статья действительно рождалась как-бы «совместно» с сообществом. о чем и свидетельствуют комменты, да вобщем-то в том числе для этого они и нужны…)

    «Минус», что Вы приводите на мой взгляд не актуальный для пользователя с ограниченными правами. Если он не может проводить/распроводить документ, то какой смысл видеть этот признак?

    как сказать.. есть ряд пользователей которые видят, но сделать ничего не могут… директора, например… (смотрящие со стороны)

    Reply
  30. LexSeIch

    Мир этому дому!

    Жизнь складывается из мелочей. А хорошая жизнь — из удобных мелочей. Спасибо идею и за статью.

    Reply
  31. ksai

    (15) Abadonna, (16)

    лишний раз производить запись объекта

    Чтобы исключить лишние телодвижения при записи объекта, можно сказать ему:

    Источник.ОбменДанными.Загрузка = Истина;

    Reply
  32. mxm2

    (31) ksai, применительно к данной теме — неактуально. Ибо запись всеравно будет происходить (пусть и без встроенных в конфигурацию проверок).

    Reply
  33. ksai

    (32)

    к данной теме — вне всякого сомнения 🙂 перезаписывать объект для данной задачи — бред с любой точки зрения)

    мой комментарий — поправка к конкретному коду пользователя Abadonna

    Reply
  34. kenza

    (2) а есть возможность не только проведение отражать, а так же другие состояния: сохранен, помечен на удаление? И лучше конечно бы не в самой форме, а в ее заголовке?

    Сделал вроде по методу №2, но состояние отражается не во всех документах, буду разбираться где проблема ), а так спасибо за статью +

    Reply
  35. mxm2

    (34) kenza, пометку удаления можно отражать «рядом», таким же образом, можно совместить картинку проведенности и пометку удаления, но это потребует усложнения алгоритма; в заголовке — вроде как проще;

    Если у Вас при реализации не во всех документах отображается картинка проверьте Вызывается ли процедура ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере из процедуры ПриСозданииНаСервере модуля формы документа.

    Reply
  36. OBEH

    По моему, при первом способе, надо еще убрать галочки на свойствах

    «РастягиватьПоГоризонтали» и «РастягиватьПоВертикали». В противном случае,

    занимается лишнее место под картинку.

    Reply
  37. maxis33

    Пользовался этим способом почти год, и тут раз — 1С сами такое в БП 3.0 сделали…

    Reply
  38. zoytsa

    Думаю, приоритетный вариант с настройкой каждой формы вручную — с т.з. производительности, иначе

    требуется обработка модуля с множеством условий.

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

    Reply
  39. Sam13

    Не понимаю, зачем добавлять Поле формы, связывать его с данными.

    Предлагаю сделать так:

    ПолеПроведен = Форма.Элементы.Вставить(«тфр_КартинкаСтатуса», Тип(«ДекорацияФормы»), Форма.Элементы.Номер.Родитель, Форма.Элементы.Номер);

    ПолеПроведен.Вид = ВидДекорацииФормы.Картинка;

    Если Форма.Объект.Проведен = Истина Тогда

    ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументПроведенКоннекторВерх;

    ПолеПроведен.Подсказка = «Проведен»;

    ИначеЕсли Форма.Объект.ПометкаУдаления = Истина Тогда

    ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументПомеченНаУдалениеКоннекторВерх;

    ПолеПроведен.Подсказка = «Помечен на удаление»;

    Иначе

    ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументЗаписанКоннекторВерх;

    ПолеПроведен.Подсказка = «Не проведен»;

    КонецЕсли;

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *