8.х Вопрос по обмену?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем -=ak=-, 17 ноя 2007.

  1. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Вопрос по обмену?

    У нас три организации у каждой своя периферийная база и главный узел, куда стекается вся информация. Номенклатура везде одинаковая. Нужно при поступлении новой номенклатуры присваивать ей новый значение число + 1. Данную функцию можно реализовать только в главном узле, при обмене присваивать новое значение артикула, иначе есть вероятность задублировать значения, если это делать в периферийных узлах.
    В модуле объекта справочника пишу процедуру ПередЗаписью()

    Код:
    Если НЕ ЭтоГруппа И СокрЛП(Артикул) = "" И ОбменДанными.Загрузка Тогда
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Номенклатура.Артикул КАК МахАртикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |    МахАртикул УБЫВ";
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Артикул =  МахАртикул + 1;                 
    КонецЕсли;
    
    Как только в периферийном узле создается новая номенклатура, сразу в главном становиться новый артикул + 1, все хорошо, но обратно новый артикул не возвращается. Если эту операцию проделать руками заполнить самому новый артикул в главном узле то все ОК.
    Где проблема?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Не догнал: "сразу в главном становиться" и "руками заполнить самому новый артикул в главном узле то все ОК."

    ЗЫ. Если правильно понял: то должны вообще разные артикулы получится. В главном один будет, в периферийном другой...
  3. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26

    Нет.

    Во всех базах должен быть один артикул, который присваивается автоматом в главном узле по мере поступления туда новой номенклатуры из периферийных баз. В периферийной базе установка артикула запрещено, поле закрыто от редактирования.
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Ты не понял - у тебя получаются разные артикулы?
  5. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    По шагам:

    1. В периферийной базе 2, создали товар (унитаз белый), артикул не присвоен, т.к. в периферийных базах на создание артикула закрыт доступ.
    2. Сделали обмен с главным узлом. В главном узле создалась позиция (унитаз белый) и автоматом присвоен артикул (4521).
    3. Разослали обмен во все периферийные узлы.

    Что должно получиться при правильной работе:

    1. В база 1 и 3 создается новая позиция (унитаз белый) с артикулом (4521)
    2. В базе 2 устанавливается только артикул (4521), т.к. позиция уже там создана.

    Описание проблемы приводил выше.
    Уже два дня ломаю голову. :unsure:
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Дык в итоге в 2 нет артикула - правильно? Я тебя это спрашивал :)

    ЗЫ. Не ПередЗаписью - а в ПриЗаписи перенеси...
  7. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26

    Нет, неправильно.
    У меня четыре базы (3 периферийные + 1 главная). Нет во всех переферийных, в ТРЁХ !!!! :unsure:
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Ну дык правильно... :)

    Если я правильно помню (сам сталкивался :unsure:)- то происходит так:
    Сначала идёт регистрация изменений и только потом запись в базу - мораль ясна?
    Поэтому в ПередЗаписью работать не будет...
  9. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    И что делать? :unsure: B) :D
  10. sergey
    Offline

    sergey Курильщик

    Регистрация:
    13 апр 2006
    Сообщения:
    365
    Симпатии:
    0
    Баллы:
    26
    А если идти другим путем?

    [1], [2], [3] - три разных офиса
    Нумерацию кодов присваиваем обработкой разную в зависимости от офисов в каждом офисе при создании номенклатуры.
    Артикула заполняем сразу.

    В [1] нумерация кодов идет:
    1000000001
    1000000002
    1000000003
    1000000004 и т.д.

    В [2] нумерация идет:
    2000000001
    2000000002
    2000000003
    2000000004 и т.д.

    В [3] соотвественно:
    2000000001
    2000000002
    2000000003
    2000000004 и т.д.

    А при выгрузке/загрузке переносим полностью элемент справочника.
    Получается не сквозная нумерация, зато проблема слияния сразу решается.

    Года 3 уже так работаю - достаточно удобно. Причем нет проблем и при открытии новых офисов.
  11. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    В типовой торговле это задается префиксами узла...
    Для генерации уникального штрихкода тоже использую :)

    ЗЫ. Поправь 2 на 3 в третьей части :)

    ЗЗЫ. Попробуй вставить ПРИНУДИТЕЛЬНУЮ запись объекта. И ещё:
    1. В ПриЗаписи-то попробовал?
    2. Записать() в ПриЗаписи надо делать...
    3. Как вариант - обработка после чтения изменений проходится по справочнику (запрос) и ставит нужные значения...
  12. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Номенклатура во всех базах общая, так не получиться!

    ПриЗаписи() не работает!
  13. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Ну, вообще-то, sergey нормальное решение предложил - просто ты его не понял - оно будет работать :)

    Но я бы сделал обработку после чтения изменений - ибо на производительности не скажется, а вот обновления проще делать будет - особенно это влияет в 8.1
  14. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Прописал в процедуре ПриначалеРаботыСистемы() код:


    Код:
    //Ставим артикул в ГБ
    
    Если ПланыОбмена.ГлавныйУзел() = Неопределено Тогда
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ЗначениеАртикула", "");
    Запрос.Текст = "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Артикул = &ЗначениеАртикула
    |    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
    
    ЗапросАртикула = Новый Запрос;
    ЗапросАртикула.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Номенклатура.Артикул КАК МахАртикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |    МахАртикул УБЫВ";
    ВыборкаАртикула = ЗапросАртикула.Выполнить().Выбрать();
    ВыборкаАртикула.Следующий();
    МахАртикул = ВыборкаАртикула.МахАртикул;
    
    Объект = Выборка.Ссылка.ПолучитьОбъект();
    Объект.Артикул = Объект.Артикул + 1;
    
    Попытка
    Объект.Записать();
    Исключение
    Сообщить("Ошибка! Установка артикула - " + Выборка.Ссылка.Наименование + " невозможна!", СтатусСообщения.Важное);
    КонецПопытки;
    
    КонецЦикла;    
    
    КонецЕсли;
    
    Может не очень красиво и гибко, зато работает на 100%
  15. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    1. В запросе получай сразу артикул - быстрее будет
    2. Запихай всё в одну транзакцию - еще немного быстрее будет.
    3. Если 8.1 - привяжись к событию ПланОбмена.ПриОкончанииЧтенииИзменений (что-то в это духе) и выполняй там
    4. Не надо каждый раз получать запросом (запрос в цикле - это зло) максимальный артикул - достаточно в транзакции ВЫБРАТЬ ДЛЯ ИЗМЕНЕНИЯ и потом самому делать инкремент - будет быстрее и правильнее.
  16. sergey
    Offline

    sergey Курильщик

    Регистрация:
    13 апр 2006
    Сообщения:
    365
    Симпатии:
    0
    Баллы:
    26
    Я не понял, что может не получиться...
    Номенклатура единая во всех базах - это понятно.
    Уникальность достигается нумерацией раздельно задаваемой раздельно в разных офисах, но общей в целом. Разница лишь в несквозной нумерации с точки зрения кода номенклатурной карточки. Не работать это будет только в случае, если вводить одновременно(до синхронизации) одинаковые номенклатурные позиции одновременно в разных базах. Имхо, идти надо по простому пути, а не создавать себе лишние проблемы. Может и не прав, конечно, но так проще... ;)
  17. Kossstya
    Offline

    Kossstya

    Регистрация:
    4 дек 2007
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    :unsure: Ужос
    Вот что у тебя есть:
    ГЛ, 1,2,3
    Артикулы в 1,2,3 не ставим - нормально, пусть так будет.
    Проблема: создание новой номенклатурной позиции без артикула в 1, или в 2, или в 3.
    Процесс:
    1. Создаем номенклатурную позицию в 1.
    2. Далее обмениваемся, она приходит в ГЛ. В процедуре ПриПолученииДанныхОтПодчиненного обрабатываем все то, что пришло. Если элемент, который пришёл - это номенклатура, то необходимо поставить артикул(в этой же процедуре и ставим) . После этого ВЗВОДИМ РЕГИСТРАЦИЮ ДЛЯ УЗЛОВ 1, 2, 3. Все! При следующем обмене номенклатура с артикулом появится на магазинах 1, 2, 3

Поделиться этой страницей