Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обмен данными в 7,7
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Alex007
Здравствуйте. Избитая вроде тема, но все таки спрошу. Необходимо наладить обмен данными между старой ТИС и Комплексной. Причем часть документов и справочников в одну сторону, часть в обратную. Вот думаю как лучше это организовать. В идеале (для оперативности) хотелось бы при проведении (или перепроведении дока) выгружать и записывать в другую базу.Но у нас такой беспредел, что документ может быть записан и проведен сегодня, потом снят с проводки, поменян номер на другой и перемещен на другую дату. Так же ковыряются и в "заднем числе" что тоже нагружает. Конечно, можно запретить редактирование и все под подпись менять, но это можно охренеть тогда. Хотелось бы разрешить ковырятся в документах скажем недельной давности. Подскажите, на основе чего будет правильнее такое организовать?
BigProblem
Alex007 @ Сегодня, 18:49 необходимо зарегистрироваться для просмотра ссылки,
1С: Конвертация данных - не предлагать?
Alex007
Честно, никогда не юзал. Но гугл сообщает о геморах постоянных других юзеров.
Zaval
А в чем смысл работы в двух базах с разными конфигурациями?
Alex007
одна под торговлю заточена, вторая для бухов
igmig65
если доступ к обоим базам возможен с одной машины, и такой обмен нужно делать постоянно, то лучше чем ОЛЕ не придумаете, можно будет работать из одной базы сразу с двумя.
Alex007
Цитата(igmig65 @ 25.03.16, 10:58) необходимо зарегистрироваться для просмотра ссылки
если доступ к обоим базам возможен с одной машины, и такой обмен нужно делать постоянно, то лучше чем ОЛЕ не придумаете, можно будет работать из одной базы сразу с двумя.

Спасибо. А как насчет глючности. Т.е. если один и тот же док. будут пытаться в обеих базах открыть например, ну или другие нестандартные ситуации. У вас есть опыт таких решений, где бы можно было почитать о практическом исполнении данного метода?
ПС Да, базы на одном компе и ДБФные обе
Cthulhu
Подсказка: УРБД.
Таблица 1supdts содержит список ИД измененных объектов данных.
Каждую из двух баз сделать центральной. Для каждой создать базу - только приемник.
Настроить мирацию объектов данных как надо (для каждой миграция чего надо только в эту самую периферийку - как будто в другую базу данных).
Когда надо - читать из 1supdts список "чего надо вігружать", "раскручивать" по ID объектов до примитивных значений реквизитов и в нужном формате выгружатью Каковую выгрузку - загружать в приемник. И чистить 1supdts. Плюс опциональн (и возможно) крутить в прочих урбд-кишочках маркеры-номра-признаки выполненных обменов.
А в-общем, задача далеко не тривиальная. Хотя и вполне решаемая. Лично я - делал, по каковой причине с этими глупостями сюда и вылезаю.
Alex007
Цитата(igmig65 @ 25.03.16, 11:58) необходимо зарегистрироваться для просмотра ссылки
то лучше чем ОЛЕ не придумаете

