Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Как выгрузить в 8.3 данные в dbf (http://forums.kuban.ru/f1040/kak_vygruzit-_v_8_3_dannye_v_dbf-8726737.html)

goto8 24.09.2018 21:56

Как выгрузить в 8.3 данные в dbf
 
Добрый вечер.
В 8ке не силён, но тут возникла простая задача выгрузить в дбф из БП 3,0 перечень расходных накладных: дата, номер, контрагент, сумма. Сочиняю внешнюю обработку, понимаю, что создание файла ДБФ, его полей и сохранение нужно делать под директивой НаКлиенте, а перебор документов - НаСервере. Но, чёрт побери, не понимаю, как, перебирая на сервере документы, заполнять НаКлиенте ДБФку? Чувствую, что, перебрав на сервере документы, нужно создать какую-то временную таблицу, запихать её в реквизит, и уже потом его на клиенте читать и заполнять. Но как конкретно это сделать? Подскажите, пожалуйста, концепцию передачи данных с сервера на клиент. Или я не так понимаю решение задачи? Что-то не разобрался я в этих УФ :(

USSR 25.09.2018 06:59

Все прекрасно делается на сервере

Jimbo 25.09.2018 13:58

(1) прав, + пишем временный файло во временной папке на сервере(не забудем потом стереть за собой) и в конце передаем его на клиент

US1C 25.09.2018 14:22

(0) Либо верни на Клиента массив записей, где запись это структура, повторяющая поля dbf.

US1C 25.09.2018 14:55

(0) Примерно так:

&НаСервере
Функция ВыгрузитьНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Номер КАК Номер,
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК Контрагент,
| РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон";

Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
МассивЗаписей = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Запись = Новый Структура("Номер",ВыборкаДетальныеЗаписи.Номер);
Запись.Вставить("Дата",ВыборкаДетальныеЗаписи.Дата);
Запись.Вставить("Контрагент",ВыборкаДетальныеЗаписи.Контрагент);
Запись.Вставить("СуммаДокумента",ВыборкаДетальныеЗаписи.СуммаДокумента);
МассивЗаписей.Добавить(Запись);
КонецЦикла;
Возврат МассивЗаписей;

КонецФункции

&НаКлиенте
Процедура Выгрузить(Команда)
РасходныеНакладные = ВыгрузитьНаСервере();
Если РасходныеНакладные.Количество()=0 Тогда
Сообщить("Нет документов за выбранный период!");
Возврат;
КонецЕсли;
ДБФ = Новый XBASE;
ДБФ.Кодировка = КодировкаXBase.OEM;

ДБФ.Поля.Добавить("NUM","S",11,0);
ДБФ.Поля.Добавить("DATE","D",,);
ДБФ.Поля.Добавить("KONTR","S",200,0);
ДБФ.Поля.Добавить("SUM","N",15,2);

ИмяФайла = "\\ИмяСервера\ИмяКаталога\ИмяФайла.dbf";

ДБФ.СоздатьФайл(ИмяФайла);
ДБФ.АвтоСохранение = Истина;
Для ххх=0 По РасходныеНакладные.Количество()-1 Цикл
Запись = РасходныеНакладные[ххх];
ДБФ.Добавить();
ДБФ.NUM = Запись.Номер;
ДБФ.DATE = Запись.Дата;
ДБФ.KONTR = Запись.Контрагент;
ДБФ.SUM = Запись.СуммаДокумента;
КонецЦикла;
ДБФ.Записать();
ДБФ.ЗакрытьФайл();

КонецПроцедуры

goto8 25.09.2018 16:07

Спасибо за помощь, попробую.

shotsdv2008 25.09.2018 19:49

Зачем всё это??? в 1С такая возможность есть стандартная, только там делается эксель, а уж из экселя дбф делается на раз... Любой журнал документов такую вещь умеет делать...

goto8 25.09.2018 20:11

[quote=shotsdv2008;46022613]Зачем всё это???[/quote]
потом планируется разворачивать документы и построчно пихать в ДБФ. Оттуда они будут загружаться в консолидированную базу.

US1C 25.09.2018 21:31

(6) Во-первых, это уже многоходовка. Во-вторых, совсем не на раз из Excel-я dbf-ку сделать. Штатно это уже не поддерживается, придется устанавливать надстройку.
(7) А через текстовые файлы не рассматриваешь? С разделителем или xml. Реквизиты шапки и ТЧ в один dbf-файл несколько коряво получится. Я в свое время в Консолидированную базу на БП 3.0 собирал из 7-х бухгалтерий и 8-х БП 3.0 напрямую через OLE и ComConnector.

US1C 25.09.2018 21:55

(0) Еще как вариант. Сделай расширение для нужного документа, где после процедуры ПослеЗаписи() будет вызываться формирование файла выгрузки. Таким образом, при любом изменении документа будет заново сформирована выгрузка (для актуальности). А в консолидирующей базе будешь мониторить каталог на предмет появления нового файла и оперативно подгружать.

goto8 25.09.2018 22:38

[quote=US1C;46022960]А через текстовые файлы не рассматриваешь? [/quote]
Нет, не получится. В том смысле, что загрузчик в консолидированную базу уже есть, он грузит из других 7/8 именно из дбф. Мне лишь надо выдать такой-то файл с такими-то полями.

goto8 25.09.2018 22:40

[quote=US1C;46023041]Сделай расширение для нужного документа, где после процедуры ПослеЗаписи() будет вызываться формирование файла выгрузки. [/quote]
Да, спасибо за совет. Сделаю. Но сначала нужно выдать требуемое. Потом уже подумаю об улучшениях.

USSR 27.09.2018 07:54

По моему, идея достаточно бредовая. Надо либо настривать синхронизацию, либо писать нормальные выгрузку и загрузку. Просто так "разворачивать" не получится, в документе ссылочные типы, их опять надо разворачивать, а там опять и опять. С DBF файлами Вас ожидает неминуемое фиаско

goto8 27.09.2018 22:34

[quote=USSR;46026821] С DBF файлами Вас ожидает неминуемое фиаско[/quote]
Да не, всё уже работает. В ДБФ грузятся построчно док-ты (ИД), коды контров, товаров, кол-во и сумма. В Консолидированную базу всё отлично загружается, синхронизируется по кодам. За гибкость схемы не ручаюсь, конечно, но вот так, в лоб, всё работает.

US1C 28.09.2018 09:22

(13) USSR имел (наверное) ввиду, что не будет выгружена вся информация ссылочных объектов, являющихся реквизитами документов. Но вам видно достаточно кода или наименования.

USSR 28.09.2018 09:33

(14)Я могу только предположить, что продажи выгружаются по товарам, контрагента и прочее, которые уже ЕСТЬ в консолидированной базе. Вообще как то странно из БП 3.0 продажи выгружать )

US1C 28.09.2018 15:11

(15) Ну да, в таком случае им достаточно ИНН контрагента выгружать или наименование товара.

goto8 29.09.2018 02:24

[quote=USSR;46030576]продажи выгружаются по товарам, контрагента и прочее, которые уже ЕСТЬ в консолидированной базе[/quote] Разумеется. Так и есть.

[quote=USSR;46030576] как то странно из БП 3.0 продажи выгружать [/quote] Ну.. У всех свои тараканы в учёте. Не будем об этом. :)

