Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разделение базы
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01)
обычные формы.

Есть так сказать 2 удаленных филиала у каждого филиала от 2-х и более складов.
По специфике их работы необходимо разделить их по двум разным базам.
При этом должна быть синхронизация по всем справочникам, за исключением Контрагенты, Договора, РасчетныеСчета, Банки.
Так же в филиалах не должно быть документов другого филиала.
По сути получается как вообще сторонняя организация, но с тесными связями (это как мне

Единственно наверное общим будет Номенклатура и подобные справочники или связанные с ним.

Думал попробовать использовать РИБ, но из-за описанного выше не подходит, т.к. синхронизация РИБ по всем справочникам, тем более что РИБ для меня черный ящик, попробовал почитать - с наскоку не разобраться.
Также необходимо чтобы филиал видел общие (не раздельно по складам) остатки товаров, чтобы можно было перемещать товар с/на.

Пока есть идея сделать 2 копии и выполнить свертку каждой, а потом удалить все лишнее в каждой их них.
Синхронизацию справочников думал сделать посредством обработки через подключение к другой базе на подобии АДО (или как оно там правильно называется) - конечно здесь могут ожидать сюрпризы, т.к. пока не знаю как быстро найти все отличия в номенклатурах и определить где правильная версия, а какую нужно заменить и так по всем параметрам.

Товар другого филиала думал загружать через функционал Прайс-лист контрагента или добавить справочник(регистр) ОстаткиФилиала.
Перемещение товара между филиалами, наверное через ЗаказПоставщику (Ф1) ->ЗаказПокупателя (Ф2) -> РеализацияТоваров (Ф2) ->ПоступлениеТоваров (Ф1).

Может кто-нибудь сталкивался с таким и может дать рекомендации, как это лучше реализовать.
sava1
ИМХО - Лучше "убить время" на РИБ, чем потом постоянно "чесаться".
Vofka
А почему нельзя использовать RLS?
sava1
поищите у гугла "Управление областью миграции данных в механизмах обмена данными"
bizisoft
Цитата(sava1 @ 20.12.17, 15:44) необходимо зарегистрироваться для просмотра ссылки
Лучше "убить время" на РИБ, чем потом постоянно "чесаться".

А что можно РИБ настроить под себя, чтобы синхронизировало только то что нужно?
Цитата(Vofka @ 20.12.17, 15:55) необходимо зарегистрироваться для просмотра ссылки
А почему нельзя использовать RLS?

А что это за зверь такой?
Если конечно я правильно понял что это, то просто нужно, чтобы некоторой информации одного филиала не было в другом физически, а не ограничивать доступ к ней.
sava1

Цитата(bizisoft @ 20.12.17, 15:47) необходимо зарегистрироваться для просмотра ссылки
чтобы синхронизировало только то что нужно?


Наводку ж кинул
Vofka
Цитата(bizisoft @ 20.12.17, 15:47) необходимо зарегистрироваться для просмотра ссылки
А что это за зверь такой?
Если конечно я правильно понял что это, то просто нужно, чтобы некоторой информации одного филиала не было в другом физически, а не ограничивать доступ к ней.

Что нужно, я не знаю. Но если информации "не видят" кому не положено, можно ли это расценивать, что её нету? В общем, с использованием RLS можно скрыть нужную информацию от посторонних. Там образом можно не париться с обменами. Но RLS не панацея и там есть свои недостатки и свои проблемы особенности. Поэтому как лучше сделать, зависит от конкретной задачи и конкретных условий. Решать вам smile.gif .
cos12
Цитата(bizisoft @ 20.12.17, 15:47) необходимо зарегистрироваться для просмотра ссылки
А что можно РИБ настроить под себя, чтобы синхронизировало только то что нужно?

можно
bizisoft
В итоге выяснилось, что РИБ в Альфа-Авто не работает - на этапе создания "образа" подчиненной базы выдавало ошибку.
Об ошибке сообщил в поддержку, а они подтвердив у себя ошибку отправили разрабам.
Время исправления бага - неизвестно.

Поэтому решено делать разделение своими силами.
Предварительно база была была почищена от помеченных на удаление объектов, выполнено восстановление последовательности, тестирование и исправление и выгрузка в файл.
Из бекапа была восстановлена в отдельную папку (копия) в которой запустил Свертку базы (самописная), на выходе были получены:
ВводОстатковТоваров (в разрезе Склад)
ВводОстатковВзаиморасчетов (в разрезе Валюта, Подразделение)
ИзменениеЦен (в разрезе ТипЦены)

и куча помеченных на удаление документов.
Запущена очистка помеченных на удаление и ТиС ИБ.
Получена свернутая база.
Из нее сделана еще одна копия, а дальше индивидуальная чистка каждой базы от других подразделений.

Все вроде получилось нормально.

Следующий этап синхронизация.
Перемещение товаров решено сделать через фиктивного контрагента, через следующую цепочку:
1) Ф1.ЗаказПоставщику --->--(СОМ соединение)--->---- Ф2.ЗаказПокупателя
2) Ф2.ЗаказПокупателя --->--(на основании)--->-- Ф2.РеализацияТовара
3) Ф2.РеализацияТовара --->--(СОМ соединение)--->---- Ф1.ПоступлениеТовара

Как думаете, на сколько такая схема жизнеспособна?

А вот с получением и отображением остатков другого филиала(ов) ситуация такая.
Для хранения прайса филиала создал РегистрСведений Измерения:( НашиФилиалы; Номенклатура; ), Остаток, Цена
Через СОМ соединение подключаюсь к филиалу и запросами получаю две ТЗ (Партии и Цены), далее в цикле перебираю ТЗПартии и для текущего товара через ТЗЦена.Найти() получаю Цену.
Полученные данные записываю в Регистр.
Все работает, но как-то очень долго выполняет.
Есть предположение, что это из-за того, что каждый происходит старт и проведение транзакции.
Подскажите пожалуйста, как можно этот процесс ускорить.

Вот код
        ТЗОстатки = ПолучитьОстаткиПрайс();
    ТЗЦены = ПолучитьЦеныПрайс();
    
    Для Каждого Стр Из ТЗОстатки Цикл        
        НайденаяСтрока = ТЗЦены.Найти(Стр.Артикул, "Артикул");
        Цена = 0;
        Если НайденаяСтрока = Неопределено Тогда
        Иначе
            Цена = НайденаяСтрока.Цена;
        КонецЕсли;        
                
        //Записываем запись в регистр сведений
        Набор = РегистрыСведений.ТоварыФилиалов.СоздатьНаборЗаписей();
        Набор.Прочитать();
        НовЗапись = Набор.Добавить();
        НовЗапись.НашФилиал= пвФилиал;
        НовЗапись.Номенклатура= Стр.Номенклатура;
        НовЗапись.ОстатокОбщий = Стр.Остаток;
        НовЗапись.ЦенаЗакупки = Цена;
    Набор.Записать();

    КонецЦикла;


Может быть можно быстрее загрузить в регистр из ТЗ.
Я пробовал, но выдавало ошибку (точно не помню какую) что-то типа не совместимости полей.

Petre
bizisoft @ Сегодня, 15:51 необходимо зарегистрироваться для просмотра ссылки ,
По коду вы считываете абсолютно все имеющиеся записи регистра, и потом их же плюс новые записи записываете.
bizisoft
Цитата(Petre @ 10.01.18, 17:02) необходимо зарегистрироваться для просмотра ссылки
По коду вы считываете абсолютно все имеющиеся записи регистра, и потом их же плюс новые записи записываете.

Получается, нужно перед Прочитать() выполнить отбор по двум Измерениям (НашФилиал и Номенклатура), подставляя соответствующее текущее значение?

bizisoft @ Сегодня, 21:43 необходимо зарегистрироваться для просмотра ссылки ,
Добавил отбор
Набор = РегистрыСведений.ТоварыФилиалов.СоздатьНаборЗаписей();
        Набор.Отбор.НашФилиал.Установить(пвФилиал);
        Набор.Отбор.Номенклатура.Установить(Стр.Номенклатура);                  
        Набор.Прочитать();


Выдало ошибку:
Набор.Записать();
по причине:
Запись с такими ключевыми полями существует! : ТоварыФилиалов: ГРАНД-ПАРТС, Подшипник дифференциала ( 00118-27-350 ) (Регистр сведений: Товары филиалов)

А оно не должно перезаписать данные?
bizisoft
bizisoft @ Вчера, 22:03 необходимо зарегистрироваться для просмотра ссылки ,
Нашел как по другому сделать
ОбъектРегистр = РегистрыСведений.ТоварыФилиалов.СоздатьНаборЗаписей();    
        ОбъектРегистр.ОбменДанными.Загрузка = Истина;
        СтруктураОтбора = Новый Структура();
                //Измерения
        СтруктураОтбора.Вставить("НашФилиал", пвФилиал);
        СтруктураОтбора.Вставить("Номенклатура", Стр.Номенклатура);
                //Ресурсы
                СтруктураОтбора.Вставить("ОстатокОбщий", Стр.Остаток);
        СтруктураОтбора.Вставить("ЦенаЗакупки", Цена);
                
        ОбъектРегистр.Отбор.НашФилиал.Установить(СтруктураОтбора.НашФилиал);
        ОбъектРегистр.Отбор.Номенклатура.Установить(СтруктураОтбора.Номенклатура);         
        ЗаполнитьЗначенияСвойств(ОбъектРегистр.Добавить(), СтруктураОтбора);
        ОбъектРегистр.Записать(Истина);


Вроде работает и в сравнение с предыдущим вариантом раз в 20 быстрее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.