Имя: Пароль:
1C
1С v8
Загрузка товаров в розницу
,
0 ColonelAp4u
 
13.08.15
15:22
Добрый день, не подскажите как разобраться с такой проблемой? На кассах стоит розница 1.0 8.2 Написана служба которая каждые 90 сек грузит товар цены кассиров права и т.д. в базу розницы из ут. Данная служба вызывает модуль в рознице ОбменСУТ далее происходит загрузка в транзакции(если есть что грузить). Если в это время кассир производит действия и затрагивает таблицы с которыми работает обмен то касса зависает и потом кассиру выдает конфликт блокировок с указанием таблицы которая заблокирована. Как можно сделать так что бы все работали и друг другу не мешали? (когда касса зависает создается очередь) раньше все проходило быстро и таких вещей не было (логи почистил, базу на ТиИ отправил с удалением битых сылок)
1 ДенисЧ
 
13.08.15
15:30
грузите данные кусками (в плане обмена есть настройка)
2 ColonelAp4u
 
13.08.15
15:32
(1) там не через план обмена)
3 ДенисЧ
 
13.08.15
15:36
(2) тем проще будет внести изменения )
4 ColonelAp4u
 
13.08.15
15:40
(3) Денис подскажите как а то пока не могу понять в какую сторону вы меня подталкиваете!
5 ДенисЧ
 
13.08.15
15:41
(4) Откуда же я могу знать, как там у вас выгрузка идёт, если не по плану обмена...
Мне отсюда не видно...
6 ColonelAp4u
 
13.08.15
15:45
Процедура ОбменУТ() Экспорт
    КаталогИБ=КаталогИБ();
    ПутьОбмена=Константы.ПутьОбмена.Получить();
    ВыборкаТоваров = Справочники.Номенклатура.Выбрать();
    НачатьТранзакцию();
    Попытка
        Если Ping(ПутьОбмена) Тогда
            КопируемФайлыИзСетевойНаКассу(ПутьОбмена);
            ПередачаСторноВУТ(ПутьОбмена);
        КонецЕсли;
        Товары=Новый Файл(КаталогИБ+"\TOVARVS.DBF");    
        Если Товары.Существует() Тогда
            //Лог("Загрузка товаров!",0);
            Если ОчисткаЗагрузкаТовары(Товары.ПолноеИмя) Тогда
                Лог("Очистка и загрузка товаров выполнена!",0);
            Иначе
                Лог("Ошибка загрузки товаров!",1);
            КонецЕсли;
        КонецЕсли;
        Карты=Новый Файл(КаталогИБ+"\Cards.DBF");    
        Если Карты.Существует() Тогда
            //Лог("Загрузка информационных карт!",0);
            Если ОчисткаЗагрузкаКарты(Карты.ПолноеИмя) Тогда
                Лог("Загрузка информационных карт выполнена!",0);
            Иначе
                Лог("Ошибка загрузки информационных карт!",1);
            КонецЕсли;
        КонецЕсли;
        НастройкаРМК = Новый Файл (КаталогИБ+"\NastrRMK.xml");
        Если НастройкаРМК.Существует() Тогда    //Обработка настройки РМК
            Если ОчисткаЗагрузкаНастройкиРМК(НастройкаРМК.ПолноеИмя) Тогда
                Лог ("Загрузка настройки РМК выполнена!", 0);
            Иначе
                Лог  (ОписаниеОшибки(), 1);
            КонецЕсли;
        КонецЕсли;        
        ТоварыПодбора=Новый Файл(КаталогИБ+"\Podbor.DBF");    
        Если ТоварыПодбора.Существует() Тогда
            //Лог("Загрузка информационных карт!",0);
            Если ОчисткаЗагрузкаТоваровПодбора(ТоварыПодбора.ПолноеИмя) Тогда
                Лог("Загрузка товаров подбора выполнена!",0);
            Иначе
                Лог("Ошибка загрузки товаров подбора!",1);
            КонецЕсли;
        КонецЕсли;
        Кассиры=Новый Файл(КаталогИБ+"\Users.DBF");    
        Если Кассиры.Существует() Тогда
            //Лог("Загрузка пользователей ИБ!",0);
            Если ОчисткаЗагрузкаПользователей_Стар(Кассиры.ПолноеИмя) Тогда
                Лог("Загрузка пользователей ИБ выполнена!",0);
            Иначе
                Лог("Ошибка пользователей ИБ!",1);
            КонецЕсли;
        КонецЕсли;
        ПраваКассиров=Новый Файл(КаталогИБ+"\KassRoles.xml");    
        Если ПраваКассиров.Существует() Тогда
            //Лог("Загрузка информационных карт!",0);
            Если ОчисткаЗагрузкаПравКассиров(ПраваКассиров.ПолноеИмя) Тогда
                Лог("Загрузка прав кассиров выполнена!",0);
            Иначе
                Лог(ОписаниеОшибки(),1);
            КонецЕсли;
        КонецЕсли;        
        //Загрузка Товаров текущие цены
        Файлы=НайтиФайлы(КаталогИБ, "TOVAR*.DBF");
        Если Файлы.Количество()>0 Тогда
            СписокФайлов=Новый ТаблицаЗначений;
            СписокФайлов.Колонки.Добавить("ИмяФайла");
            Для каждого Файл из Файлы Цикл
                Если  (Найти(Файл.ИмяБезРасширения,"TOVARVS"))Тогда
                    Продолжить;
                КонецЕСли;
                Стр=СписокФайлов.Добавить();
                Стр.ИмяФайла=Файл.ПолноеИмя;        
            КонецЦикла;
            СписокФайлов.Сортировать("ИмяФайла");    
            Для каждого Файл из СписокФайлов Цикл
                //Лог("Загрузка товаров промежуточная!",0);
                ЗагрузитьФайлУТ(Файл.ИмяФайла);
                Лог("Загрузка товаров промежуточная выполнена!",0);
            КонецЦикла;
        КонецЕсли;
        Попытка
            ЗафиксироватьТранзакцию();
        Исключение
            Лог("Ошибка загрузки МА! "+ОписаниеОшибки(),1);
        КонецПопытки;
    Исключение
        ОтменитьТранзакцию();
        УдалитьФайлы(КаталогИБ(), "*.DBF");
        УдалитьФайлы(КаталогИБ(), "*.opo");
        УдалитьФайлы(КаталогИБ(), "*.jpg");
        попытка
            УдалитьФайлы(КаталогИБ(), "NastrRMK.xml");
        исключение
        конецПопытки;
        попытка
            УдалитьФайлы(КаталогИБ(), "KassRoles.xml");
        исключение
        конецПопытки;         
        Лог("Ошибка загрузки данных!",1);
    КонецПопытки
