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

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С 8.3.24)

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

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4610    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8824    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2072    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16147    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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

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

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

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

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