В любом случае, всем спасибо. Задача решена.

goto8 01.10.2018 22:48

Обнаружился интересный эффект..
Перебираю документы в простейшем цикле:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(НачДата, КонДата);
Пока Выборка.Следующий() Цикл
...
КЦ
Так вот, если выбрать в качестве НачДата и КонДата одинаковую дату, то цикл не делает ни одной итерации. А чтобы выгрузить документы, например, за 1.09, я должен выбрать диапазон 1.09-2.09. Это, багофича какая-то?

Чучундер 02.10.2018 01:00

18-ПереходимНа8 > в снеговике дата содержит дата+время.
и что ты хочешь получить в выборке в диапазоне
15.05.18 00:00:00 - 15.05.18 00:00:00
...?

это те не кристально ясные клюшки, это, брат, негры в черной комнате с выбитыми зубами и в черных очках...

Чучундер 02.10.2018 01:00

.. поэтому выбирай от НАЧАЛА ДНЯ до КОНЦА ДНЯ

goto8 02.10.2018 01:12

[quote=Чучундер;46042465]это те не кристально ясные клюшки, это, брат, негры в черной комнате с выбитыми зубами и в черных очках.[/quote]
Вот уж воистину..
[quote=Чучундер;46042465]поэтому выбирай от НАЧАЛА ДНЯ до КОНЦА ДНЯ[/quote]
а ведь точно, что-то такое вспоминается..
Спасибо!

USSR 02.10.2018 06:07

Это азбука ) Если время при отборе не надо, то проще всего даты сделать с составом "дата" и при выборке конечную дата брать как КонецДня(), как и написал уважаемый Чучундер


Текущее время: 23:54. Часовой пояс GMT +3.