Имя: Пароль:
1C
1С v8
Алгоритм проведения документов в 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
Спасибо помогло, прояснили!