8.х Запрос по остаткам

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем jackevsen, 16 июл 2008.

  1. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Добрый день!Можно ли вообще при проведении документа,например,ПриходнаяНакладная,получить остатки товара с учетом этого документа?
    Сейчас у меня так,при проведении документа я делаю запрос к регистру остатков и пытаюсь получить остатки по номенклатуре,которая содержится в документе проведения.Остатки я получаю,но только без учета движения документа,который в данный момент проводится.При чем,запрос я делаю после того,как движения по регистру остатков сформированы.
    Если это возможно,хотелось бы узнать где мне нужно вызывать функцию,которая запрашивает остатки и если есть какие-то особенности запроса хотелось бы их узнать.
    Спасибо.
  2. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    Получить остаток на скалде прибавить количество из табличной части. И не париться.
    Остатки с учетом документа не получите пока не завершите проведение документа полностью.

    Вопрос в другом зачем такое надо?
  3. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Прибавить табличную часть не очень удачная идея.Меня она посещала.Если документ не проведен,то все замечательно,но если провести проведенный документ,то к реальному остатку прибавится еще табличная часть,а если проведенный документ открыть и изменить количество и еще раз провести,то вообще фигня получается.

    А такое надо было(вернее,желательно, что бы было) по следующей причине:
    Есть такая вещь,как Мобильное приложение на 1С и там регистров накопления не существует,есть только регистры сведений.В демо приложении получение остатков реализовано через регистр сведений.То есть,на КПК нажимают кнопку,делается запрос к регистру накопления на предмет остатков и результат запроса записывается в регистр сведений,потом эта информация передается в КПК.
    Просто была идея,что бы всегда иметь актуальные остатки в регистре сведений для КПК,при проведении документов расхода и прихода выбирать последний остаток на товар проведения и записывать этот остаток в регистр сведений.Это позволило бы сократить время на получение остатков через КПК.
    Но, по всей видимости идея не очень удачная.....
    Вчера пол-дня доказывал начальнику,что так не получится скорее всего. :unsure:
  4. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Задача бредовая изначально, но сделать ее можно - просто принудительно вызовите запись движений документа по нужному регистру.
  5. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Действительно,получилось! :unsure: Но тут потенциально возможны проблемы если не учесть всех нюансов при проведении...

    Неужели это единственное решение?
  6. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Для начала: откуда такая необходимость?
  7. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Про необходимость (или вернее, желательную возможность в конфигурации ) я уже писал немного ранее. :unsure:
  8. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    Все равно непонятно.
    Ну провели Вы документ. Полезли забрали актуальные остатки. Зачем это делать именно в момент проведения а не после?

    А про пребавлние таблицной части. Можно ведь условие написать на проверку признака проведения документа :)

    BabySG
    А если по каким-то причинам после принудительной записи отказаться от проведения. Движения в регистре остануться?
  9. Coder1C
    Offline

    Coder1C Слуга форума Команда форума Администратор

    Регистрация:
    10 фев 2006
    Сообщения:
    506
    Симпатии:
    31
    Баллы:
    54
    Можешь попробовать с двойным провидением:

    1. Провел
    2. Получил остатки
    3. Опять провел
  10. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    В какой момент после проведения можно получить остатки? Нажав кнопочку в обработке или что-то подобное?
    В том-то и дело,что была идея всегда в регистре хранить актуальные остатки без каких-либо дополнительных действий со стороны пользователя.

    Условие написать можно.Типа:Если ЭтотОбъект.Проведен Тогда........
    Хорошо,а если документ был проведен и в нем изменили количество и опять проводят? В ОбработкеПроведения документ будет считаться проведенным.ЭтотОбъект.Проведен будет Истина.Я сам проверял.

    Если после Движения.Остатки.Записать() в ОбработкаПроведения сказать Отказ = Истина,тогда появляется табличка "Операция не выполнена" и движений в регистре нет.Проверил.

    Coder1C

    Тоже вариант,но....вариант очень неоптимальный.Проведение документа происходит в 2 раза дольше.

    Чувствую,прийдется все это делать более традиционным способом.Наверное,оно и к лучшему....
  11. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    А почему вы считаете, что у Вас тут будут неактуальные остатки. Если остатки обновляются по запросу пользователя. Я если честно не совсем понимаю что Вы пытаетесь автоматизировать.

    По поводу условия если проведен отнимате остатки из регистра прибавляйте из таб части. Но все равно это не выход. Надо задачу понять.
  12. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Я нигде не писал,что если нажать кнопку на КПК и получить остатки,они буду не актуальны. B)
    Я писал,что идея была задумана вот для этого : Это позволило бы сократить время на получение остатков через КПК.

    Просто если 10000 товаров по которым есть остатки,сначала делается запрос(это какое-то время),потом результат запроса записывается в регистр сведений(это еще какое-то время) и после этого формируется файл для КПК(это еще какое-то время) и передается в КПК (это еще какое-то время).Вот,что бы часть какого-то времени сократить была придумана эта идея.

    Если что,то я описал стандартную процедуру обмена остатками между базой и КПК,которая есть в демо приложении,которое в свою очередь поставляется вместе с диском установки и т.д и т.п.


    По всей видимости другого решения нет,как принудительно вызывать процедуру записи регистра.

    По поводу условия если проведен отнимате остатки из регистра прибавляйте из таб части. Но все равно это не выход.

    Полностью с вами согласен :unsure:
  13. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    Все равно не понял. Как идея должна была сократить время.
    Можно подробно описать процедуру передачи данных в КПК. Как, когда, в какой момент, кто инициатор передачи, кто готовит данные, кто передает, как передает.

    Я с этой технологией не знаком. Просто интересно стало.
  14. BabySG
    Offline

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

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

    Код:
    НачатьТранзакцию();
    //...
    // Где-то тут сделать все движения документа
    // получить остатки после движений
    // и выгрузить их в ТЗ
    //...
    ОтменитьТранзакцию();
    
    Тем самым в ТЗ будут твои остатки после проведения документа, но самих записей в регистре не будет :)
  15. Kaboom
    Offline

    Kaboom Опытный в 1С

    Регистрация:
    2 июл 2007
    Сообщения:
    158
    Симпатии:
    0
    Баллы:
    26
    В этой задаче можно использовать асинхронные сообщения. Почитать можно здесь.
    Алгоритм следующий:
    1. Проводим документ.
    2. Вызываем событие.
    3. Обрабатываем событие (записываем или нет новые остатки в регистр сведений).
  16. BabySG
    Offline

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

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

    Kaboom Опытный в 1С

    Регистрация:
    2 июл 2007
    Сообщения:
    158
    Симпатии:
    0
    Баллы:
    26
    Я ссылку ту кинул для примера, что можно сделать с помощью асинхронных событий. А они очень даже причем в контексте задачи;). Суть асинхронного сообщения: посылаем сообщение, 1С делает дальше по алгоритму то что нужно, после этого испольняется процедура ОбработкаВнешнегоСобытия. Например,
    Код:
    Процедура ОбработкаПроведения()
    fakir.ВызватьСобытие("fakir", "ПроведениеДокумента",  ЗначениеВСтрокуВнутр(док));
    ...
    КонецПроцедуры
    
    
    1С проведет документ, а уже потом выполнит код процедуры ОбработкаВнешнегоПроведения в который и передаст параметры.
    Посмотрим, нам нужны значения регистра после проведения документа, получить их при проведении документа невозможно , нужно это делать только после проведения. Мною видится несколько решений задачи:
    1. Перед/после проведения документа пишем алгоритм который учитывает данные которые документ проведет/провел (идея автора).
    2. Двойное перепроведение (идея Coder1C).
    3. Запуск после проведения таймера и последующая его обработка.
    4. Использование асинхронных сообщений.
    Первая идея сложна по реализации, и имеет одну очень неприятную особенность: если возникнет необходимость переписать алгоритм проведения документа, нужно еще и переписывать алгоритм учитывания проведения документа. Вторая делает ненужное второе проведения. Вроде как третья идея не имеет предыдущих минусов, но какое время поставить для ожидания? тут сложно предугадать (хотя, наверное, возможно). А четвертая ИМХО идеально подходит для решения проблемы.
    ЗЫ: Я бы так и сделал:)
  18. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Я предложил уже два варианта решения этой проблемы :) Которые проще в реализации и использовании.
    Асинхронность не позволит реализовать отмену проведения простым способом, если остатки не устроят (о чем автор писал)
  19. Kaboom
    Offline

    Kaboom Опытный в 1С

    Регистрация:
    2 июл 2007
    Сообщения:
    158
    Симпатии:
    0
    Баллы:
    26
    Сдесь тоже нет ничего сложного:).
    Почему же, получаем остатки после проведения или отмены проведения (что я забыл добавить) документа и соотвественно добавляем/отнимаем остатки в регистре сведений.
  20. TopicStarter Overlay
    jackevsen
    Offline

    jackevsen

    Регистрация:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    В принципе,идея хорошая. Но,с другой стороны,если строка Движение.Записать() стоит последней строкой в процедуре ОбработкаПроведения есть ли смысл отменять транзакцию,если все равно движение будет записано после того, как процедура ОбработкаПроведения будет закончена?
    Ведь,все возможные проверки были уже сделаны ранее в ОбработкеПроведения.....
    Или я ошибаюсь....?

    Kaboom

    Идея понятна: Написать какую-то программку,типа внешней компоненты и она будет вызывать внешнее событие,которое в свою очередь будет вызывать процедуру запроса остатков...Но, если база серверная,не будет ли эта идея слишком проблематичной?
    Внешние компоненты вроде не работают с сервером....И потом,если одновременно несколько человек проведут документы,не будет ли это слишком большой проблемой для данной идеи?

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