"Придумал" подключаться через ОЛЕ. Всунул в ПриЗаписи() документа, который надо перенести, исполнение обработки, которая создает новый док. в другой базе. Все работает вроде, создается нужный док, но с тормозами конечно. Но вот столкнулся и со следующими проблемами- как передать создаваемому доку время текущего документа? И не могу придумать как сделать чтобы один раз подключиться к базе и только обращаться к ней, а не как сейчас- постоянно вылазит окошко логин/пароль для подключения другой базы. Прописал в Глобальном следующее:

    //+++++++++++++++++++++++OLE-подключение+++++++++++++++++++++++++++++++++++++  
         Процедура ПриНачалеРаботыСистемы()

    БазаИсточник = СоздатьОбъект("V77.Application");  
    Путь=Строка("D:\1C_Base\Копия(2)\");
    Пользователь=глПользователь;
    пароль="";
    Открыта = БазаИсточник.Initialize(БазаИсточник.RMTrade, "/D" + СокрЛП(Путь) + " /N" + Пользователь + "/P" + Пароль, "");
    Если Открыта = 0 Тогда
        Предупреждение("Ошибка открытия информационной базы 2");
        Иначе
            Сообщить("База 2 доступна");
    КонецЕсли

В выгружаемом доке как правильно подключаться к уже открытой базе? Пока, чтобы проверить, как работает я прописал тоже самое что и в глобальном.
XBrut
Cthulhu @ 25.03.16, 21:54 необходимо зарегистрироваться для просмотра ссылки,
УРБД только для того, чтобы получить список изменённых объектов?
Alex007
Цитата(Cthulhu @ 25.03.16, 21:54) необходимо зарегистрироваться для просмотра ссылки
Подсказка: УРБД.
Таблица 1supdts содержит список ИД измененных объектов данных.
Каждую из двух баз сделать центральной. Для каждой создать базу - только приемник.
Настроить мирацию объектов данных как надо (для каждой миграция чего надо только в эту самую периферийку - как будто в другую базу данных).
Когда надо - читать из 1supdts список "чего надо вігружать", "раскручивать" по ID объектов до примитивных значений реквизитов и в нужном формате выгружатью Каковую выгрузку - загружать в приемник. И чистить 1supdts. Плюс опциональн (и возможно) крутить в прочих урбд-кишочках маркеры-номра-признаки выполненных обменов.
А в-общем, задача далеко не тривиальная. Хотя и вполне решаемая. Лично я - делал, по каковой причине с этими глупостями сюда и вылезаю.

Проделал все манипуляции с УРБД. Алгоритм ясен, хочу спросить- каким образом "вытаскивать" данные об измененных объектах из 1supdts? Нет ли у вас примера или кусок модуля для этой манипуляции? Все что я нашел это вот: необходимо зарегистрироваться для просмотра ссылки
Но там просто сообщение на табло выводится об изм. объектах. А надо это все в файл засовывать для дальнейшей обработки насколько я понимаю?
V..I..P
Alex007, В процедурах "ОбработкаПроведения" и "ПриЗаписи" делайТЕ запись в каталог файла, в котором "ЗначениеВСтрокуВнутр".
СделайТЕ пользователя робот, который постоянно запущен и мониторит каталог. Появился файл, через ОЛЕ - Конвертацию передал его приемнику. И в приемнике использовать Блокировка()
Установить/прочитать режим блокировки.
Если при вызове метода параметр <ВклВыкл> не задан, то возвращается режим блокировки до выполнения метода.
Число: 1 - заблокирован; 0 - свободен.
Если при вызове метода параметр <ВклВыкл> задан, то возвращается результат выполнения метода блокировки.
Число: 1 - успешно; 0 - не получилось.


УРБД мне кажется для больших проектов на SQL и большого гемороя пока это все отладишТЕ.


 ! 

необходимо зарегистрироваться для просмотра ссылки: 1
 
Alex007
V..I..P @ Сегодня, 18:20 необходимо зарегистрироваться для просмотра ссылки,
Минусик имеется тут. Если юзверь поменял номер к примеру, то все, куку? Необходимо ID какой-то прописывать тогда всем докам и что-то ему присваивать в ВводНового()? И еще , почему УРБД рассматривал- юзер может от нечего делать х-раз просто открыть и записать док и в этом случае получим кучу ненужных файлов и оле-переносов, а урбд по итогу одну запись сделает в АПДЕЙТС. Но гемора с этим уриб конечно в разы...
Zaval
Цитата(Alex007 @ 12.04.16, 17:22) необходимо зарегистрироваться для просмотра ссылки
Проделал все манипуляции с УРБД. Алгоритм ясен, хочу спросить- каким образом "вытаскивать" данные об измененных объектах из 1supdts? Нет ли у вас примера или кусок модуля для этой манипуляции? Все что я нашел это вот: необходимо зарегистрироваться для просмотра ссылки
Но там просто сообщение на табло выводится об изм. объектах. А надо это все в файл засовывать для дальнейшей обработки насколько я понимаю?

Если Вы успешно пошаманили с кодами баз(т. е. получили "правильные" заголовки файлов обмена), то ничего никуда вытаскивать не нужно - УРБД сама проведет обмен. Остается только после изменений конф удалять из 1supdts записи с пустыми TYPEID и OBJID.

ЗЫ. А "заднее число" нужно искоренить на уровне приказа по фирме. Это эффективнее километров кода.
V..I..P
Alex007, Из ЗначениеВСтрокуВнутр() можно получить УИД объекта и хранить в реквизите базы приемника.
В таблицах УРБД хранится ссылка на объект, там нет изменений для этого объекта.

А вот для проверки изменений, я думаю понадобится что-то типа "РигистрСведений" и в каждой форме документа/справочника в процедурах "ПриЗаписи()" создать гл. процедуру в которой нужно сравнить Объект и Ссылку на отличия.
Была такая наработка на просторах 1СРР.ру. Как называется, не помню. Но что-то типа Детальное логирование объектов в Access
Alex007
Цитата(Zaval @ 13.04.16, 10:43) необходимо зарегистрироваться для просмотра ссылки
Если Вы успешно пошаманили с кодами баз(т. е. получили "правильные" заголовки файлов обмена), то ничего никуда вытаскивать не нужно - УРБД сама проведет обмен. Остается только после изменений конф удалять из 1supdts записи с пустыми TYPEID и OBJID.

Я не знаю насколько успешно у меня получилось, прошу "проинспектировать"). вот мой алгоритм действий:
1. Поднял УРБД в базе, из которой надо выгружать. Периферийную назначил как "только получатель" (на всякий случай)
2. В конце раб. дня делаю выгрузку из Головной базы, далее раскладываю обновленный файл АПДЕЙТС и вытягиваю оттуда инфу об объектах которые изменялись, записываю данные в другой файл (экспорт.дбф) в соотв. колонки : ТИП НомерДок Датадок (считаю достаточно).
3. Через ОЛЕ обрабатываю уже Экспорт.ДБФ и переношу соотв. документы в другую конфу по нужным мне правилам.
4. Делаю выгрузку из Периферийки и загружаю квитанцию в Гол. базу для подтверждения полученных изменений и автоматической очистки АПДЕЙТС.
А вот что Вы имели ввиду под "УРБД сама проведет обмен" я не понял. Если каким то образом возможно "вклиниться" в УРБД и заставить преносить данные в принципиально другую конфу, без таких телодвижений как я описал- то это высший пилотаж для меня....


Цитата(V..I..P @ 13.04.16, 10:53) необходимо зарегистрироваться для просмотра ссылки
Alex007, Из ЗначениеВСтрокуВнутр() можно получить УИД объекта и хранить в реквизите базы приемника.
В таблицах УРБД хранится ссылка на объект, там нет изменений для этого объекта.

А вот для проверки изменений, я думаю понадобится что-то типа "РигистрСведений" и в каждой форме документа/справочника в процедурах "ПриЗаписи()" создать гл. процедуру в которой нужно сравнить Объект и Ссылку на отличия.
Была такая наработка на просторах 1СРР.ру. Как называется, не помню. Но что-то типа Детальное логирование объектов в Access

Честно говоря, задача несколько посложнее чем вариант с шаманством по УРБД и думаю, мне не под силу такое провернуть и главное- качественно отладить! А вот какое-то уникальное идентифицирование объекта (документа прежде всего) мне прийдется внедрить. Пока не знаю как. У нас часто возникает такая ситуация- есть например Док № АА-0000325 от 10.04.2016 Клиент.Код=0001, из него могут сделать АА-000032ъ от 11.04.2016 (чтоб не сбивать нумератор и освободить номер) ,а освободившийся № АА-0000325 присвоить доку с Клиент.Код=0002 скажем. Как правильно идентифицировать эти доки я не могу понять. Как вариант- хочу попробовать создать реквизит ИД (тип строка) в обеих базах и ТОЛЬКО в процедурах ВводНового(), вводНаосновании() присваивать ему что-то типа ИД=Строка(НомерДок+ТекущаяДата()+ТекущееВремя());
Zaval
Цитата(Alex007 @ 14.04.16, 9:51) необходимо зарегистрироваться для просмотра ссылки
Если каким то образом возможно "вклиниться" в УРБД и заставить преносить данные в принципиально другую конфу, без таких телодвижений как я описал- то это высший пилотаж для меня....

