|
Алгоритм проведения документов в 1С 8 | ☑ | ||
---|---|---|---|---|
0
DenisVich
04.06.12
✎
16:18
|
Здравствуйте, вопрос по поводу проведения документов в 1С 8 Управление торговлей 10.3. Как строится алгоритм проведения? Сначала обрабатывается информация формы документа, затем данные передаются движителю - регистру накопления. Не прибегая к конструктору движений модифицировал(для определенных целей) поля документа(добавил 2 суммовых поля - в регистре накопления и в самом документе).
Суть проблемы: При проведении документа регистр накопления не видит изменения в документе. хотя в самом документе эти значения хранятся. Скажите пожалуйста как решить такую ошибку. Прилагаю кусок кода: Процедура ОбработкаПроведения(Отказ, РежимПроведения) // Дерево значений, содержащее имена необходимых полей в запросе по шапке. Перем ДеревоПолейЗапросаПоШапке; СуммаРеализации1 = 0; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка КАК Ссылка, | РеализацияТоваровУслуг.Номер КАК Номер, | РеализацияТоваровУслуг.Дата КАК Дата, | РеализацияТоваровУслуг.Сделка КАК Сделка, | РеализацияТоваровУслугТовары.Ссылка КАК СсылкаТЧ, | РеализацияТоваровУслугТовары.Количество КАК Количество, | РеализацияТоваровУслугТовары.Коэффициент КАК Коэффициент, | РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, | РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС, | СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма, | РеализацияТоваровУслугТовары.СуммаНДС КАК СуммаНДС, | РеализацияТоваровУслугТовары.Цена КАК Цена, | РеализацияТоваровУслугТовары.ЗаказПокупателя КАК ТЧЗаказПокупателя |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка |ГДЕ | РеализацияТоваровУслуг.Сделка = &Сделка | И РеализацияТоваровУслуг.Проведен = ИСТИНА | |СГРУППИРОВАТЬ ПО | РеализацияТоваровУслуг.Ссылка, | РеализацияТоваровУслуг.Номер, | РеализацияТоваровУслуг.Дата, | РеализацияТоваровУслуг.Сделка, | РеализацияТоваровУслугТовары.Ссылка, | РеализацияТоваровУслугТовары.Количество, | РеализацияТоваровУслугТовары.Коэффициент, | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.СтавкаНДС, | РеализацияТоваровУслугТовары.СуммаНДС, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.ЗаказПокупателя, | РеализацияТоваровУслугТовары.Сумма"; Запрос.УстановитьПараметр("Сделка",ЭтотОбъект.Ссылка); РезультатЗапросаПоРеализации =Запрос.Выполнить().Выбрать(); Пока РезультатЗапросаПоРеализации.Следующий() Цикл СуммаРеализации1 = СуммаРеализации1 + РезультатЗапросаПоРеализации.Сумма; КонецЦикла; ЭтотОбъект.СуммаРеализации = СуммаРеализации1; //Запрос = Новый Запрос; //Запрос.Текст = "ВЫБРАТЬ // | ЗаказПоставщику.Номер КАК Номер, // | ЗаказПоставщику.Дата КАК Дата, // | ЗаказПоставщику.Проведен КАК Проведен, // | ЗаказПоставщику.Ссылка КАК Ссылка, // | ЗаказПоставщику.ДокументОснование КАК ДокументОснование // |ИЗ // | Документ.ЗаказПоставщику КАК ЗаказПоставщику // |ГДЕ // | ЗаказПоставщику.ДокументОснование = &ДокументОснование"; //Запрос.УстановитьПараметр("ДокументОснование",ЭтотОбъект.Ссылка); //РезультатЗапросаЗаказПоставщику = Запрос.Выполнить().Выбрать(); СуммаПоступлений = 0; //Пока РезультатЗапросаЗаказПоставщику.Следующий() Цикл //ЗапросПоступлениеПоЗаказу = Новый Запрос; //ЗапросПоступлениеПоЗаказу.Текст ="ВЫБРАТЬ // | ПоступлениеТоваровУслуг.Ссылка, // | ПоступлениеТоваровУслуг.Номер, // | ПоступлениеТоваровУслуг.Дата, // | ПоступлениеТоваровУслуг.Проведен, // | ПоступлениеТоваровУслуг.Контрагент, // | СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаДокумента, // | ПоступлениеТоваровУслуг.Сделка // |ИЗ // | Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг // |ГДЕ // | ПоступлениеТоваровУслуг.Сделка = &Сделка // | И ПоступлениеТоваровУслуг.Проведен = ИСТИНА // | // |СГРУППИРОВАТЬ ПО // | ПоступлениеТоваровУслуг.Ссылка, // | ПоступлениеТоваровУслуг.Номер, // | ПоступлениеТоваровУслуг.Дата, // | ПоступлениеТоваровУслуг.Проведен, // | ПоступлениеТоваровУслуг.Контрагент, // | ПоступлениеТоваровУслуг.Сделка"; ЗапросПоступлениеПоЗаказу = Новый Запрос; ЗапросПоступлениеПоЗаказу.Текст ="ВЫБРАТЬ | ПлатежноеПоручениеВходящее.Ссылка, | ПлатежноеПоручениеВходящее.Номер, | ПлатежноеПоручениеВходящее.Дата, | ПлатежноеПоручениеВходящее.Проведен, | СУММА(ПлатежноеПоручениеВходящее.СуммаДокумента) КАК СуммаДокумента |ИЗ | Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее |ГДЕ | ПлатежноеПоручениеВходящее.ДокументОснование = &ДокументОснование | И ПлатежноеПоручениеВходящее.Проведен = ИСТИНА | |СГРУППИРОВАТЬ ПО | ПлатежноеПоручениеВходящее.Ссылка, | ПлатежноеПоручениеВходящее.Номер, | ПлатежноеПоручениеВходящее.Дата, | ПлатежноеПоручениеВходящее.Проведен"; //ЗапросПоступлениеПоЗаказу.УстановитьПараметр("Сделка",РезультатЗапросаЗаказПоставщику.Ссылка); ЗапросПоступлениеПоЗаказу.УстановитьПараметр("ДокументОснование",ЭтотОбъект.Ссылка); Попытка ВыборкаПоПоступлению = ЗапросПоступлениеПоЗаказу.Выполнить().Выбрать(); Если ВыборкаПоПоступлению.Следующий() Тогда СуммаПоступлений = СуммаПоступлений + ВыборкаПоПоступлению.СуммаДокумента Иначе Сообщить("Нет поступлений по заказу покупателя"); КонецЕсли; Исключение Сообщить("Не удалось просуммировать поступления!") КонецПопытки; //КонецЦикла; ЭтотОбъект.СуммаПоПоступлению = СуммаПоступлений; Если мУдалятьДвижения Тогда ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ); КонецЕсли; // Сформируем структуру реквизитов шапки документа СтруктураШапкиДокумента = ОбщегоНазначения.СформироватьСтруктуруШапкиДокумента(ЭтотОбъект); // Заполним по шапке документа дерево параметров, нужных при проведении. ДеревоПолейЗапросаПоШапке = ОбщегоНазначения.СформироватьДеревоПолейЗапросаПоШапке(); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "Константы" , "ВалютаУправленческогоУчета", "ВалютаУправленческогоУчета"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "Константы" , "КурсВалютыУправленческогоУчета" , "КурсВалютыУправленческогоУчета"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "ДоговорыКонтрагентов", "ВедениеВзаиморасчетов" , "ВедениеВзаиморасчетов"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "ДоговорыКонтрагентов", "ВалютаВзаиморасчетов" , "ВалютаВзаиморасчетов"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "ДоговорыКонтрагентов", "Организация" , "ДоговорОрганизация"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика" , "ВестиПартионныйУчетПоСкладам" , "ВестиПартионныйУчетПоСкладам"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "ДоговорыКонтрагентов", "ОбособленныйУчетТоваровПоЗаказамПокупателей", "ОбособленныйУчетТоваровПоЗаказамПокупателей"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "СуммаРеализации", "СуммаРеализации","СуммаРеализации"); ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "СуммаПоПоступлению", "СуммаПоПоступлению","СуммаПоПоступлению"); Если ЗначениеЗаполнено(СкладГруппа) И ТипЗнч(СкладГруппа) = Тип("СправочникСсылка.Склады") Тогда ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "СкладГруппа", "ВидСклада", "ВидСклада"); Иначе ОбщегоНазначения.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "NULL", "NULL", "ВидСклада"); КонецЕсли; // Сформируем запрос на дополнительные параметры, нужные при проведении, по данным шапки документа СтруктураШапкиДокумента = УправлениеЗапасами.СформироватьЗапросПоДеревуПолей(ЭтотОбъект, ДеревоПолейЗапросаПоШапке, СтруктураШапкиДокумента, мВалютаРегламентированногоУчета); // Заголовок для сообщений об ошибках проведения. Заголовок = ОбщегоНазначения.ПредставлениеДокументаПриПроведении(СтруктураШапкиДокумента); // Проверим правильность заполнения шапки документа ПроверитьЗаполнениеШапки(СтруктураШапкиДокумента, Отказ, Заголовок); // Проверим допустимость для пользователя цен документа УправлениеДопПравамиПользователей.ПроверитьДопустимостьЦенОтпуска(ЭтотОбъект, "Товары", Отказ); // Получим необходимые данные для проведения и проверки заполнения данных по табличной части "Товары". СтруктураПолей = Новый Структура(); СтруктураПолей.Вставить("Номенклатура" , "Номенклатура"); СтруктураПолей.Вставить("Услуга" , "Номенклатура.Услуга"); СтруктураПолей.Вставить("Набор" , "Номенклатура.Набор"); СтруктураПолей.Вставить("Комплект" , "Номенклатура.Комплект"); СтруктураПолей.Вставить("Количество" , "Количество * Коэффициент /Номенклатура.ЕдиницаХраненияОстатков.Коэффициент"); СтруктураПолей.Вставить("Цена" , "Цена"); СтруктураПолей.Вставить("ЕдиницаИзмерения" , "ЕдиницаИзмерения"); СтруктураПолей.Вставить("ПроцентСкидкиНаценки" , "ПроцентСкидкиНаценки"); СтруктураПолей.Вставить("ПроцентАвтоматическихСкидок" , "ПроцентАвтоматическихСкидок"); СтруктураПолей.Вставить("УсловиеАвтоматическойСкидки" , "УсловиеАвтоматическойСкидки"); СтруктураПолей.Вставить("ЗначениеУсловияАвтоматическойСкидки" , "ЗначениеУсловияАвтоматическойСкидки"); СтруктураПолей.Вставить("Сумма" , "Сумма"); СтруктураПолей.Вставить("СтавкаНДС" , "СтавкаНДС"); СтруктураПолей.Вставить("НДС" , "СуммаНДС"); СтруктураПолей.Вставить("ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры"); СтруктураПолей.Вставить("Размещение" , "Размещение"); СтруктураПолей.Вставить("ВидСкладаРазмещения" , "Размещение.ВидСклада"); СтруктураПолей.Вставить("СерияНоменклатуры" , "СерияНоменклатуры"); СтруктураПолей.Вставить("КлючСтроки" , "КлючСтроки"); СтруктураПолей.Вставить("ТипНоменклатуры", "Номенклатура.ВидНоменклатуры.ТипНоменклатуры"); РезультатЗапросаПоТоварам = ОбщегоНазначения.СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "Товары", СтруктураПолей); // Подготовим таблицу товаров для проведения. ТаблицаПоТоварам = ПодготовитьТаблицуТоваров(РезультатЗапросаПоТоварам, СтруктураШапкиДокумента); // Проверим допустимость для пользователя цен документа УправлениеДопПравамиПользователей.ПроверитьДопустимостьЦенОтпуска(ЭтотОбъект, "Услуги", Отказ); // Получим необходимые данные для проведения и проверки заполнения данных по табличной части "Услуги". СтруктураПолей = Новый Структура(); СтруктураПолей.Вставить("Номенклатура" , "Номенклатура"); СтруктураПолей.Вставить("Содержание" , "Содержание"); СтруктураПолей.Вставить("Услуга" , "Номенклатура.Услуга"); СтруктураПолей.Вставить("Набор" , "Номенклатура.Набор"); СтруктураПолей.Вставить("Комплект" , "Номенклатура.Комплект"); СтруктураПолей.Вставить("Количество" , "Количество"); СтруктураПолей.Вставить("Цена" , "Цена"); СтруктураПолей.Вставить("ПроцентСкидкиНаценки" , "ПроцентСкидкиНаценки"); СтруктураПолей.Вставить("ПроцентАвтоматическихСкидок" , "ПроцентАвтоматическихСкидок"); СтруктураПолей.Вставить("УсловиеАвтоматическойСкидки" , "УсловиеАвтоматическойСкидки"); СтруктураПолей.Вставить("ЗначениеУсловияАвтоматическойСкидки" , "ЗначениеУсловияАвтоматическойСкидки"); СтруктураПолей.Вставить("Сумма" , "Сумма"); СтруктураПолей.Вставить("СтавкаНДС" , "СтавкаНДС"); СтруктураПолей.Вставить("НДС" , "СуммаНДС"); РезультатЗапросаПоУслугам = ОбщегоНазначения.СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "Услуги", СтруктураПолей); // Подготовим таблицу товаров для проведения. ТаблицаПоУслугам = ПодготовитьТаблицуУслуг(РезультатЗапросаПоУслугам, СтруктураШапкиДокумента); // Получим необходимые данные для проведения и проверки заполнения данных // по табличной части "Возвратная тара". СтруктураПолей = Новый Структура(); СтруктураПолей.Вставить("Номенклатура" , "Номенклатура"); СтруктураПолей.Вставить("Услуга" , "Номенклатура.Услуга"); СтруктураПолей.Вставить("Набор" , "Номенклатура.Набор"); СтруктураПолей.Вставить("Комплект" , "Номенклатура.Комплект"); СтруктураПолей.Вставить("Количество" , "Количество"); СтруктураПолей.Вставить("ЕдиницаИзмерения" , "Номенклатура.ЕдиницаХраненияОстатков"); СтруктураПолей.Вставить("Цена" , "Цена"); СтруктураПолей.Вставить("Сумма" , "Сумма"); СтруктураПолей.Вставить("ВестиУчетПоХарактеристикам", "Номенклатура.ВестиУчетПоХарактеристикам"); СтруктураПолей.Вставить("Размещение" , "Размещение"); СтруктураПолей.Вставить("ВидСкладаРазмещения" , "Размещение.ВидСклада"); РезультатЗапросаПоТаре = ОбщегоНазначения.СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "ВозвратнаяТара", СтруктураПолей); // Подготовим таблицу тары для проведения. ТаблицаПоТаре = ПодготовитьТаблицуТары(РезультатЗапросаПоТаре, СтруктураШапкиДокумента); // Проверить заполнение ТЧ "Товары" и "Возвратная тара". ПроверитьЗаполнениеТабличнойЧастиТовары(ТаблицаПоТоварам, СтруктураШапкиДокумента, Отказ, Заголовок); ПроверитьЗаполнениеТабличнойЧастиУслуги(ТаблицаПоУслугам, СтруктураШапкиДокумента, Отказ, Заголовок); ПроверитьЗаполнениеТабличнойЧастиВозвратнаяТара(ТаблицаПоТаре, СтруктураШапкиДокумента, Отказ, Заголовок); // Проверить заполнение ТЧ "Состав набора" СтруктураПолей = Новый Структура(); СтруктураПолей.Вставить("Номенклатура"); СтруктураПолей.Вставить("Цена"); ЗаполнениеДокументов.ПроверитьЗаполнениеТабличнойЧасти(ЭтотОбъект, "СоставНабора", СтруктураПолей, Отказ, Заголовок); // Движения по документу Если Не Отказ Тогда ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоТаре, Отказ, Заголовок); КонецЕсли; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры // ОбработкаПроведения() |
|||
1
DenisVich
04.06.12
✎
16:19
|
Добавил поля
СуммаРеализации СуммаПоПоступлению |
|||
2
shuhard
04.06.12
✎
16:20
|
(0) что-то мешает зайти в ДвиженияПоРегистрам() отладчиком и посмотреть ?
|
|||
3
DenisVich
04.06.12
✎
16:25
|
Смотрел, значения не передаются.
|
|||
4
unregistered
04.06.12
✎
16:25
|
(0) Мало что понял....
>> Сначала обрабатывается информация формы документа При проведении данные формы не обрабатываются. При проведении формы вообще может не быть, если документ проводится программно или в форме списка. >> затем данные передаются движителю - регистру накопления. Этого вообще не понял >> Не прибегая к конструктору движений модифицировал(для определенных целей) поля документа(добавил 2 суммовых поля - в регистре накопления и в самом документе). В какой момент происходит "модификация" полей документа? В каком обработчике? За такое: ЭтотОбъект.СуммаРеализации = СуммаРеализации1 в обработке проведения надо по пальцам табуреткой бить. |
|||
5
DenisVich
04.06.12
✎
16:32
|
>>В какой момент происходит "модификация" полей документа? В каком обработчике?
В момент выполнения процедуры ОбработкаПроведения |
|||
6
DenisVich
04.06.12
✎
16:34
|
Непосредственно после выполнения ДвиженияПоРегистрам должно быть выполнено.
|
|||
7
Irbis
04.06.12
✎
16:35
|
Занятно, открыл новый мешок попкорна.
|
|||
8
DenisVich
04.06.12
✎
16:37
|
Но ничего не происходит с двумя новыми полями.:( Просто на уровне концепции как движения регистров правильно выполнять для документов?
|
|||
9
Irbis
04.06.12
✎
16:39
|
(8) на уровне концепции документ сам должен знать что ему делать при проведении. Иногда используются разные махинации с проверкой до проведения или после, но это загоны гуру от 1С.
|
|||
10
ptiz
04.06.12
✎
16:42
|
(0) Реквизиты документа надо заполнять в процедуре "ПередЗаписью" модуля объекта.
Так же, как это сделано с реквизитом "СуммаДокумента". |
|||
11
unregistered
04.06.12
✎
16:49
|
(5) >> В момент выполнения процедуры ОбработкаПроведения
Этого делать нельзя. Значения всех реквизитов документа должны быть установлены ПередЗаписью. ПриЗаписи, и в ОбработкеПроведения реквизиты документа меняться не должны. Естественно все типовые запросы по шапке и табличным частям не видят тех реквизитов которые ты там понаустанавливал, т.к. эти запросы делаются к базе данных, а в базе данных ни каких устанавленных тобою в обработке проведения значений нет (они есть только у объекта). |
|||
12
unregistered
04.06.12
✎
16:54
|
(8) >> Просто на уровне концепции
Запись и проведении происходит в одной транзакции. Сначала запись документа в БД, потом - проведение. В обработке проведения, как правило, для получения необходимых для проведения данных делаются запросы к базе данных (документ уже на этот момент записан и данные в БД есть) по шапке документа, по его табличным частям, к необходимым дополнительным объектам (регистрам, справочникам и т.п.). Используя эти данные выполняются движение по регистрам. |
|||
13
DenisVich
04.06.12
✎
17:15
|
Спасибо помогло, прояснили!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |