Доработка механизма версионирования объектов

09.05.15

База данных - Инструменты администратора БД

Пара небольших доработок:
1. Исправлена ошибка построения отчета по версиям объектов для случая, когда реквизиты имеют составной тип.
2. Доработан механизм сохранения версий - при записи неизмененных объектов новые версии не создаются.

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

Наименование Файл Версия Размер
Исправление
.rar 138,36Kb
11
.rar 138,36Kb 11 Скачать

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

На Рис.1 отображен результат ошибочного построения. Этот же отчет после исправления ошибки показан на Рис.2.

В архивном файле публикации:
  - файл ""Общий модуль ВерсионированиеОбъектов_ Модуль.txt" " содержит исправленную функцию  ВерсионированиеОбъектов.РазборПредставленияОбъектаXML(), которая участвует в построении корректного отчета о версии объекта.
  - файл ""Общий модуль ВерсионированиеОбъектовСобытия_ Модуль.txt" " включает доработанный механизм сохранения версий объектов, неизмененные версии объектов не создаются.

Изменения в указанных двух файлах независимы и могут применяться раздельно. Все изменения включены в комментирующие скобки // +AZ , // -AZ


См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

12000 руб.

06.12.2023    3006    15    1    

34

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3634    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177829    1074    0    

852

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27413    79    146    

60

Система хранения присоединенных файлов в томах на диске

Инструменты администратора БД Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    61324    88    59    

73

"Менеджер потоков 2.1": УПП: "Восстановление партий"

Инструменты администратора БД Платформа 1С v8.3 1С:Управление производственным предприятием Россия Бухгалтерский учет Управленческий учет Платные (руб)

Как оптимизировать то, что, считалось, не поддается оптимизации? Как повысить доступность базы данных? Как проводить самую «времяемкую» операцию не по паре раз в неделю, а по несколько раз в день*? Ответ есть!

20000 руб.

12.09.2019    11752    5    9    

7

Брандмауэр для сервера 1С Предприятие 8 - внешнее управление сеансами

Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Управление возможностью начала и возобновления сеансов пользователей по различным условиям, ограничение общего числа возможных сеансов для работы с информационной базой, резервирование возможности работы с информационной базой определенных польззователей, запрет запуска нескольких сеансов для пользователя, журнализация событий начала (возобновления) и завершения (гибернации) сеансов, ведение списка активных сеансов для информационных баз кластера серверов

3600 руб.

06.02.2017    31120    31    18    

47

Хранилище файлов на SQL

Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Управленческий учет Платные (руб)

Привязка файлов / сканов к объектам 1С с сохранением их на SQL-сервере

12000 руб.

09.10.2019    10994    5    8    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ojiojiowka 10.05.15 13:43 Сейчас в теме
Вся суть инфостарта: народ жмется даже кусочек кода выложить просто так.
2. webester 26 10.05.15 14:12 Сейчас в теме
(1)Это не вся суть, :) но такое иногда имеет место быть.
3. hobi 615 10.05.15 14:42 Сейчас в теме
(1) ojiojiowka, кусочек не жалко, но он большой и их два :)
Кусочек общего модуля ВерсионированиеОбъектов с исправлением ошибки в функции РазборПредставленияОбъектаXML():

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

КонецФункции
// -AZ 

Функция РазборПредставленияОбъектаXML(ДвоичныеДанные, Ссылка) Экспорт
	
	// Содержит имя метаданного измененного объекта.
	Перем ИмяОбъекта;
	
	// Содержит положение маркера в дереве XML.
	// Требуется для идентификации текущего элемента.
	Перем УровеньЧтения;
	
	// Содержат значения реквизитов справочников / документов.
	ЗначенияРеквизитов = Новый ТаблицаЗначений;
	
	ЗначенияРеквизитов.Колонки.Добавить("НаименованиеРеквизита");
	ЗначенияРеквизитов.Колонки.Добавить("ЗначениеРеквизита");
	ЗначенияРеквизитов.Колонки.Добавить("ТипРеквизита");
	ЗначенияРеквизитов.Колонки.Добавить("Тип");
	
	ТабличныеЧасти = Новый Соответствие;
	
	ЧтениеXML = Новый ЧтениеFastInfoSet;
	
	ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные);
	
	// Уровень позиции маркера в иерархии XML:
	// 0 - уровень не задан
	// 1 - первый элемент (имя объекта)
	// 2 - описание реквизита или табличной части
	// 3 - описание строки табличной части
	// 4 - описание поля строки табличной части.
	УровеньЧтения = 0;
	
	МетаданныеОбъекта = Ссылка.Метаданные();
	ТабличныеЧастиМТД = МетаданныеОбъекта.ТабличныеЧасти;
	
	ТипЗначения = "";
	
	ТипЗначенияПоляТЧ = "";
	
	// Основной цикл разбора по XML.
	Пока ЧтениеXML.Прочитать() Цикл
		
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			УровеньЧтения = УровеньЧтения + 1;
			Если УровеньЧтения = 1 Тогда // Указатель на первом элементе XML - корень XML.
				ИмяОбъекта = ЧтениеXML.Имя;
			ИначеЕсли УровеньЧтения = 2 Тогда // Указатель на втором уровне - это реквизит или имя табличной части.
				ИмяРеквизита = ЧтениеXML.Имя;
				ОписаниеРеквизита = Неопределено;
				НовоеЗР = Неопределено;
				ЗначениеПоля = Неопределено;
				ЗначениеРеквизитаДобавлено = ПроверитьСоставныеТипы(ЧтениеXML,МетаданныеОбъекта,ИмяРеквизита,ЗначенияРеквизитов,ОписаниеРеквизита,УровеньЧтения,НовоеЗР,Ложь,ЗначениеПоля);
				
				// Любой реквизит "может оказаться" табличной частью, поэтому на всякий случай его запомним.
				ИмяТабличнойЧасти = ИмяРеквизита;
				Если МетаданныеОбъекта.ТабличныеЧасти.Найти(ИмяТабличнойЧасти) <> Неопределено И ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда
					ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений);
				КонецЕсли;
				
				Если Не ЗначениеРеквизитаДобавлено Тогда
					НовоеЗР = ЗначенияРеквизитов.Добавить();
					НовоеЗР.НаименованиеРеквизита = ИмяРеквизита;
				КонецЕсли;
				
// +AZ 
				//Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
				//	Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
				//		Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут 
				//		   И ЧтениеXML.Имя = "xsi:type" Тогда
				//			НовоеЗР.ТипРеквизита = ЧтениеXML.Значение;
				//			
				//			XMLТип = ЧтениеXML.Значение;
				//			
				//			Если Лев(XMLТип, 3) = "xs:" Тогда
				//				НовоеЗР.Тип = ИзXMLТипа(Новый ТипДанныхXML(Прав(XMLТип, СтрДлина(XMLТип)-3), "http://www.w3.org/2001/XMLSchema"));
				//			Иначе
				//				НовоеЗР.Тип = ИзXMLТипа(Новый ТипДанныхXML(XMLТип, ""));
				//			КонецЕсли;
				//			
				//		КонецЕсли;
				//	КонецЦикла;
				//КонецЕсли;
// -AZ 
				
				Если Не ЗначениеЗаполнено(НовоеЗР.Тип) Тогда
// +AZ ОписаниеРеквизита получены значение выше по коду 					
//                  ОписаниеРеквизита = МетаданныеОбъекта.Реквизиты.Найти(НовоеЗР.НаименованиеРеквизита);
// -AZ					
					Если ОписаниеРеквизита = Неопределено Тогда
						
						НаименованиеРеквизита = ПолучитьПредставлениеРеквизитаНаЯзыке(НовоеЗР.НаименованиеРеквизита);
						
						Если ОбщегоНазначения.ЭтоСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, НаименованиеРеквизита) Тогда
							
							ОписаниеРеквизита = МетаданныеОбъекта.СтандартныеРеквизиты[НаименованиеРеквизита];
							
						КонецЕсли;
						
					КонецЕсли;
					
					Если ОписаниеРеквизита <> Неопределено
						И ОписаниеРеквизита.Тип.Типы().Количество() = 1 Тогда
						НовоеЗР.Тип = ОписаниеРеквизита.Тип.Типы()[0];
					КонецЕсли;
					
				КонецЕсли;
				
			ИначеЕсли (УровеньЧтения = 3) И (ЧтениеXML.Имя = "Row") Тогда // Указатель на поле табличной части.
				Если ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда
					ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений);
				КонецЕсли;
				
				ТабличныеЧасти[ИмяТабличнойЧасти].Добавить();
			ИначеЕсли УровеньЧтения = 4 Тогда // Указатель на поле табличной части.
				
				ТипЗначенияПоляТЧ = "";
				
				ИмяПоляТЧ = ЧтениеXML.Имя; // 
// +AZ 
				ОписаниеРеквизита = Неопределено;
				НовоеЗР = Неопределено;
				ЗначениеПоля = Неопределено;
				ЗначениеРеквизитаДобавлено = ПроверитьСоставныеТипы(ЧтениеXML,МетаданныеОбъекта,ИмяПоляТЧ,ЗначенияРеквизитов,ОписаниеРеквизита,УровеньЧтения,НовоеЗР,Истина,ЗначениеПоля);
// -AZ 
				Таблица   = ТабличныеЧасти[ИмяТабличнойЧасти];
				Если Таблица.Колонки.Найти(ИмяПоляТЧ)= Неопределено Тогда
					Таблица.Колонки.Добавить(ИмяПоляТЧ);
				КонецЕсли;
				
// +AZ 
				Если ЗначениеРеквизитаДобавлено Тогда
				    ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1);
				    ПоследняяСтрока[ИмяПоляТЧ] = ЗначениеПоля;
				КонецЕсли;	
				//Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
				//	Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
				//		Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут 
				//		   И ЧтениеXML.Имя = "xsi:type" Тогда
				//			XMLТип = ЧтениеXML.Значение;
				//			
				//			Если Лев(XMLТип, 3) = "xs:" Тогда
				//				ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(Прав(XMLТип, СтрДлина(XMLТип)-3), "http://www.w3.org/2001/XMLSchema"));
				//			Иначе
				//				ТипЗначенияПоляТЧ = ИзXMLТипа(Новый ТипДанныхXML(XMLТип, ""));
				//			КонецЕсли;
				//			
				//		КонецЕсли;
				//	КонецЦикла;
				//КонецЕсли;
// -AZ 
				
			КонецЕсли;
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			УровеньЧтения = УровеньЧтения - 1;
			ТипЗначения = "";
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
			Если (УровеньЧтения = 2) Тогда // значение реквизита
				Попытка
					НовоеЗР.ЗначениеРеквизита = ?(ЗначениеЗаполнено(НовоеЗР.Тип), XMLЗначение(НовоеЗР.Тип, ЧтениеXML.Значение), ЧтениеXML.Значение);
				Исключение
					НовоеЗР.ЗначениеРеквизита = ЧтениеXML.Значение;
				КонецПопытки;
			ИначеЕсли (УровеньЧтения = 4) Тогда // значение реквизита
				ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1);
				
				Если ТипЗначенияПоляТЧ = "" Тогда
					ОписаниеРТЧ = Неопределено;
					Если ТабличныеЧастиМТД.Найти(ИмяТабличнойЧасти) <> Неопределено Тогда
						ОписаниеРТЧ = ТабличныеЧастиМТД[ИмяТабличнойЧасти].Реквизиты.Найти(ИмяПоляТЧ);
						
						Если ОписаниеРТЧ <> Неопределено
						   И ОписаниеРТЧ.Тип.Типы().Количество() = 1 Тогда
							ТипЗначенияПоляТЧ = ОписаниеРТЧ.Тип.Типы()[0];
						КонецЕсли;
					КонецЕсли;					
				КонецЕсли;
				
				ПоследняяСтрока[ИмяПоляТЧ] = ?(ЗначениеЗаполнено(ТипЗначенияПоляТЧ), XMLЗначение(ТипЗначенияПоляТЧ, ЧтениеXML.Значение), ЧтениеXML.Значение);
				
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	// Й-й этап: из списка реквизитов исключаем табличные части.
	Для Каждого Элемент Из ТабличныеЧасти Цикл
		ЗначенияРеквизитов.Удалить(ЗначенияРеквизитов.Найти(Элемент.Ключ));
	КонецЦикла;
	// ТабличныеЧастиМТД
	Для Каждого ЭлементСоответствия Из ТабличныеЧасти Цикл
		Таблица = ЭлементСоответствия.Значение;
		Если Таблица.Колонки.Количество() = 0 Тогда
			ТаблицаМТД = ТабличныеЧастиМТД.Найти(ЭлементСоответствия.Ключ);
			Если ТаблицаМТД <> Неопределено Тогда
				Для Каждого ОписаниеКолонки Из ТаблицаМТД.Реквизиты Цикл
					Если Таблица.Колонки.Найти(ОписаниеКолонки.Имя)= Неопределено Тогда
						Таблица.Колонки.Добавить(ОписаниеКолонки.Имя);
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Результат = Новый Структура;
	Результат.Вставить("Реквизиты", ЗначенияРеквизитов);
	Результат.Вставить("ТабличныеЧасти", ТабличныеЧасти);
	
	Возврат Результат;
	
КонецФункции
Показать
5. AlexO 135 12.05.15 09:11 Сейчас в теме
(3) на баг-треккер 1С отправили "привет"?
6. hobi 615 12.05.15 12:30 Сейчас в теме
(5) AlexO, не отправил.
О проблеме на Инфостарте рассказал, здесь живое обсуждение :)
7. AlexO 135 12.05.15 12:46 Сейчас в теме
(6) можете и не отправлять ))
Все равно получите дежурное "мы приняли к сведению". Разве что так, моральное удовлетворение...
4. dgolovanov 12.05.15 09:01 Сейчас в теме
(1) ojiojiowka, что-то твоих публикаций бесплатных не видно. Жлоб, или показать нечего?
8. Pawlick 10 20.10.15 04:06 Сейчас в теме
У меня КА 1.1, платформа 8.3.5.1517.

Функция НеСовпадаетСПредыдущейВерсией хоть убей всегда возвращает ИСТИНА, потому как у меня всегда
Источник = Источник.Ссылка = Источник.Ссылка .ПолучитьОбъект(), даже если объект был изменен.

Попытка версионирования происходит ПриЗаписи объекта (может в БСП по другому?).
04.00 - понять уже ничего не могу...

Получаю XML строкой для заведомо неизмененного объекта - всё равно:
Строка1 <> Строка2,
хотя визуально файлы одинаковые. Может потому что получены из разных временных файлов?...

Короче закончилось вот чем:

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