Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=10427)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ ПриЗаписи() документа

Автор: Darina 29.12.12, 10:50

Пожалуйста, помогите разобраться.
При записи документа ПТ (ПриЗаписи()) создаю новый документ - Документы.Документ.СоздатьДокумент().
Все создается, записывается.
Но в программе есть функция, которая обращается к ПТ: Объект.Записать(РежимЗаписиДокумента.Запись, РежимПроведенияДокумента.Неоперативный).

Подскажите, как обойти условием создание нового документа в ПриЗаписи().

Автор: alex040269 29.12.12, 10:54

Ничего не понял. Документ А создает документ Б в процедуре ПриЗаписи. В процедуре ПриЗаписи Документа Б есть обращение к документу А?

Автор: Darina 29.12.12, 11:04

Документ А создает Документ В. Все нормально.
Но потом при загрузке из Клиент-банка идет обращение к Документам А:
Объект.Записать(РежимЗаписиДокумента.Запись, РежимПроведенияДокумента.Неоперативный).
sad.gif

Автор: Ardi 29.12.12, 11:23

Без видео не обойтись.

Автор: Darina 29.12.12, 11:37

Ardi, вы считаете, я глупость спросила?

Автор: lex2707 29.12.12, 11:40

Если ЭтоНовый() Тогда
... Создать документ Б
КонецЕсли;

Автор: logist 29.12.12, 12:16

Цитата(Darina @ 29.12.12, 11:37) *
глупость спросила?

Может и не глупость, но суть так и не понятна.

Автор: alex040269 29.12.12, 15:05

Darina , Ardi имел ввиду видео с участием 1С. Ну или куски кода с комментариями.

Автор: zay 29.12.12, 15:31

Иногда при вызове экспортной функции не важно чего документа/обработки/отчета есть необходимость "обойти" часть кода вызываемой функции.

Возможно вам подойдет такой способ:

Создайте глобальную переменную модуля документа

Перем НеСоздаватьНовыйДокументПриЗаписи Экспорт;

В процедуре ПриЗаписи() этого документа в точке создания нового документа вставьте
Процедура ПриЗаписи()
//.................
Если НеСоздаватьНовыйДокументПриЗаписи <> истина Тогда
        Документы.Документ.СоздатьДокумент();
КонецЕсли;
//................


И записывайте наш документ в следующем режиме
НашДокумент = СсылкаНаНашДокумент.ПолучитьОбъект();
НашДокумент.НеСоздаватьНовыйДокументПриЗаписи = истина;
НашДокумент.Записать( );


Автор: Zaval 29.12.12, 16:23

К сожалению, в сабже задача не формализована.
Возможно, все решается гораздо проще.
Предопределенная процедура ПриЗаписи() есть как в модуле документа, так и в модуле формы документа.
Если вызов процедуры создания подчиненного документа поместить в процедуру ПриЗаписи() модуля формы, то подчиненный док будет создаваться только при интерактивной записи документа(по кноп Записать на форме).
При программной записи(без открытия формы) ничего происходить не будет.

ЗЫ. Учтите, что после изменения основного дока может понадобиться внести изменения в подчиненный(может это не нужно сейчас, но понадобится при дальнейшем развитии функционала). Из этих соображений проверка на ЭтоНовый() - тупиковое напрвление, рано или поздно придется переделывать.

Автор: XBrut 29.12.12, 17:28

на мисте в таких случаях требуют фото, а Ardi распоясался и просит видео smile.gif

Автор: Vofka 29.12.12, 19:59

Цитата(XBrut @ 29.12.12, 17:28) *
на мисте в таких случаях требуют фото, а Ardi распоясался и просит видео smile.gif

У нас здесь своя атосфера. Мисту в топку. 29000000.gif

Автор: Darina 20.02.13, 14:15

Спасибо всем за ответы.
В процедуре ПриЗаписи() в модуле документа "ПлатежноеТребование" написала так:

Процедура ПриЗаписи(Отказ)
    Если ЭтотОбъект.ПометкаУдаления = Истина тогда
             ...
    иначе
            Запрос = Новый Запрос;
            Запрос.Текст ="ВЫБРАТЬ  
                    |    ДокументДляСозданияПлатежногоТребования.Ссылка,
                    |    ДокументДляСозданияПлатежногоТребования.ПлатежноеТребование
                    |ИЗ
                    |    Документ.ДокументДляСозданияПлатежногоТребования КАК ДокументДляСозданияПлатежногоТребования
                    |ГДЕ
                    |    ДокументДляСозданияПлатежногоТребования.ПлатежноеТребование.Ссылка = &ПТ";
            
            Запрос.УстановитьПараметр("ПТ", ЭтотОбъект.Ссылка);
            
            Результат = Запрос.Выполнить().Выгрузить();              
            
            Если Результат.Количество() = 0 тогда
                ДокументДоп = Документы.ДокументДляСозданияПлатежногоТребования.СоздатьДокумент();
                ...
                ДокументДоп.Записать(РежимЗаписиДокумента.Проведение);
            
            иначе
                Выборка = Запрос.Выполнить().Выбрать();
                Пока Выборка.Следующий() цикл
                    ДокДоп = Выборка.Ссылка.ПолучитьОбъект();
                    ДокДоп.Записать(РежимЗаписиДокумента.Проведение);
                КонецЦикла;
            КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Автор: zay 20.02.13, 18:55

У меня был опыт с подобным - модификация и запись одного документа (ДокументДляСозданияПлатежногоТребования) при записи другого документа (ПлатежноеТребование)
Какие при этом я получил грабли.

Грабли №1. Пользователь с полными правами на ПлатежноеТребование и с правами "только чтение" на ДокументДляСозданияПлатежногоТребования вносит изменения в ПлатежноеТребование. И эти модификации должны попасть в ДокументДляСозданияПлатежногоТребования.

Грабли №2. При записи ПлатежноеТребование иногда пробегала некая барабашка (подозреваю что конфликт блокировок, но точно так и не выяснил). В результате у ПлатежноеТребование и ДокументДляСозданияПлатежногоТребования шла рассинхронизация реквизитов, которые должны были совпадать. Другими словами - по одновному документу запись произошла, а по подчиненному - нет.

Проблема типа Грабли №2 - очень каварная. Идут тысячи документов. Никому и в голову не прийдет проверять - а все ли там хорошо? Всегда ли создается ДокументДляСозданияПлатежногоТребования ?

Поэтому для себя сделал вывод: создавать/модифицировать один документ из модуля другого - это зло. Надо стараться этого избегать. Например "выкручиватся" при помощи регистров сведений не подчиненных регистратору. Заполнять их из ПлатежноеТребование и потом использовать в комплексе с ДокументДляСозданияПлатежногоТребования (или вообще без него).

Автор: Darina 21.02.13, 9:06

Как мне не хватало вашего опыта и комментариев пару месяцев назад. Спасибо за советы.

Задача была такая: есть 2 базы «Абонент» и «Торговля».
Обработка:
Количество Актов тех. обслуживания должно совпадать с количеством проведенных Актов (Реализаций тов. и услуг) в Торговле по кажд. контрагенту.
Если условие выполнено, вывожу список контрагентов для выставления им плат.требования. Но нужно учесть уже выставленные ПТ.
Поэтому при записи ПТ (именно при Записи, т.к. выставляет один человек, а подтверждает оплату ПТ и проводит другой) создаю документ ДокДляСозданияПТ, записываю все акты по данному контрагенту в ТЧ.ДокументыРеализации, провожу в РС.АктыВыставленныеВПТ.

Повторное формирование Списка контрагентов происходит на основании записей в РС.
Вот для этой цели был создан дополнительный документ. Да, я не предусмотрела, что ПТ м.изменяться.
Наверное, буду информировать пользователя об изменении в ПТ ТЧ.ДокументыРеализации для корректировки ДокументаДляСозданияПТ.
Уже два месяца выставляются так.образом ПТ.

Или вы считаете, стоит переделать?

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua