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, Спасибо за подсказку. Добавил в статью. Ваш метод имеет безусловное преимущество, если больше незачем включать возможность изменений в конфигурации. Если же возможность изменений включена, то добавление в конфигураторе имхо — нагляднее.
Изображение выбора картинки, которое почему-то не отображается:
интересненько…. влепим себе для наглядности )))
автор предлагает для искомого результата:
— перелопатить форму КАЖДОГО документа
— повторять эти действия при каждом обновлении
не слишком ли большая цена за удовольствие видеть статус проведенности ?
как насчет подписки на событие открытия формы и проставления статуса в заголовке формы ?
(6) Свой, Да не вопрос, подобные действия можно проделать не со всеми, а только с некоторыми документами. Т.к. у меня достаточно сильно измененная конфигурация, то для меня это — относительно небольшие временнЫе затраты (не для всех документов). Про события — чесно говоря даже не думал, а вот с использованием программирования это скорее всего можно сделать универсально. Второй способ — сохраняется даже при обновлении (в настройках пользователя). А вообще хорошо бы, что бы от 1С уже что-то подобное было.
(6)
Свой, насколько я знаю, на данный момент платформа не предоставляет возможность делать подписки на события форм.
(6) Свой, (8) 1cUserAndrew, Есть универсальный программный способ, сразу для всех документов… если получится — добавлю…
(6) Свой, Добавлен программный способ. теперь все просто, для всех документов сразу.
пример коллективной работы сообщества! спасибо!
(8) Уже давно есть, начиная с версий 8.2.15. Об этом на инфостарте уже писалось и я свои комменты делал.
(12) Поручик, Вы имеете ввиду этоhttp://infostart.ru/public/149181/ ? Тогда, позвольте процитировать Вас:
Проще найти нечто общее при создании/открытии форм.
(12) Да, про событие «ОбработкаПолученияФормы» я не подумал.)
Имел в виду события самих форм. Не менеджеров объектов.
Я вот что-то пока для себя не нашел применения этого события.
Да и применительно к данной теме чет сходу не соображу, как его можно использовать. Как добавить на форму элемент. Ведь самой формой мы в этом событии не оперируем. Имеем только вид формы и, возможно, имя формы.
Может и можно … наверное, просто туплю с утра 🙂
(14) 1cUserAndrew, через ж… использовать можно. Один недостаток — событие серверное, ну никак из него форму не выдернешь 🙁
А вот так получилось, но мне лично не нравится:
Показать
(15) Abadonna, что-то как то невесело… ради информирования пользователя о проведенности, лишний раз производить запись объекта… Сама форма-то недоступна… Всетаки второй способ описанный в статье — лучше, да и обновлять его просто.
(16)
1. Я и написал, что мне не нравится
2. Второй способ — в УТ. Процедуры, там указанной, в БП 3.0 и в помине нет. А этот будет везде работать.
(17) Abadonna, я прекрасно видел, что Вам не нравится, просто констатировал факт того что, реализация через запись объекта — не желательна (а иначе через события, вроде и не реализуешь)… В БП3 скорее всего тоже есть что-то общее при вызове формы документа… Нужно будет посмотреть (в крайнем случае можно будет добавить в каждый нужный докумнт)) ).
(18)
Добавить в каждый нужный -тогда уж проще добавить с процедуры каждого документа, например, ПриОткрытии
Навскидку я там как раз ни фиге не нашел. Но не особо и искал.
Кстати, если уж так юзверю шибко надо видеть, можно и коммент не трогать, и не перезаписывать.
Элементарное «Сообщить», оно так аккуратненько справа стыкуется.
+/19/ Давно убедился, что штатными методами особо в 1С не разгонишься. ВК — милое дело.
MiracleNative событие открытия любой формы получает без проблем.
(19) Abadonna, Таки развернул БП3 версии 3.0.17.10: там аналогично делается через ОбщийМодуль/Процедуру «ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере«, которая вызывается из аналогичной функции любого документа.
(21) Ну и хорошо, что есть 😉
Меня другое удивляет:
«(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)»
Раз ВидФормы передается, то, наверное, как-то можно было и контекст формы передать?…
(22) Abadonna, Если это модуль менеджера, то «по логике» — никак, сдается мне что эта фича сделана для того чтобы «подменять» стандартную форму какой-либо другой, при этом не править ни саму эту исходную форму ни места её вызовов.
(23) это ж еще и подписка на событие…
(24) Abadonna, Все верно, подписка на событие уровня менеджера объекта, т.е. при возникновении, формы объекта как таковой, еще не существует, (есть только форма в дереве метаданных, которая, вроде как, недоступна для изменения из языка, впрочем она существует и до и после события)
Нет ничего проще, чем объяснить пользователю как пользоваться меню «Все действия», при этом ничего не нужно дорабатывать, для удобства соглашусь (1), можно просто перенести кнопку «Отмена проведения» рядом с кнопкой «Провести».
Соглашусь с (6). Мое мнение программная доработка не имеет смысла. Но это только мое мнение и оно может не совпадать с большинством.
(26) ASchekachev, дочитайте до конца статью (ну или хотя бы внимательно прочитайте аннотацию).
Там есть способ, лишенный недостатка указанного в (6). Также там есть третий способ (вывод на панель кнопки «Отмена проведения» в пользовательском режиме), который имеет свои +/-, один из «минусов» — то что если у пользователя нет права распроведения документов — то он не увидит соответствующей активной кнопки. Не призываю включать возможность изменения только ради этой «фенечки», но если изменения уже возможны — её удобно применить (приоритетно, способ 2)
(27)
Статью прочитал внимательно и до конца, третий способ видел. Так же видел, что Вы его добавили после комментария (1).
«Минус», что Вы приводите на мой взгляд не актуальный для пользователя с ограниченными правами. Если он не может проводить/распроводить документ, то какой смысл видеть этот признак?
Другое дело пользователь имеющий права, к примеру он редактировал документ, сохранял его, затем переключался между окнами и когда вернулся в документ, решил его закрыть (без лишнего ОК), но не помнит проводил он его или нет. В таком случае он смотрит его текущее состояние и если нужно, то нажимает ОК, иначе Закрыть.
Повторюсь, что это только мое мнение и это нормально, что она не совпадает, к примеру, с Вашим.
(28) ASchekachev,
но, видимо, не сразу…)))… а статья действительно рождалась как-бы «совместно» с сообществом. о чем и свидетельствуют комменты, да вобщем-то в том числе для этого они и нужны…)
как сказать.. есть ряд пользователей которые видят, но сделать ничего не могут… директора, например… (смотрящие со стороны)
Мир этому дому!
Жизнь складывается из мелочей. А хорошая жизнь — из удобных мелочей. Спасибо идею и за статью.
(15) Abadonna, (16)
Чтобы исключить лишние телодвижения при записи объекта, можно сказать ему:
Источник.ОбменДанными.Загрузка = Истина;
(31) ksai, применительно к данной теме — неактуально. Ибо запись всеравно будет происходить (пусть и без встроенных в конфигурацию проверок).
(32)
к данной теме — вне всякого сомнения 🙂 перезаписывать объект для данной задачи — бред с любой точки зрения)
мой комментарий — поправка к конкретному коду пользователя Abadonna
(2) а есть возможность не только проведение отражать, а так же другие состояния: сохранен, помечен на удаление? И лучше конечно бы не в самой форме, а в ее заголовке?
Сделал вроде по методу №2, но состояние отражается не во всех документах, буду разбираться где проблема ), а так спасибо за статью +
(34) kenza, пометку удаления можно отражать «рядом», таким же образом, можно совместить картинку проведенности и пометку удаления, но это потребует усложнения алгоритма; в заголовке — вроде как проще;
Если у Вас при реализации не во всех документах отображается картинка проверьте Вызывается ли процедура ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере из процедуры ПриСозданииНаСервере модуля формы документа.
По моему, при первом способе, надо еще убрать галочки на свойствах
«РастягиватьПоГоризонтали» и «РастягиватьПоВертикали». В противном случае,
занимается лишнее место под картинку.
Пользовался этим способом почти год, и тут раз — 1С сами такое в БП 3.0 сделали…
Думаю, приоритетный вариант с настройкой каждой формы вручную — с т.з. производительности, иначе
требуется обработка модуля с множеством условий.
Но если конфигурация на поддержке в целом, то безусловно вариант с модулем хороший.
Не понимаю, зачем добавлять Поле формы, связывать его с данными.
Предлагаю сделать так:
ПолеПроведен = Форма.Элементы.Вставить(«тфр_КартинкаСтатуса», Тип(«ДекорацияФормы»), Форма.Элементы.Номер.Родитель, Форма.Элементы.Номер);
ПолеПроведен.Вид = ВидДекорацииФормы.Картинка;
Если Форма.Объект.Проведен = Истина Тогда
ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументПроведенКоннекторВерх;
ПолеПроведен.Подсказка = «Проведен»;
ИначеЕсли Форма.Объект.ПометкаУдаления = Истина Тогда
ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументПомеченНаУдалениеКоннекторВерх;
ПолеПроведен.Подсказка = «Помечен на удаление»;
Иначе
ПолеПроведен.Картинка = БиблиотекаКартинок.ДокументЗаписанКоннекторВерх;
ПолеПроведен.Подсказка = «Не проведен»;
КонецЕсли;