Версия для печати темы (https://pro1c.org.ua/index.php?s=e16da58ce38c9a152574934ec8f2659a&showtopic=42828)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Разделение базы

Автор: bizisoft 20.12.17, 14:34

Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01)
обычные формы.

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

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

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

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

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

Может кто-нибудь сталкивался с таким и может дать рекомендации, как это лучше реализовать.

Автор: sava1 20.12.17, 14:44

ИМХО - Лучше "убить время" на РИБ, чем потом постоянно "чесаться".

Автор: Vofka 20.12.17, 14:55

А почему нельзя использовать RLS?

Автор: sava1 20.12.17, 15:11

поищите у гугла "Управление областью миграции данных в механизмах обмена данными"

Автор: bizisoft 20.12.17, 15:47

Цитата(sava1 @ 20.12.17, 15:44) *
Лучше "убить время" на РИБ, чем потом постоянно "чесаться".

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

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

Автор: sava1 20.12.17, 15:56


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


Наводку ж кинул

Автор: Vofka 20.12.17, 17:01

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

Что нужно, я не знаю. Но если информации "не видят" кому не положено, можно ли это расценивать, что её нету? В общем, с использованием RLS можно скрыть нужную информацию от посторонних. Там образом можно не париться с обменами. Но RLS не панацея и там есть свои недостатки и свои проблемы особенности. Поэтому как лучше сделать, зависит от конкретной задачи и конкретных условий. Решать вам smile.gif .

Автор: cos12 20.12.17, 17:42

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

можно

Автор: bizisoft 10.01.18, 15:51

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

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

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

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

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

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

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

Вот код

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

    КонецЦикла;


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


Автор: Petre 10.01.18, 16:02

bizisoft @ Сегодня, 15:51 * ,
По коду вы считываете абсолютно все имеющиеся записи регистра, и потом их же плюс новые записи записываете.

Автор: bizisoft 10.01.18, 21:03

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

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

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


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

А оно не должно перезаписать данные?

Автор: bizisoft 11.01.18, 2:09

bizisoft @ Вчера, 22:03 * ,
Нашел как по другому сделать

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


Вроде работает и в сравнение с предыдущим вариантом раз в 20 быстрее.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua