|   |   | 
| 
 | v7: Не записывается программно созданная операция | ☑ | ||
|---|---|---|---|---|
| 0
    
        Прохожий1С 24.01.18✎ 13:27 | 
        Пожалуйста, выручайте!
 Суть проблемы такова: я провожу некий документ и при в модуле проведения этом программно создаю, заполняю и записываю еще одну отдельную операцию. И эта операция не сохраняется! Ради проверки в модуле проведения открыл эту операцию модально. Она открылась, заполненная, редактируется, по кнопке Записать вроде бы записывается - но в базе отсутствует, а в мониторе пользователей мои попытки ее записать проходят якобы над <Объект не найден>. | |||
| 1
    
        1Сергей 24.01.18✎ 13:29 | 
        А док записывается?     | |||
| 2
    
        1Сергей 24.01.18✎ 13:29 | 
        проводится?     | |||
| 3
    
        Прохожий1С 24.01.18✎ 13:30 | 
        (2) Да.     | |||
| 4
    
        1Сергей 24.01.18✎ 13:33 | 
        Код показывай     | |||
| 5
    
        Прохожий1С 24.01.18✎ 13:43 | 
        Процедура ОбработкаПроведения()  
 ........... //тут код проведения самого дока и в процессе заполняется ТЗ Если Тз.КоличествоСтрок() > 0 Тогда Тз.ВыбратьСтроки(); Оп2 = СоздатьОбъект("Операция"); Оп2.Новая(); Пока Тз.ПолучитьСтроку() = 1 Цикл Оп2.НоваяПроводка(); Оп2.Дебет.Счет = Тз.ДебетСчет; Оп2.Дебет.Суб1 = Тз.Суб1; Оп2.Кредит.Счет = Тз.КредитСчет; Оп2.Дебет.Суб2 = Тз.Суб2; Оп2.Сумма = Тз.Сум; КонецЦикла; Оп2.Содержание = "Дополнительная операция"; Оп2.ДатаОперации = ДатаДок; Оп2.ЗаписатьПроводки(); Оп2.Записать(); ОткрытьФормуМодально(КоррОперация.Документ); //вот тут все открылось, номер есть, дата есть, все проводки правильно заполнены КонецЕсли; КонецПроцедуры | |||
| 6
    
        Прохожий1С 24.01.18✎ 13:44 | 
        (5) Т е.
 ОткрытьФормуМодально(Оп2.Документ); разумеется | |||
| 7
    
        Злопчинский 24.01.18✎ 13:46 | 
        а к какому документу товя программно создаваемая операция относится.... операции без дока в 77 вроде как не могут быть...     | |||
| 8
    
        Смотрящий 24.01.18✎ 13:47 | 
        на моменте создания объекта дыра логическая - тебе надо получить операцию документа и в нее писать проводки, а ты создаешь объект не привязанный к документу.
 В бухне типовой клюшек посмотри как сделано | |||
| 9
    
        VitShvets 24.01.18✎ 13:47 | 
        У 7.7 есть ограничение на одновременную запись-проведение еще одного, другого документа из "Обработки проведения". Уже не помню, но как-то мы извращались пытаясь победить. На вскидку, два выхода:
 1. Разрешить родительскому документу писать проводки. Тогда не придётся создавать отдельный документ Операция. 2. Програмно разделить транзакционность создания проведения. Открываем транзакцию, проводим родительский документ, создаём и проводим операцию, коммитим транзакцию если всё хорошо. | |||
