|
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). С этим счетом работает только один оператор, так что накосячить там некому :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |