В PAPI 0.9.2.6 появился функционал важный и не очень, в любом случае обновление не маленькое, поэтому я решил сделать статью с описанием новшеств и подготовил несколько примеров.
1 Переработан механизм отложенного действия с документами.
- Добавлено действие «Снять пометку удаления»
- Добавлено действие «Установить пометку удаления»
- Добавлен макет с информацией по действиям с документами (РегистрСведений.PAPI_ОчередьДействийСДокументами.Макеты.ИнформацияПоДействиям)
3 Обновлена обработка PAPI_НастройкаСоставаИсторииДанных
- Изменена функция для подключения БСП: "Дополнительные обработки и отчеты", обработка теперь работает нормально с БСП и без
- Переименована команда "Прочитать настройки заново" в "Перечитать"
- Добавлена строка поиска по дереву метаданных
- Добавлена строка поиска по дереву полей и табличных частей
- Добавлен расширенный поиск по дереву метаданных
- Добавлен расширенный поиск дереву полей и табличных частей
- Добавлена полная очистка истории данных на выбранную дату
- Добавлена чистка истории данных по выбранному объекту метаданных
4 Обновлена обработка PAPI_ОтправкаСообщенийСервисовИнтеграции
- Добавлена проверка на Минимальную версию платформы 8.3.17. Если платформа меньше, функционал будет отсутствовать
- Добавлена проверка на версию платформы 8.3.21. Если версия больше или равна тогда появится возможность снять галочку создающую параметр "РазмерСообщения"
- Изменена функция для подключения БСП: "Дополнительные обработки и отчеты", обработка теперь работает нормально с БСП и без
5 Обновление обработок PAPI_НастройкаСоставаИсторииДанных и PAPI_СообщенияСервисовИнтеграции
- Изменена функция для подключения БСП: "Дополнительные обработки и отчеты", обработка теперь работает нормально с БСП и без
6 Добавлен механизм для автоматической очистки устаревших версий истории данных.
8 Проведены санитарные работы
- Логирование алгоритмов и методов убрано из модуля логирования.
- Из общих методов убрано начальное заполнение.
- Заполнение заголовка ответа перенесено в модуль работы с ответом.
- Частично подправлен нейминг и описание процедур и функций.
Основные флажки отвечающие за поведение изменили первичное отображение. Ранее они были в один ряд и я иногда сам ошибался включая не тот флажок.
Теперь заголовок находится справа и сами флажки побиты на две строки:
На закладке «Ответ» ранее было жестко "захардкожено" тело ответа в виде строки и если выбирали файл или двоичные данные, при записи значение менялось на строку. Я в работе не использовал другие варианты, а протестировать их руки не доходили. Протестировал и исправил два бага.
Можно использовать двоичные данные и файлы:
В связи с этим изменением были добавлены новые методы в демо базу, ниже покажу их в примерах.
Постановка задачи:
В демо базу добавлена закладка «Демо»
На закладке демо есть справочник «Страны мира», в который уже добавлено несколько стран:
На закладке «Демо» появился СКД отчет по странам мира «Все страны мира»:
Необходимо сделать метод, который будет вызывать обработку «ДемоПримерыМетодовPAPI» из расширения «Локализация PAPI» и в случае если передан параметр «CountryCode», метод будет возвращать страны найденные по коду. Результат будет возвращаться в файле с расширением XLSX. Метод должен работать как Get так и как Post.
При вызове Get в «CountryCode» передается код одной страны, при вызове Post передается массив кодов.
Создаем метод и включаем Get и Post.
Флажки выставил все, но можно оставить только «Разрешен».
Имя методу указал GetListCountriesXLSX
На закладке «Запрос» в параметрах добавил параметр «Страны» и в Алгоритме выбрал строку.
Код по созданию массива кодов:
МассивСтран = Новый Массив;
Если ПараметрыЗапроса.Свойство("CountryCode") Тогда
МассивСтран.Добавить(Справочники.СтраныМира.НайтиПоКоду(ПараметрыЗапроса.CountryCode));
КонецЕсли;
Результат = МассивСтран;
Напоминаю: таким образом мы обрабатываем Query-параметры, они передаются после знака "?" в URL и чаще всего используются в запросах get.
Далее на закладке «Тело» пишем обработку для передаваемого в теле JSON с параметрами запроса post:
// читаем JSON
ТелоЗапросаJSON = PAPI.Прочитать_JSON(СтруктураВходныхПараметров.ТелоЗапроса);
МассивСтран = Новый Массив;
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
Если ТелоЗапросаJSON.Свойство("CountryCode") Тогда
Если ТипЗнч(ТелоЗапросаJSON.CountryCode) = Тип("Массив") Тогда
Для Каждого ТекущаяСтрана Из ТелоЗапросаJSON.CountryCode Цикл
МассивСтран.Добавить(Справочники.СтраныМира.НайтиПоКоду(ТекущаяСтрана));
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПараметрыМетода.Вставить("Страны", МассивСтран);
Результат = ПараметрыМетода;
На закладке «Вычисления» пишу вызов процедуры «ПолучитьСписокСтранВXML» из обработки «ДемоПримерыМетодовPAPI» добавленной в расширение «ДемоПримерыМетодовPAPI»:
текОбработка = Обработки.ДемоПримерыМетодовPAPI.Создать();
текОбработка.ПолучитьСписокСтранВXML(ПараметрыМетода, СтруктураВозврата);
PAPI.ДобавитьЗаголовокОтвета(ПроизвольныеЗаголовки, "Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
Результат = СтруктураВозврата.ДанныеОтвета;
Процедура «ПолучитьСписокСтранВXML» из обработки:
// Получить список стран в XML на основании СКД
//
// Параметры:
// ПараметрыМетода - Структура - Входящие параметры запроса
// СтруктураВозврата - Структура - Исходящее состояние ответа
//
Процедура ПолучитьСписокСтранВXML(ПараметрыМетода, СтруктураВозврата) Экспорт
Страны = ?(ПараметрыМетода.Свойство("Страны"), ПараметрыМетода.Страны, Неопределено);
СхемаКомпоновки = Отчеты.ВсеСтраныМира.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ВариантНастройки = СхемаКомпоновки.ВариантыНастроек.Найти("Основной");
НастройкиКомпоновки = ВариантНастройки.Настройки;
ПараметрОтбора = НастройкиКомпоновки.Отбор.Элементы;
СтранаПолеКомпоновки = Новый ПолеКомпоновкиДанных("Ссылка");
Для Каждого Элемент Из ПараметрОтбора Цикл
Если Элемент.ЛевоеЗначение = СтранаПолеКомпоновки Тогда
Элемент.Использование = ЗначениеЗаполнено(Страны);
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Элемент.ПравоеЗначение = Страны;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабличныйДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//ИмяВременногоФайла = ПолучитьИмяВременногоФайла("XLSX");
//ТабличныйДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
//СтруктураВозврата.ДанныеОтвета = Новый ДвоичныеДанные(ИмяВременногоФайла);
//УдалитьФайлы(ИмяВременногоФайла);
НовПоток = Новый ПотокВПамяти;
ТабличныйДок.Записать(НовПоток, ТипФайлаТабличногоДокумента.XLSX);
СтруктураВозврата.ДанныеОтвета = НовПоток.ЗакрытьИПолучитьДвоичныеДанные();
КонецПроцедуры
Обратите внимание, что перед потоком оставлен закомментированный код выполняющий помещение в ответ двоичных данных с использованием временного файла. Этот вариант продемонстрирую в следующем методе.
На закладке «Ответ» указываем двоичные данные:
Проверяем GET в браузере. Выбираем все страны:
http://localhost/papi_demo/hs/papi/v1/GetListCountriesXLSX
Открываем скаченный файл:
Теперь передадим GET с параметром:
http://localhost/papi_demo/hs/papi/v1/GetListCountriesXLSX?CountryCode=642
Открываем скаченный файл:
Теперь проверяем POST через postman.
Тело запроса в JSON:
{
"CountryCode": ["643", "642"]
}
Ответ прилетел.
Создаю метод копированием предыдущего и изменяю версию на V2:
Меняю код на закладке «Вычисления»:
Страны = ?(ПараметрыМетода.Свойство("Страны"), ПараметрыМетода.Страны, Неопределено);
СхемаКомпоновки = Отчеты.ВсеСтраныМира.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("Основной");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
ПрараметрОтбора = НастройкиКомпоновки.Отбор.Элементы;
СтранаПолеКомпоновки = Новый ПолеКомпоновкиДанных("Ссылка");
Для Каждого Элемент Из ПрараметрОтбора Цикл
Если Элемент.ЛевоеЗначение = СтранаПолеКомпоновки Тогда
Элемент.Использование = ЗначениеЗаполнено(Страны);
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Элемент.ПравоеЗначение = Страны;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабличныйДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("XLSX");
ТабличныйДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
PAPI.ДобавитьЗаголовокОтвета(ПроизвольныеЗаголовки, "Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
Результат = Новый ДвоичныеДанные(ИмяВременногоФайла);
PAPIУдалиВременныйФайл = ИмяВременногоФайла;
Обратите внимание результат в данном случае я решил сделать через временный файл, а не поток.
В самом конце написан код:
PAPIУдалиВременныйФайл = ИмяВременногоФайла;
Это служебная переменная и после выполнения метода произойдет удаление временного файла:
УдалитьФайлы(ИмяВременногоФайла);
Проверяем GET в браузере. Выбираем все страны:
http://localhost/papi_demo/hs/papi/v2/GetListCountriesXLSX
Открываем скаченный файл:
Теперь передадим GET с параметром:
http://localhost/papi_demo/hs/papi/v2/GetListCountriesXLSX?CountryCode=642
Открываем скаченный файл:
Postman тоже отрабатывает нормально.
Прежде чем сделать метод немного теории:
Тело ответа у нас может быть строка, двоичные данные и файл. При этом строка и двоичные данные имеют данные до отправки. Файл же получает данные в момент отправки.
То есть этот метод хорош когда у вас есть некая папка с файлами и вам периодически их нужно отправлять по запросу. Этот метод не предполагает, что мы будем формировать временные файлы, отправлять их и удалять. Поэтому то, что я покажу неправильно, делаю это просто для примера. Имейте ввиду после этого метода сохранится временный файл, который необходимо почистить руками. В следующих версиях PAPI я сделаю чистку через переменную из метода V2.
Создаю метод копированием предыдущего и изменяю версию на V3:
Оставляю все как было, меняю только тело ответа на закладке ответ:
Проверяем GET в браузере. Выбираем все страны:
http://localhost/papi_demo/hs/papi/v3/GetListCountriesXLSX
Открываем скаченный файл:
Так как я ничего в коде не менял, делаем вывод, что работает и с параметрами и через postman.
Таким образом можно реализовать выгрузку данных в Ексель для коллег, чтобы они получали отчеты не входя в 1с. Ну или вдруг вам нужен Ексель как источник данных для других систем...
Добавлен механизм для автоматической очистки устаревших версий истории данных.
«История Данных» появилась уже давно, еще на платформе 8.3.11. Это очень классный механизм который нам дала фирма 1С, но почему же его так мало людей используют?
Все потому, что фирма 1С по мимо механизма забыла дать следующее:
1 Хорошо оформленную информацию.
2 Инструменты по работе с этим механизмом стали появляться только с платформы 8.3.24.
3 До сих пор в типовых конфигурациях нет ролей по работе с историей данных и нет подсистемы по авто отчистке устаревших версий. Хотя, что уж сделать проще?
Первые два пункта я уже помог закрыть фирме 1С, а третий пункт частично сделал в PAPI.
Появился следующий пункт:
Форма настроек с включенным отбором:
По умолчанию включена настройка отбора «Показывать только со включенной историей данных». Соответственно выводятся только те метаданные по которым включена История данных программно или в конфигураторе, но если отключить отбор то мы увидим все объекты.
Отбор отключен:
Я не стал делать как в БСП: Версионирование объектов. Честно скажу, мне не нравится, что там можно выбрать за текущий год, месяц и тд. Мне нужно хранить в принципе за год.
ВОПРОС: Если Вам нужно как в БСП. Напишите в комментариях и я сделаю дополнительные настройки.
Настройки по чистке можно включить из меню:
Настройки можно включить из контекстного меню:
Можно настроить регламент и выполнить чистку вручную:
Чистка происходит в одном потоке, в следующих версиях планирую сделать механизм настройки многопоточной чистки.
Переработан механизм отложенного действия с документами.
Механизм отложенного действия с документами служит для того, чтобы была возможность во время обмена документ просто записать, а уже потом выполнять затратные операции.
Механизм состоит из следующих объектов конфигурации:
1 Перечисление «PAPI_ДействиеСДокументом» со следующими значениями:
- Запись – с документом будут выполнено следующее действие Документ.Записать();
- ОтменаПроведения – с документом будут выполнено следующее действие Документ.Записать(РежимЗаписиДокумента.ОтменаПроведения);
- Проведение – с документом будут выполнено следующее действие Документ.Записать(РежимЗаписиДокумента.Проведение);
- ПроведениеНеоперативный – с документом будут выполнено следующее действие Документ.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
- СнятьПометкуУдаления – с документом будут выполнено следующее действие Документ.УстановитьПометкуУдаления(Ложь);
- УстановитьПометкуУдаления – с документом будут выполнено следующее действие Документ.УстановитьПометкуУдаления(Истина);
2 Регистр сведений PAPI_ОчередьДействийСДокументами служит для фиксации отложенного действия. Регистр содержит макет (ИнформацияПоДействиям) в котором описаны все варианты состояния источника и приемника. Описано, что в каждом из случаем делаю я, но это не значит, что вы будете делать тоже самое. Также описаны варианты которых быть недолжно (когда документ и проведен и помечен на удаления) и что с ними делать.
3 Константа PAPI_КоличествоПопытокОчередиДокументов служит для хранения количества допустимых попыток выполнения отложенного действия с документом. При превышении количества попыток, данное действие больше не выполняется.
4 Регламентное задание PAPI_ВыполнитьОбработкуОчередиДействийСДокументами
Примечание:
В текущей версии настройка находится в головной форме настроек подсистемы PAPI, в следующей версии запланировано переработка структуры подсистем и разработка понятной формы настроек.
Код для записи данных в регистр:
РегистрыСведений.PAPI_ОчередьДействийСДокументами.ДобавитьИзменитьЗапись(СтруктураЗаписи);
Пример регистра с ошибками:
Пример регистра без ошибок:
Изменения обработок из состава PAPI-tools
Обновлена обработка PAPI_НастройкаСоставаИсторииДанных
Было в версии 0.9.2.5:
Стало в версии 0.9.2.6:
Подробно по изменениям можно прочитать в статье История данных. Изменения в платформе 8.3.26
Также все обработки из PAPI-tools теперь можно использовать как в конфигурациях без БСП, так и встраивать в подсистему БСП: «Дополнительные обработки и отчеты».
Добавлен регистр сведений для сбора ошибок при выполнении подписки с постобработкой истории данных
Данный регистр сделан для тех случаев, когда в интеграции используется «История данных» и подписка на событие «ОбработкаПослеЗаписиВерсийИсторииДанных»
Про данный вид обмена я расскажу в будущей статье с примерами, в данной статье опишу кратко.
В подписке «ОбработкаПослеЗаписиВерсийИсторииДанных» выполняется следующий код:
// Так-как по одному объекту, может быть, несколько изменений, группируем их в СоответствиеДанных
СоответствиеДанных = PAPI_ПодпискиНаСобытия.СоответствиеНаОснованииОбработкаПослеЗаписиВерсийИсторииДанных(Источник, ИнформацияОЗаписиВерсий);
// В цикле обрабатываю все измененные объекты
Для Каждого элСоответствия Из СоответствиеДанных Цикл
// Тут код по формированию сообщений
Если БылаОшибка Тогда
// Вот тут происходит запись в регистр сведений PAPI_ОшибкиОбработкиПослеЗаписиВерсий
РегистрыСведений.PAPI_ОшибкиОбработкиПослеЗаписиВерсий.ЗаписатьОшибкуВРегистр(ТекДанные, РезультатПодготовки);
Так выглядит запись в регистре:
// Чистка объекта из очереди++
PAPI_ИсторияДанных.УдалитьИзОбработкиПослеЗаписиВерсий(ТекДанные.Данные, Неопределено);
// Чистка объекта из очереди--
Продолжить;
Иначе
// Отправка сообщений и прочие действия
КонецЕсли;
КонецЦикла;
Итоги:
Как видите изменений было не мало, и прежде чем писать продолжение по использованию PAPI, я решил, что про изменения нужно рассказать отдельно.
Подсистема лежит на GitHub, найти ее там труда не составит. Если вы не используете GitHub, я создал отдельную статью на Infostart и выложил все исходники в нее.
Следить за обновлениями можно в моем телеграмм канале, найти который труда не составит.
На этом статью завершаю, спасибо за терпение.
Всем удачи и интересных проектов.
1 Информация по HTTP сервисам:
HTTP Сервисы: Путь к своему сервису. Часть 1
HTTP Сервисы: Путь к своему сервису. Часть 2
HTTP Сервисы: Путь к своему сервису. Часть 3
HTTP Сервисы: Путь к своему сервису. Часть 4
Проект, который прошел путь от провала до web-клиента. От web-клиента до мобильного приложения
2 Информация по Истории данных:
Настройка состава "Истории данных"
Версионирование объектов VS История данных
История данных. Изменения в платформе 8.3.24
История данных. Изменения в платформе 8.3.26
Неочевидный баг Истории данных, убивающий rphost
Планы обмена VS История данных
3 Информация по Сервисам интеграции
Три инструмента для сервисов интеграции
Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?
Сервисы интеграции без Шины и интеграции
[Замер] Кто самый быстрый в конфигураторе?
4 Примеры PAPI