| 10
    
        Прохожий1С 24.01.18✎ 13:53 | 
        (7) Могут.
 (8) Через Док2.Новый(); Док2.ДатаДок = ДатаДок; Док2.Записать(); ........... Оп2.НайтиОперацию(Док2.ТекущийДокумент()); пробовали, не помогло. (9) Видно, в этом и дело ( | |||
| 11
    
        Масянька 24.01.18✎ 13:53 | 
        (9) Молодец! Отлично!
 3. Симуляция закрытия док-та. | |||
| 12
    
        Прохожий1С 24.01.18✎ 14:02 | 
        (9) Писать проводки нельзя, т.к. эта доп. операция не каждый раз создаваться должна.
 Транзакция что-то не помогла. (11) Это как? | |||
| 13
    
        VitShvets 24.01.18✎ 14:08 | 
        (7) Операция в 7-ке это отдельный "предопределенный" служебный документ.
 (10) Не правильно пробовал. Нельзя искать и править отдельную сущность операции. Нужно это делать в контексте проведения. Не помню как в 7.7, в 8-ке это предопределенная сущность "Движения" у документа-объекта. И в 7.7 по моему это можно делать только внутри обработки проведения. В (8) правильно написано, посмотри как в типовой бухии документу при проведении проводки добавляются. Там не создают операцию "СоздатьОбъект", а формируют движения в контексте самого проводимого документа. (11) :) Ага. Есть ещё способ с параметром типа "Сам проведеись". (12) Основной вопрос, зачем тебе именно отдельная операция. Ну у части документов будут проводки, у части нет. (12) Дело не в транзакции, а в разделении процессов. Прогррамно, вне проведения, в идеале вообще отдельной обработкой: 1. Начали транзакцию. 2. Создали и заполнили документ, записали провели. 4. Создали и заполнили Операцию, записали провели. 5. Закрыли транзакцию. 1. | |||
| 14
    
        Прохожий1С 24.01.18✎ 14:16 | 
        (13) Это весьма кривая вспомогательная база.
 Документ проводится, если на счете склада есть остатки. Если нет - выдает сообщение по всем несуществующим остаткам и не проводится. Тогда оператор вручную вводит операцию, которой кладет на счет склада остатки, и снова пытается провести этот документ. Да, учет у нас именно так ведется :) Операция2 должна заполнить эти остатки, чтобы при повторном проведении документа они уже были (т.е. автоматизировать работу оператора). Переписать базу, наладить нормальный учет, выгнать оператора или уволиться - не варианты :) | |||
| 15
    
        Builder 24.01.18✎ 14:44 | 
        (14) 
 1. Проверить остатки перед проведением документа (например попробовать ПриЗаписи(). 2. Создать и провести операцию (опять же в форме документа). 3. Провести документ. | |||
| 16
    
        Builder 24.01.18✎ 14:46 | 
        + к (15)
 Есть и минусы, например при групповом перепроведении это все не будет работать. | |||
| 17
    
        VitShvets 24.01.18✎ 14:47 | 
        (14) Сделай им кнопку на форме "Проверить-исправить остатки". Пусть жмут перед проведением, ну или после проведения, если не хватило чего.     | |||
| 18
    
        Прохожий1С 24.01.18✎ 15:11 | 
        (17) О, хорошая идея!
 А нельзя ли как-нибудь ТЗ, формируемую во время проведения, сохранить, чтобы она была потом доступна из модуля формы? Не во внешний файл только. Т.е. попытался провести - не провелось, зато вон тебе ТЗ со всеми данными - жмакнуть кнопку, записать операцию - еще раз попробовать провести. | |||
| 19
    
        Ёпрст гуру 24.01.18✎ 15:30 | ||||
| 20
    
        VitShvets 24.01.18✎ 15:58 | 
        (18) Можно глобальную переменную сделать. А в форме проверять какого она значения. Можно в строковый реквизит документа затолкать при помощи ЗначениеВСтрокуВнутр, хотя не понятно зачем. Правильнее всего в твоей ситуации, как мне кажется, вытащить процедуру формирования ТЗ в глобальный модуль и получать актуальные данные перед действием. А то получится, что оператор нажал "провести" и чай пить пошел. Когда вернулся увидел нехватку и сформировал "операцию-приход". А на самом деле, пока он чаи гонял, ситуация в остатках сильно поменялась.     | |||
| 21
    
        Прохожий1С 24.01.18✎ 16:03 | 
        Спасибо всем за советы!
 Сделал как предлагали в (17) с глобальной переменной как в (20). С этим счетом работает только один оператор, так что накосячить там некому :) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |