Как выгрузить в 8.3 данные в dbf Добрый вечер. В 8ке не силён, но тут возникла простая задача выгрузить в дбф из БП 3,0 перечень расходных накладных: дата, номер, контрагент, сумма. Сочиняю внешнюю обработку, понимаю, что создание файла ДБФ, его полей и сохранение нужно делать под директивой НаКлиенте, а перебор документов - НаСервере. Но, чёрт побери, не понимаю, как, перебирая на сервере документы, заполнять НаКлиенте ДБФку? Чувствую, что, перебрав на сервере документы, нужно создать какую-то временную таблицу, запихать её в реквизит, и уже потом его на клиенте читать и заполнять. Но как конкретно это сделать? Подскажите, пожалуйста, концепцию передачи данных с сервера на клиент. Или я не так понимаю решение задачи? Что-то не разобрался я в этих УФ :( |
Все прекрасно делается на сервере |
(1) прав, + пишем временный файло во временной папке на сервере(не забудем потом стереть за собой) и в конце передаем его на клиент |
(0) Либо верни на Клиента массив записей, где запись это структура, повторяющая поля dbf. |
(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 = Запись.СуммаДокумента; КонецЦикла; ДБФ.Записать(); ДБФ.ЗакрытьФайл(); КонецПроцедуры |
Спасибо за помощь, попробую. |
Зачем всё это??? в 1С такая возможность есть стандартная, только там делается эксель, а уж из экселя дбф делается на раз... Любой журнал документов такую вещь умеет делать... |
[quote=shotsdv2008;46022613]Зачем всё это???[/quote] потом планируется разворачивать документы и построчно пихать в ДБФ. Оттуда они будут загружаться в консолидированную базу. |
(6) Во-первых, это уже многоходовка. Во-вторых, совсем не на раз из Excel-я dbf-ку сделать. Штатно это уже не поддерживается, придется устанавливать надстройку. (7) А через текстовые файлы не рассматриваешь? С разделителем или xml. Реквизиты шапки и ТЧ в один dbf-файл несколько коряво получится. Я в свое время в Консолидированную базу на БП 3.0 собирал из 7-х бухгалтерий и 8-х БП 3.0 напрямую через OLE и ComConnector. |
(0) Еще как вариант. Сделай расширение для нужного документа, где после процедуры ПослеЗаписи() будет вызываться формирование файла выгрузки. Таким образом, при любом изменении документа будет заново сформирована выгрузка (для актуальности). А в консолидирующей базе будешь мониторить каталог на предмет появления нового файла и оперативно подгружать. |
[quote=US1C;46022960]А через текстовые файлы не рассматриваешь? [/quote] Нет, не получится. В том смысле, что загрузчик в консолидированную базу уже есть, он грузит из других 7/8 именно из дбф. Мне лишь надо выдать такой-то файл с такими-то полями. |
[quote=US1C;46023041]Сделай расширение для нужного документа, где после процедуры ПослеЗаписи() будет вызываться формирование файла выгрузки. [/quote] Да, спасибо за совет. Сделаю. Но сначала нужно выдать требуемое. Потом уже подумаю об улучшениях. |
По моему, идея достаточно бредовая. Надо либо настривать синхронизацию, либо писать нормальные выгрузку и загрузку. Просто так "разворачивать" не получится, в документе ссылочные типы, их опять надо разворачивать, а там опять и опять. С DBF файлами Вас ожидает неминуемое фиаско |
[quote=USSR;46026821] С DBF файлами Вас ожидает неминуемое фиаско[/quote] Да не, всё уже работает. В ДБФ грузятся построчно док-ты (ИД), коды контров, товаров, кол-во и сумма. В Консолидированную базу всё отлично загружается, синхронизируется по кодам. За гибкость схемы не ручаюсь, конечно, но вот так, в лоб, всё работает. |
(13) USSR имел (наверное) ввиду, что не будет выгружена вся информация ссылочных объектов, являющихся реквизитами документов. Но вам видно достаточно кода или наименования. |
(14)Я могу только предположить, что продажи выгружаются по товарам, контрагента и прочее, которые уже ЕСТЬ в консолидированной базе. Вообще как то странно из БП 3.0 продажи выгружать ) |
(15) Ну да, в таком случае им достаточно ИНН контрагента выгружать или наименование товара. |
[quote=USSR;46030576]продажи выгружаются по товарам, контрагента и прочее, которые уже ЕСТЬ в консолидированной базе[/quote] Разумеется. Так и есть. [quote=USSR;46030576] как то странно из БП 3.0 продажи выгружать [/quote] Ну.. У всех свои тараканы в учёте. Не будем об этом. :) В любом случае, всем спасибо. Задача решена. |
Обнаружился интересный эффект.. Перебираю документы в простейшем цикле: Выборка = Документы.РеализацияТоваровУслуг.Выбрать(НачДата, КонДата); Пока Выборка.Следующий() Цикл ... КЦ Так вот, если выбрать в качестве НачДата и КонДата одинаковую дату, то цикл не делает ни одной итерации. А чтобы выгрузить документы, например, за 1.09, я должен выбрать диапазон 1.09-2.09. Это, багофича какая-то? |
18-ПереходимНа8 > в снеговике дата содержит дата+время. и что ты хочешь получить в выборке в диапазоне 15.05.18 00:00:00 - 15.05.18 00:00:00 ...? это те не кристально ясные клюшки, это, брат, негры в черной комнате с выбитыми зубами и в черных очках... |
.. поэтому выбирай от НАЧАЛА ДНЯ до КОНЦА ДНЯ |
[quote=Чучундер;46042465]это те не кристально ясные клюшки, это, брат, негры в черной комнате с выбитыми зубами и в черных очках.[/quote] Вот уж воистину.. [quote=Чучундер;46042465]поэтому выбирай от НАЧАЛА ДНЯ до КОНЦА ДНЯ[/quote] а ведь точно, что-то такое вспоминается.. Спасибо! |
Это азбука ) Если время при отборе не надо, то проще всего даты сделать с составом "дата" и при выборке конечную дата брать как КонецДня(), как и написал уважаемый Чучундер |
Текущее время: 23:54. Часовой пояс GMT +3. |