Дата создания во всех документах, не снимая документы с поддержки

Программирование - Практика программирования

Дата создания во всех документах, при этом документы остаются на поддержке

Здравствуйте! Я расскажу на примере конфигурации Бухгалтерия предприятия 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, в принципе будет работать и на прошлых релизах, но придется решить некоторые несоответствия совместимости расширения и конфигурации,  т.к. с выходом нового релиза приходится постоянно менять совместимость в расширении... С расширением не придется создавать и снимать общие модули с поддержки), также расширение необходимо снять с безопасного режима.

Скачать файлы

Наименование Файл Версия Размер
Расширение по дате создания:
.cfe 8,75Kb
09.01.18
0
.cfe 8,75Kb Скачать

См. также

Комментарии
1. script Мальчинко (script) 197 08.01.18 03:58 Сейчас в теме
Вы хотя бы написали бы причину, почему это нельзя сделать через расширения.
motorsoft; Silenser; alexveraww; +3 Ответить
3. Маргарита Мальцева (Margo462) 60 08.01.18 09:43 Сейчас в теме
(1) можно попробовать в расширении добавить общий модуль и там процедуры те написать, и перехватить модуль подключаемых команд, я делала это давно когда расширения еще не перехватывали процедуры, надо будет попробовать, тут уже на Ваш вкус, как говориться))
4. Маргарита Мальцева (Margo462) 60 08.01.18 09:46 Сейчас в теме
(1) я не помню просто в 8.3.9 проблема была с общими модулями, поэтому если сделаю в расширении, то добавлю сюда
13. Сергей Иванов (u_n_k_n_o_w_n) 31 08.01.18 10:40 Сейчас в теме
(1),
Как только данные расширения "глючить" перестанут и будут поддерживать полный функционал изменения типовой конфигурации, тогда будет можно говорить, как про инструмент изменения типовых конфигураций.
А так можно все менять непосредственно в конфигурации, при этом спокойно обновляя на последующие релизы.

Расширения больше нужны для Freshа.
rpgshnik; +1 Ответить
2. Тахир Акчурин (tahir.akchurin) 08.01.18 06:24 Сейчас в теме
Отличное решение, когда необходимо видеть дату создания именно в списке документов.
В других случаях можно настроить Версионирование объектов
igo1; rpgshnik; u_n_k_n_o_w_n; +3 Ответить
5. Алексей Ермилов (Alex_E) 1637 08.01.18 09:46 Сейчас в теме
Сказать, что это удивительно
Правда этот общий модуль придется снять с поддержки;
- ничего не сказать...

Добавить нужный модуль в расширение, создать там процедуру

&После("ПриСозданииНаСервере")
Процедура _ПриСозданииНаСервереФорма, ПараметрыРазмещения = Неопределено) Экспорт 


и все дела... А то как - то смысл заголовка "не снимая документы с поддержки" смазывается...
vovan_victory; rpgshnik; u_n_k_n_o_w_n; +3 Ответить
6. Маргарита Мальцева (Margo462) 60 08.01.18 09:50 Сейчас в теме
(5) этот вариант точно работает, можете попробовать в расширении перехватить
7. Маргарита Мальцева (Margo462) 60 08.01.18 09:53 Сейчас в теме
(5) там же не написано не снимая конфы с поддержки, там только про документы, так что не придирайтесь)
u_n_k_n_o_w_n; +1 Ответить
8. Алексей Ермилов (Alex_E) 1637 08.01.18 09:56 Сейчас в теме
(7) Да я и не придираюсь, просто удивляюсь, что сказав "А" Вы говорите что "Б" не бывает))))

ЗЫ а в (6) это что? вопрос, пожелание, утверждение?

ЗЫЫ вообще-то я Вам помочь хотел - вернуться на поддержку полностью (в чём, собственно, ИМХО, суть расширений). А то как у Ширвинта - "тут играем, тут пропускаем, тут мы рыбу заворачивали")))))
9. Маргарита Мальцева (Margo462) 60 08.01.18 10:02 Сейчас в теме
(8) ахах))))) полностью не вернемся на поддержку там общий реквизит надо вставлять, расширение позже будет)
10. Алексей Ермилов (Alex_E) 1637 08.01.18 10:08 Сейчас в теме
(9) Дополнительное сведение спасёт отца русской демократии ситуацию не дожидаясь выхода релиза в режиме совместимости с 8.3.11...понимаю, что с ДС работать чуть сложнее, чем с добавленным реквизитом (кстати, что есть общий реквизит просветите пожалуйста, как создаётся, с чем едят?), но снятия с поддержки тут ни разу не нужно...
11. Маргарита Мальцева (Margo462) 60 08.01.18 10:17 Сейчас в теме
(10) согласна, придется заморочиться с ДС, у меня конфа давно снята с поддержки, поэтому общий реквизит не мешает) в отличие от ДС общий реквизит можно создать один раз и указать в каких объектах будет участвовать, удобно и быстро)
12. Алексей Ермилов (Alex_E) 1637 08.01.18 10:38 Сейчас в теме
(11) ДС тоже разные бывают, общие в том числе...
u_n_k_n_o_w_n; +1 Ответить
14. Маргарита Мальцева (Margo462) 60 08.01.18 10:41 Сейчас в теме
15. q_i 325 08.01.18 15:28 Сейчас в теме
s/снять с поддержки/разрешить редактирование с сохранением поддержки/ ;)
rpgshnik; +1 Ответить
16. Биг Босс (BigBoss) 3 09.01.18 09:54 Сейчас в теме
Очень интересное решение!!!
17. Александр Закиров (sasha777666) 260 10.01.18 10:46 Сейчас в теме
Функция ДатаСозданияСсылки(Ссылка)
    ГУИД = Ссылка.УникальныйИдентификатор();
    Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
    Разрядность = СтрДлина(Строка16);
    ЧислоСек = 0;
    Для Позиция = 1 По Разрядность Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
    КонецЦикла;
    ЧислоСек = ЧислоСек / 10000000;
    Возврат Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
КонецФункции
Показать
klinval; Klash; корум; itriot11; the1; Korolev; 02RUSlan; primat; DarkAn; Margo462; +10 1 Ответить
18. Пафнутий Чебышев (primat) 362 10.01.18 14:43 Сейчас в теме
Пока смотрел публикацию, думал о том, что ведь правда в ссылке хранится дата создания объекта. В (17) привели пример. Считаю, решение более корректно и повлиять никто не сможет на эту дату. Недостаток только в том, что в форму списка это не получится вывести.
19. Маргарита Мальцева (Margo462) 60 10.01.18 14:59 Сейчас в теме
(18) это да, с формой списка заморочка)
20. П Ж (palsergeich) 10.01.18 15:13 Сейчас в теме
(17) (18) Вы же понимаете, что дата создания документа в конкрентой базе и дата из GUID могут быть различные (такое возможно например при обмене при синхронизации по guid)
AZel84; Irwin; корум; +3 Ответить
Оставьте свое сообщение