// Скрипт для консоли кода 1С. // Создает передаточные акты НЕ вручную по квартире, а на основании договора покупателя. // // Логика: // 1. Берем фид сделок Домопланера. // 2. Оставляем сделки, где: // - сделка активна; // - объект продан; // - есть Договор.Номер; // - есть Акт_приема_передачи.Дата. // 3. Ищем в 1С договор покупателя Документ.РеализацияНедвижимости по номеру договора. // 4. Проверяем, что по договору/квартире еще нет УПДК_ПередаточныйАкт. // 5. Создаем УПДК_ПередаточныйАкт через Заполнить(Договор), чтобы 1С сама подтянула // правоустанавливающий документ, клиента, бронь, объект, организацию и прочие поля. // // Первый запуск: // Импорт_DryRun = Истина; // // Тестовое создание: // Импорт_DryRun = Ложь; // Импорт_ЛимитСоздания = 1; Импорт_DryRun = Истина; Импорт_ЛимитСоздания = 0; // 0 = без лимита. Импорт_Всего = 0; Импорт_ПодходитПоФиду = 0; Импорт_НеHandOverДом = 0; Импорт_НеГотовКФормированию = 0; Импорт_ДоговорНеНайден = 0; Импорт_ДубльДоговора = 0; Импорт_УжеЕстьАПП = 0; Импорт_СозданоАПП = 0; Импорт_Ошибок = 0; Импорт_ВидДокументаАПП = Неопределено; Импорт_АдресСервера = "domoplaner.ru"; Импорт_ПутьФида = "/feeds-export/deals/full/366/4xD68DfUge9sUh7pGO0UPzBmujUkBvd83wGJ1tEhZGQJtIgDFRn8BusCzviVwU81/eqxyqN6TT5EASXwaYHRRmlHVoCORTCug/"; Импорт_ПутьФидаОбъектов = "/dc-api/feeds/366-DgOqhmXRAWb75aUymFKA9hYDG9Khsl8D21WLCTNx6wf8szosoblTozsrOusa7oNu/"; Импорт_HandOverДома = Новый Соответствие; Попытка Импорт_HTTP = Новый HTTPСоединение(Импорт_АдресСервера, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL()); Импорт_HTTPЗапрос = Новый HTTPЗапрос(Импорт_ПутьФида); Импорт_HTTPОтвет = Импорт_HTTP.Получить(Импорт_HTTPЗапрос); Импорт_JSONСтрока = Импорт_HTTPОтвет.ПолучитьТелоКакСтроку(); Исключение Сообщить("Ошибка загрузки фида Домопланера: " + ОписаниеОшибки()); Импорт_JSONСтрока = "[]"; КонецПопытки; Попытка Импорт_ЧтениеJSON = Новый ЧтениеJSON; Импорт_ЧтениеJSON.УстановитьСтроку(Импорт_JSONСтрока); Импорт_JSON = ПрочитатьJSON(Импорт_ЧтениеJSON); Исключение Сообщить("Ошибка чтения JSON фида Домопланера: " + ОписаниеОшибки()); Импорт_JSON = Новый Массив; КонецПопытки; Если ТипЗнч(Импорт_JSON) = Тип("Массив") Тогда Импорт_Сделки = Импорт_JSON; Иначе Импорт_Сделки = Новый Массив; Если НЕ Импорт_JSON.Свойство("data", Импорт_Сделки) Тогда Сообщить("Не найден массив data в JSON фида."); Импорт_Сделки = Новый Массив; КонецЕсли; КонецЕсли; // Ищем значение "Акт ПП" для реквизита ВидПравовогоДокумента динамически, // чтобы не угадывать техническое имя справочника "Вид правового документа". Попытка Импорт_МетаРеквизитВидДок = Метаданные.Документы.УПДК_ПередаточныйАкт.Реквизиты.ВидПравовогоДокумента; Импорт_ТипыВидаДок = Импорт_МетаРеквизитВидДок.Тип.Типы(); Если Импорт_ТипыВидаДок.Количество() > 0 Тогда Импорт_ТипВидаДок = Импорт_ТипыВидаДок[0]; Импорт_МетаВидДок = Метаданные.НайтиПоТипу(Импорт_ТипВидаДок); Если Импорт_МетаВидДок <> Неопределено Тогда Импорт_ЗапросВидДок = Новый Запрос; Импорт_ЗапросВидДок.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВидДок.Ссылка КАК Ссылка |ИЗ | Справочник." + Импорт_МетаВидДок.Имя + " КАК ВидДок |ГДЕ | ВидДок.ПометкаУдаления = ЛОЖЬ | И ВидДок.Наименование = &Наименование"; Импорт_ЗапросВидДок.УстановитьПараметр("Наименование", "Акт ПП"); Импорт_ВыборкаВидДок = Импорт_ЗапросВидДок.Выполнить().Выбрать(); Если Импорт_ВыборкаВидДок.Следующий() Тогда Импорт_ВидДокументаАПП = Импорт_ВыборкаВидДок.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли; Исключение Сообщить("Не удалось найти вид документа 'Акт ПП': " + ОписаниеОшибки()); Импорт_ВидДокументаАПП = Неопределено; КонецПопытки; Если НЕ ЗначениеЗаполнено(Импорт_ВидДокументаАПП) Тогда Сообщить("Вид документа 'Акт ПП' не найден. Скрипт продолжит работу, но реквизит ВидПравовогоДокумента может остаться пустым."); КонецЕсли; // Собираем дома, по которым разрешено создавать АПП: building_state = hand-over. Попытка Импорт_HTTPОбъекты = Новый HTTPСоединение(Импорт_АдресСервера, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL()); Импорт_HTTPЗапросОбъекты = Новый HTTPЗапрос(Импорт_ПутьФидаОбъектов); Импорт_HTTPОтветОбъекты = Импорт_HTTPОбъекты.Получить(Импорт_HTTPЗапросОбъекты); Импорт_JSONСтрокаОбъекты = Импорт_HTTPОтветОбъекты.ПолучитьТелоКакСтроку(); Импорт_ЧтениеJSONОбъекты = Новый ЧтениеJSON; Импорт_ЧтениеJSONОбъекты.УстановитьСтроку(Импорт_JSONСтрокаОбъекты); Импорт_JSONОбъекты = ПрочитатьJSON(Импорт_ЧтениеJSONОбъекты); Импорт_ПроектыОбъектов = Новый Массив; Если Импорт_JSONОбъекты.Свойство("projects", Импорт_ПроектыОбъектов) Тогда Для Каждого Импорт_ПроектОбъектов Из Импорт_ПроектыОбъектов Цикл Импорт_ДомаБезСтадии = Новый Массив; Импорт_ПроектОбъектов.Свойство("houses_without_stage", Импорт_ДомаБезСтадии); Для Каждого Импорт_ДомФида Из Импорт_ДомаБезСтадии Цикл Импорт_StateДома = ""; Импорт_IdДома = ""; Импорт_ДомФида.Свойство("building_state", Импорт_StateДома); Импорт_ДомФида.Свойство("id", Импорт_IdДома); Если НРег(СокрЛП(Строка(Импорт_StateДома))) = "hand-over" Тогда Импорт_IdДомаСтр = СокрЛП(Строка(Импорт_IdДома)); Импорт_IdДомаСтр = СтрЗаменить(СтрЗаменить(Импорт_IdДомаСтр, Символ(160), ""), " ", ""); Импорт_HandOverДома.Вставить(Импорт_IdДомаСтр, Истина); КонецЕсли; КонецЦикла; Импорт_СтадииОбъектов = Новый Массив; Импорт_ПроектОбъектов.Свойство("stages", Импорт_СтадииОбъектов); Для Каждого Импорт_СтадияОбъектов Из Импорт_СтадииОбъектов Цикл Импорт_ДомаСтадии = Новый Массив; Импорт_СтадияОбъектов.Свойство("houses", Импорт_ДомаСтадии); Для Каждого Импорт_ДомФида Из Импорт_ДомаСтадии Цикл Импорт_StateДома = ""; Импорт_IdДома = ""; Импорт_ДомФида.Свойство("building_state", Импорт_StateДома); Импорт_ДомФида.Свойство("id", Импорт_IdДома); Если НРег(СокрЛП(Строка(Импорт_StateДома))) = "hand-over" Тогда Импорт_IdДомаСтр = СокрЛП(Строка(Импорт_IdДома)); Импорт_IdДомаСтр = СтрЗаменить(СтрЗаменить(Импорт_IdДомаСтр, Символ(160), ""), " ", ""); Импорт_HandOverДома.Вставить(Импорт_IdДомаСтр, Истина); КонецЕсли; КонецЦикла; Импорт_ДомаБезСтадии = Новый Массив; Импорт_СтадияОбъектов.Свойство("houses_without_stage", Импорт_ДомаБезСтадии); Для Каждого Импорт_ДомФида Из Импорт_ДомаБезСтадии Цикл Импорт_StateДома = ""; Импорт_IdДома = ""; Импорт_ДомФида.Свойство("building_state", Импорт_StateДома); Импорт_ДомФида.Свойство("id", Импорт_IdДома); Если НРег(СокрЛП(Строка(Импорт_StateДома))) = "hand-over" Тогда Импорт_IdДомаСтр = СокрЛП(Строка(Импорт_IdДома)); Импорт_IdДомаСтр = СтрЗаменить(СтрЗаменить(Импорт_IdДомаСтр, Символ(160), ""), " ", ""); Импорт_HandOverДома.Вставить(Импорт_IdДомаСтр, Истина); КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЕсли; Исключение Импорт_Ошибок = Импорт_Ошибок + 1; Сообщить("Ошибка загрузки/разбора фида объектов для отбора hand-over домов: " + ОписаниеОшибки()); КонецПопытки; Сообщить("Домов hand-over в фиде объектов = " + Строка(Импорт_HandOverДома.Количество())); Для Каждого Импорт_Сделка Из Импорт_Сделки Цикл Импорт_Всего = Импорт_Всего + 1; Импорт_СделкаАктивна = ""; Импорт_Сделка.Свойство("Сделка_активна", Импорт_СделкаАктивна); Если НРег(СокрЛП(Строка(Импорт_СделкаАктивна))) <> "да" Тогда Продолжить; КонецЕсли; Импорт_ОбъектФида = Неопределено; Если НЕ Импорт_Сделка.Свойство("Объект", Импорт_ОбъектФида) Тогда Продолжить; КонецЕсли; Импорт_ТипПомещения = ""; Импорт_СтатусПомещения = ""; Импорт_ОбъектФида.Свойство("Тип_помещения", Импорт_ТипПомещения); Импорт_ОбъектФида.Свойство("Статус_помещения", Импорт_СтатусПомещения); Если НРег(СокрЛП(Строка(Импорт_СтатусПомещения))) <> "продано" Тогда Продолжить; КонецЕсли; Импорт_HouseIdФида = ""; Импорт_ОбъектФида.Свойство("ID_дома", Импорт_HouseIdФида); Импорт_HouseIdФидаСтр = СокрЛП(Строка(Импорт_HouseIdФида)); Импорт_HouseIdФидаСтр = СтрЗаменить(СтрЗаменить(Импорт_HouseIdФидаСтр, Символ(160), ""), " ", ""); Импорт_ДомHandOver = Импорт_HandOverДома.Получить(Импорт_HouseIdФидаСтр); Если Импорт_ДомHandOver <> Истина Тогда Импорт_НеHandOverДом = Импорт_НеHandOverДом + 1; Продолжить; КонецЕсли; // Если надо только квартиры, раскомментируйте этот блок. // Если НРег(СокрЛП(Строка(Импорт_ТипПомещения))) <> "квартира" Тогда // Продолжить; // КонецЕсли; Импорт_АППФида = Неопределено; Если НЕ Импорт_Сделка.Свойство("Акт_приема_передачи", Импорт_АППФида) Тогда Продолжить; КонецЕсли; Импорт_ДатаАППСтрока = ""; Импорт_НомерАППСтрока = ""; Импорт_АППФида.Свойство("Дата", Импорт_ДатаАППСтрока); Импорт_АППФида.Свойство("Номер", Импорт_НомерАППСтрока); Импорт_ДатаАППСтрока = СокрЛП(Строка(Импорт_ДатаАППСтрока)); Импорт_НомерАППСтрока = СокрЛП(Строка(Импорт_НомерАППСтрока)); Если Импорт_ДатаАППСтрока = "" Тогда Продолжить; КонецЕсли; Импорт_ДоговорФида = Неопределено; Если НЕ Импорт_Сделка.Свойство("Договор", Импорт_ДоговорФида) Тогда Продолжить; КонецЕсли; Импорт_НомерДоговораФида = ""; Импорт_ДоговорФида.Свойство("Номер", Импорт_НомерДоговораФида); Импорт_НомерДоговораФида = СокрЛП(Строка(Импорт_НомерДоговораФида)); Если Импорт_НомерДоговораФида = "" Тогда Продолжить; КонецЕсли; Если Импорт_НомерАППСтрока = "" Тогда Импорт_НомерАППСтрока = Импорт_НомерДоговораФида; КонецЕсли; Импорт_ДатаАПП = Неопределено; Попытка Импорт_ЧастиДатыАПП = СтрРазделить(Импорт_ДатаАППСтрока, "."); Если Импорт_ЧастиДатыАПП.Количество() >= 3 Тогда Импорт_ДатаАПП = Дата(Число(Импорт_ЧастиДатыАПП[2]), Число(Импорт_ЧастиДатыАПП[1]), Число(Импорт_ЧастиДатыАПП[0])); КонецЕсли; Исключение Импорт_ДатаАПП = Неопределено; КонецПопытки; Если Импорт_ДатаАПП = Неопределено Тогда Продолжить; КонецЕсли; Импорт_DealId = ""; Импорт_Сделка.Свойство("ID", Импорт_DealId); Импорт_DealIdСтр = СокрЛП(Строка(Импорт_DealId)); Импорт_ПодходитПоФиду = Импорт_ПодходитПоФиду + 1; Импорт_ЗапросДоговор = Новый Запрос; Импорт_ЗапросДоговор.Текст = "ВЫБРАТЬ | Договор.Ссылка КАК Ссылка, | Договор.Номер КАК Номер, | Договор.Дата КАК Дата, | Договор.Клиент КАК Клиент, | Договор.ЗаказКлиента КАК ЗаказКлиента, | Договор.ОбъектНедвижимости КАК ОбъектНедвижимости, | Договор.Объект КАК Объект, | Договор.Организация КАК Организация |ИЗ | Документ.РеализацияНедвижимости КАК Договор |ГДЕ | Договор.ПометкаУдаления = ЛОЖЬ | И Договор.Проведен = ИСТИНА | И Договор.Номер = &НомерДоговора"; Импорт_ЗапросДоговор.УстановитьПараметр("НомерДоговора", Импорт_НомерДоговораФида); Попытка Импорт_РезультатДоговор = Импорт_ЗапросДоговор.Выполнить().Выгрузить(); Исключение Импорт_Ошибок = Импорт_Ошибок + 1; Сообщить("Ошибка поиска договора. Проверьте имя документа РеализацияНедвижимости и реквизиты: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; " + ОписаниеОшибки()); Продолжить; КонецПопытки; Если Импорт_РезультатДоговор.Количество() = 0 Тогда Импорт_ДоговорНеНайден = Импорт_ДоговорНеНайден + 1; Сообщить("Договор не найден в 1С: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида); Продолжить; КонецЕсли; Если Импорт_РезультатДоговор.Количество() > 1 Тогда Импорт_ДубльДоговора = Импорт_ДубльДоговора + 1; Сообщить("Найден дубль договора, пропуск: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; количество=" + Строка(Импорт_РезультатДоговор.Количество())); Продолжить; КонецЕсли; Импорт_ДоговорСтрока = Импорт_РезультатДоговор[0]; Импорт_ДоговорСсылка = Импорт_ДоговорСтрока.Ссылка; Импорт_ЗапросАПП = Новый Запрос; Импорт_ЗапросАПП.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Акт.Ссылка КАК Ссылка |ИЗ | Документ.УПДК_ПередаточныйАкт КАК Акт |ГДЕ | Акт.ПометкаУдаления = ЛОЖЬ | И ( | Акт.ОсновнойДоговор = &Договор | ИЛИ Акт.ДоговорДолевогоУчастия = &Договор | ИЛИ Акт.ОбъектНедвижимости = &ОбъектНедвижимости | )"; Импорт_ЗапросАПП.УстановитьПараметр("Договор", Импорт_ДоговорСсылка); Импорт_ЗапросАПП.УстановитьПараметр("ОбъектНедвижимости", Импорт_ДоговорСтрока.ОбъектНедвижимости); Импорт_ВыборкаАПП = Импорт_ЗапросАПП.Выполнить().Выбрать(); Если Импорт_ВыборкаАПП.Следующий() Тогда Импорт_УжеЕстьАПП = Импорт_УжеЕстьАПП + 1; Продолжить; КонецЕсли; Попытка Импорт_НовыйАПП = Документы.УПДК_ПередаточныйАкт.СоздатьДокумент(); Импорт_НовыйАПП.Заполнить(Импорт_ДоговорСсылка); Исключение Импорт_НеГотовКФормированию = Импорт_НеГотовКФормированию + 1; Сообщить("Договор не готов к формированию АПП, пропуск: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; " + ОписаниеОшибки()); Продолжить; КонецПопытки; Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.ОбъектНедвижимости) ИЛИ НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.Клиент) Тогда Импорт_НеГотовКФормированию = Импорт_НеГотовКФормированию + 1; Сообщить("Договор не готов к формированию АПП, не заполнены клиент/объект: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; объект=" + Строка(Импорт_НовыйАПП.ОбъектНедвижимости) + "; клиент=" + Строка(Импорт_НовыйАПП.Клиент)); Продолжить; КонецЕсли; Если Импорт_DryRun Тогда Импорт_СозданоАПП = Импорт_СозданоАПП + 1; Сообщить("Найден к созданию: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; 1С=" + Строка(Импорт_ДоговорСсылка) + "; объект=" + Строка(Импорт_ДоговорСтрока.ОбъектНедвижимости) + "; клиент=" + Строка(Импорт_ДоговорСтрока.Клиент) + "; датаАПП=" + Импорт_ДатаАППСтрока); Если Импорт_ЛимитСоздания > 0 И Импорт_СозданоАПП >= Импорт_ЛимитСоздания Тогда Прервать; КонецЕсли; Продолжить; КонецЕсли; Попытка Импорт_НовыйАПП.Дата = ТекущаяДата(); Импорт_НовыйАПП.Номер = Импорт_НомерАППСтрока; Импорт_НовыйАПП.Статус = Перечисления.УПДК_СтатусыПередаточногоАкта.Подписан; Импорт_НовыйАПП.ДатаПодписания = Импорт_ДатаАПП; Если ЗначениеЗаполнено(Импорт_ВидДокументаАПП) Тогда Импорт_НовыйАПП.ВидПравовогоДокумента = Импорт_ВидДокументаАПП; КонецЕсли; // Подстраховка, если Заполнить() не перенесло часть реквизитов. Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.ОсновнойДоговор) Тогда Импорт_НовыйАПП.ОсновнойДоговор = Импорт_ДоговорСсылка; КонецЕсли; Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.ДоговорДолевогоУчастия) Тогда Импорт_НовыйАПП.ДоговорДолевогоУчастия = Импорт_ДоговорСсылка; КонецЕсли; Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.Клиент) Тогда Импорт_НовыйАПП.Клиент = Импорт_ДоговорСтрока.Клиент; КонецЕсли; Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.ЗаказКлиента) Тогда Импорт_НовыйАПП.ЗаказКлиента = Импорт_ДоговорСтрока.ЗаказКлиента; КонецЕсли; Если НЕ ЗначениеЗаполнено(Импорт_НовыйАПП.ОбъектНедвижимости) Тогда Импорт_НовыйАПП.ОбъектНедвижимости = Импорт_ДоговорСтрока.ОбъектНедвижимости; КонецЕсли; Импорт_НовыйАПП.Комментарий = "Создано автоматически по фиду Домопланера на основании договора. deal_id=" + Импорт_DealIdСтр + "; contract=" + Импорт_НомерДоговораФида + "; act_number=" + Импорт_НомерАППСтрока + "; act_date=" + Импорт_ДатаАППСтрока; Импорт_НовыйАПП.Записать(); Импорт_СозданоАПП = Импорт_СозданоАПП + 1; Сообщить("АПП создан на основании договора: deal_id=" + Импорт_DealIdСтр + "; акт=" + Строка(Импорт_НовыйАПП.Ссылка) + "; номерАПП=" + Импорт_НомерАППСтрока + "; видДокумента=" + Строка(Импорт_НовыйАПП.ВидПравовогоДокумента) + "; договор=" + Строка(Импорт_ДоговорСсылка) + "; объект=" + Строка(Импорт_НовыйАПП.ОбъектНедвижимости) + "; клиент=" + Строка(Импорт_НовыйАПП.Клиент) + "; датаПодписания=" + Импорт_ДатаАППСтрока); Исключение Импорт_Ошибок = Импорт_Ошибок + 1; Сообщить("Ошибка создания АПП по договору: deal_id=" + Импорт_DealIdСтр + "; договор=" + Импорт_НомерДоговораФида + "; " + ОписаниеОшибки()); Продолжить; КонецПопытки; Если Импорт_ЛимитСоздания > 0 И Импорт_СозданоАПП >= Импорт_ЛимитСоздания Тогда Прервать; КонецЕсли; КонецЦикла; Сообщить("DryRun = " + ?(Импорт_DryRun, "Да", "Нет")); Сообщить("Всего сделок в фиде = " + Строка(Импорт_Всего)); Сообщить("Подходит по фиду = " + Строка(Импорт_ПодходитПоФиду)); Сообщить("Пропущено: дом не hand-over = " + Строка(Импорт_НеHandOverДом)); Сообщить("Договор не найден = " + Строка(Импорт_ДоговорНеНайден)); Сообщить("Дублей договора = " + Строка(Импорт_ДубльДоговора)); Сообщить("Уже есть АПП = " + Строка(Импорт_УжеЕстьАПП)); Сообщить("Не готов к формированию АПП = " + Строка(Импорт_НеГотовКФормированию)); Сообщить("Найдено к созданию / создано АПП = " + Строка(Импорт_СозданоАПП)); Сообщить("Ошибок = " + Строка(Импорт_Ошибок));