Files
uas_ep/src/Catalogs/МашиночитаемыеДоверенностиКонтрагентов/Ext/ManagerModule.bsl
T

1034 lines
70 KiB
Plaintext

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