Набор функций, возвращающих данные из истории версий объекта или "Кто виноват?" оптом

19.12.18

Разработка - Универсальные функции

В рамках одного проекта понадобился функционал который бы сообщал ответ на так интересующий вопрос - "КТО ПОСЛЕДНИЙ МЕНЯЛ?!?" в отчете для большого количества объектов сразу. Найти решения не удалось на просторах интернета и по этому было принято решение сделать "Своё". Задумка очень проста - на входе ссылка на объект и интересующий нас реквизит, а на выходе все подноготная (кто, когда, из какого значения в какое). Хотел бы поделиться данными функциями с сообществом.

Хотелось бы отметить, что программирование в наше время, призвано облегчить работу пользователям и уменьшить количество кликов совершаемых ими до минимума, это и может послужить ответом на вопрос "Почему нельзя просто посмотреть сравнение версий объектов ткнув туда, потом туда, затем туда и потом ещё два раза".

Всё таки стоит отметить, что данные функции предназначены для применения в отчетах и формах с целью сокращения времени затраченного пользователями на анализ вручную отчета по версиям объектов.

Итак начнём с самого простого -

Первая функция ПолучитьИзменившегоРеквизитОбъектаНаДату(СсылкаПоиска,Дата,ИмяРеквизита)

// функция определяет кто, когда и как последний изменял реквизит переданной ссылки до указанной даты//
// Параметры:
//  СсылкаПоиска  - ссылка для которой необходимо определить 
//  Дата  - Дата по которую проверяются версии объектов
//  ИмяРеквизита  - имя реквизитакоторое проверяется изменение
// Возвращаемое значение:
//   Структура   - Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле
//
Функция ПолучитьИзменившегоРеквизитОбъектаНаДату(СсылкаПоиска,Дата,ИмяРеквизита) экспорт

	МетаданныеОбъекта = СсылкаПоиска.ПолучитьОбъект().Метаданные();
	Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
		Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле");
	КонецЕсли; 
	Запр = новый Запрос("ВЫБРАТЬ
	                  
	                    |	ВерсииОбъектов.ТабличныеДокументы КАК ТабличныеДокументы,
	                    |	ВерсииОбъектов.НомерВерсии КАК Версия,
	                    |	ВерсииОбъектов.АвторВерсии КАК АвторВерсии,
	                    |	ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии
	                    |ИЗ
	                    |	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
	                    |ГДЕ
	                    |	ВерсииОбъектов.ДатаВерсии <= &ДатаВерсии
	                    |	И ВерсииОбъектов.Объект = &Объект
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	Версия");
	Запр.УстановитьПараметр("Объект",СсылкаПоиска);
	Запр.УстановитьПараметр("ДатаВерсии",Дата);
	ВыполненныйЗапрос = Запр.Выполнить();
	Если ВыполненныйЗапрос.Пустой() Тогда
	
		Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле");	
	
	КонецЕсли; 
	Результат = ВыполненныйЗапрос.Выгрузить();
	ПоследняяВерсия=неопределено;
	Для каждого РезультатСтрока Из Результат Цикл
		
		ДвоичныеДанные = ВерсионированиеОбъектов.СведенияОВерсииОбъекта(СсылкаПоиска, РезультатСтрока.Версия).ВерсияОбъекта;
		
		Если ДвоичныеДанные = неопределено Тогда
		
			продолжить;
		
		КонецЕсли; 
		
		Объект = ВосстановитьОбъектПоXML(ДвоичныеДанные,"");
		
		Если ПоследняяВерсия=неопределено Тогда
			
		    ПоследняяВерсия = новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле");
			ЗаполнитьЗначенияСвойств(ПоследняяВерсия,РезультатСтрока);
			ПоследняяВерсия.Объект=Объект;	
			ПоследняяВерсия.ЗначениеДо = "";
			ПоследняяВерсия.ЗначениеПосле = Объект[ИмяРеквизита];
			продолжить;
			
		КонецЕсли; 
		Если Объект[ИмяРеквизита] <> ПоследняяВерсия.Объект[ИмяРеквизита] Тогда
			
			ЗаполнитьЗначенияСвойств(ПоследняяВерсия,РезультатСтрока);
			ПоследняяВерсия.Объект = Объект;
			ПоследняяВерсия.ЗначениеДо = ПоследняяВерсия.ЗначениеПосле;
			ПоследняяВерсия.ЗначениеПосле = Объект[ИмяРеквизита];
			
		КонецЕсли; 
	КонецЦикла;
	Если ПоследняяВерсия=неопределено Тогда
		Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле");
	иначе
		Возврат ПоследняяВерсия;
	КонецЕсли;
КонецФункции // ПолучитьИзменившегоРеквизитОбъектаНаДату()

Это простая функция которая просто вернёт нам необходимые данные структурой. И тут, я считаю, комментарии дополнительные излишни.

Казалось бы - задача выполнена и можно остановиться, но как быть с табличными частями? Ответом на этот вопрос и послжит

Вторая функция ПолучитьИзменившегоСтрокуТЧОбъектаНаДату

// функция определяет кто, когда и как последний изменял реквизит строки табличной части переданной ссылки до указанной даты//
// Параметры:
//  СсылкаПоиска  - ссылка для которой необходимо определить 
//  Дата  - Дата по которую проверяются версии объектов
//  ИмяТЧ  - имя табличной части проверяется изменение
//  ИмяРеквизитаТЧ - имя колонки значение которой проверяется
//  СтруктураОтбораСтрокиТЧ - структура с параметрами ИменаКолонок - имя колонки по которой будет поиск, Значение - искомое значение. 
//                            К табличной части по этим данным применится функция Найти(<Значение>, <Колонки>) для определения строки.
// Возвращаемое значение:
//   Структура   - Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ
//
Функция ПолучитьИзменившегоСтрокуТЧОбъектаНаДату(СсылкаПоиска,Дата,ИмяТЧ,ИмяРеквизитаТЧ,СтруктураОтбораСтрокиТЧ)экспорт 	
	Если 	СсылкаПоиска.ПолучитьОбъект().Метаданные().ТабличныеЧасти.Найти(ИмяТЧ) 	= Неопределено
			или СсылкаПоиска.ПолучитьОбъект().Метаданные().ТабличныеЧасти[ИмяТЧ].реквизиты.найти(ИмяРеквизитаТЧ)  = неопределено
			или	СтруктураОтбораСтрокиТЧ.Свойство("ИменаКолонок") 				= ложь 
			или СтруктураОтбораСтрокиТЧ.Свойство("Значение") 					= ложь Тогда
			
		Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ");
		
	КонецЕсли; 
	Запр = новый Запрос("ВЫБРАТЬ
	                  
	                    |	ВерсииОбъектов.ТабличныеДокументы КАК ТабличныеДокументы,
	                    |	ВерсииОбъектов.НомерВерсии КАК Версия,
	                    |	ВерсииОбъектов.АвторВерсии КАК АвторВерсии,
	                    |	ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии
	                    |ИЗ
	                    |	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
	                    |ГДЕ
	                    |	ВерсииОбъектов.ДатаВерсии <= &ДатаВерсии
	                    |	И ВерсииОбъектов.Объект = &Объект
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	Версия");
	Запр.УстановитьПараметр("Объект",СсылкаПоиска);
	Запр.УстановитьПараметр("ДатаВерсии",Дата);
	ВыполненныйЗапрос = Запр.Выполнить();
	Если ВыполненныйЗапрос.Пустой() Тогда
	
		Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ");	
	
	КонецЕсли; 
	Результат = ВыполненныйЗапрос.Выгрузить();
	
	ПоследняяВерсия=неопределено;
	
	Для каждого РезультатСтрока Из Результат Цикл
		
		ДвоичныеДанные = ВерсионированиеОбъектов.СведенияОВерсииОбъекта(СсылкаПоиска, РезультатСтрока.Версия).ВерсияОбъекта;
		
		Если ДвоичныеДанные = неопределено Тогда
		
			продолжить;
		
		КонецЕсли; 
		
		Объект = ВосстановитьОбъектПоXML(ДвоичныеДанные,"");
		Попытка
		
			СтрокаТЧ = Объект[ИмяТЧ].найти(СтруктураОтбораСтрокиТЧ.Значение,СтруктураОтбораСтрокиТЧ.ИменаКолонок);	
		
		Исключение
		    Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ");
		КонецПопытки; 
		Если СтрокаТЧ = неопределено Тогда
		
			продолжить;
		
		КонецЕсли; 
		ЗначениеСтроки = СтрокаТЧ[ИмяРеквизитаТЧ];
		
		Если ПоследняяВерсия	=	неопределено Тогда
			
		    ПоследняяВерсия = новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ");
			ЗаполнитьЗначенияСвойств(ПоследняяВерсия,РезультатСтрока);
			ПоследняяВерсия.Объект=Объект;	
			ПоследняяВерсия.ЗначениеДо = "";
			ПоследняяВерсия.ЗначениеПосле = ЗначениеСтроки;
			ПоследняяВерсия.ИндексСтрокиТЧ = СтрокаТЧ.НомерСтроки;
			продолжить;
			
		КонецЕсли; 
		Если ЗначениеСтроки <> ПоследняяВерсия.ЗначениеПосле Тогда
			
			ЗаполнитьЗначенияСвойств(ПоследняяВерсия,РезультатСтрока);
			ПоследняяВерсия.Объект = Объект;
			ПоследняяВерсия.ЗначениеДо = ПоследняяВерсия.ЗначениеПосле;
			ПоследняяВерсия.ЗначениеПосле = ЗначениеСтроки;
			ПоследняяВерсия.ИндексСтрокиТЧ = СтрокаТЧ.НомерСтроки;
			
		КонецЕсли; 
	КонецЦикла;
	Если ПоследняяВерсия	=	неопределено Тогда
			
		    Возврат новый Структура("Объект,ДатаВерсии,АвторВерсии,ЗначениеДо,ЗначениеПосле,ИндексСтрокиТЧ");	
			
	КонецЕсли;
	Возврат ПоследняяВерсия;
КонецФункции // ПолучитьИзменившегоРеквизитОбъектаНаДату()

Тут может возникнуть ряд вопросов на которые я постараюсь ответить сразу:

Из описания функции становится понятно, что работать будем именно со строкой данных, а не с таблицей в целом, так сделано для упрощения получения данных в отчете, у нескольких строк могут быть разные авторы версии, что пагубно скажется на группировке в иерархии, для определения конкретной строки я использовал именно функцию Найти, а не НайтиСтроки  - потому, что найти возвращает конкретную строку, тогда как другая функция - массив строк, пришлось бы ещё выбирать, что не есть удобно. 

Теперь нам понадобится функция которая вернет одно конкретное значение, до текущего момента мы получали обратно структуры данных, а её использовать в обращении через СКД не очень то и удобно. Для этого есть 

Третья функция ПолучитьУказанныеДанныеПоИзменениямРеквизитаИзИсторииОбъекта

// функция определяет кто или когда или как последний изменял реквизит строки табличной части или реквизита переданной ссылки до указанной даты 
// если не задано имя ТЧ то ищится реквизит ссылки
// Параметры:
//  СсылкаПоиска  - ссылка для которой необходимо определить 
//  Дата  - Дата по которую проверяются версии объектов
//  ИмяРеквизитаПроверки  - имя реквизитакоторое проверяется изменение  или имя колонки значение которой проверяется
//  РеквизитВозврата  - Имя того, что нужно получить: "Объект","ДатаВерсии","АвторВерсии","ЗначениеДо","ЗначениеПосле","ИндексСтрокиТЧ"
//  ИмяТЧ  - имя табличной части проверяется изменение
//  ИменаКолонокПоиска - имя колонки по которой будет поиск. К табличной части по этим данным применится функция Найти(<Значение>, <Колонки>) для определения строки. 
//  ЗначениеПоиска - искомое значение. К табличной части по этим данным применится функция Найти(<Значение>, <Колонки>) для определения строки.                           
// Возвращаемое значение:
//   Зависит от переданного параметра РеквизитВозврата.
функция ПолучитьУказанныеДанныеПоИзменениямРеквизитаИзИсторииОбъекта(СсылкаПоиска,Дата,ИмяРеквизитаПроверки,РеквизитВозврата,ИмяТЧ = "",ИменаКолонокПоиска = "", ЗначениеПоиска = "")экспорт
	
	Если ИмяТЧ = "" Тогда
	
		ПолученнаяСтруктура = ПолучитьИзменившегоРеквизитОбъектаНаДату(СсылкаПоиска,Дата,ИмяРеквизитаПроверки);	
	
	Иначе
	
		ПолученнаяСтруктура = ПолучитьИзменившегоСтрокуТЧОбъектаНаДату(СсылкаПоиска,Дата,ИмяТЧ,ИмяРеквизитаПроверки,Новый Структура("ИменаКолонок, Значение",ИменаКолонокПоиска,ЗначениеПоиска));		
	
	КонецЕсли;
	НеобходимоеЗначение = "";
	Если ТипЗнч(ПолученнаяСтруктура) = тип("Структура") и ПолученнаяСтруктура.Свойство(РеквизитВозврата,НеобходимоеЗначение) Тогда
	
		возврат НеобходимоеЗначение;	
	
	КонецЕсли; 
КонецФункции

Данная функция добавляет универсальности всему механизму, так-как позволяет обращаться в одну точку и в зависимости от набора параметров возвращает конкретное значение, это будет удобно для использования в СКД. 

Все это строится на БСП и будет работать на актуальных релизах программ поддерживающих версионирование объектов. Единственный "прокол" в БСП это то что их функция ВосстановитьОбъектПоXML (код см. ниже) не является экспортно, что несколько усложняет нам жизнь по этому нам понадобится добавить её в наш модуль где будут располагаться пред идущие три красавицы. 

Функция ВосстановитьОбъектПоXML(ДанныеОбъекта, ТекстСообщенияОбОшибке = "")экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ДвоичныеДанные = ДанныеОбъекта;
	Если ТипЗнч(ДанныеОбъекта) = Тип("Структура") Тогда
		ДвоичныеДанные = ДанныеОбъекта.Объект;
	КонецЕсли;
	
	ЧтениеFastInfoSet = Новый ЧтениеFastInfoSet;
	ЧтениеFastInfoSet.УстановитьДвоичныеДанные(ДвоичныеДанные);
	
	Попытка
		Объект = ПрочитатьXML(ЧтениеFastInfoSet);
	Исключение
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Версионирование'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ТекстСообщенияОбОшибке = НСтр("ru = 'Не удалось перейти на выбранную версию.
											|Возможная причина: версия объекта была записана в другой версии программы.
											|Техническая информация об ошибке: %1'");
		ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Неопределено;
	КонецПопытки;
	
	Возврат Объект;
	
КонецФункции

Как разработчик этого всего заявляю, что метод довольно варварский, и работает "со скрипом", это связанно с тем, что у 1с всё хранится в хранилище данных в виде двоичного кода и метод получить всё это - развернуть через XML что в цикле даст огромный труд, а если сложить это всё с тем, что у нас будут корячиться запросы в цикле - то можно смело ставить два на экзамене, но в защиту хотелось бы сказать, что это расширяет функционал СКД и позволит получать сведения о интересующих нас негодяях пользователях в отчетах и "давать по рукам" в режиме online и оптом.

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

Разработка и тестирование велись на 1С:Предприятие 8.3 (8.3.13.1644) в конфигурации 1С:ERP Управление предприятием 2 (2.4.5.143)

Для функционирования необходимо подключенная к конфигурации БСП Версионирования объетков и включенная в использовании.

Отчеты историяизменения версии объектов СКД ВерсииОбъектов ЖурналРегистрации журнал регистрации разработка

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    20235    dimanich70    81    

145

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4100    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18194    atdonya    24    

57

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5508    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14774    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3593    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18498    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. zeegin 117 19.12.18 15:34 Сейчас в теме
Разве это не типовой функционал БСП?
Документация:
https://its.1c.ru/db/bsp302doc#content:1858:1:issogl1_%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80_%D0­%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8_%D0%B8%D0%B7%D0%BC%D­0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%­D0%BA%D1%82%D0%B0

Можно перейти к отчету по всем версиям объектов и отобрать в каких версиях конкретные интересующие реквизиты менялись...
Прикрепленные файлы:
andrvyst; ktb; user633533_encantado; RustIG; +4 Ответить
3. RustIG 1747 19.12.18 15:45 Сейчас в теме
(1) круто придумали!
что еще я не знаю?
7. feva 525 19.12.18 16:50 Сейчас в теме
(1) Абсолютно верно, именно об этом и и писал в самом начале статьи, рад что вы "Внимательно" прочитали
8. feva 525 19.12.18 16:51 Сейчас в теме
(1)
Хотелось бы отметить, что программирование в наше время, призвано облегчить работу пользователям и уменьшить количество кликов совершаемых ими до минимума, это и может послужить ответом на вопрос "Почему нельзя просто посмотреть сравнение версий объектов ткнув туда, потом туда, затем туда и потом ещё два раза"
2. user633533_encantado 11 19.12.18 15:44 Сейчас в теме
"Найти решения не удалось" - садись, два. Идите учить БСП и на пересдачу.
4. RustIG 1747 19.12.18 15:46 Сейчас в теме
(2) не кидайте камнями - это легче всего, покажите путь и дайте фонарь
5. user633533_encantado 11 19.12.18 15:58 Сейчас в теме
(4) Открываем конфигурацию "Библиотека стандартных подсистем" и изучаем подсистему "Версионирование объектов".
Что же вы там за "проекты" делаете с такими знаниями типовых подсистем ?
6. feva 525 19.12.18 16:49 Сейчас в теме
(5) Хорошо, простой вопрос - какая функция мне вернет одно значение - кто изменил реквизит?
thedarkness; +1 Ответить
9. feva 525 19.12.18 16:54 Сейчас в теме
(2) Товарищ магистр БСП, подскажите неучу каким образом можно получить в отчет на СКД кто изменил тот или иной реквизит
thedarkness; +1 Ответить
10. user633533_encantado 11 19.12.18 17:09 Сейчас в теме
(9) Не подскажу, так как это нафиг никому не нужная вещь , есть типовой отчет сравнения версий вызываемый из любого объекта подключенного к подсистеме.

Но вы всегда можете изобрести велосипед под хотелку заказчика, ваше право.
11. feva 525 19.12.18 17:13 Сейчас в теме
(10)т.е. нет такого функционала в БСП? Или Вы плохо знаете БСП?
Про типовой отчет сравнения версий написано ещё в начале статьи, и почему он не используется в некоторых случаях.
Raskad; thedarkness; +2 Ответить
12. zeegin 117 19.12.18 17:25 Сейчас в теме
(11) Т.е. заполнить левую форму отбора набором параметров проще, чем пару раз ткнуть?
Ответ на вопрос-то где? "Почему нельзя просто посмотреть сравнение версий объектов ткнув туда, потом туда, затем туда и потом ещё два раза". Что улучшено? Как было, как сейчас? Почему это лучше в вашем сценарии? Почему в общем случае лучше БСП, а не ваш сценарий?

Где ответы на вопросы? Я вижу портянку текста кода и поноса мыслей, простите, а ответа на то почему стало лучше решать главный вопрос "КТО ПОСЛЕДНИЙ МЕНЯЛ?!?" не вижу.
andrvyst; +1 Ответить
13. feva 525 19.12.18 17:35 Сейчас в теме
(12)Левая форма была как пример использования функций.
Для анализа изменений одного реквизита одной реализации пользователю нужно сделать 5 действий и проанализировать портяночный отчет, что бы посмотреть кто сделал последним изменение.
Вопрос - сколько нужно действий что бы проверить 1000 реализаций?
Raskad; thedarkness; RustIG; +3 Ответить
16. zeegin 117 19.12.18 18:26 Сейчас в теме
(13) Зачем проверять 1000 реализаций? Какая проблема решается?
19. muskul 20.12.18 07:06 Сейчас в теме
(16)Например проблема кто и когда менял документы за определенный период. Этого отчета очень нехватает в типовых конфигурациях. Клиент хочет знать простой ответ, кто менял какие документы.
24. zeegin 117 20.12.18 18:54 Сейчас в теме
27. muskul 21.12.18 04:36 Сейчас в теме
(24) можешь пример отчета из такого журнала привести.Период месяц показать все реализации которые менялись в этом месяце.
28. zeegin 117 21.12.18 09:19 Сейчас в теме
(27) Администрирование, Обслуживание, Журнал регистрации, Установить отбор: Интервал, События, Метаданные.
Прикрепленные файлы:
32. muskul 23.12.18 05:21 Сейчас в теме
(28)И он тебе покажет все документы которые записывал менеджер за месяц. а нужны только дважды записанные.
21. feva 525 20.12.18 08:43 Сейчас в теме
(16) Допустим отдел аналитики хочет понять, кто из ответственных обособленных подразделений выставляет больше скидок, а кто больше наценок за прошедший год для премирования.
25. zeegin 117 20.12.18 18:58 Сейчас в теме
(21) Зачем для такого отчета версии? Для премирования надо использовать реальные продажи и реальные полученные деньги, а не скидку, которая потом была отменена. Да и вообще строить отчет с аналитикой для принятия управленческого решения по данным из документа, а не из регистра, это моветон.
30. feva 525 21.12.18 17:21 Сейчас в теме
(25) Это как пример и причины могут быть использовать именно версии.
На местах могут работать команды которые заводят и редактируют данные в хаотичном порядке. Менеджером продажи выступает один человек, о ценах договаривался другой человек, отгрузку и логистику рассчитывал третий человек, и если изначально не реализовано техническим, что фиксируется кто последний менял, а потом за год хотят получить эти данные, то журнал регистрации не несёт в себе ни какие были данные, ни когда их устанавливали. А когда штат работающий с 1с переваливает за 1к пользователей с каждой обособкой разбираться никто не захочет, но данные требуют уже вчера. По этому и приходится делать варварские решения (почему они не эффективны тоже описано в статье), но предоставляющие необходимые данные. Бывают и другие жизненные ситуации когда данные можно получить из регистра версий, но как правило приходилось отказывать клиентам.
31. feva 525 21.12.18 17:27 Сейчас в теме
(25) С опытом, и в Вашей практике появятся задачи требующие решения, пусть и не самого рационального на первый взгляд и это не единственный случай.
thedarkness; +1 Ответить
14. feva 525 19.12.18 17:51 Сейчас в теме
(12) все ответы в конце статьи, зачем использовать эти функции, их минусы и плюсы.
это расширяет функционал СКД и позволит получать сведения о интересующих нас пользователях в отчетах и "давать по рукам" в режиме online и оптом.

Данный функционал можно так же прикрутить к кнопке на форме документа, которая будет возвращать вам информацию о том, кто последний изменял скидки в заказе по которому сделана реализация или к примеру того, кто изменил условия оплаты договора перед тем, как провести реализацию и т.д.
15. zeegin 117 19.12.18 18:25 Сейчас в теме
(14) т.е. это не общее решение, а точечно, да еще и программировать надо...

и это вместо того, чтобы, считаем:
1. перейти на вкладку
2. открыть форму отбора реквизита по которому надо найти изменения
3. применить отбор
4. нажать кнопку сравнения версий

Вот если выбирать что проще, написать отчет или сделать кнопку с выводом или это же сделать в форме отчета бсп в режиме пользователя, что проще?
23. feva 525 20.12.18 09:10 Сейчас в теме
(15) С точки зрения программирования - проще отправить пользователя в типовой. Это не замена ему, а расширение. Для решения локальной задачи в рамках одного объекта, в большинстве случаев, лучше использовать типовой вариант. Данное решение имеет место быть если нужно получать информацию по большому объему объектов.
17. bulpi 217 19.12.18 18:45 Сейчас в теме
Не понял. Что это за регистр ВерсииОбъектов ?
Разве в новой платформе версионирование не встроено ?
20. feva 525 20.12.18 08:41 Сейчас в теме
(17) Да, все верно! Есть типовое решение которое позволяет в рамках одного документа посмотреть его версии (если включено версионирование), но порой не хватает отчета который покажет массово объекты и пользователей их изменяющие.
18. RustIG 1747 19.12.18 21:33 Сейчас в теме
в любом случае, какая ни была статья, обсуждение полезно
triviumfan; +1 Ответить
22. feva 525 20.12.18 08:47 Сейчас в теме
26. acanta 20.12.18 22:58 Сейчас в теме
Можно ли по регистру сведений получить срез последних и показать отдельной колонкой к примеру в справочнике контрагенты (форма списка) дату и автора последних изменений (и вообще имеет ли смысл записывать признак изменения и авторство в элемент справочника партнеры при модификации к примеру соглашения или условий договора) вместо/по аналогии с типовой датой создания и менеджером?
29. feva 525 21.12.18 17:13 Сейчас в теме
(26) В том и проблема, что нельзя напрямую, т.к. данные (дата и автор версии) хранятся в регистре в хранилище значений как двоичные данные и запросом пока нет технической возможности получить, для этого нужны данные функции.
Мог зайти человек создать контрагента и записать его номер телефона. Следом зашёл другой человек и изменил номер, но допустил ошибку, вот можно использовать эти функции, что бы рядом с номером указывать того, кто этот номер ввёл и какой он был раньше.
33. androgin 17.01.19 14:31 Сейчас в теме
Устарело.
В текущих версиях можно использовать ИсториюДанных.
Ну или журнал регистрации будет интересней, чем версионирование.
Надеюсь в скором будущем 1С откажется от этой подсистемы в пользу ИсторииДанных
34. thedarkness 03.11.22 10:32 Сейчас в теме
Полезная вещь. Пригодилась.
По поводу последнего комментария, что неактуально и можно использовать Историю данных - это конфигурацию снимать с поддержки и менять настройку объекта. БСП механизм версионирования не связан с Историей данных. Версионирование включено - История данных пустая.
35. tgr123 32 12.01.24 17:09 Сейчас в теме
Если кто то еще интересуется подобным функционалом, то посмотрите на это (не моё, но очень помогло): https://infostart.ru/1c/reports/1118272/
36. iiceberg 92 10.06.24 15:32 Сейчас в теме
Возникла потребность восстановить комментарий справочнике из предыдущей версии.
Решил в консоли запросов с обработкой результата.

Запрос:

ВЫБРАТЬ //ПЕРВЫЕ 10
	уатТС.Ссылка КАК Ссылка,
	МАКСИМУМ(ВерсииОбъектов.НомерВерсии) КАК НомерВерсии
ИЗ
	Справочник.уатТС КАК уатТС
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
		ПО (уатТС.Ссылка = ВерсииОбъектов.Объект)
СГРУППИРОВАТЬ ПО
	уатТС.Ссылка
Показать


Обработка результата:
СтруктураВерсии = ВерсионированиеОбъектов.РазборВерсии(Выборка.Ссылка, Выборка.НомерВерсии-1);
ТабРевизитов = СтруктураВерсии.Реквизиты;
Для Каждого стр из ТабРевизитов Цикл
	Если Стр["НаименованиеРеквизита"] = "Комментарий" ТОгда
		//Сообщить(Стр["НаименованиеРеквизита"] +" " + стр["ЗначениеРеквизита"]);
		ТС = Выборка.Ссылка.ПолучитьОбъект();
		ТС.Комментарий = стр["ЗначениеРеквизита"];
		// ТС.ОбменДанными.Загрузка=Истина; // если по быстрому и без лишних проверок, без записи еще одной версии 
		ТС.Записать();
	КонецЕсли;
КонецЦикла;

// заменить "комментарий" на свой вариант

Показать


зы:
м.б. кому пригодится.
Оставьте свое сообщение