Имя: Пароль:
1C
1C 7.7
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).
С этим счетом работает только один оператор, так что накосячить там некому :)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший