Здравствуйте! Я расскажу на примере конфигурации Бухгалтерия предприятия 3.0 как я добавила реквизит "Дата создания" во все документы не снимая документы с поддержки. Предлагаю два варианта решения:
Первый вариант:
1. Создать общий реквизит "_ДатаСоздания", указать состав документов, которые будут содержать данный реквизит;
2. Найти процедуру, в которую обращаются все документы при создании, у меня это процедура "ПриСозданииНаСервере" в общем модуле "ПодключаемыеКоманды" и написать там одну строчку:
Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения = Неопределено) Экспорт
_Общий.ПриСозданииФормыНаСервере(Форма);
//*Дальше стандартный код, я не буду его здесь показывать
КонецПроцедуры
3. И последнее:) Создать общий модуль под названием "_Общий" или использовать существующий, в котором будут лежать нужные процедуры для прорисовки реквизита "Дата создания" на форме документа и на форме списка. Процедуры модуля:
Процедура ПриСозданииФормыНаСервере(Форма) Экспорт
МДФормы = Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы);
МДОбъекта = МДФормы.Родитель();
Если Метаданные.Документы.Содержит(МДОбъекта) Тогда
// это какая то из форм документа
Если Метаданные.ОбщиеРеквизиты._ДатаСоздания.Состав.Найти(МДОбъекта).Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать Тогда
//общий реквизит _ДатаСоздания есть
Если МДФормы = МДОбъекта.ОсновнаяФормаДляВыбора Тогда
//ничего не делаем
ИначеЕсли МДФормы = МДОбъекта.ОсновнаяФормаСписка Тогда
// это основная форма списка
Реквизиты = Форма.ПолучитьРеквизиты();
//МДОбъекта.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный)
Для каждого Рекв из Реквизиты цикл
Если Рекв.ТипЗначения.СодержитТип(Тип("ДинамическийСписок")) Тогда
Список = Форма[Рекв.Имя];
Если Список.ОсновнаяТаблица = МДОбъекта.ПолноеИмя() Тогда
// Это динамический список с нужными документами
ДобавитьДопПоляВДинСписок(Форма, Рекв.Имя);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ИначеЕсли НЕ (Форма.Элементы.Найти("Дата") = Неопределено ИЛИ Форма.Элементы.Найти("Номер") = Неопределено) Тогда
//это форма документа
Если Форма.Параметры.Ключ.Пустая() Тогда
//новый документ - заполним дату создания
Форма.Объект._ДатаСоздания = ТекущаяДата();
КонецЕсли;
ОтобразитьДатуСозданияНаФорме(Форма);
КонецЕсли;
КонецЕсли;
ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(МДОбъекта) Тогда
//журнал документов - добавим поле
ПолеФормы_ДатаСоздания = Форма.Элементы.Добавить("_ДатаСоздания", Тип("ПолеФормы"),Форма.Элементы.Список);
ПолеФормы_ДатаСоздания.Вид = ВидПоляФормы.ПолеВвода;
ПолеФормы_ДатаСоздания.ПутьКДанным = "Список.Ссылка._ДатаСоздания";
ПолеФормы_ДатаСоздания.Заголовок = "Создан";
КонецЕсли;
КонецПроцедуры
Процедура ОтобразитьДатуСозданияНаФорме(Форма)
мЭлементы = Форма.Элементы;
ЭУ = мЭлементы.Найти("_ДатаСоздания");
Если ЭУ = Неопределено Тогда
ГруппаДатаСоздания = мЭлементы.Найти("_ГруппаДатаСоздания");
Если НЕ ГруппаДатаСоздания = Неопределено Тогда
ЭУ = мЭлементы.Добавить("_ДатаСоздания", Тип("ПолеФормы"), ГруппаДатаСоздания);
Иначе
ЭлементОрганизация = мЭлементы.Найти("Организация");
Если ЭлементОрганизация = Неопределено Тогда
//пока просто добавим поле
ЭУ = мЭлементы.Добавить("_ДатаСоздания", Тип("ПолеФормы"));
Иначе
//создадим группу _ДатаСоздания и поместим туда
Если ТипЗнч(ЭлементОрганизация.Родитель) = Тип("ГруппаФормы") Тогда
ГруппаДатаСоздания = мЭлементы.Добавить("_ГруппаДатаСоздания", Тип("ГруппаФормы"), ЭлементОрганизация.Родитель);
Иначе
ГруппаДатаСоздания = мЭлементы.Добавить("_ГруппаДатаСоздания", Тип("ГруппаФормы"));
КонецЕсли;
ГруппаДатаСоздания.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДатаСоздания.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
ГруппаДатаСоздания.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДатаСоздания.ОтображатьЗаголовок = Ложь;
//перемещаем группу перед организацией
мЭлементы.Переместить(ГруппаДатаСоздания, ГруппаДатаСоздания.Родитель, ЭлементОрганизация);
//меняем группу у организации
мЭлементы.Переместить(ЭлементОрганизация, ГруппаДатаСоздания);
//добавляем в созданную группу дату создания
ЭУ = мЭлементы.Добавить("_ДатаСоздания", Тип("ПолеФормы"), ГруппаДатаСоздания);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЭУ.Вид = ВидПоляФормы.ПолеВвода;
ЭУ.ПутьКДанным = "Объект._ДатаСоздания";
ЭУ.Ширина = 12;
ЭУ.РастягиватьПоГоризонтали = Ложь;
ЭУ.Заголовок = "Создан";
ЭУ.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
ЭУ.Доступность = Ложь;
Если НЕ Форма.Параметры.Ключ.Пустая() Тогда
//существующий документ
Если Форма.Объект._ДатаСоздания <> '00010101' Тогда
//дата создания заполнена
РазностьВСекундах = НачалоДня(Форма.Объект._ДатаСоздания) - НачалоДня(Форма.Объект.Дата);
Если РазностьВСекундах / 86400 > 15 Тогда
//совсем задним число ввели - обведем рамку
ЭУ.ЦветРамки = WebЦвета.КрасноФиолетовый;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ОтобразитьДатуСозданияНаФорме()
Процедура ДобавитьДопПоляВДинСписок(Форма, ИмяРеквизита)
Список = Форма[ИмяРеквизита];
ИмяТаблицы = Список.ОсновнаяТаблица;
Если Список.ПроизвольныйЗапрос Тогда
Схема = Новый СхемаЗапроса();
Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);
// Теперь нужно добавить дату создания
Если Схема.ПакетЗапросов.Количество() > 1 Тогда
//внутренние таблицы в дин.списках только с 8.3.8 и пока нигде не используются
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
"Не могу добавить доп.поля, т. к. в пакете больше одного запроса.
|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
Возврат;
КонецЕсли;
ЗапросПакета = Схема.ПакетЗапросов[0];
Если ЗапросПакета.Операторы.Количество() > 1 тогда
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
"Не могу добавить доп.поля, т. к. в запросе больше одного оператора.
|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
Возврат;
КонецЕсли;
ИндексОператора = 0;
Оператор = ЗапросПакета.Операторы[ИндексОператора];
Источник1 = Оператор.Источники[0];
Если ТипЗнч(Источник1.Источник) <> Тип("ТаблицаСхемыЗапроса") или Источник1.Источник.ИмяТаблицы <> ИмяТаблицы тогда
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
"Не могу добавить доп.поля, т. к. первый источник — не основная таблица.
|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
Возврат;
КонецЕсли;
Выражение = Оператор.ВыбираемыеПоля.Добавить(Источник1.Источник.Псевдоним + "._ДатаСоздания");
Колонка = ЗапросПакета.Колонки[ЗапросПакета.Колонки.Количество()-1];
Колонка.Поля.Установить(ИндексОператора, Выражение);
Колонка.Псевдоним = "Создан";
ПсевдонимДока = Источник1.Источник.Псевдоним;
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, ""+ПсевдонимДока+".ПометкаУдаления КАК ПометкаУдаления,", ""+ПсевдонимДока+".ПометкаУдаления,"); //Схема.ПолучитьТекстЗапроса();
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, ""+ПсевдонимДока+".ПометкаУдаления,", ""+ПсевдонимДока+".ПометкаУдаления," + Символы.ПС + ПсевдонимДока +"._ДатаСоздания КАК Создан, "); //Схема.ПолучитьТекстЗапроса();
Элт = Форма.Элементы.Добавить("Создан", Тип("ПолеФормы"), Форма.Элементы[ИмяРеквизита]);
Элт.Вид = ВидПоляФормы.ПолеВвода;
Элт.Заголовок = "Создан";
Элт.ПутьКДанным = ИмяРеквизита + ".Создан";
Элт.Видимость = Истина;
КонецЕсли;
КонецПроцедуры //ДобавитьДопПоляВДинСписок()
Второй вариант:
1. Создать общий реквизит "_ДатаСоздания", указать состав документов, которые будут содержать данный реквизит;
2. Установить расширение, я его тестировала на релизе 3.0.57.10, в принципе будет работать и на прошлых релизах, но придется решить некоторые несоответствия совместимости расширения и конфигурации, т.к. с выходом нового релиза приходится постоянно менять совместимость в расширении... С расширением не придется создавать и снимать общие модули с поддержки), также расширение необходимо снять с безопасного режима.