КонецПроцедуры

Вот такую процедуру запускает служба
7 ColonelAp4u
 
13.08.15
15:47
Я Выгрузил из Ут Скидочные карты  25 к штук, пока идет загрузка этих карт я спокойно добавляю товар изменяю количество, но если делаю сторно сразу конфликт
8 ejikbeznojek
 
13.08.15
15:50
Как-то странно, зачем это делать раз в 90 секунд?
Если объём выгрузки большой, то ничего с этим особо не сделаешь.
Разве что извращаться как-нибудь...например продажи не проводить, а записывать, а проводить потом в конце дня
9 ColonelAp4u
 
13.08.15
15:54
(8) Объем выгрузки большой бывает ночью когда кассы полностью чистятся и заново грузятся в этот момент магазины не работают.
А в течении дня может из ут прийти новая цена на товары новый кассир с правами новая номенклатура, и когда обмен работает с таблицей к которой относится та и или иная выгрузка то если кассир в этот момент производит действие то происходит блокировка данной таблицы
10 ejikbeznojek
 
13.08.15
16:01
(9) Ну согласись, что обменом новая номенклатура когда придёт из УТ. В живую этот товар ещё не приедет. Реально чаще чем 2-3 раза в день нужна только информация по ценам. Если вдруг внезапно решили что-то поменять.

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

Может хард по быстрее поставить? Но лучше бы убедить всех что обмен нужен 2-3 раза в день)
11 ColonelAp4u
 
13.08.15
16:07
(10) цены могут приходить новые и по этому приходится грузит часто. Есть кассы новые на ССД дисках и там тоже случается тоже самое. процедура в начале смотрит есть ли файлы, если есть она в начале их копирует к себе в базу а потом из папки с базой загружает в 1с. Выгрузка может быть и не большой просто в момент достаточно 1 секунды если таблица заблокирована обменом и в этот момент кассир что то делает происходит конфликт. Я прошу вас помочь/ответить/подсказать как сделать так чтобы обмен работал и не мешал кассиру. Может создать еще таблицу такую же? и пусть один работает с одной другой с другой. а после сделать перенос данных из одной в другую когда не будут выполняться ни какие операции кассиром?
12 ejikbeznojek
 
13.08.15
16:36
Может сделать константу какую-то,"ИдётЗагрузка"
И в момент обращения к таблице условие
если ИдётЗагрузка тогда
//ждём пока загрузка кончится
конецесли
13 разработчик 1с
 
13.08.15
16:38
(12) лучше константу - ОткрытЧек.
пока продавец оформляет, ничего не грузится
пришёл ты на кассу с товарами, денег достал, а кассир руками разводит - тут 1с пишет, идёт загрузка..стоим..
14 ejikbeznojek
 
13.08.15
16:56
(13) ну не суть, главное разделить по времени загрузку и всё остальное.
Ещё лучше тогда "СейчасПроводитсяДокумент" потому что кассир откроет чек и убежит в туалет по писать. И может быть наверное не только чек.