Пишу по памяти - без точных названий файлов.
УРБД не контролирует идентичность конф.
При создании ПБ конфа создает свой клон. Если в ЦБ изменить конфигурацию, в 1supdts появляется запись с пустым TYPEID(при изменении отдельных объектов - с пустыми OBJID). Тогда при следующей выгрузке в пакет обмена добавляется MDфайл(весь или частично). По наличию этого файла ПБ запускает обновление своей конфы. В эпоху диалапа часто правили код в ПБ - изменения успешно работали до следующего обновления.
Список баз с их кодами, признаками ЦБ/ПБ, датами и номерами выгрузок хранится в обычном дбф-файле и его можно править программно и вручную. Кстати, редактированием записей этого файла базу можно "отцепить" от УРБД, заставить обмениваться с "левыми" базами, выступать в обменах то ЦБ то ПБ.
Но в Вашем случае это не поможет - в разнотипных базах объекты и их реквизиты "обзываются" по разному.
Вам нужно писать обработку, которая по расписанию будет находить свежую выгрузку и редактировать файлы. Обычная замена текста.
Нужно исправить: файл-квитанцию(коды баз), заголовок файла данных(там дублируется содержимое квитанции) и в самих данных заменить идентификаторы объектов. Соотв надо будет поправить и ответную квитанцию - файл с сообщением об успешной загрузке(по его получении чистится 1supdts в базе источнике).
СтОит ли возиться со всем этим - решать Вам. Я бы взял творческий отпуск на денек и попробовал бы научить копии баз обмениваться одним-двумя объектами.

Еще во время оно был довольно распространен МОД( МОД ПиБ? менеджер обмена данными). Я видел базы с ним, но не применял его и не настраивал. Знаю, что при установке он вписывает в конфу свои участки кода и абсолютно не чувствителен к различиям конфигураций. Давненько о нем ничего не слышно...
Поищите, возможно, это будет для Вас оптимальным вариантом, хотя, емнип, по надежности он уступает УРБД.

ЗЫ. УРБД идентифицирует(для себя) объекты по внутреннему идентификатору и выгрузит объект в состоянии на момент выгрузки с любыми изменениями. Подмена объекта юзером исключена в принципе.

ЗЗЫ. Вспомнил об одной особенности УРБД: выгрузка/загрузка по сети может вызывать ошибку. Т. е. правильно и надежно так: выгрузка на локальный диск - копирование готового пакета - загрузка с локального диска.
V..I..P
Alex007, ЗначениеВСтрокуВнутр() для элемента, документа, перечисления есть уникальный идентификатор. ничего думать не нужно, уже все придумали за вас.
Создать один справочник "Соответствие объектов", в нем колонки: строка "УИД объекта"(Это если объект пришел из вне), Неопределенно "Объект". В обоих реквизитах отбор по реквизиту и сортировку.
Вот вам и отпадает связка Номер Дата Тип дока. И свое колесо с ИД для документа
twilight_dream
У нас розница меняется когда заблагорассудится главбуху. А в оптовой торговле только ночью через регламентные задания. Меняться следует одним видом объекта тлько в одну сторону. В крайнем случае поставить приоритет. Или сложный приоритет. К примеру, если сегодня на филиале и в центральной базе меняли один и тот же док, то цб затрет филиальную. А если менялась только на филиале, то она затрет цб-шную. Вобщем вариантов миллион.
Alex007
Что-то никак не хочет ОЛЯ со мной подружиться). Но все равно докручу, хотя бы ради собственного развития что-ли уже. Пока мучаюсь с этим всем, понаписывал параллельно обработок обмена через ДБФ- в принципе работает, но хочется "жити по-новому" так сказать)). Вот какая закавыка сейчас донимает- не могу найти док. по ОЛЕ. "ОлеСчет - Не выбран документ" и все тут, хотя он есть. Что не так подскажите?

    Док=СоздатьОбъект("Документ");
           олеДок=БазаИсточник.CreateObject("Документ");

                Док.ВыбратьДокументы(ДатаОтчета);
            олеДок.ВыбратьДокументы(ДатаОтчета);
    
    Пока Док.ПолучитьДокумент()=1  Цикл  
      Если (Док.Вид()= "Счет") тогда
        олеДок.НайтиПоНомеру(Док.НомерДок,ДатаОтчета,"Счет");
        олеСчет=ОлеДок.ТекущийДокумент();
        олеКл.НайтиПоКоду(Док.Контрагент.Код,0);
        олеСчет.Контрагент=олеКл.ТекущийЭлемент();
     //.........................................
        олеСчет.Записать();  
        Сообщить("Обновлен"+олеСчет.ПредставлениеВида()+" №"+СокрЛП(олеСчет.НомерДок)+" от "+Шаблон("[олеСчет.ДатаДок]"));
Acid
Нужно получить Вид полученного документа из цикла, создать такой объект, потом ПолучитьДокумент().
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.