Программное создание и проведение документа.
Есть конфигурация(самописная). При интерактивном создании документа и его заполнении (В форме документа есть кнопки по заполнению табличных частей) документ заполняется и проводится. Процедуры заполнения документа вызываются из модуля менеджера. При программном создании и заполнении документа и его проведении документ создается, шапка заполняется, но табличная часть не заполняется и сам документ остается не проведен. Хотя в отладчике видно что они (табличные части) заполняются данными и формируются движения по регистрам. Пробовал отключить проведение документа, закоментировав вызов процедур записи в регистры - данные в табличных частях не сохраняются. Возникает вопрос, почему данные в документе не сохраняются.
По теме из базы знаний
- Программное добавление реквизитов на форму документа. Без изменения самой формы.
- Кто сейчас проводит документ: человек или компьютер? Зачем нужна подобная классификация "режимов" проведения документа в 1С 8.3 в клиент-серверном режиме и как получить ответ на этот вопрос при работе с обработчиками событий управляемой формы и документа?
- Как программно создать сотрудников (внештатников) в ЗУП 3.0
- Программное создание корректировочного счета-фактуры выданного в УПП 1.3
- Программное создание и расчет документов начисления зарплаты в конфигурации ЗУП 3.1 и ERP (по подразделениям)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
смотрите что именно (какие именно табчасти) передаются в модуль менеджера при заполнении из формы, и что именно передается при программном заполнении.
Вот код обработки:
ДокументРасчета = Документы.Расчет.СоздатьДокумент();
ДокументРасчета.Дата = ДатаДокумента;
ДокументРасчета.УстановитьНовыйНомер();
ДокументРасчета.Организация = Организация;
ДокументРасчета.ЛицевойСчет = ЛицевойСчет;
ДокументРасчета.Автор = Пользователь;
ДокументРасчета.Записать();
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчета);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчета);
ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
Показать
(3) Prisian, кривовато, конечно. Надо смотреть, что именно заполняется в процедурах Документы.Расчет.х, скорее всего, там заполняется другой документ.
Для начала надо переименовать переменные, чтобы хотя бы понимать, где объект, а где ссылка. Не
а
потом смотреть в процедуры, что там происходит.
Для начала надо переименовать переменные, чтобы хотя бы понимать, где объект, а где ссылка. Не
ДокументРасчета = Документы.Расчет.СоздатьДокумент();
а
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
потом смотреть в процедуры, что там происходит.
(3) Prisian, Как я понял из вашего кода, вы:
1. Создаете программно документ и записываете его.
2. Заполняете ТЧ в записанном документе.
Мне кажется, что проблема в том, что вы не получаете объект документа. Надо что-то типа
1. Создаете программно документ и записываете его.
2. Заполняете ТЧ в записанном документе.
Мне кажется, что проблема в том, что вы не получаете объект документа. Надо что-то типа
ОбъектДока = ВашаССылкаНаДокумент.ПолучитьОбъект();
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
ОбъектДока.Записать(РежимЗаписиДокумента.Проведение);
(7) Prisian, Вы пишите, что документ не проводится. Если при выполнении кода:
нет ошибки, значит "проводится" какой-то другой документ. Соответственно проблема именно в некорректном получении объекта.
Можно попробовать при создании документа устанавливать ссылку нового, а потом по этой ссылке получать документ, получать его объект и проводить.
ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
нет ошибки, значит "проводится" какой-то другой документ. Соответственно проблема именно в некорректном получении объекта.
Можно попробовать при создании документа устанавливать ссылку нового, а потом по этой ссылке получать документ, получать его объект и проводить.
Так при интерактивном создании и заполнении вызываются те же процедуры, но там все работает. Вот код из процедуры формы для расчета табличных частей.
ДокументОбъект = РеквизитФормыВЗначение("Объект");
Документы.Расчет.РасчитатьНачисления(ДокументОбъект);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументОбъект);
Документы.Расчет.РасчитатьЛьготы(ДокументОбъект);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументОбъект);
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
Ну, если как-то не так получаю объект документа, уже код по-другому переписал:
Но результат тот же. В отладчике видно, что табличные части заполнены, но после выхода из процедуры - документ есть, но табличные части пустые.
ОбъектДокументРасчета = ДокументРасчета.Ссылка.ПолучитьОбъект();
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчета);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчета);
ОбъектДокументРасчета.Расчеты.Загрузить(ДокументРасчета.Расчеты.Выгрузить());
ОбъектДокументРасчета.Льготы.Загрузить(ДокументРасчета.Льготы.Выгрузить());
ОбъектДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
ПоказатьНо результат тот же. В отладчике видно, что табличные части заполнены, но после выхода из процедуры - документ есть, но табличные части пустые.
(9) Prisian, Написал код, аналогичный вашему, попробовал воспроизвести ошибку - не получилось. Все проводится. Скажите, а если оставить вот такой-вот код:
Документ будет проводится? Если да, то попробуйте добавлять по одой процедуре из модуля менеджера, чтобы понять на какой возникает проблема.
ДокументРасчета = Документы.Расчет.СоздатьДокумент();
ДокументРасчета.Дата = ДатаДокумента;
ДокументРасчета.УстановитьНовыйНомер();
ДокументРасчета.Организация = Организация;
ДокументРасчета.ЛицевойСчет = ЛицевойСчет;
ДокументРасчета.Автор = Пользователь;
ДокументРасчета.Записать();
ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
ПоказатьДокумент будет проводится? Если да, то попробуйте добавлять по одой процедуре из модуля менеджера, чтобы понять на какой возникает проблема.
(9) Prisian, Вы бы еще выложили код обработки проведения. б.м. в ней не выполняется какое-то условие и устанавливается отказ на проведение. Это можно еще проверить изменив ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение) на ДокументРасчета.Записать(РежимЗаписиДокумента.Запись) и посмотреть будет ли документ сохраняться с измененными таблицами.
(11) Я и так пробовал и в Попытку... Исключение ставил - Постоянно одно и то же: в отладчике все отлично, но когда выхожу из отладчика - только заполненная шапка документа и все - табличные части пусты. Поэтому я и тему создал. Пробовал и в реквизит обработки ссылку на документ добавлять и потом получать объект. И уже эти же процедуры в модуль объекта добавлял и оттуда вызывал - в отладчике показывает все нормально, но после того как-бы документ вообще не заполнял. :(
(13) Prisian, Если мыслить логически - раз таблица заполняется, а потом вы видите пустой документ значит либо не то заполняется, либо заполняется но не охраняется.
Трудно разбираться в проблеме не видя всего когда, но есть такая мысль.
Если я правильно понимаю логику, то:
Попробуйте записать документ после заполнения ТЧ т.е.
Трудно разбираться в проблеме не видя всего когда, но есть такая мысль.
Если я правильно понимаю логику, то:
// Вот тут заполняется ТЧ документа
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);
// Начиная отсюда начинается работа с данными ТЧ.
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Попробуйте записать документ после заполнения ТЧ т.е.
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
ДокументРасчета.Записать();
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Решение найдено. Хотя это не сильно оптимальный вариант решения по скорости выполнения, но он работает, в отличии от более быстрых:
1. Получение объекта документа и обработка его в модуле менеджера:
2. Получение Обекта документа и обработка его в модуле объекта:
Как ни странно в отладчике, при выполнении данного кода, табличные части заполнялись, документ делал движения по регистрам, но после завершения обработки кода - в базе данных создавались документы, заполнялись реквизиты шапки и больше ничего...
Но когда я вызывал данные процедуры заполнения табличной части из формы документа, все заполнялось и документ делал движения по регистрам.
После этого я подумал, а что если я буду получать форму нужного мне документа и заполнять из нее табличные части документа. Понимаю, что данное решение не оптимально, но попробовал. В итоге получился код, который работает и хоть намного медленнее.
Первое что я сделал разделил процедуры получения объекта и формы, так как с сервера форму получить невозможно, то основная процедура была на клиенте. На сервере я создавал документ и передавал ссылку на него назад в "основную процедуру". После этого получаю форму нужного мне документа, присваиваю переменной основной реквизит формы - объект, далее заполняю табличные части, вызывая процедуры заполнения из модуля менеджера. После этого у меня получается заполненная переменная типа "ДанныеФормыСтруктура" из нее заполняю реквизит документа "объект" такого же типа и провожу документ в форме:
В итоге такой метод работает. Может кому и в дальнейшем пригодится.
П.С. Может кто из гуру объяснит почему при получении и заполнении объекта документа данные не сохранялись, а при получении и заполнении типа "ДанныеФормыСтруктура" все работает?
1. Получение объекта документа и обработка его в модуле менеджера:
&НаСервере
Процедура РасчитатьАбонента(ДатаРасчета, НомерДокумента = Неопределено) Экспорт
// Проверяем не было ли в этом периоде расчета
ДокументРасчетаСсылка = РаботаСРасчетами.ПолучитьДокументРасчета(ЛицевойСчет, ДатаДокумента);
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
ДокументРасчетаОбъект.Дата = ДатаДокумента;
ДокументРасчетаОбъект.УстановитьНовыйНомер();
ДокументРасчетаОбъект.Организация = Организация;
ДокументРасчетаОбъект.ЛицевойСчет = ЛицевойСчет;
ДокументРасчетаОбъект.Автор = Пользователь;
ДокументРасчетаОбъект.Записать();
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчетаОбъект);
Документы.Расчет.РасчитатьНачисления(ДокументРасчетаОбъект);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчетаОбъект);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчетаОбъект);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчетаОбъект);
ДокументРасчетаОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Показать2. Получение Обекта документа и обработка его в модуле объекта:
&НаСервере
Процедура РасчитатьАбонента(ДатаРасчета, НомерДокумента = Неопределено) Экспорт
// Проверяем не было ли в этом периоде расчета
ДокументРасчетаСсылка = РаботаСРасчетами.ПолучитьДокументРасчета(ЛицевойСчет, ДатаДокумента);
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
ДокументРасчетаОбъект.Дата = ДатаДокумента;
ДокументРасчетаОбъект.УстановитьНовыйНомер();
ДокументРасчетаОбъект.Организация = Организация;
ДокументРасчетаОбъект.ЛицевойСчет = ЛицевойСчет;
ДокументРасчетаОбъект.Автор = Пользователь;
ДокументРасчетаОбъект.Записать();
ДокументРасчетаОбъект.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов();
ДокументРасчетаОбъект.РасчитатьНачисления();
ДокументРасчетаОбъект.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов();
ДокументРасчетаОбъект.РасчитатьЛьготы();
ДокументРасчетаОбъект.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот();
ДокументРасчетаОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
ПоказатьКак ни странно в отладчике, при выполнении данного кода, табличные части заполнялись, документ делал движения по регистрам, но после завершения обработки кода - в базе данных создавались документы, заполнялись реквизиты шапки и больше ничего...
Но когда я вызывал данные процедуры заполнения табличной части из формы документа, все заполнялось и документ делал движения по регистрам.
&НаСервере
Процедура ЗаполнитьТабличнуюЧастьИнформацияДляРасчетов()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументОбъект);
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
Модифицированность = Истина;
КонецПроцедуры // ЗаполнитьТабличнуюЧастьИнформацияДляРасчетов()
ПоказатьПосле этого я подумал, а что если я буду получать форму нужного мне документа и заполнять из нее табличные части документа. Понимаю, что данное решение не оптимально, но попробовал. В итоге получился код, который работает и хоть намного медленнее.
Первое что я сделал разделил процедуры получения объекта и формы, так как с сервера форму получить невозможно, то основная процедура была на клиенте. На сервере я создавал документ и передавал ссылку на него назад в "основную процедуру". После этого получаю форму нужного мне документа, присваиваю переменной основной реквизит формы - объект, далее заполняю табличные части, вызывая процедуры заполнения из модуля менеджера. После этого у меня получается заполненная переменная типа "ДанныеФормыСтруктура" из нее заполняю реквизит документа "объект" такого же типа и провожу документ в форме:
&НаКлиенте
Процедура РасчитатьАбонента(ДатаДокумента)
ДокументРасчетаСсылка = СоздатьДокументРасчет(ДатаДокумента);
ПровестиВФормеДокументаРасчет(ДокументРасчетаСсылка);
КонецПроцедуры // РасчитатьАбонента()
&НаСервере
Функция СоздатьДокументРасчет(ДатаДокумента)
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
ДокументРасчетаОбъект.Дата = ДатаДокумента;
ДокументРасчетаОбъект.УстановитьНовыйНомер();
ДокументРасчетаОбъект.Организация = Организация;
ДокументРасчетаОбъект.ЛицевойСчет = ЛицевойСчет;
ДокументРасчетаОбъект.Автор = Пользователь;
ДокументРасчетаОбъект.Записать();
Возврат ДокументРасчетаОбъект.Ссылка;
КонецФункции
&НаКлиенте
Процедура ПровестиВФормеДокументаРасчет(ДокументРасчетаСсылка)
П = Новый Структура("Ключ", ДокументРасчетаСсылка);
ФормаДокументаРасчет = ПолучитьФорму("Документ.Расчет.ФормаОбъекта", П);
ДокументОбъектИзФормы = ФормаДокументаРасчет.Объект;
ЗаполнитьОбъектДокументаРасчет(ДокументОбъектИзФормы);
КопироватьДанныеФормы(ДокументОбъектИзФормы, ФормаДокументаРасчет.Объект);
ФормаДокументаРасчет.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьОбъектДокументаРасчет(ДокументОбъектИзФормы)
ДокументОбъектИзФормы.Расчеты.Очистить();
ДокументОбъектИзФормы.Льготы.Очистить();
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументОбъектИзФормы);
Документы.Расчет.РасчитатьНачисления(ДокументОбъектИзФормы);
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументОбъектИзФормы);
Документы.Расчет.РасчитатьЛьготы(ДокументОбъектИзФормы);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументОбъектИзФормы);
КонецПроцедуры
ПоказатьВ итоге такой метод работает. Может кому и в дальнейшем пригодится.
П.С. Может кто из гуру объяснит почему при получении и заполнении объекта документа данные не сохранялись, а при получении и заполнении типа "ДанныеФормыСтруктура" все работает?
Я тоже столкнулась с такой ситуацией: конфигурация не типовая, программно создаю документы в шапке данные есть, а в табличной части пусто, в отладчике данные вижу. Долго голову ломала. В итоге решила перед тем как записать документ открыть его. И его табличная часть оказалась заполненной! После этого я в отладчике просмотрела два документа: один, который создавала программно, и второй, который создала обычно вручную. Нашла отличия и проанализировала. В моем случае дело было в флагах, которые автоматом определялись при обычном вводе документов, а программно я не ставила. Может кому-нибудь поможет.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот