Цифровая подпись. Документооборот КОРП 2.1

24.02.21

Функциональные - Документооборот и делопроизводство (СЭД)

Вставка виртуальной цифровой подписи (грифа утверждения) в автозаполняемые шаблоны word для Документооборот КОРП 2.1. Генерация картинки подписи происходит на сервере с помощью утилиты ImageMagick. Поддерживаемые форматы doc. Заполнение происходит на стороне клиента. Формат docx не поддерживается, т.к. он заполняется на сервере! При желании можно дописать.

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

Наименование Файл Версия Размер
Цифровая подпись Документооборот КОРП 2.1:
.rar 105,39Kb
8
.rar 105,39Kb 8 Скачать

При внедрении 1С: ДО КОРП 2.1 у одного из заказчиков было принято решение внедрить механизм виртуальной ЭП (электронной подписи) для визуализации наличия подписи (грифа утверждения) в документах.

Работает на релизе 1С: ДО КОРП 2.1.19.22.

1. В шаблон документа doc необходимо вставить тэг "ВставитьФаксимиле".

2. В архиве ECP_Emul.rar макет цифровой подписи в формате png и psd (Adobe Photoshop CC 2019) + файл конфигурации с изменениями.

3. Добавить два общих макета "ШаблонОтметкиПодписано", "ШаблонОтметкиУтверждено".

4. Добавить глобальные модули "ОбщийБизнес" и "ОбщийБизнесКлиент".

5. Добавить в справочник "Файлы" новый реквизит "ПодписанФаксимиле" (тип булево).

6. Доработать глобальные модули "РаботаСКартинками", "РаботаСФайламиКлиент", "РаботаСФайламиВызовСервера". В коде поиск по комментарию "виртуальная цифровая подпись".

 

В модуль "РаботаСКартинками" добавить функцию:

//виртуальная цифровая подпись
Функция СформироватьЭмуляторПодписи(ОписаниеЭП, МакетСертификат, Формат = "PNG") Экспорт
	
	ФайлыКУдалению = Новый Массив;
	
	ПутьФайлаШаблона = ПолучитьИмяВременногоФайла(Формат);
	МакетСертификат.Записать(ПутьФайлаШаблона);
	ФайлыКУдалению.Добавить(ПутьФайлаШаблона);
	
	ПараметрыDraw = Новый Массив;
	
	ПараметрыDraw.Добавить(
		СтрШаблон(
			"text %1, %2 '%3'",
			205,
			105,
			ОписаниеЭП.Фамилия));
			
	ПараметрыDraw.Добавить(
		СтрШаблон(
			"text %1, %2 '%3'",
			10,
			140,
			ОписаниеЭП.Имя + " " + ОписаниеЭП.Отчество));
			
	ПараметрыDraw.Добавить(
		СтрШаблон(
			"text %1, %2 '%3'",
			90,
			227,
			Формат(ОписаниеЭП.ДатаПодписи, "ДЛФ=DT")));				
			
	ПараметрыСоздания = Новый Массив;
	
	ПараметрыСоздания.Добавить(
		СтрШаблон("convert %1", ПутьФайлаШаблона));		
			
	ПараметрыСоздания.Добавить(
		СтрШаблон(" -fill ""#536AC2"" -pointsize 32 -draw ""%1""", 
			СтрСоединить(ПараметрыDraw, " ")));
			
	ПараметрыDraw = Новый Массив;	
	ПараметрыDraw.Добавить(
		СтрШаблон(
			"text %1, %2 '%3'",
			80,
			185,
			ОписаниеЭП.Хэш));	
			
	ПараметрыСоздания.Добавить(
		СтрШаблон(" -fill ""#536AC2"" -pointsize 22 -draw ""%1""", 
			СтрСоединить(ПараметрыDraw, " ")));		
	
	ПараметрыСоздания.Добавить("-resize 35%");
		
	ПутьНовогоФайла = ПолучитьИмяВременногоФайла("PNG");
	
	ПараметрыСоздания.Добавить(ПутьНовогоФайла);
	
	ПараметрыImageMagick = СтрСоединить(ПараметрыСоздания, " ");
	
	ЗапуститьImageMagick(ПараметрыImageMagick, ФайлыКУдалению);
	
	Возврат Новый ДвоичныеДанные(ПутьНовогоФайла);
	
КонецФункции
//виртуальная цифровая подпись

В Модуле "РаботаСФайламиКлиент" изменить код процедур и функций:

// Сохранение файлов 
// 
// Параметры
//  ДанныеСохраняемыхФайлов  - структура, со список значений с данными файлов и общей информацией о файлах
//  УникальныйИдентификатор - уникальный идентификатор формы
//  ТипПапки - пользовательская настройка, в которую будет сохранена папка
//  СохранитьБезДиалогаПользователя - не спрашивать у пользователя путь сохранения файла.
//                                    Путь будет взят из ДанныеСохраняемыхФайлов.ПутьВыбора.
//  НеСпрашиватьВариантСохранения - автоматически сохранять файл с именем типа 
//                                  "Имя файла(1).Расширение файла" в случае совпадения имен.
//                                  В противном случае будет выдан диалог пользователя для 
//                                  выбора варианта сохранения.
Функция СохранитьФайлы(
	ОписаниеОповещения,
	ДанныеСохраняемыхФайлов, 
	УникальныйИдентификатор, 
	ТипПапки = "ПапкаДляСохраненияФайлов", 
	СохранитьБезДиалогаПользователя = Ложь, 
	НеСпрашиватьВариантСохранения = Ложь) Экспорт
	
	#Если ВебКлиент Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'В Веб-клиенте сохранение файлов не поддерживается.'"));
		Возврат "";
	#КонецЕсли
	
	ПутьВыбора = ДанныеСохраняемыхФайлов.ПутьВыбора;
	
	Если Не СохранитьБезДиалогаПользователя Тогда
		
		ВыборКаталога = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
		ВыборКаталога.Каталог = ПутьВыбора;
		
		Если ВыборКаталога.Выбрать() Тогда
			
			ПутьВыбораПрежний = ПутьВыбора;
			ПутьВыбора = ВыборКаталога.Каталог;
			ПутьВыбора = ФайловыеФункцииКлиент.НормализоватьКаталог(ПутьВыбора);
			
			ПутьВыбора = ФайловыеФункцииКлиент.НормализоватьКаталог(ПутьВыбора);
			Если ПутьВыбораПрежний <> ПутьВыбора Тогда
				ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", ТипПапки, ПутьВыбора);
			КонецЕсли;
			
		Иначе
			
			ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь);
			Возврат "";
			
		КонецЕсли;
		
	КонецЕсли;
	
	Номер = 0;
	Для Каждого СписокСтрока Из ДанныеСохраняемыхФайлов.СписокДанныхФайлов Цикл
		
		ДанныеФайла = СписокСтрока.Значение;
		
		Если ДанныеФайла.ТребуетсяСоздатьВизуализациюЭП
			И ДанныеФайла.ВизуализацияЭПДобавлена = Ложь Тогда 
			
			#Если Не ВебКлиент И Не МобильныйКлиент Тогда
				// для doc файла заполним на клиенте - если не веб клиент
				СоздатьВизуализациюЭПВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
			#КонецЕсли	
			
		КонецЕсли;
		
		//виртуальная цифровая подпись
		Если ДанныеФайла.ТребуетсяСоздатьВизуализациюФаксимиле
			И ДанныеФайла.ВизуализацияФаксимилеДобавлена = Ложь Тогда 
		
			#Если Не ВебКлиент И Не МобильныйКлиент Тогда
				// для doc файла заполним на клиенте - если не веб клиент
				ОбщийБизнесКлиент.СоздатьВизуализациюФаксимилеВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
			#КонецЕсли	
		
		КонецЕсли;
		//виртуальная цифровая подпись
		
		ДанныеСохраняемыхФайлов.СписокДанныхФайлов[Номер].Значение = ДанныеФайла;
		Номер = Номер + 1;
	
	КонецЦикла;	
	
	КоличествоФайлов = ДанныеСохраняемыхФайлов.КоличествоФайлов;
	ОбщийРазмерВМб = ДанныеСохраняемыхФайлов.ОбщийРазмер / (1024 * 1024);
	
	#Если Не ВебКлиент Тогда
		ТекстПояснения =
			СтрШаблон(
				НСтр("ru = 'Выполняется сохранение %1 файлов (%2 Мб)...
					|Пожалуйста, подождите.'"),
				КоличествоФайлов, 
				ФайловыеФункцииКлиентСервер.ПолучитьСтрокуСРазмеромФайла(ОбщийРазмерВМб));	
		Состояние(ТекстПояснения);
	#КонецЕсли
	
	ПутьВыбора = ФайловыеФункцииКлиент.НормализоватьКаталог(ПутьВыбора);
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("НомерФайла", 0);
	ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	ПараметрыВыполнения.Вставить("ОписаниеОповещения", ОписаниеОповещения);
	ПараметрыВыполнения.Вставить("ДанныеСохраняемыхФайлов", ДанныеСохраняемыхФайлов);
	ПараметрыВыполнения.Вставить("ТипПапки", ТипПапки);
	ПараметрыВыполнения.Вставить("СохранитьБезДиалогаПользователя", СохранитьБезДиалогаПользователя);
	ПараметрыВыполнения.Вставить("НеСпрашиватьВариантСохранения", НеСпрашиватьВариантСохранения);
	ПараметрыВыполнения.Вставить("ПутьВыбора", ПутьВыбора);
	
	Обработчик = Новый ОписаниеОповещения("СохранитьФайлыМассивФайловТонкийКлиент", ЭтотОбъект, ПараметрыВыполнения);
	ВыполнитьОбработкуОповещения(Обработчик);
	Возврат "";
	
КонецФункции

// Процедура печати Файла
//
// Параметры
//  ДанныеФайлов  - массив структур с данными файла
//  УникальныйИдентификатор - уникальный идентификатор формы
//
Процедура НапечататьФайлы(ДанныеФайлов, УникальныйИдентификатор = Неопределено) Экспорт
	
	Оповестить("ОбновитьСписокПоследних");
	
	Номер = 0;
	Для Каждого ДанныеФайла Из ДанныеФайлов Цикл
		
		Если ДанныеФайла.ТребуетсяСоздатьВизуализациюЭП
			И ДанныеФайла.ВизуализацияЭПДобавлена = Ложь Тогда 
			
			#Если Не ВебКлиент И Не МобильныйКлиент Тогда
				// для doc файла заполним на клиенте - если не веб клиент
				СоздатьВизуализациюЭПВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
			#КонецЕсли	
			
		КонецЕсли;
		
		//виртуальная цифровая подпись
		Если ДанныеФайла.ТребуетсяСоздатьВизуализациюФаксимиле
			И ДанныеФайла.ВизуализацияФаксимилеДобавлена = Ложь Тогда 
		
			#Если Не ВебКлиент И Не МобильныйКлиент Тогда
				// для doc файла заполним на клиенте - если не веб клиент
				ОбщийБизнесКлиент.СоздатьВизуализациюФаксимилеВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
			#КонецЕсли	
		
		КонецЕсли;
		//виртуальная цифровая подпись
		
		ДанныеФайлов[Номер] = ДанныеФайла;
		Номер = Номер + 1;
	
	КонецЦикла;	
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("НомерФайла", 0);
	ПараметрыВыполнения.Вставить("ДанныеФайлов", ДанныеФайлов);
	ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	Обработчик = Новый ОписаниеОповещения("НапечататьФайлыВыполнение", ЭтотОбъект, ПараметрыВыполнения);
	ВыполнитьОбработкуОповещения(Обработчик);
	
КонецПроцедуры

// Сохранение на диск Файла
// 
// Параметры:
//   ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода.
//   ДанныеФайла  - структура с данными файла.
//   УникальныйИдентификатор - уникальный идентификатор формы.
//
// Возвращаемое значение:
//   Строка - выбранный полный путь файла.
//
Процедура СохранитьКак(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт
	
	Если ДанныеФайла.ТребуетсяСоздатьВизуализациюЭП
		И ДанныеФайла.ВизуализацияЭПДобавлена = Ложь Тогда 
		
		#Если Не ВебКлиент И Не МобильныйКлиент Тогда
			// для doc файла заполним на клиенте - если не веб клиент
			СоздатьВизуализациюЭПВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
		#КонецЕсли	
		
	КонецЕсли;
	
	//виртуальная цифровая подпись
	Если ДанныеФайла.ТребуетсяСоздатьВизуализациюФаксимиле
		И ДанныеФайла.ВизуализацияФаксимилеДобавлена = Ложь Тогда 
		
		#Если Не ВебКлиент И Не МобильныйКлиент Тогда
			// для doc файла заполним на клиенте - если не веб клиент
			ОбщийБизнесКлиент.СоздатьВизуализациюФаксимилеВФайлеDoc(ДанныеФайла, УникальныйИдентификатор);
		#КонецЕсли	
		
	КонецЕсли;
	//виртуальная цифровая подпись
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата);
	ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла);
	ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	
	Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
		СохранитьКакСРасширением(ПараметрыВыполнения);
	Иначе
		СохранитьКакБезРасширения(ПараметрыВыполнения);
	КонецЕсли;
	
КонецПроцедуры

// Открыть файл для просмотра из карточки документа
Процедура ОткрытьФайлДокумента(Файл, Форма) Экспорт 
	
	Если Не ЗначениеЗаполнено(Файл) Тогда 
		Возврат;
	КонецЕсли;
	
	Если Форма.Модифицированность И
		Форма.Параметры.Свойство("Ключ") И
		ЗначениеЗаполнено(Форма.Параметры.Ключ) Тогда
		Если НЕ Форма.Записать() Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Попытка 
		ПредыдущийАдресФайла = Форма.ПредыдущийАдресФайла;
	Исключение
		ПредыдущийАдресФайла = Неопределено;
	КонецПопытки;
	
	ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайлаДляОткрытия(
		Файл, 
		Неопределено, 
		Форма.УникальныйИдентификатор, 
		Неопределено, 
		ПредыдущийАдресФайла);
		
	Если ДанныеФайла.ТребуетсяСоздатьВизуализациюЭП
		И ДанныеФайла.ВизуализацияЭПДобавлена = Ложь Тогда 
		
		#Если Не ВебКлиент И Не МобильныйКлиент Тогда
			// для doc файла заполним на клиенте - если не веб клиент
			СоздатьВизуализациюЭПВФайлеDoc(ДанныеФайла, Форма.УникальныйИдентификатор);
		#КонецЕсли	
		
	КонецЕсли;
	
	//виртуальная цифровая подпись
	Если ДанныеФайла.ТребуетсяСоздатьВизуализациюФаксимиле
		И ДанныеФайла.ВизуализацияФаксимилеДобавлена = Ложь Тогда 
		
		#Если Не ВебКлиент И Не МобильныйКлиент Тогда
			// для doc файла заполним на клиенте - если не веб клиент
			ОбщийБизнесКлиент.СоздатьВизуализациюФаксимилеВФайлеDoc(ДанныеФайла, Форма.УникальныйИдентификатор);
		#КонецЕсли	
		
	КонецЕсли;
	//виртуальная цифровая подпись
	
	КомандыРаботыСФайламиКлиент.Открыть(ДанныеФайла);
	
КонецПроцедуры

В модуле "РаботаСФайламиВызовСервера" изменить код процедур и функций:

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

// Функция возвращает структуру, содержащую различные сведения о Файле и версии.
//
// Параметры:
//  ФайлВерсияСсылка        - СправочникСсылка.Файлы, СправочникСсылка.ВерсииФайлов - файл или версия файла.
//  ИдентификаторФормы      - УникальныйИдентификатор - уникальный идентификатор формы.
//  РабочийКаталогВладельца - Строка - в ней возвращается рабочий каталог владельца файла.
//  ПредыдущийАдресФайла    - Строка - в ней возвращается рабочий каталог владельца файла.
//
// Возвращаемое значение:
//   Структура - структура с данными файла. См. ПолучитьДанныеФайла.
//
Функция ДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка = Неопределено, ИдентификаторФормы = Неопределено,
	РабочийКаталогВладельца = Неопределено, ПредыдущийАдресФайла = Неопределено,
	НеПолучатьВизуализациюЭП = Ложь) Экспорт
	
	Если ПредыдущийАдресФайла <> Неопределено Тогда
		Если НЕ ПустаяСтрока(ПредыдущийАдресФайла) И ЭтоАдресВременногоХранилища(ПредыдущийАдресФайла) Тогда
			УдалитьИзВременногоХранилища(ПредыдущийАдресФайла);
		КонецЕсли;
	КонецЕсли;
	
	ДанныеФайла = ДанныеФайла(ФайлСсылка, ВерсияСсылка);
	
	Если РабочийКаталогВладельца = Неопределено Тогда
		РабочийКаталогВладельца = РабочийКаталогПапки(ДанныеФайла.Владелец);
	КонецЕсли;
	ДанныеФайла.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца);
	
	Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда
		ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
			ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение);
		ПолноеИмяФайлаВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла;
		ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге);
	КонецЕсли;
	
	ПредыдущийАдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии;
	
	ПротоколированиеРаботыПользователей.ЗаписатьПолучениеФайла(ДанныеФайла.Ссылка);
	
	ЗаписатьОбращениеКВерсииФайла(ДанныеФайла.Версия);
	РаботаСПоследнимиОбъектами.ЗаписатьОбращениеКОбъекту(ДанныеФайла.Ссылка);
	
	ОбщийБизнес.ДобавитьВизуализациюФаксимиле(ДанныеФайла, ИдентификаторФормы);//виртуальная цифровая подпись
	
	Если НеПолучатьВизуализациюЭП = Ложь Тогда
		
		ДобавитьВизуализациюЭП(ДанныеФайла, ИдентификаторФормы);
				
		Если ДанныеФайла.ВизуализацияЭПДобавлена = Истина Тогда
			
			ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге = ""; // не берем из кеша
			УдалитьИзРегистра(ДанныеФайла.Версия); // удалим инфо из кеша
			
			Возврат ДанныеФайла;
		КонецЕсли;	
		
	Иначе	
		
		ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге = ""; // не берем из кеша
		УдалитьИзРегистра(ДанныеФайла.Версия); // удалим инфо из кеша
		
	КонецЕсли;
	
	ТипХраненияФайла = ДанныеФайла.Версия.ТипХраненияФайла;
	
	Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ДанныеФайла.Версия <> Неопределено Тогда
		
		УстановитьПривилегированныйРежим(Истина);
		
		Запрос = Новый Запрос;
		
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу,
		|	ВерсииФайлов.Том КАК Том
		|ИЗ
		|	Справочник.ВерсииФайлов КАК ВерсииФайлов
		|ГДЕ
		|	ВерсииФайлов.Ссылка = &Версия";
		
		Запрос.Параметры.Вставить("Версия", ДанныеФайла.Версия);
		
		ДанныеФайлаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка();
		ДанныеФайлаПутьКФайлу = "";
		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			ДанныеФайлаТом = Выборка.Том;
			ДанныеФайлаПутьКФайлу = Выборка.ПутьКФайлу;
		КонецЕсли;
		
		Если НЕ ДанныеФайлаТом.Пустая() Тогда
			ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ДанныеФайлаТом) + ДанныеФайлаПутьКФайлу; 
			Попытка
				ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть);
				// Работаем только с текущей версией - для не-текущей ссылку получаем в ПолучитьНавигационнуюСсылкуДляОткрытия.
				ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы);
			Исключение
				// Запись в журнал регистрации.
				СсылкаНаФайл = ?(ФайлСсылка <> Неопределено, ФайлСсылка, ВерсияСсылка);
				СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(
					ИнформацияОбОшибке(), СсылкаНаФайл);
				
				ЗаписьЖурналаРегистрации(
					НСтр("ru = 'Файлы.Открытие файла'",
					     ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
					УровеньЖурналаРегистрации.Ошибка,
					Метаданные.Справочники.Файлы,
					ФайлСсылка,
					СообщениеОбОшибке);
					
				ТипВладельцаФайла = ТипЗнч(ДанныеФайла.Владелец);
				Если ТипВладельцаФайла = Тип("СправочникСсылка.ПапкиФайлов") Тогда
					ПредставлениеВладельца = ПолныйПутьПапки(ДанныеФайла.Владелец);
				Иначе
					ПредставлениеВладельца = ДанныеФайла.Владелец;
				КонецЕсли;
				ПредставлениеВладельцаФайла = СтрШаблон(
					НСтр("ru = 'Присоединен к %1 : %2'"),
					Строка(ТипВладельцаФайла),
					ПредставлениеВладельца);
					
				ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов(
					ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение,
					,
					ПредставлениеВладельцаФайла);
					
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге) Тогда
		ОбновитьДатуОбращенияФайлыВРабочемКаталогеКомпьютера(ДанныеФайла.Версия);
	КонецЕсли;	
	
	Возврат ДанныеФайла;
	
КонецФункции // ДанныеФайлаДляОткрытия()

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

7. Финиш.

документооборот подпись утверждение

См. также

1С:Документооборот - цена на лицензии КОРП, ПРОФ и ДГУ

Документооборот и делопроизводство (СЭД) Типовые Платформа 1С v8.3 Управленческий учет Платные (руб)

Организуйте правильный документооборот на вашем предприятии. Ведение учета и хранения документов. Управление потоками документации между подразделениями. Работа с договорами в компании. Автоматизация подготовки, согласования и подписания документов. Сократите время и объем ошибок с 1С:Документооборот!

42500 руб.

19.02.2016    107000    103    5    

84

Таймлист (1С:Совещание, Таймлист Лайт)

Документооборот и делопроизводство (СЭД) Конфигурации 1cv8

«Таймлист» – экосистема сервисов («Таймлист Лайт», «1C:Совещание», «Таймлист Recorder»), основанная на искусственном интеллекте Таймлист, который позволяет эффективно работать с легкими поручениями за счет фиксации всех важных идей при расшифровке и последующем формировании автопротокола встречи. Сервисы, в которые интегрирован ИИ, позволяют работать с задачами (поручениями), полученными из автопротокола.

10000 руб.

06.12.2023    1260    0    0    

5

SALE! 30%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

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

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    101378    296    173    

312

1С:Архив

Документооборот и делопроизводство (СЭД) Платформа 1С v8.3 Платные (руб)

"1С:Архив" – это универсальная система, обеспечивающая надежное долговременное хранение документов с гарантией юридической значимости на неограниченный срок. "1С:Архив" разработан на основе нормативно-правовых актов по архивному делу, поддерживает операции хранения документов – от попадания в архив до уничтожения – и не имеет ограничений на объем хранимых данных. "1С:Архив" сопровождается методологической поддержкой в виде организационных документов по хранению, входящих в состав "Комплекта нормативных документов" к "Методике управления документами и совместной работой", разработанной специалистами фирмы "1С". Использование "1С:Архива" позволяет организовать единое хранилище всех бумажных и электронных документов из разных информационных систем, вести архивный учет в соответствии с требованиями Росархива и снизить нагрузку на учетные системы. Продукт подходит для малых, средних, крупных предприятий и учреждений любых отраслей.

90000 руб.

24.10.2022    4859    4    1    

4

Легкий документооборот (+чат-бот для Telegram)

Документооборот и делопроизводство (СЭД) Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Платные (руб)

Расширение для согласования справочников и документов в конфигурациях "1С: Бухгалтерия 3.0", "Управление нашей фирмой", "1С ERP Управление предприятием", "Бухгалтерия государственного учреждения". Ролевая адресация, условная маршрутизация, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для 1cfresh.com. Сертификат 1С-Совместимо.

14900 руб.

15.11.2018    27794    25    48    

57

Групповая выгрузка и загрузка файлов XML для ЭДО в каталог по приказу №820 ФНС (для УТ 10.3/11, КА2, ERP2, БП3, УНФ, УПП1.3, Розница2.3). Поддержка маркировки. Прослеживание товаров.

Документооборот и делопроизводство (СЭД) ЭДО и ОФД Файловый обмен (TXT, XML, DBF), FTP Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Платные (руб)

Групповая выгрузка файлов XML для ЭДО в каталог по приказу №820 ФНС для Контур.Диадок, СБИС и других провайдеров ЭДО. Поддержка УНФ 1.6, УНФ 3.0 Поддержка УТ 10.3, УПП 1.3 Поддержка Розница 2.3 Добавлена выгрузка непосредственно из документа

18000 руб.

15.12.2022    6426    106    25    

14

ЭДО: организация архива оригиналов первичных документов, комплексный отчет по ошибкам

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

Мощный, единый инструмент для решения всех проблем, связанных с переходом на ЭДО. Экономит бумагу и время - организует архив оригиналов первичных документов прямо в базе 1С, в прикрепленных файлах к соответствующим документам. С помощью комплексного отчета по ошибкам в ЭДО позволяет выявить и исправить все возможные ошибки - ошибочно сопоставленные документы, не подписанные документы, подписанные, но не загруженные в 1С документы. Автоматически сопоставляет не сопоставленные между собой документы. Может работать по расписанию и присылать отчет о состоянии архива/по ошибкам на почту. Взаимодействует напрямую с сервисами Диадок/СБИС, имеет интуитивно понятный интерфейс и учитывает 3-х летний опыт 40+ клиентов.

14880 руб.

17.12.2018    44287    56    51    

71

1С:Бухгалтерия 3.0 ПРОФ + 1С:Документооборот. Модуль интеграции 1С:БП и 1С:ДО (ПРОФ или КОРП)

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

Бесшовная связь с 1С:Документооборот (КОРП или ПРОФ) - вот что обеспечит Вам и Вашим сотрудникам оперативный доступ и продуктивную работу с документами в учётной системе 1С на базе "1С:Бухгалтерия предприятия 3.0 ПРОФ". Интеграция позволяет экономить до 60% времени на поиск и согласование первичной документации (актов, счетов-фактур, накладных), не говоря уже о других полезных функциональных возможностях: создании и запуске бизнес-процессов, работе с электронной почтой, штрихкодировании документов и многом другом.

30000 руб.

23.05.2017    53779    34    67    

41
Оставьте свое сообщение