Имя: Пароль:
1C
 
Получение файлов ДО из БУХ
0 Terrixus
 
03.06.25
11:17
Добрый день,

разбираюсь с интеграцией ДО с Бухгалтерией. Конкретно, надо получить информацию из справочника Файлы в обработке, т.е. программно на стороне БУХ.

Где вообще описаны доступные способы/примеры программно получить подобную информацию. Я не могу их найти. Что-то похожее есть в общих модулях на стороне Бух, но к ним же должна быть документация?

Версия БИД Версия 1.1.18, версия ДО 2 Корп
1 PLUT
 
гуру
03.06.25
11:19
(0) почитайте для начала

Описание веб-сервисов.html
Описание механизмов интеграции.doc

в каталоге шаблонов 1С, что-то типа: ...tmplts\1c\DocMngCorpRuEng (не знаю, у вас обычный ДО или КОРП)
2 Bigbro
 
03.06.25
11:27
смотрите в конфигурации про DMService  и в частности DMGetObjectListRequest
3 rozer76
 
03.06.25
12:42
если нет в штатной интеграции то примерно так:
в ДО http-сервис по ИНН, ну в БУХ можно даже файл открыть, если он хранится в "томах".

Подробности

Функция ПолучитьФайлыGET(Запрос)
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        ИНН = Запрос.ПараметрыURL["inn"];
        СтрокаJSON = ПолучитьФайлыПоИНН(ИНН);
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.Использовать);
    Исключение
        Ответ = Новый HTTPСервисОтвет(404);
        ТекстСообщения = СтрШаблон(НСтр("ru = 'Ошибка метода ПолучитьФайлыGET %1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Ответ.УстановитьТелоИзСтроки(ТекстСообщения);
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции

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

4 Terrixus
 
03.06.25
15:20
(2) получаю объекты типа DMFile, почему-то слишком мало полей. Например, нет даже расширения, владельца, даты создания... Что я делаю не так? Я могу как-то отфильтровать их по имени владельцу, например?

Вот код

    Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьПрокси();
    Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMGetObjectListRequest");
    Запрос.type = "DMFile";
    //Запрос.query = СписокУсловий;
    
    Результат = Прокси.execute(Запрос);
    ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Результат);
    
    Для Каждого Элемент из Результат.items Цикл
        Сообщить(СтрШаблон("%1 %2 %3", Элемент.object.name,  Элемент.object.objectId.id, Элемент.object.objectId.type ));
    КонецЦикла;
5 Garykom
 
гуру
03.06.25
15:31
(4) columnSet установи для возврата
или для каждого в цикле запрашивай конкретный DMFile
6 Garykom
 
гуру
03.06.25
15:32
(4) для фильтра в ДО изучи в конфигураторе ОбработкаЗапросовXDTO.ОбработатьУниверсальноеСообщение
ищи подходящий
7 Garykom
 
гуру
03.06.25
15:33
(6)+ например
ИначеЕсли ПроверитьТип(Сообщение, "DMGetFileListByOwnerRequest") Тогда
				Результат = ПолучитьСписокФайловПоВладельцу(Сообщение);
8 Garykom
 
гуру
03.06.25
15:38
А еще лучше не страдать с изучением БИДа а допилить один свой универсальный метод и все

Добавь в XDTO пакет DM (в ДО) свой "универсальный" тип (точнее два типа), с неограниченной строкой запроса входящего и результата исходящего
И хреначь туда JSON как запрос и как ответ

В итоге что хочешь то и запрашивай и сам как надо кодом возвращай через сериализацию JSON

Например я так отбор компоновки данных со всеми группами гоняю из ЕРП в ДО
И текст запроса для ДО
В ответ результат запроса с наложенным через СКД отбором возвращается
9 Terrixus
 
03.06.25
16:09
Ну вот у меня есть список, который я получил через DMGetObjectListRequest. Каким образом мне получить адрес хранения файла в ДО (хранится в файловом томе, реквизит ТекущаяВерсияПутьКФайлу)

В текущем объекте там такого нет.
10 Garykom
 
гуру
03.06.25
16:13
(9) адрес нельзя получить этим методом
и нахрена он тебе?

можно получить двоичные данные файла
или наваять свой метод для получения адреса

ну или допилить текущий
типа в columnSet передаешь нечто вроде "ТекущаяВерсияПутьКФайлу" или "твойпрефикс_НужныйРеквизит"
11 Terrixus
 
03.06.25
16:45
"и нахрена он тебе?"

Мне нужно его локально сохранить. Двоичные данные тоже подойдут. Как их получить?

Спасибо, выручаете.
12 Garykom
 
гуру
03.06.25
16:53
binaryData
13 Terrixus
 
03.06.25
16:57
Это я понял ) Ну то есть так же, через columnSet.

Я посмотрел глобальным поиском, синтаксис такой

    Запрос.columnSet.Добавить("name");
    Запрос.columnSet.Добавить("binaryData");
    Запрос.columnSet.Добавить("extension");


Копирую к себе это условие - "Поле объекта не обнаружено (columnSet)". что я делаю не так?
14 Garykom
 
гуру
03.06.25
17:01
(12)+ например
ИнтеграцияС1СДокументооборотБазоваяФункциональностьВызовСервера.ФайлыПоВладельцу

// Возвращает список XDTO файлов по объекту Документооборота.
//
// Параметры:
//   ИдентификаторВладельца - Строка - уникальный идентификатор объекта Документооборота.
//   ИмяВладельца - Строка - представление объекта Документооборота.
//   ТипВладельца - Строка - тип XDTO объекта Документооборота.
//   ВключатьПомеченныеНаУдаление - Булево - Истина, если нужно получить файлы без учета пометки.
//
// Возвращаемое значение:
//   ОбъектXDTO - Список объектов XDTO типа DMFile.
//
Функция ФайлыПоВладельцу(ИдентификаторВладельца, ИмяВладельца, ТипВладельца,
		ВключатьПомеченныеНаУдаление = Ложь) Экспорт
	
	Прокси = ИнтеграцияС1СДокументооборотБазоваяФункциональностьПовтИсп.ПолучитьПрокси();
	
	Запрос = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(Прокси, "DMGetFileListByOwnerRequest");
	ПолучаемыеПоля = Запрос.columnSet; // СписокXDTO
	Владельцы = Запрос.owners; // СписокXDTO
	
	ОбъектВладелец =  ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(Прокси, "DMObject");
	ОбъектВладелец.name = ИмяВладельца;
	ОбъектВладелец.objectID = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьObjectID(
		Прокси,
		Строка(ИдентификаторВладельца),
		ТипВладельца);
	
	Владельцы.Добавить(ОбъектВладелец);
	
	ПолучаемыеПоля.Добавить("objectID");
	ПолучаемыеПоля.Добавить("signed");
	ПолучаемыеПоля.Добавить("name");
	ПолучаемыеПоля.Добавить("size");
	ПолучаемыеПоля.Добавить("creationDate");
	ПолучаемыеПоля.Добавить("modificationDateUniversal");
	ПолучаемыеПоля.Добавить("author");
	ПолучаемыеПоля.Добавить("extension");
	ПолучаемыеПоля.Добавить("description");
	ПолучаемыеПоля.Добавить("encrypted");
	ПолучаемыеПоля.Добавить("editing");
	
	// добавить binaryData
	ПолучаемыеПоля.Добавить("binaryData");
	
	Если ВключатьПомеченныеНаУдаление Тогда
		Запрос.ignoreDeletionMark = Истина;
		ПолучаемыеПоля.Добавить("deletionMark");
	КонецЕсли;
	
	// Захват и редактирование файлов.
	Если ИнтеграцияС1СДокументооборотБазоваяФункциональностьПовтИсп.ДоступенФункционалВерсииСервиса("1.4.8.1") Тогда
		ПолучаемыеПоля.Добавить("editingUser");
	КонецЕсли;
	
	Файлы = ИнтеграцияС1СДокументооборотБазоваяФункциональность.ВыполнитьЗапрос(Прокси, Запрос);
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПроверитьВозвратВебСервиса(Прокси, Файлы);
	
	Возврат Файлы;
	
КонецФункции
15 Garykom
 
гуру
03.06.25
17:01
(13) ты какую DM используешь и как?
смотри (14)
16 Terrixus
 
03.06.25
17:09
(15) понял в чем разница. Я прокси подключаю так
        Прокси=ИнтеграцияС1СДокументооборот.ПолучитьПрокси(Истина,"Администратор","",ложь);


Если поменять на строку как в сообщении выше, то columnSet ошибку не выдает.
17 Terrixus
 
03.06.25
17:12
(15) сори, разница не в прокси, а в методе. уже запутался в конец - спасибо, буду разбираться.
18 Terrixus
 
04.06.25
16:49
"Добавь в XDTO пакет DM (в ДО) свой "универсальный" тип (точнее два типа), с неограниченной строкой запроса входящего и результата исходящего
И хреначь туда JSON как запрос и как ответ"

вообще, звучит красиво. а есть какой-то мануал, как это сделать? отправлять запросы, которые структуру которых я формирую и давать ответы, которые опять я формирую - это вообще все мои проблемы решит в данной области.

как настроить?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший