gifts2017

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

Опубликовал mxm2 mxm2 (mxm2) в раздел Администрирование - Оптимизация БД (HighLoad)

Как мы узнаём проведен ли документ если перед глазами его форма? А никак! Нужно либо знать тонкости конкретной формы документа, либо прибегать к дополнительным действиям, что не всегда удобно. Предлагаю добавить на форму идентификатор проведения, тремя способами:
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;
             ПолеПроведен.РастягиватьПоГоризонтали = Ложь;
             ПолеПроведен.РастягиватьПоВертикали = Ложь;
             ПолеПроведен.Подсказка = "Проведен";
         КонецЕсли;
     КонецЕсли;

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. TMV 03.01.13 07:32
Хм.. может проще вывести кнопку "отмена проведения" на форму и по ней ориентироваться? (И включать возможность редактирования не нужно)
2. mxm2 mxm2 (mxm2) 03.01.13 08:03
Хороший метод. Сам сначала так делал. но не слишком наглядно это. да и потом всеравно пришлсь включить возможность изиенений. Поэтому прикрутил картинку
3. mxm2 mxm2 (mxm2) 03.01.13 17:56
(1) TMV, Спасибо за подсказку. Добавил в статью. Ваш метод имеет безусловное преимущество, если больше незачем включать возможность изменений в конфигурации. Если же возможность изменений включена, то добавление в конфигураторе имхо - нагляднее.
4. mxm2 mxm2 (mxm2) 04.01.13 00:22
Изображение выбора картинки, которое почему-то не отображается:
Прикрепленные файлы:
5. Дмитрий Елисеев (w-divin) 05.01.13 15:36
интересненько.... влепим себе для наглядности )))
6. Андрей (Свой) 06.01.13 19:49
автор предлагает для искомого результата:
- перелопатить форму КАЖДОГО документа
- повторять эти действия при каждом обновлении
не слишком ли большая цена за удовольствие видеть статус проведенности ?
как насчет подписки на событие открытия формы и проставления статуса в заголовке формы ?
7. mxm2 mxm2 (mxm2) 06.01.13 20:10
(6) Свой, Да не вопрос, подобные действия можно проделать не со всеми, а только с некоторыми документами. Т.к. у меня достаточно сильно измененная конфигурация, то для меня это - относительно небольшие временнЫе затраты (не для всех документов). Про события - чесно говоря даже не думал, а вот с использованием программирования это скорее всего можно сделать универсально. Второй способ - сохраняется даже при обновлении (в настройках пользователя). А вообще хорошо бы, что бы от 1С уже что-то подобное было.
8. Андрей (1cUserAndrew) 07.01.13 16:44
(6)
как насчет подписки на событие открытия формы и проставления статуса в заголовке формы ?

Свой, насколько я знаю, на данный момент платформа не предоставляет возможность делать подписки на события форм.
9. mxm2 mxm2 (mxm2) 07.01.13 19:53
(6) Свой, (8) 1cUserAndrew, Есть универсальный программный способ, сразу для всех документов... если получится - добавлю...
10. mxm2 mxm2 (mxm2) 08.01.13 07:53
(6) Свой, Добавлен программный способ. теперь все просто, для всех документов сразу.
Свой; +1 Ответить
11. andr bat (zoytsa) 08.01.13 08:08
пример коллективной работы сообщества! спасибо!
12. Сергей Ожерельев (Поручик) 08.01.13 20:55
(8) Уже давно есть, начиная с версий 8.2.15. Об этом на инфостарте уже писалось и я свои комменты делал.
13. mxm2 mxm2 (mxm2) 08.01.13 22:58
(12) Поручик, Вы имеете ввиду это http://infostart.ru/public/149181/? Тогда, позвольте процитировать Вас:

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


Проще найти нечто общее при создании/открытии форм.
14. Андрей (1cUserAndrew) 09.01.13 06:25
(12) Да, про событие "ОбработкаПолученияФормы" я не подумал.)
Имел в виду события самих форм. Не менеджеров объектов.

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

Может и можно ... наверное, просто туплю с утра :)
15. Аркадий Кучер (Abadonna) 09.01.13 13:16
(14) 1cUserAndrew, через ж... использовать можно. Один недостаток - событие серверное, ну никак из него форму не выдернешь :(
А вот так получилось, но мне лично не нравится:
&НаСервере
Процедура ПодпискаНаСобытие1ОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
	Если ВидФормы="ФормаОбъекта" Тогда
		Ссылка=Параметры.Ключ;
		Объект=Ссылка.ПолучитьОбъект();
		СтарыйКомментарий=Объект.Комментарий;
		Проведен=" /ПРОВЕДЕН";
		НеПроведен=" /НЕ ПРОВЕДЕН";
		СтарыйКомментарий=СтрЗаменить(СтарыйКомментарий,Проведен,"");
		СтарыйКомментарий=СтрЗаменить(СтарыйКомментарий,НеПроведен,"");
		Если Объект.Проведен Тогда
			Объект.Комментарий=СтарыйКомментарий+Проведен;
		Иначе
			Объект.Комментарий=СтарыйКомментарий+НеПроведен;
		КонецЕсли;
		Объект.Записать(РежимЗаписиДокумента.Запись);
	КонецЕсли;
КонецПроцедуры

...Показать Скрыть
Прикрепленные файлы:
16. mxm2 mxm2 (mxm2) 09.01.13 13:26
(15) Abadonna, что-то как то невесело... ради информирования пользователя о проведенности, лишний раз производить запись объекта... Сама форма-то недоступна... Всетаки второй способ описанный в статье - лучше, да и обновлять его просто.
17. Аркадий Кучер (Abadonna) 09.01.13 14:15
(16)
1. Я и написал, что мне не нравится
2. Второй способ - в УТ. Процедуры, там указанной, в БП 3.0 и в помине нет. А этот будет везде работать.
18. mxm2 mxm2 (mxm2) 09.01.13 14:34
(17) Abadonna, я прекрасно видел, что Вам не нравится, просто констатировал факт того что, реализация через запись объекта - не желательна (а иначе через события, вроде и не реализуешь)... В БП3 скорее всего тоже есть что-то общее при вызове формы документа... Нужно будет посмотреть (в крайнем случае можно будет добавить в каждый нужный докумнт)) ).
19. Аркадий Кучер (Abadonna) 09.01.13 14:39
(18)
Нужно будет посмотреть (в крайнем случае можно будет добавить в каждый нужный докумнт)) ).

Добавить в каждый нужный -тогда уж проще добавить с процедуры каждого документа, например, ПриОткрытии
Навскидку я там как раз ни фиге не нашел. Но не особо и искал.
Кстати, если уж так юзверю шибко надо видеть, можно и коммент не трогать, и не перезаписывать.
Элементарное "Сообщить", оно так аккуратненько справа стыкуется.
20. Аркадий Кучер (Abadonna) 09.01.13 14:49
+/19/ Давно убедился, что штатными методами особо в 1С не разгонишься. ВК - милое дело.
MiracleNative событие открытия любой формы получает без проблем.
21. mxm2 mxm2 (mxm2) 09.01.13 18:34
(19) Abadonna, Таки развернул БП3 версии 3.0.17.10: там аналогично делается через ОбщийМодуль/Процедуру "ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере", которая вызывается из аналогичной функции любого документа.
22. Аркадий Кучер (Abadonna) 09.01.13 18:47
(21) mxm2, Ну и хорошо, что есть ;)
Меня другое удивляет:
"(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)"
Раз ВидФормы передается, то, наверное, как-то можно было и контекст формы передать?...
23. mxm2 mxm2 (mxm2) 12.01.13 13:24
(22) Abadonna, Если это модуль менеджера, то "по логике" - никак, сдается мне что эта фича сделана для того чтобы "подменять" стандартную форму какой-либо другой, при этом не править ни саму эту исходную форму ни места её вызовов.
24. Аркадий Кучер (Abadonna) 12.01.13 13:34
(23) mxm2, это ж еще и подписка на событие...
25. mxm2 mxm2 (mxm2) 12.01.13 13:50
(24) Abadonna, Все верно, подписка на событие уровня менеджера объекта, т.е. при возникновении, формы объекта как таковой, еще не существует, (есть только форма в дереве метаданных, которая, вроде как, недоступна для изменения из языка, впрочем она существует и до и после события)
26. Антон Щекачев (ASchekachev) 16.01.13 14:51
Нет ничего проще, чем объяснить пользователю как пользоваться меню "Все действия", при этом ничего не нужно дорабатывать, для удобства соглашусь (1), можно просто перенести кнопку "Отмена проведения" рядом с кнопкой "Провести".
Соглашусь с (6). Мое мнение программная доработка не имеет смысла. Но это только мое мнение и оно может не совпадать с большинством.
Прикрепленные файлы:
27. mxm2 mxm2 (mxm2) 16.01.13 15:02
(26) ASchekachev, дочитайте до конца статью (ну или хотя бы внимательно прочитайте аннотацию).
Там есть способ, лишенный недостатка указанного в (6). Также там есть третий способ (вывод на панель кнопки "Отмена проведения" в пользовательском режиме), который имеет свои +/-, один из "минусов" - то что если у пользователя нет права распроведения документов - то он не увидит соответствующей активной кнопки. Не призываю включать возможность изменения только ради этой "фенечки", но если изменения уже возможны - её удобно применить (приоритетно, способ 2)
28. Антон Щекачев (ASchekachev) 16.01.13 15:56
(27) mxm2,

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


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

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

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

Повторюсь, что это только мое мнение и это нормально, что она не совпадает, к примеру, с Вашим.
29. mxm2 mxm2 (mxm2) 16.01.13 16:06
(28) ASchekachev,
Статью прочитал внимательно и до конца

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

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

как сказать.. есть ряд пользователей которые видят, но сделать ничего не могут... директора, например... (смотрящие со стороны)
30. Сергей Маслов (LexSeIch) 17.01.13 08:58
Мир этому дому!

Жизнь складывается из мелочей. А хорошая жизнь - из удобных мелочей. Спасибо идею и за статью.
31. ksai ksai (ksai) 18.01.13 11:32
(15) Abadonna, (16) mxm2,

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


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

Источник.ОбменДанными.Загрузка = Истина;
32. mxm2 mxm2 (mxm2) 18.01.13 12:04
(31) ksai, применительно к данной теме - неактуально. Ибо запись всеравно будет происходить (пусть и без встроенных в конфигурацию проверок).
33. ksai ksai (ksai) 18.01.13 16:59
(32) mxm2,
к данной теме - вне всякого сомнения :) перезаписывать объект для данной задачи - бред с любой точки зрения)
мой комментарий - поправка к конкретному коду пользователя Abadonna
34. Геннадий Зимин (kenza) 22.07.13 11:03
(2) mxm2, а есть возможность не только проведение отражать, а так же другие состояния: сохранен, помечен на удаление? И лучше конечно бы не в самой форме, а в ее заголовке?
Сделал вроде по методу №2, но состояние отражается не во всех документах, буду разбираться где проблема ), а так спасибо за статью +
35. mxm2 mxm2 (mxm2) 22.07.13 12:00
(34) kenza, пометку удаления можно отражать "рядом", таким же образом, можно совместить картинку проведенности и пометку удаления, но это потребует усложнения алгоритма; в заголовке - вроде как проще;

Если у Вас при реализации не во всех документах отображается картинка проверьте Вызывается ли процедура ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере из процедуры ПриСозданииНаСервере модуля формы документа.
36. OBEH (OBEH) 15.08.13 16:58
По моему, при первом способе, надо еще убрать галочки на свойствах
"РастягиватьПоГоризонтали" и "РастягиватьПоВертикали". В противном случае,
занимается лишнее место под картинку.
37. Maxim k (maxis33) 04.07.14 16:58
Пользовался этим способом почти год, и тут раз - 1С сами такое в БП 3.0 сделали...
orekhov_rnd; +1 Ответить
38. andr bat (zoytsa) 22.07.14 09:53
Думаю, приоритетный вариант с настройкой каждой формы вручную - с т.з. производительности, иначе
требуется обработка модуля с множеством условий.

Но если конфигурация на поддержке в целом, то безусловно вариант с модулем хороший.
39. Дмитрий Семенов (Sam13) 10.03.16 14:24
Не понимаю, зачем добавлять Поле формы, связывать его с данными.
Предлагаю сделать так:

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